diff --git a/.tx/config b/.tx/config index befa61f59..795d3959f 100644 --- a/.tx/config +++ b/.tx/config @@ -270,6 +270,8 @@ source_lang = en ;;trans.ca = installer/resources/locale/po/messages_ca.po trans.de = installer/resources/locale/po/messages_de.po trans.es = installer/resources/locale/po/messages_es.po +;; currently fails check +;;trans.fi = installer/resources/locale/po/messages_fi.po trans.fr = installer/resources/locale/po/messages_fr.po trans.id = installer/resources/locale/po/messages_id.po trans.it = installer/resources/locale/po/messages_it.po @@ -297,6 +299,7 @@ type = PROPERTIES trans.cs = core/java/src/gnu/getopt/MessagesBundle_cs.properties trans.de = core/java/src/gnu/getopt/MessagesBundle_de.properties trans.es = core/java/src/gnu/getopt/MessagesBundle_es.properties +trans.fi = core/java/src/gnu/getopt/MessagesBundle_fi.properties trans.fr = core/java/src/gnu/getopt/MessagesBundle_fr.properties trans.hu = core/java/src/gnu/getopt/MessagesBundle_hu.properties ;; Java converts id to in @@ -322,6 +325,7 @@ trans.zh_CN = core/java/src/gnu/getopt/MessagesBundle_zh.properties [I2P.streaming] source_file = apps/ministreaming/locale/messages_en.po source_lang = en +trans.ca = apps/ministreaming/locale/messages_ca.po trans.de = apps/ministreaming/locale/messages_de.po trans.es = apps/ministreaming/locale/messages_es.po trans.fr = apps/ministreaming/locale/messages_fr.po @@ -332,6 +336,7 @@ trans.nb = apps/ministreaming/locale/messages_nb.po trans.pl = apps/ministreaming/locale/messages_pl.po trans.ro = apps/ministreaming/locale/messages_ro.po trans.ru_RU = apps/ministreaming/locale/messages_ru.po +trans.sv_SE = apps/ministreaming/locale/messages_sv.po trans.uk_UA = apps/ministreaming/locale/messages_uk.po trans.zh_CN = apps/ministreaming/locale/messages_zh.po diff --git a/INSTALL-headless.txt b/INSTALL-headless.txt index 6f5457580..3ae8a14f0 100644 --- a/INSTALL-headless.txt +++ b/INSTALL-headless.txt @@ -25,21 +25,22 @@ where there are comments labeled "PORTABLE". Do this before you run I2P for the first time. To start I2P: - (*nix): sh i2prouter start + (*nix, BSD, Mac): sh i2prouter start (win*): I2P.exe - (non-x86 platforms PPC, ARM, etc): sh runplain.sh + (platforms without wrapper support): sh runplain.sh To stop I2P (gracefully): lynx http://localhost:7657/summaryframe (click "Shutdown") + or (*nix, BSD, Mac) sh i2prouter graceful To stop I2P immediately: - sh i2prouter stop + (*nix, BSD, Mac) sh i2prouter stop To uninstall I2P: rm -rf $I2PInstallDir ~/.i2p Supported JVMs: - All platforms: Java 1.6 or higher required; 1.7 or higher recommended + All platforms: Java 1.7 or higher required Windows: OpenJDK or Oracle from http://java.com/download Linux: OpenJDK or Oracle from http://java.com/download FreeBSD: OpenJDK or Oracle from http://java.com/download diff --git a/INSTALL.txt b/INSTALL.txt index 23701b041..d9960fc3a 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,8 +1,9 @@ I2P source installation instructions Prerequisites to build from source: - Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher + Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher Non-linux operating systems and JVMs: See https://trac.i2p2.de/wiki/java + Certain subsystems for embedded (core, router, mstreaming, streaming, i2ptunnel) require only Java 1.6 Apache Ant 1.7.0 or higher The xgettext, msgfmt, and msgmerge tools installed from the GNU gettext package http://www.gnu.org/software/gettext/ @@ -40,29 +41,30 @@ or on Windows, just double-click on i2pinstall.exe. Or move the i2pupdate.zip file into an existing installation directory and restart. To start I2P: - (*nix): sh i2prouter start + (*nix, BSD, Mac): sh i2prouter start (win*): I2P.exe or i2prouter.bat - (non-x86 platforms PPC, ARM, etc): sh runplain.sh + (platforms without wrapper support): sh runplain.sh To install I2P as a system service: - (*nix) sh i2prouter install + (*nix, BSD, Mac) sh i2prouter install (win*) install_i2p_service_winnt.bat To uninstall I2P as a system service: - (*nix) sh i2prouter remove + (*nix, BSD, Mac) sh i2prouter remove (win*) uninstall_i2p-service_winnt.bat To stop I2P (gracefully): lynx http://localhost:7657/summaryframe (click "Shutdown") + or (*nix, BSD, Mac) sh i2prouter graceful To stop I2P immediately: - sh i2prouter stop + (*nix, BSD, Mac) sh i2prouter stop To uninstall I2P: rm -rf $I2PInstallDir ~/.i2p Supported JVMs: - Windows: Latest available from http://java.com/download (1.5+ supported) - Linux: Latest available from http://java.com/download (1.5+ supported) - FreeBSD: 1.5-compatible (NIO required) + Windows: Latest available from http://java.com/download (1.7+ supported) + Linux: Latest available from http://java.com/download (1.7+ supported) + FreeBSD: 1.7-compatible (NIO required) Other operating systems and JVMs: See http://trac.i2p2.de/wiki/java diff --git a/LICENSE.txt b/LICENSE.txt index 254fde1a3..295da33aa 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -252,8 +252,8 @@ Applications: Bundles systray4j-2.4.1: See licenses/LICENSE-LGPLv2.1.txt - Tomcat 6.0.43: - Copyright 1999-2014 The Apache Software Foundation + Tomcat 6.0.44: + Copyright 1999-2015 The Apache Software Foundation See licenses/LICENSE-Apache2.0.txt See licenses/NOTICE-Tomcat.txt diff --git a/README.txt b/README.txt index d115a6dbf..b7a4b8e40 100644 --- a/README.txt +++ b/README.txt @@ -1,6 +1,7 @@ Prerequisites to build from source: - Java SDK (preferably Oracle/Sun or OpenJDK) 1.6.0 or higher + Java SDK (preferably Oracle/Sun or OpenJDK) 1.7.0 or higher Non-linux operating systems and JVMs: See https://trac.i2p2.de/wiki/java + Certain subsystems for embedded (core, router, mstreaming, streaming, i2ptunnel) require only Java 1.6 Apache Ant 1.7.0 or higher The xgettext, msgfmt, and msgmerge tools installed from the GNU gettext package http://www.gnu.org/software/gettext/ @@ -19,7 +20,8 @@ To build: Documentation: https://geti2p.net/how - API: run 'ant javadoc' then start at build/javadoc/index.html + API: http://docs.i2p-projekt.de/javadoc/ + or run 'ant javadoc' then start at build/javadoc/index.html Latest release: https://geti2p.net/download @@ -34,6 +36,15 @@ Need help? IRC irc.freenode.net #i2p http://forum.i2p/ +Bug reports: + https://trac.i2p2.de/report/1 + +Contact information, security issues, press inquiries: + https://geti2p.net/en/contact + +Twitter: + @i2p, @geti2p + Licenses: See LICENSE.txt diff --git a/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java b/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java index ca7b82889..313f10f2c 100644 --- a/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java +++ b/apps/BOB/Demos/echo/echoclient/src/net/i2p/BOB/Demos/echo/echoclient/Main.java @@ -66,7 +66,7 @@ public class Main { } static void wrtxt(OutputStream CMDout, String s) throws IOException { - CMDout.write(s.getBytes()); + CMDout.write(DataHelper.getUTF8(s)); CMDout.write('\n'); CMDout.flush(); } diff --git a/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java b/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java index 6b7be2518..93bd7d753 100644 --- a/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java +++ b/apps/BOB/Demos/echo/echoserver/src/net/i2p/BOB/Demos/echo/echoserver/Main.java @@ -63,7 +63,7 @@ public class Main { } static void wrtxt(OutputStream CMDout, String s) throws IOException { - CMDout.write(s.getBytes()); + CMDout.write(DataHelper.getUTF8(s)); CMDout.write('\n'); CMDout.flush(); } diff --git a/apps/BOB/src/net/i2p/BOB/BOB.java b/apps/BOB/src/net/i2p/BOB/BOB.java index c4ef3b23a..c8b06b5e9 100644 --- a/apps/BOB/src/net/i2p/BOB/BOB.java +++ b/apps/BOB/src/net/i2p/BOB/BOB.java @@ -247,11 +247,11 @@ public class BOB implements Runnable, ClientApp { save = true; } if (!props.containsKey("inbound.length")) { - props.setProperty("inbound.length", "1"); + props.setProperty("inbound.length", "3"); save = true; } if (!props.containsKey("outbound.length")) { - props.setProperty("outbound.length", "1"); + props.setProperty("outbound.length", "3"); save = true; } if (!props.containsKey("inbound.lengthVariance")) { @@ -338,7 +338,7 @@ public class BOB implements Runnable, ClientApp { if (g) { DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log); - Thread t = new Thread(conn_c); + Thread t = new I2PAppThread(conn_c); t.setName("BOB.DoCMDS " + i); t.start(); i++; diff --git a/apps/BOB/src/net/i2p/BOB/DoCMDS.java b/apps/BOB/src/net/i2p/BOB/DoCMDS.java index 957f0ea3f..7e5bd1014 100644 --- a/apps/BOB/src/net/i2p/BOB/DoCMDS.java +++ b/apps/BOB/src/net/i2p/BOB/DoCMDS.java @@ -25,12 +25,13 @@ import java.util.Locale; import java.util.Properties; import java.util.StringTokenizer; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.I2PClientFactory; -//import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -//import net.i2p.i2ptunnel.I2PTunnel; +import net.i2p.util.I2PAppThread; + // needed only for debugging. // import java.util.logging.Level; // import java.util.logging.Logger; @@ -1307,7 +1308,7 @@ public class DoCMDS implements Runnable { // wait } tunnel = new MUXlisten(lock, database, nickinfo, _log); - Thread t = new Thread(tunnel); + Thread t = new I2PAppThread(tunnel); t.start(); // try { // Thread.sleep(1000 * 10); // Slow down the startup. diff --git a/apps/BOB/src/net/i2p/BOB/I2Plistener.java b/apps/BOB/src/net/i2p/BOB/I2Plistener.java index 28c053a3a..ebe488860 100644 --- a/apps/BOB/src/net/i2p/BOB/I2Plistener.java +++ b/apps/BOB/src/net/i2p/BOB/I2Plistener.java @@ -18,10 +18,12 @@ package net.i2p.BOB; import java.net.ConnectException; import java.net.SocketTimeoutException; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PException; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.util.I2PAppThread; /** * Listen on I2P and connect to TCP @@ -30,16 +32,15 @@ import net.i2p.client.streaming.I2PSocketManager; */ public class I2Plistener implements Runnable { - private NamedDB info, database; - private Logger _log; - public I2PSocketManager socketManager; - public I2PServerSocket serverSocket; - private AtomicBoolean lives; + private final NamedDB info, database; + private final Logger _log; + private final I2PServerSocket serverSocket; + private final AtomicBoolean lives; /** * Constructor * @param SS - * @param S + * @param S unused * @param info * @param database * @param _log @@ -48,7 +49,6 @@ public class I2Plistener implements Runnable { this.database = database; this.info = info; this._log = _log; - this.socketManager = S; this.serverSocket = SS; this.lives = lives; } @@ -79,7 +79,7 @@ public class I2Plistener implements Runnable { conn++; // toss the connection to a new thread. I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives); - Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn); + Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn); t.start(); } diff --git a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java index bf699db60..11b401029 100644 --- a/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java +++ b/apps/BOB/src/net/i2p/BOB/I2PtoTCP.java @@ -19,7 +19,10 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.client.streaming.I2PSocket; +import net.i2p.data.DataHelper; +import net.i2p.util.I2PAppThread; /** * Process I2P->TCP @@ -104,15 +107,15 @@ public class I2PtoTCP implements Runnable { if (tell) { // tell who is connecting - out.write(I2P.getPeerDestination().toBase64().getBytes()); + out.write(DataHelper.getASCII(I2P.getPeerDestination().toBase64())); out.write(10); // nl out.flush(); // not really needed, but... } // setup to cross the streams TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app - t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); - q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); + t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB"); // Fire! t.start(); q.start(); diff --git a/apps/BOB/src/net/i2p/BOB/MUXlisten.java b/apps/BOB/src/net/i2p/BOB/MUXlisten.java index f330be971..81dbe0845 100644 --- a/apps/BOB/src/net/i2p/BOB/MUXlisten.java +++ b/apps/BOB/src/net/i2p/BOB/MUXlisten.java @@ -21,11 +21,13 @@ import java.net.InetAddress; import java.net.ServerSocket; import java.util.Properties; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PException; import net.i2p.client.I2PClient; import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManagerFactory; +import net.i2p.util.I2PAppThread; import net.i2p.util.Log; /** @@ -201,14 +203,14 @@ public class MUXlisten implements Runnable { // I2P -> TCP SS = socketManager.getServerSocket(); I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives); - t = new Thread(tg, conn, "BOBI2Plistener " + N); + t = new I2PAppThread(tg, conn, "BOBI2Plistener " + N); t.start(); } if (come_in) { // TCP -> I2P TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives); - q = new Thread(tg, conn, "BOBTCPlistener " + N); + q = new I2PAppThread(tg, conn, "BOBTCPlistener " + N); q.start(); } diff --git a/apps/BOB/src/net/i2p/BOB/NamedDB.java b/apps/BOB/src/net/i2p/BOB/NamedDB.java index 5a1b8e45f..dda9ab268 100644 --- a/apps/BOB/src/net/i2p/BOB/NamedDB.java +++ b/apps/BOB/src/net/i2p/BOB/NamedDB.java @@ -64,7 +64,7 @@ public class NamedDB { } /** - * Find objects in the array, returns it's index or throws exception + * Find objects in the array, returns its index or throws exception * @param key * @return an objects index * @throws ArrayIndexOutOfBoundsException when key does not exist diff --git a/apps/BOB/src/net/i2p/BOB/TCPlistener.java b/apps/BOB/src/net/i2p/BOB/TCPlistener.java index e5dd41d59..2ad1b5af6 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPlistener.java +++ b/apps/BOB/src/net/i2p/BOB/TCPlistener.java @@ -20,8 +20,10 @@ import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.util.I2PAppThread; /** * Listen on TCP port and connect to I2P @@ -30,12 +32,11 @@ import net.i2p.client.streaming.I2PSocketManager; */ public class TCPlistener implements Runnable { - private NamedDB info, database; - private Logger _log; - public I2PSocketManager socketManager; - public I2PServerSocket serverSocket; - private ServerSocket listener; - private AtomicBoolean lives; + private final NamedDB info, database; + private final Logger _log; + private final I2PSocketManager socketManager; + private final ServerSocket listener; + private final AtomicBoolean lives; /** * Constructor @@ -76,7 +77,7 @@ public class TCPlistener implements Runnable { conn++; // toss the connection to a new thread. TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives); - Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn); + Thread t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn); t.start(); g = false; } diff --git a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java index 0ce587257..3f196af28 100644 --- a/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java +++ b/apps/BOB/src/net/i2p/BOB/TCPtoI2P.java @@ -24,13 +24,14 @@ import java.net.NoRouteToHostException; import java.net.Socket; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; + +import net.i2p.I2PAppContext; import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; -//import net.i2p.i2ptunnel.I2PTunnel; -import net.i2p.I2PAppContext; +import net.i2p.util.I2PAppThread; /** * @@ -158,8 +159,8 @@ public class TCPtoI2P implements Runnable { // setup to cross the streams TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app - t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA"); - q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB"); + t = new I2PAppThread(conn_c, Thread.currentThread().getName() + " TCPioA"); + q = new I2PAppThread(conn_a, Thread.currentThread().getName() + " TCPioB"); // Fire! t.start(); q.start(); diff --git a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java index 1b6f4249d..9448d1d7b 100644 --- a/apps/BOB/src/net/i2p/BOB/UDPIOthread.java +++ b/apps/BOB/src/net/i2p/BOB/UDPIOthread.java @@ -34,15 +34,17 @@ import net.i2p.util.Log; * The skeletal frame is here, just needs to be finished. * * @author sponge + * @deprecated incomplete, unused */ public class UDPIOthread implements I2PSessionListener, Runnable { - private NamedDB info; - private Log _log; - private Socket socket; + private final NamedDB info; + private final Log _log; + private final Socket socket; private DataInputStream in; private DataOutputStream out; - private I2PSession _session; + private final I2PSession _session; + // FIXME never set private Destination _peerDestination; private boolean up; @@ -58,7 +60,6 @@ public class UDPIOthread implements I2PSessionListener, Runnable { this._log = _log; this.socket = socket; this._session = _session; - } /** diff --git a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java index 4a124e488..fea030774 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java @@ -27,6 +27,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.regex.Pattern; import net.i2p.I2PAppContext; import net.i2p.util.EepGet; @@ -49,6 +50,26 @@ class AddressBook { private boolean modified; private static final boolean DEBUG = false; + private static final int MIN_DEST_LENGTH = 516; + private static final int MAX_DEST_LENGTH = MIN_DEST_LENGTH + 100; // longer than any known cert type for now + + /** + * 5-67 chars lower/upper case + */ + private static final Pattern HOST_PATTERN = + Pattern.compile("^[0-9a-zA-Z\\.-]{5,67}$"); + + /** + * 52 chars lower/upper case + * Always ends in 'a' or 'q' + */ + private static final Pattern B32_PATTERN = + Pattern.compile("^[2-7a-zA-Z]{51}[aAqQ]$"); + + /** not a complete qualification, just a quick check */ + private static final Pattern B64_PATTERN = + Pattern.compile("^[0-9a-zA-Z~-]{" + MIN_DEST_LENGTH + ',' + MAX_DEST_LENGTH + "}={0,2}$"); + /** * Construct an AddressBook from the contents of the Map addresses. * @@ -159,8 +180,13 @@ class AddressBook { * @since 0.8.7 */ public Iterator> iterator() { - if (this.subFile != null) - return new ConfigIterator(this.subFile); + if (this.subFile != null) { + try { + return new ConfigIterator(this.subFile); + } catch (IOException ioe) { + return new ConfigIterator(); + } + } return this.addresses.entrySet().iterator(); } @@ -201,9 +227,6 @@ class AddressBook { return "Map containing " + this.addresses.size() + " entries"; } - private static final int MIN_DEST_LENGTH = 516; - private static final int MAX_DEST_LENGTH = MIN_DEST_LENGTH + 100; // longer than any known cert type for now - /** * Do basic validation of the hostname * hostname was already converted to lower case by ConfigParser.parse() @@ -220,9 +243,10 @@ class AddressBook { host.indexOf("..") < 0 && // IDN - basic check, not complete validation (host.indexOf("--") < 0 || host.startsWith("xn--") || host.indexOf(".xn--") > 0) && - host.replaceAll("[a-z0-9.-]", "").length() == 0 && + HOST_PATTERN.matcher(host).matches() && // Base32 spoofing (52chars.i2p) - (! (host.length() == 56 && host.substring(0,52).replaceAll("[a-z2-7]", "").length() == 0)) && + // We didn't do it this way, we use a .b32.i2p suffix, but let's prohibit it anyway + (! (host.length() == 56 && B32_PATTERN.matcher(host.substring(0,52)).matches())) && // ... or maybe we do Base32 this way ... (! host.equals("b32.i2p")) && (! host.endsWith(".b32.i2p")) && @@ -246,7 +270,7 @@ class AddressBook { (dest.length() > MIN_DEST_LENGTH && dest.length() <= MAX_DEST_LENGTH)) && // B64 comes in groups of 2, 3, or 4 chars, but never 1 ((dest.length() % 4) != 1) && - dest.replaceAll("[a-zA-Z0-9~-]", "").length() == 0 + B64_PATTERN.matcher(dest).matches() ; } @@ -332,4 +356,27 @@ class AddressBook { protected void finalize() { delete(); } + +/**** + public static void main(String[] args) { + String[] tests = { "foo.i2p", + "3bnipzzu67cdq2rcygyxz52xhvy6ylokn4zfrk36ywn6pixmaoza.b32.i2p", + "9rhEy4dT9fMlcSOhDzfWRxCV2aen4Zp4eSthOf5f9gVKMa4PtQJ-wEzm2KEYeDXkbM6wEDvMQ6ou4LIniSE6bSAwy7fokiXk5oabels-sJmftnQWRbZyyXEAsLc3gpJJvp9km7kDyZ0z0YGL5tf3S~OaWdptB5tSBOAOjm6ramcYZMWhyUqm~xSL1JyXUqWEHRYwhoDJNL6-L516VpDYVigMBpIwskjeFGcqK8BqWAe0bRwxIiFTPN6Ck8SDzQvS1l1Yj-zfzg3X3gOknzwR8nrHUkjsWtEB6nhbOr8AR21C9Hs0a7MUJvSe2NOuBoNTrtxT76jDruI78JcG5r~WKl6M12yM-SqeBNE9hQn2QCHeHAKju7FdRCbqaZ99IwyjfwvZbkiYYQVN1xlUuGaXrj98XDzK7GORYdH-PrVGfEbMXQ40KLHUWHz8w4tQXAOQrCHEichod0RIzuuxo3XltCWKrf1xGZhkAo9bk2qXi6digCijvYNaKmQdXZYWW~RtAAAA", + "6IZTYacjlXjSAxu-uXEO5oGsj-f4tfePHEvGjs5pu-AMXMwD7-xFdi8kdobDMJp9yRAl96U7yLl~0t9zHeqqYmNeZnDSkTmAcSC2PT45ZJDXBobKi1~a77zuqfPwnzEatYfW3GL1JQAEkAmiwNJoG7ThTZ3zT7W9ekVJpHi9mivpTbaI~rALLfuAg~Mvr60nntZHjqhEZuiU4dTXrmc5nykl~UaMnBdwHL4jKmoN5CotqHyLYZfp74fdD-Oq4SkhuBhU8wkBIM3lz3Ul1o6-s0lNUMdYJq1CyxnyP7jeekdfAlSx4P4sU4M0dPaYvPdOFWPWwBuEh0pCs5Mj01B2xeEBhpV~xSLn6ru5Vq98TrmaR33KHxd76OYYFsWwzVbBuMVSd800XpBghGFucGw01YHYsPh3Afb01sXbf8Nb1bkxCy~DsrmoH4Ww3bpx66JhRTWvg5al3oWlCX51CnJUqaaK~dPL-pBvAyLKIA5aYvl8ca66jtA7AFDxsOb2texBBQAEAAcAAA==", + "te9Ky7XvVcLLr5vQqvfmOasg915P3-ddP3iDqpMMk7v5ufFKobLAX~1k-E4WVsJVlkYvkHVOjxix-uT1IdewKmLd81s5wZtz0GQ3ZC6p0C3S2cOxz7kQqf7QYSR0BrhZC~2du3-GdQO9TqNmsnHrah5lOZf0LN2JFEFPqg8ZB5JNm3JjJeSqePBRk3zAUogNaNK3voB1MVI0ZROKopXAJM4XMERNqI8tIH4ngGtV41SEJJ5pUFrrTx~EiUPqmSEaEA6UDYZiqd23ZlewZ31ExXQj97zvkuhKCoS9A9MNkzZejJhP-TEXWF8~KHur9f51H--EhwZ42Aj69-3GuNjsMdTwglG5zyIfhd2OspxJrXzCPqIV2sXn80IbPgwxHu0CKIJ6X43B5vTyVu87QDI13MIRNGWNZY5KmM5pilGP7jPkOs4xQDo4NHzpuJR5igjWgJIBPU6fI9Pzq~BMzjLiZOMp8xNWey1zKC96L0eX4of1MG~oUvq0qmIHGNa1TlUwBQAEAAEAAA==", + "(*&(*&(*&(*", + "9rhEy4dT9fMlcSOhDzfWRxCV2aen4Zp4eSthOf5f9gVKMa4PtQJ-wEzm2KEYeDXkbM6wEDvMQ6ou4LIniSE6bSAwy7fokiXk5oabels-sJmftnQWRbZyyXEAsLc3gpJJvp9km7kDyZ0z0YGL5tf3S~OaWdptB5tSBOAOjm6ramcYZMWhyUqm~xSL1JyXUqWEHRYwhoDJNL6-L516VpDYVigMBpIwskjeFGcqK8BqWAe0bRwxIiFTPN6Ck8SDzQvS1l1Yj-zfzg3X3gOknzwR8nrHUkjsWtEB6nhbOr8AR21C9Hs0a7MUJvSe2NOuBoNTrtxT76jDruI78JcG5r~WKl6M12yM-SqeBNE9hQn2QCHeHAKju7FdRCbqaZ99IwyjfwvZbkiYYQVN1xlUuGaXrj98XDzK7GORYdH-PrVGfEbMXQ40KLHUWHz8w4tQXAOQrCHEichod0RIzuuxo3XltCWKrf1xGZhkAo9bk2qXi6digCijvYNaKmQdXZYWW~RtAAA", + "6IZTYacjlXjSAxu-uXEO5oGsj-f4tfePHEvGjs5pu-AMXMwD7-xFdi8kdobDMJp9yRAl96U7yLl~0t9zHeqqYmNeZnDSkTmAcSC2PT45ZJDXBobKi1~a77zuqfPwnzEatYfW3GL1JQAEkAmiwNJoG7ThTZ3zT7W9ekVJpHi9mivpTbaI~rALLfuAg~Mvr60nntZHjqhEZuiU4dTXrmc5nykl~UaMnBdwHL4jKmoN5CotqHyLYZfp74fdD-Oq4SkhuBhU8wkBIM3lz3Ul1o6-s0lNUMdYJq1CyxnyP7jeekdfAlSx4P4sU4M0dPaYvPdOFWPWwBuEh0pCs5Mj01B2xeEBhpV~xSLn6ru5Vq98TrmaR33KHxd76OYYFsWwzVbBuMVSd800XpBghGFucGw01YHYsPh3Afb01sXbf8Nb1bkxCy~DsrmoH4Ww3bpx66JhRTWvg5al3oWlCX51CnJUqaaK~dPL-pBvAyLKIA5aYvl8ca66jtA7AFDxsOb2texBBQAEAAcAAA===", + "!e9Ky7XvVcLLr5vQqvfmOasg915P3-ddP3iDqpMMk7v5ufFKobLAX~1k-E4WVsJVlkYvkHVOjxix-uT1IdewKmLd81s5wZtz0GQ3ZC6p0C3S2cOxz7kQqf7QYSR0BrhZC~2du3-GdQO9TqNmsnHrah5lOZf0LN2JFEFPqg8ZB5JNm3JjJeSqePBRk3zAUogNaNK3voB1MVI0ZROKopXAJM4XMERNqI8tIH4ngGtV41SEJJ5pUFrrTx~EiUPqmSEaEA6UDYZiqd23ZlewZ31ExXQj97zvkuhKCoS9A9MNkzZejJhP-TEXWF8~KHur9f51H--EhwZ42Aj69-3GuNjsMdTwglG5zyIfhd2OspxJrXzCPqIV2sXn80IbPgwxHu0CKIJ6X43B5vTyVu87QDI13MIRNGWNZY5KmM5pilGP7jPkOs4xQDo4NHzpuJR5igjWgJIBPU6fI9Pzq~BMzjLiZOMp8xNWey1zKC96L0eX4of1MG~oUvq0qmIHGNa1TlUwBQAEAAEAAA==", + "x" + }; + for (String s : tests) { + test(s); + } + } + + public static void test(String s) { + System.out.println(s + " valid host? " + isValidKey(s) + " valid dest? " + isValidDest(s)); + } +****/ } diff --git a/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java b/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java index 955363eaf..10119d844 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java @@ -22,6 +22,7 @@ package net.i2p.addressbook; import java.io.BufferedReader; +import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -31,6 +32,8 @@ import java.util.Locale; import java.util.Map; import java.util.NoSuchElementException; +import net.i2p.data.DataHelper; + /** * A class to iterate through a hosts.txt or config file without * reading the whole thing into memory. @@ -41,7 +44,7 @@ import java.util.NoSuchElementException; * * @since 0.8.7 */ -class ConfigIterator implements Iterator> { +class ConfigIterator implements Iterator>, Closeable { private BufferedReader input; private ConfigEntry next; @@ -54,11 +57,9 @@ class ConfigIterator implements Iterator> { /** * An iterator over the key/value pairs in the file. */ - public ConfigIterator(File file) { - try { + public ConfigIterator(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); - input = new BufferedReader(new InputStreamReader(fileStream)); - } catch (IOException ioe) {} + input = new BufferedReader(new InputStreamReader(fileStream, "UTF-8")); } public boolean hasNext() { @@ -70,7 +71,7 @@ class ConfigIterator implements Iterator> { String inputLine = input.readLine(); while (inputLine != null) { inputLine = ConfigParser.stripComments(inputLine); - String[] splitLine = inputLine.split("="); + String[] splitLine = DataHelper.split(inputLine, "="); if (splitLine.length == 2) { next = new ConfigEntry(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim()); return true; diff --git a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java index 5fda52940..625b6e3d0 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import net.i2p.data.DataHelper; import net.i2p.util.SecureFile; import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SystemVersion; @@ -93,7 +94,7 @@ class ConfigParser { inputLine = input.readLine(); while (inputLine != null) { inputLine = stripComments(inputLine); - String[] splitLine = inputLine.split("="); + String[] splitLine = DataHelper.split(inputLine, "="); if (splitLine.length == 2) { result.put(splitLine[0].trim().toLowerCase(Locale.US), splitLine[1].trim()); } @@ -116,7 +117,7 @@ class ConfigParser { public static Map parse(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); BufferedReader input = new BufferedReader(new InputStreamReader( - fileStream)); + fileStream, "UTF-8")); Map rv = parse(input); try { fileStream.close(); @@ -205,7 +206,7 @@ class ConfigParser { public static List parseSubscriptions(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); BufferedReader input = new BufferedReader(new InputStreamReader( - fileStream)); + fileStream, "UTF-8")); List rv = parseSubscriptions(input); try { fileStream.close(); diff --git a/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java b/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java index fe74c7a83..b0689a208 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/DaemonThread.java @@ -25,6 +25,7 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.client.naming.NamingServiceUpdater; +import net.i2p.util.I2PAppThread; /** * A thread that waits five minutes, then runs the addressbook daemon. @@ -32,7 +33,7 @@ import net.i2p.client.naming.NamingServiceUpdater; * @author Ragnarok * */ -public class DaemonThread extends Thread implements NamingServiceUpdater { +public class DaemonThread extends I2PAppThread implements NamingServiceUpdater { private String[] args; diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Log.java b/apps/addressbook/java/src/net/i2p/addressbook/Log.java index d0f01904f..a87af2537 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/Log.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/Log.java @@ -23,8 +23,9 @@ package net.i2p.addressbook; import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.Date; /** @@ -56,8 +57,8 @@ class Log { public void append(String entry) { BufferedWriter bw = null; try { - bw = new BufferedWriter(new FileWriter(this.file, - true)); + bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.file, + true), "UTF-8")); String timestamp = new Date().toString(); bw.write(timestamp + " -- " + entry); bw.newLine(); diff --git a/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java b/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java index cf7b04fc0..74e946f95 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/SubscriptionIterator.java @@ -26,6 +26,7 @@ import java.util.Iterator; import java.util.List; import net.i2p.I2PAppContext; +import net.i2p.util.PortMapper; /** * An iterator over the subscriptions in a SubscriptionList. Note that this iterator @@ -69,11 +70,14 @@ class SubscriptionIterator implements Iterator { * Yes, the EepGet fetch() is done in here in next(). * * see java.util.Iterator#next() - * @return an AddressBook (empty if the minimum delay has not been met) + * @return non-null AddressBook (empty if the minimum delay has not been met, + * or there is no proxy tunnel, or the fetch otherwise fails) */ public AddressBook next() { Subscription sub = this.subIterator.next(); - if (sub.getLastFetched() + this.delay < I2PAppContext.getGlobalContext().clock().now()) { + if (sub.getLastFetched() + this.delay < I2PAppContext.getGlobalContext().clock().now() && + I2PAppContext.getGlobalContext().portMapper().getPort(PortMapper.SVC_HTTP_PROXY) >= 0 && + !I2PAppContext.getGlobalContext().getBooleanProperty("i2p.vmCommSystem")) { //System.err.println("Fetching addressbook from " + sub.getLocation()); return new AddressBook(sub, this.proxyHost, this.proxyPort); } else { diff --git a/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java index 2851d7d86..d5c63c60d 100644 --- a/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java +++ b/apps/admin/java/src/net/i2p/router/admin/AdminRunner.java @@ -11,6 +11,7 @@ import java.util.Iterator; import java.util.Set; import net.i2p.data.Hash; +import net.i2p.data.DataHelper import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.util.I2PThread; @@ -47,7 +48,7 @@ class AdminRunner implements Runnable { reply(out, "this is not a website"); } else if ( (command.indexOf("routerStats.html") >= 0) || (command.indexOf("oldstats.jsp") >= 0) ) { try { - out.write("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n".getBytes()); + out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); _generator.generateStatsPage(new OutputStreamWriter(out)); out.close(); } catch (IOException ioe) { @@ -61,7 +62,7 @@ class AdminRunner implements Runnable { reply(out, shutdown(command)); } else if (true || command.indexOf("routerConsole.html") > 0) { try { - out.write("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n".getBytes()); + out.write(DataHelper.getASCII("HTTP/1.1 200 OK\nConnection: close\nCache-control: no-cache\nContent-type: text/html\n\n")); _context.router().renderStatusHTML(new OutputStreamWriter(out)); out.close(); } catch (IOException ioe) { @@ -80,7 +81,7 @@ class AdminRunner implements Runnable { reply.append("Content-type: text/html\n\n"); reply.append(content); try { - out.write(reply.toString().getBytes()); + out.write(DataHelper.getASCII(reply.toString())); out.close(); } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) @@ -97,7 +98,7 @@ class AdminRunner implements Runnable { reply.append("Content-type: text/plain\n\n"); reply.append(content); try { - out.write(reply.toString().getBytes()); + out.write(DataHelper.getASCII(reply.toString())); out.close(); } catch (IOException ioe) { if (_log.shouldLog(Log.WARN)) diff --git a/apps/apparmor/home.i2p.i2prouter b/apps/apparmor/home.i2p.i2prouter index b31f3adba..7f7dcb7ef 100644 --- a/apps/apparmor/home.i2p.i2prouter +++ b/apps/apparmor/home.i2p.i2prouter @@ -1,4 +1,4 @@ -# Last Modified: Sun Apr 12 22:08:32 2015 +#Last Modified: Sun Dec 06 12:30:32 2015 # vim:syntax=apparmor et ts=8 sw=4 #include @@ -15,7 +15,7 @@ $INSTALL_PATH/{i2prouter,runplain.sh} flags=(complain) { $INSTALL_PATH/ r, $INSTALL_PATH/{i2psvc,wrapper} rmix, - owner $INSTALL_PATH/** rwklm, + owner $INSTALL_PATH/** rwkm, # Needed for Java owner @{PROC} r, @@ -57,7 +57,7 @@ $INSTALL_PATH/{i2prouter,runplain.sh} flags=(complain) { /usr/share/java/eclipse-ecj-*.jar r, /{,var/}tmp/ rwm, - owner /{,var/}tmp/** rwklm, + owner /{,var/}tmp/** rwkm, /{,usr/}bin/{,b,d}ash rix, /{,usr/}bin/cat rix, diff --git a/apps/desktopgui/bundle-messages.sh b/apps/desktopgui/bundle-messages.sh index 22b6038ce..6823dde03 100644 --- a/apps/desktopgui/bundle-messages.sh +++ b/apps/desktopgui/bundle-messages.sh @@ -26,12 +26,12 @@ then fi # on windows, one must specify the path of commnad find -# since windows has its own retarded version of find. +# since windows has its own version of find. if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="src" @@ -64,19 +64,19 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") - # handler._("foo") - # formhandler._("foo") + # handler._t("foo") + # formhandler._t("foo") # net.i2p.router.web.Messages.getString("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \ + --keyword=_t --keyword=_x --keyword=intl._ --keyword=intl.title \ --keyword=handler._ --keyword=formhandler._ \ --keyword=net.i2p.router.web.Messages.getString \ -o ${i}t diff --git a/apps/desktopgui/locale/messages_uk.po b/apps/desktopgui/locale/messages_uk.po index c45356c20..3084ecab5 100644 --- a/apps/desktopgui/locale/messages_uk.po +++ b/apps/desktopgui/locale/messages_uk.po @@ -4,7 +4,7 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: -# Denis Blank , 2011 +# Denis Lysenko , 2011 # LinuxChata, 2014 # madjong , 2014 msgid "" @@ -12,9 +12,9 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-01-09 19:27+0000\n" -"PO-Revision-Date: 2014-12-17 17:00+0000\n" -"Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"PO-Revision-Date: 2015-08-07 16:31+0000\n" +"Last-Translator: Denis Lysenko \n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/otf/I2P/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" diff --git a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java index 6fea46fef..2a3a16b63 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/ExternalTrayManager.java @@ -20,7 +20,7 @@ public class ExternalTrayManager extends TrayManager { @Override public PopupMenu getMainMenu() { PopupMenu popup = new PopupMenu(); - MenuItem startItem = new MenuItem(_("Start I2P")); + MenuItem startItem = new MenuItem(_t("Start I2P")); startItem.addActionListener(new ActionListener() { @Override @@ -35,7 +35,7 @@ public class ExternalTrayManager extends TrayManager { @Override protected void done() { - trayIcon.displayMessage(_("Starting"), _("I2P is starting!"), TrayIcon.MessageType.INFO); + trayIcon.displayMessage(_t("Starting"), _t("I2P is starting!"), TrayIcon.MessageType.INFO); //Hide the tray icon. //We cannot stop the desktopgui program entirely, //since that risks killing the I2P process as well. diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java index e1247dde6..1cb464308 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java @@ -23,7 +23,7 @@ public class InternalTrayManager extends TrayManager { public PopupMenu getMainMenu() { PopupMenu popup = new PopupMenu(); - MenuItem browserLauncher = new MenuItem(_("Launch I2P Browser")); + MenuItem browserLauncher = new MenuItem(_t("Launch I2P Browser")); browserLauncher.addActionListener(new ActionListener() { @Override @@ -47,7 +47,7 @@ public class InternalTrayManager extends TrayManager { }.execute(); } }); - MenuItem desktopguiConfigurationLauncher = new MenuItem(_("Configure desktopgui")); + MenuItem desktopguiConfigurationLauncher = new MenuItem(_t("Configure desktopgui")); desktopguiConfigurationLauncher.addActionListener(new ActionListener() { @Override @@ -64,7 +64,7 @@ public class InternalTrayManager extends TrayManager { } }); - MenuItem restartItem = new MenuItem(_("Restart I2P")); + MenuItem restartItem = new MenuItem(_t("Restart I2P")); restartItem.addActionListener(new ActionListener() { @Override @@ -82,7 +82,7 @@ public class InternalTrayManager extends TrayManager { } }); - MenuItem stopItem = new MenuItem(_("Stop I2P")); + MenuItem stopItem = new MenuItem(_t("Stop I2P")); stopItem.addActionListener(new ActionListener() { @Override diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java index f124ee3f6..227050735 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java @@ -78,7 +78,7 @@ public abstract class TrayManager { return image; } - protected static String _(String s) { - return DesktopguiTranslator._(s); + protected static String _t(String s) { + return DesktopguiTranslator._t(s); } } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java index 1e49f6609..a697c5779 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/DesktopguiConfigurationFrame.java @@ -40,10 +40,10 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { cancelButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle(_("Tray icon configuration")); + setTitle(_t("Tray icon configuration")); desktopguiEnabled.setSelected(true); - desktopguiEnabled.setText(_("Should tray icon be enabled?")); + desktopguiEnabled.setText(_t("Should tray icon be enabled?")); desktopguiEnabled.setActionCommand("shouldDesktopguiBeEnabled"); okButton.setText("OK"); @@ -98,8 +98,8 @@ public class DesktopguiConfigurationFrame extends javax.swing.JFrame { configureDesktopgui(); }//GEN-LAST:event_okButtonMouseReleased - protected static String _(String s) { - return DesktopguiTranslator._(s); + protected static String _t(String s) { + return DesktopguiTranslator._t(s); } private void configureDesktopgui() { diff --git a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java index e95cbc01f..3778c4ad9 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/i18n/DesktopguiTranslator.java @@ -16,11 +16,11 @@ public class DesktopguiTranslator { return ctx; } - public static String _(String s) { + public static String _t(String s) { return Translate.getString(s, getRouterContext(), BUNDLE_NAME); } - public static String _(String s, Object o) { + public static String _t(String s, Object o) { return Translate.getString(s, o, getRouterContext(), BUNDLE_NAME); } } diff --git a/apps/i2psnark/COPYING b/apps/i2psnark/COPYING index d60c31a97..a0d98f2a6 100644 --- a/apps/i2psnark/COPYING +++ b/apps/i2psnark/COPYING @@ -1,340 +1 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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 of the License, or - (at your option) any later version. - - This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. +See ../../licenses/LICENSE-GPLv2.txt diff --git a/apps/i2psnark/TODO b/apps/i2psnark/TODO deleted file mode 100644 index 6f89c0f50..000000000 --- a/apps/i2psnark/TODO +++ /dev/null @@ -1,24 +0,0 @@ -- I2PSnark: - - add multitorrent support by checking the metainfo hash in the - PeerAcceptor and feeding it off to the appropriate coordinator - - add a web interface - -- BEncode - - Byte array length indicator can overflow. - - Support really big BigNums (only 256 chars allowed now) - - Better BEValue toString(). Uses stupid heuristic now for debugging. - - Implemented bencoding. - - Remove application level hack to calculate sha1 hash for metainfo - (But can it be done as efficiently?) - -- Storage - - Check file name filter. - -- TrackerClient - - Support undocumented &numwant= request. - -- PeerCoordinator - - Disconnect from other seeds as soon as you are a seed yourself. - -- Text UI - - Make it completely silent. diff --git a/apps/i2psnark/authors.snark b/apps/i2psnark/authors-snark.txt similarity index 100% rename from apps/i2psnark/authors.snark rename to apps/i2psnark/authors-snark.txt diff --git a/apps/i2psnark/changelog.snark b/apps/i2psnark/changelog-snark.txt similarity index 100% rename from apps/i2psnark/changelog.snark rename to apps/i2psnark/changelog-snark.txt diff --git a/apps/i2psnark/java/bundle-messages.sh b/apps/i2psnark/java/bundle-messages.sh index c301622ed..7ef207a6d 100755 --- a/apps/i2psnark/java/bundle-messages.sh +++ b/apps/i2psnark/java/bundle-messages.sh @@ -25,12 +25,12 @@ then fi # on windows, one must specify the path of commnad find -# since windows has its own retarded version of find. +# since windows has its own version of find. if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/src" @@ -63,13 +63,13 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean poupdate. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x \ + --keyword=_t --keyword=_x \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java index d18ef1343..f724f71d7 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java +++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java @@ -20,6 +20,8 @@ package org.klomp.snark; +import java.util.Arrays; + /** * Container of a byte array representing set and unset bits. @@ -66,7 +68,7 @@ public class BitField /** * This returns the actual byte array used. Changes to this array - * effect this BitField. Note that some bits at the end of the byte + * affect this BitField. Note that some bits at the end of the byte * array are supposed to be always unset if they represent bits * bigger then the size of the bitfield. */ @@ -105,6 +107,37 @@ public class BitField } } + /** + * Sets the given bit to false. + * + * @exception IndexOutOfBoundsException if bit is smaller then zero + * bigger then size (inclusive). + * @since 0.9.22 + */ + public void clear(int bit) + { + if (bit < 0 || bit >= size) + throw new IndexOutOfBoundsException(Integer.toString(bit)); + int index = bit/8; + int mask = 128 >> (bit % 8); + synchronized(this) { + if ((bitfield[index] & mask) != 0) { + count--; + bitfield[index] &= ~mask; + } + } + } + + /** + * Sets all bits to true. + * + * @since 0.9.21 + */ + public void setAll() { + Arrays.fill(bitfield, (byte) 0xff); + count = size; + } + /** * Return true if the bit is set or false if it is not. * diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java index 057e0780f..18493854d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java @@ -24,6 +24,7 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.ConnectException; import net.i2p.I2PAppContext; import net.i2p.I2PException; @@ -213,6 +214,20 @@ class ConnectionAcceptor implements Runnable } } } + catch (ConnectException ioe) + { + // This is presumed to be due to socket closing by I2PSnarkUtil.disconnect(), + // which does not currently call our halt(), although it should + if (_log.shouldWarn()) + _log.warn("Error while accepting", ioe); + synchronized(this) { + if (!stop) { + locked_halt(); + thread = null; + stop = true; + } + } + } catch (IOException ioe) { int level = stop ? Log.WARN : Log.ERROR; diff --git a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java index 001897764..a711d9a05 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java +++ b/apps/i2psnark/java/src/org/klomp/snark/ExtensionHandler.java @@ -42,7 +42,7 @@ abstract class ExtensionHandler { * @param dht advertise DHT capability * @return bencoded outgoing handshake message */ - public static byte[] getHandshake(int metasize, boolean pexAndMetadata, boolean dht) { + public static byte[] getHandshake(int metasize, boolean pexAndMetadata, boolean dht, boolean uploadOnly) { Map handshake = new HashMap(); Map m = new HashMap(); if (pexAndMetadata) { @@ -59,6 +59,9 @@ abstract class ExtensionHandler { handshake.put("p", Integer.valueOf(TrackerClient.PORT)); handshake.put("v", "I2PSnark"); handshake.put("reqq", Integer.valueOf(5)); + // BEP 21 + if (uploadOnly) + handshake.put("upload_only", Integer.valueOf(1)); return BEncoder.bencode(handshake); } @@ -90,17 +93,20 @@ abstract class ExtensionHandler { peer.setHandshakeMap(map); Map msgmap = map.get("m").getMap(); - if (msgmap.get(TYPE_PEX) != null) { - if (log.shouldLog(Log.DEBUG)) - log.debug("Peer supports PEX extension: " + peer); - // peer state calls peer listener calls sendPEX() - } + if (log.shouldLog(Log.DEBUG)) + log.debug("Peer " + peer + " supports extensions: " + msgmap.keySet()); - if (msgmap.get(TYPE_DHT) != null) { - if (log.shouldLog(Log.DEBUG)) - log.debug("Peer supports DHT extension: " + peer); - // peer state calls peer listener calls sendDHT() - } + //if (msgmap.get(TYPE_PEX) != null) { + // if (log.shouldLog(Log.DEBUG)) + // log.debug("Peer supports PEX extension: " + peer); + // // peer state calls peer listener calls sendPEX() + //} + + //if (msgmap.get(TYPE_DHT) != null) { + // if (log.shouldLog(Log.DEBUG)) + // log.debug("Peer supports DHT extension: " + peer); + // // peer state calls peer listener calls sendDHT() + //} MagnetState state = peer.getMagnetState(); @@ -204,30 +210,31 @@ abstract class ExtensionHandler { if (log.shouldLog(Log.DEBUG)) log.debug("Got request for " + piece + " from: " + peer); byte[] pc; + int totalSize; synchronized(state) { pc = state.getChunk(piece); + totalSize = state.getSize(); } - sendPiece(peer, piece, pc); + sendPiece(peer, piece, pc, totalSize); // Do this here because PeerConnectionOut only reports for PIECE messages peer.uploaded(pc.length); listener.uploaded(peer, pc.length); } else if (type == TYPE_DATA) { - int size = map.get("total_size").getInt(); - if (log.shouldLog(Log.DEBUG)) - log.debug("Got data for " + piece + " length " + size + " from: " + peer); + // On close reading of BEP 9, this is the total metadata size. + // Prior to 0.9.21, we sent the piece size, so we can't count on it. + // just ignore it. The actual length will be verified in saveChunk() + //int size = map.get("total_size").getInt(); + //if (log.shouldLog(Log.DEBUG)) + // log.debug("Got data for " + piece + " length " + size + " from: " + peer); boolean done; int chk = -1; synchronized(state) { if (state.isComplete()) return; int len = is.available(); - if (len != size) { - // probably fatal - if (log.shouldLog(Log.WARN)) - log.warn("total_size " + size + " but avail data " + len); - } peer.downloaded(len); listener.downloaded(peer, len); + // this checks the size done = state.saveChunk(piece, bs, bs.length - len, len); if (log.shouldLog(Log.INFO)) log.info("Got chunk " + piece + " from " + peer); @@ -290,11 +297,15 @@ abstract class ExtensionHandler { } } - private static void sendPiece(Peer peer, int piece, byte[] data) { + private static void sendPiece(Peer peer, int piece, byte[] data, int totalSize) { Map map = new HashMap(); map.put("msg_type", Integer.valueOf(TYPE_DATA)); map.put("piece", Integer.valueOf(piece)); - map.put("total_size", Integer.valueOf(data.length)); + // BEP 9 + // "This key has the same semantics as the 'metadata_size' in the extension header" + // which apparently means the same value. Fixed in 0.9.21. + //map.put("total_size", Integer.valueOf(data.length)); + map.put("total_size", Integer.valueOf(totalSize)); byte[] dict = BEncoder.bencode(map); byte[] payload = new byte[dict.length + data.length]; System.arraycopy(dict, 0, payload, 0, dict.length); diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java index f77f954a1..1bff1a74b 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java +++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java @@ -3,8 +3,8 @@ package org.klomp.snark; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -14,6 +14,7 @@ import java.util.Set; import net.i2p.I2PAppContext; import net.i2p.I2PException; +import net.i2p.client.I2PClient; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; import net.i2p.client.streaming.I2PServerSocket; @@ -74,7 +75,7 @@ public class I2PSnarkUtil { private static final int EEPGET_CONNECT_TIMEOUT_SHORT = 5*1000; public static final int DEFAULT_STARTUP_DELAY = 3; public static final boolean DEFAULT_USE_OPENTRACKERS = true; - public static final int MAX_CONNECTIONS = 16; // per torrent + public static final int MAX_CONNECTIONS = 24; // per torrent public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond"; public static final boolean DEFAULT_USE_DHT = true; public static final String EEPGET_USER_AGENT = "I2PSnark"; @@ -135,6 +136,7 @@ public class I2PSnarkUtil { public boolean configured() { return _configured; } + @SuppressWarnings({"unchecked", "rawtypes"}) public void setI2CPConfig(String i2cpHost, int i2cpPort, Map opts) { if (i2cpHost != null) _i2cpHost = i2cpHost; @@ -255,6 +257,8 @@ public class I2PSnarkUtil { opts.setProperty("i2p.streaming.disableRejectLogging", "true"); if (opts.getProperty("i2p.streaming.answerPings") == null) opts.setProperty("i2p.streaming.answerPings", "false"); + if (opts.getProperty(I2PClient.PROP_SIGTYPE) == null) + opts.setProperty(I2PClient.PROP_SIGTYPE, "EdDSA_SHA512_Ed25519"); _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts); _connecting = false; } @@ -456,7 +460,7 @@ public class I2PSnarkUtil { return null; } - String getOurIPString() { + public String getOurIPString() { Destination dest = getMyDestination(); if (dest != null) return dest.toBase64(); @@ -586,10 +590,10 @@ public class I2PSnarkUtil { */ public boolean isKnownOpenTracker(String url) { try { - URL u = new URL(url); + URI u = new URI(url); String host = u.getHost(); return host != null && SnarkManager.KNOWN_OPENTRACKERS.contains(host); - } catch (MalformedURLException mue) { + } catch (URISyntaxException use) { return false; } } @@ -657,7 +661,7 @@ public class I2PSnarkUtil { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java b/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java index d046a7a0c..1a109654a 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java +++ b/apps/i2psnark/java/src/org/klomp/snark/IdleChecker.java @@ -120,10 +120,10 @@ class IdleChecker extends SimpleTimer2.TimedEvent { Map opts = _util.getI2CPOptions(); String i = opts.get("inbound.quantity"); if (i == null) - i = "3"; + i = Integer.toString(SnarkManager.DEFAULT_TUNNEL_QUANTITY); String o = opts.get("outbound.quantity"); if (o == null) - o = "3"; + o = Integer.toString(SnarkManager.DEFAULT_TUNNEL_QUANTITY); String ib = opts.get("inbound.backupQuantity"); if (ib == null) ib = "0"; diff --git a/apps/i2psnark/java/src/org/klomp/snark/Message.java b/apps/i2psnark/java/src/org/klomp/snark/Message.java index 9f2197d2b..ee07ae9ef 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Message.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Message.java @@ -55,11 +55,13 @@ class Message byte type; // Used for HAVE, REQUEST, PIECE and CANCEL messages. + // Also SUGGEST, REJECT, ALLOWED_FAST // low byte used for EXTENSION message // low two bytes used for PORT message int piece; // Used for REQUEST, PIECE and CANCEL messages. + // Also REJECT int begin; int length; @@ -104,15 +106,18 @@ class Message int datalen = 1; // piece is 4 bytes. - if (type == HAVE || type == REQUEST || type == PIECE || type == CANCEL) + if (type == HAVE || type == REQUEST || type == PIECE || type == CANCEL || + type == SUGGEST || type == REJECT || type == ALLOWED_FAST) datalen += 4; // begin/offset is 4 bytes - if (type == REQUEST || type == PIECE || type == CANCEL) + if (type == REQUEST || type == PIECE || type == CANCEL || + type == REJECT) datalen += 4; // length is 4 bytes - if (type == REQUEST || type == CANCEL) + if (type == REQUEST || type == CANCEL || + type == REJECT) datalen += 4; // msg type is 1 byte @@ -131,15 +136,18 @@ class Message dos.writeByte(type & 0xFF); // Send additional info (piece number) - if (type == HAVE || type == REQUEST || type == PIECE || type == CANCEL) + if (type == HAVE || type == REQUEST || type == PIECE || type == CANCEL || + type == SUGGEST || type == REJECT || type == ALLOWED_FAST) dos.writeInt(piece); // Send additional info (begin/offset) - if (type == REQUEST || type == PIECE || type == CANCEL) + if (type == REQUEST || type == PIECE || type == CANCEL || + type == REJECT) dos.writeInt(begin); // Send additional info (length); for PIECE this is implicit. - if (type == REQUEST || type == CANCEL) + if (type == REQUEST || type == CANCEL || + type == REJECT) dos.writeInt(length); if (type == EXTENSION) @@ -173,21 +181,32 @@ class Message case UNINTERESTED: return "UNINTERESTED"; case HAVE: - return "HAVE(" + piece + ")"; + return "HAVE(" + piece + ')'; case BITFIELD: return "BITFIELD"; case REQUEST: - return "REQUEST(" + piece + "," + begin + "," + length + ")"; + return "REQUEST(" + piece + ',' + begin + ',' + length + ')'; case PIECE: - return "PIECE(" + piece + "," + begin + "," + length + ")"; + return "PIECE(" + piece + ',' + begin + ',' + length + ')'; case CANCEL: - return "CANCEL(" + piece + "," + begin + "," + length + ")"; + return "CANCEL(" + piece + ',' + begin + ',' + length + ')'; case PORT: - return "PORT(" + piece + ")"; + return "PORT(" + piece + ')'; case EXTENSION: return "EXTENSION(" + piece + ',' + data.length + ')'; + // fast extensions below here + case SUGGEST: + return "SUGGEST(" + piece + ')'; + case HAVE_ALL: + return "HAVE_ALL"; + case HAVE_NONE: + return "HAVE_NONE"; + case REJECT: + return "REJECT(" + piece + ',' + begin + ',' + length + ')'; + case ALLOWED_FAST: + return "ALLOWED_FAST(" + piece + ')'; default: - return ""; + return "UNKNOWN (" + type + ')'; } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java index 543753331..a40a68f8d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java @@ -74,10 +74,11 @@ public class MetaInfo * @param files null for single-file torrent * @param lengths null for single-file torrent * @param announce_list may be null + * @param created_by may be null */ MetaInfo(String announce, String name, String name_utf8, List> files, List lengths, int piece_length, byte[] piece_hashes, long length, boolean privateTorrent, - List> announce_list) + List> announce_list, String created_by) { this.announce = announce; this.name = name; @@ -91,7 +92,7 @@ public class MetaInfo this.privateTorrent = privateTorrent; this.announce_list = announce_list; this.comment = null; - this.created_by = null; + this.created_by = created_by; this.creation_date = I2PAppContext.getGlobalContext().clock().now(); // TODO if we add a parameter for other keys diff --git a/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java b/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java index bcf0aefd0..6cf35836d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PartialPiece.java @@ -108,7 +108,8 @@ class PartialPiece implements Comparable { /** * Convert this PartialPiece to a request for the next chunk. - * Used by PeerState only. + * Used by PeerState only. This depends on the downloaded value + * as set by setDownloaded() or read(). */ public Request getRequest() { @@ -128,14 +129,16 @@ class PartialPiece implements Comparable { } /** - * How many bytes are good - only valid by setDownloaded() + * How many bytes are good - as set by setDownloaded() or read() */ public int getDownloaded() { return this.off; } /** - * Call this before returning a PartialPiece to the PeerCoordinator + * Call this if necessary before returning a PartialPiece to the PeerCoordinator. + * We do not use a bitmap to track individual chunks received. + * Any chunks after a 'hole' will be lost. * @since 0.9.1 */ public void setDownloaded(int offset) { @@ -191,11 +194,20 @@ class PartialPiece implements Comparable { /** * Blocking. + * If offset matches the previous downloaded amount + * (as set by a previous call to read() or setDownlaoded()), + * the downloaded amount will be incremented by len. + * * @since 0.9.1 */ - public void read(DataInputStream din, int off, int len) throws IOException { + public void read(DataInputStream din, int offset, int len) throws IOException { if (bs != null) { - din.readFully(bs, off, len); + din.readFully(bs, offset, len); + synchronized (this) { + // only works for in-order chunks + if (this.off == offset) + this.off += len; + } } else { // read in fully before synching on raf ByteArray ba; @@ -211,8 +223,11 @@ class PartialPiece implements Comparable { synchronized (this) { if (raf == null) createTemp(); - raf.seek(off); + raf.seek(offset); raf.write(tmp); + // only works for in-order chunks + if (this.off == offset) + this.off += len; } if (ba != null) _cache.release(ba, false); diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index a7c4f4127..68258022e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -62,7 +62,7 @@ public class Peer implements Comparable // Keeps state for in/out connections. Non-null when the handshake // was successful, the connection setup and runs - PeerState state; + volatile PeerState state; /** shared across all peers on this torrent */ MagnetState magnetState; @@ -79,15 +79,15 @@ public class Peer implements Comparable private long uploaded_old[] = {-1,-1,-1}; private long downloaded_old[] = {-1,-1,-1}; - // bytes per bt spec: 0011223344556677 - static final long OPTION_EXTENSION = 0x0000000000100000l; - static final long OPTION_FAST = 0x0000000000000004l; - static final long OPTION_DHT = 0x0000000000000001l; + // bytes per bt spec: 0011223344556677 + private static final long OPTION_EXTENSION = 0x0000000000100000l; + private static final long OPTION_FAST = 0x0000000000000004l; + //private static final long OPTION_DHT = 0x0000000000000001l; /** we use a different bit since the compact format is different */ /* no, let's use an extension message static final long OPTION_I2P_DHT = 0x0000000040000000l; */ - static final long OPTION_AZMP = 0x1000000000000000l; + //private static final long OPTION_AZMP = 0x1000000000000000l; private long options; /** @@ -217,9 +217,11 @@ public class Peer implements Comparable * * If the given BitField is non-null it is send to the peer as first * message. + * + * @param uploadOnly if we are complete with skipped files, i.e. a partial seed */ - public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, MagnetState mState) - { + public void runConnection(I2PSnarkUtil util, PeerListener listener, BitField bitfield, + MagnetState mState, boolean uploadOnly) { if (state != null) throw new IllegalStateException("Peer already started"); @@ -275,17 +277,9 @@ public class Peer implements Comparable int metasize = metainfo != null ? metainfo.getInfoBytes().length : -1; boolean pexAndMetadata = metainfo == null || !metainfo.isPrivate(); boolean dht = util.getDHT() != null; - out.sendExtension(0, ExtensionHandler.getHandshake(metasize, pexAndMetadata, dht)); + out.sendExtension(0, ExtensionHandler.getHandshake(metasize, pexAndMetadata, dht, uploadOnly)); } - // Old DHT PORT message - //if ((options & OPTION_I2P_DHT) != 0 && util.getDHT() != null) { - // if (_log.shouldLog(Log.DEBUG)) - // _log.debug("Peer supports DHT, sending PORT message"); - // int port = util.getDHT().getPort(); - // out.sendPort(port); - //} - // Send our bitmap if (bitfield != null) s.out.sendBitfield(bitfield); @@ -297,7 +291,7 @@ public class Peer implements Comparable if (_log.shouldLog(Log.DEBUG)) _log.debug("Start running the reader with " + toString()); - // Use this thread for running the incomming connection. + // Use this thread for running the incoming connection. // The outgoing connection creates its own Thread. out.startup(); Thread.currentThread().setName("Snark reader from " + peerID); @@ -338,6 +332,9 @@ public class Peer implements Comparable dout.write("BitTorrent protocol".getBytes("UTF-8")); // Handshake write - options long myOptions = OPTION_EXTENSION; + // we can't handle HAVE_ALL or HAVE_NONE if we don't know the number of pieces + if (metainfo != null) + myOptions |= OPTION_FAST; // FIXME get util here somehow //if (util.getDHT() != null) // myOptions |= OPTION_I2P_DHT; @@ -385,15 +382,15 @@ public class Peer implements Comparable if (options != 0) { // send them something in runConnection() above if (_log.shouldLog(Log.DEBUG)) - _log.debug("Peer supports options 0x" + Long.toString(options, 16) + ": " + toString()); + _log.debug("Peer supports options 0x" + Long.toHexString(options) + ": " + toString()); } return bs; } - /** @since 0.8.4 */ - public long getOptions() { - return options; + /** @since 0.9.21 */ + public boolean supportsFast() { + return (options & OPTION_FAST) != 0; } /** @since 0.8.4 */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java index 430f6c7ae..c2abf6660 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java @@ -267,7 +267,23 @@ class PeerCheckerTask implements Runnable // close out unused files, but we don't need to do it every time Storage storage = coordinator.getStorage(); - if (storage != null && (_runCount % 4) == 0) { + if (storage != null) { + // The more files a torrent has, the more often we call the cleaner, + // to keep from running out of FDs + int files = storage.getFileCount(); + int skip; + if (files == 1) + skip = 6; + else if (files <= 4) + skip = 4; + else if (files <= 20) + skip = 3; + else if (files <= 50) + skip = 2; + else + skip = 1; + + if ((_runCount % skip) == 0) storage.cleanRAFs(); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java index 32ed0473c..da1b94333 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java @@ -39,7 +39,7 @@ class PeerConnectionIn implements Runnable private static final int MAX_MSG_SIZE = Math.max(PeerState.PARTSIZE + 9, MagnetState.CHUNK_SIZE + 100); // 100 for the ext msg dictionary - private Thread thread; + private volatile Thread thread; private volatile boolean quit; long lastRcvd; @@ -75,9 +75,12 @@ class PeerConnectionIn implements Runnable thread = Thread.currentThread(); try { - PeerState ps = peer.state; - while (!quit && ps != null) + while (!quit) { + final PeerState ps = peer.state; + if (ps == null) + break; + // Common variables used for some messages. int piece; int begin; @@ -91,59 +94,64 @@ class PeerConnectionIn implements Runnable if (i == 0) { - ps.keepAliveMessage(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received keepalive from " + peer); + ps.keepAliveMessage(); continue; } byte b = din.readByte(); - Message m = new Message(); - m.type = b; switch (b) { - case 0: - ps.chokeMessage(true); + case Message.CHOKE: if (_log.shouldLog(Log.DEBUG)) _log.debug("Received choke from " + peer); + ps.chokeMessage(true); break; - case 1: - ps.chokeMessage(false); + + case Message.UNCHOKE: if (_log.shouldLog(Log.DEBUG)) _log.debug("Received unchoke from " + peer); + ps.chokeMessage(false); break; - case 2: - ps.interestedMessage(true); + + case Message.INTERESTED: if (_log.shouldLog(Log.DEBUG)) _log.debug("Received interested from " + peer); + ps.interestedMessage(true); break; - case 3: - ps.interestedMessage(false); + + case Message.UNINTERESTED: if (_log.shouldLog(Log.DEBUG)) _log.debug("Received not interested from " + peer); + ps.interestedMessage(false); break; - case 4: + + case Message.HAVE: piece = din.readInt(); - ps.haveMessage(piece); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received havePiece(" + piece + ") from " + peer); + ps.haveMessage(piece); break; - case 5: + + case Message.BITFIELD: byte[] bitmap = new byte[i-1]; din.readFully(bitmap); - ps.bitfieldMessage(bitmap); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received bitmap from " + peer + ": size=" + (i-1) /* + ": " + ps.bitfield */ ); + ps.bitfieldMessage(bitmap); break; - case 6: + + case Message.REQUEST: piece = din.readInt(); begin = din.readInt(); len = din.readInt(); - ps.requestMessage(piece, begin, len); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received request(" + piece + "," + begin + ") from " + peer); + ps.requestMessage(piece, begin, len); break; - case 7: + + case Message.PIECE: piece = din.readInt(); begin = din.readInt(); len = i-9; @@ -151,9 +159,9 @@ class PeerConnectionIn implements Runnable if (req != null) { req.read(din); - ps.pieceMessage(req); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received data(" + piece + "," + begin + ") from " + peer); + ps.pieceMessage(req); } else { @@ -165,21 +173,24 @@ class PeerConnectionIn implements Runnable _log.debug("Received UNWANTED data(" + piece + "," + begin + ") from " + peer); } break; - case 8: + + case Message.CANCEL: piece = din.readInt(); begin = din.readInt(); len = din.readInt(); - ps.cancelMessage(piece, begin, len); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received cancel(" + piece + "," + begin + ") from " + peer); + ps.cancelMessage(piece, begin, len); break; - case 9: // PORT message + + case Message.PORT: int port = din.readUnsignedShort(); - ps.portMessage(port); if (_log.shouldLog(Log.DEBUG)) _log.debug("Received port message from " + peer); + ps.portMessage(port); break; - case 20: // Extension message + + case Message.EXTENSION: int id = din.readUnsignedByte(); byte[] payload = new byte[i-2]; din.readFully(payload); @@ -187,6 +198,43 @@ class PeerConnectionIn implements Runnable _log.debug("Received extension message from " + peer); ps.extensionMessage(id, payload); break; + + // fast extensions below here + case Message.SUGGEST: + piece = din.readInt(); + ps.suggestMessage(piece); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received suggest(" + piece + ") from " + peer); + break; + + case Message.HAVE_ALL: + ps.haveMessage(true); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received have_all from " + peer); + break; + + case Message.HAVE_NONE: + ps.haveMessage(false); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received have_none from " + peer); + break; + + case Message.REJECT: + piece = din.readInt(); + begin = din.readInt(); + len = din.readInt(); + ps.rejectMessage(piece, begin, len); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received reject(" + piece + ',' + begin + ',' + len + ") from " + peer); + break; + + case Message.ALLOWED_FAST: + piece = din.readInt(); + ps.allowedFastMessage(piece); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received allowed_fast(" + piece + ") from " + peer); + break; + default: byte[] bs = new byte[i-1]; din.readFully(bs); @@ -202,11 +250,9 @@ class PeerConnectionIn implements Runnable if (_log.shouldLog(Log.INFO)) _log.info("IOError talking with " + peer, ioe); } - catch (Throwable t) + catch (RuntimeException t) { _log.error("Error talking with " + peer, t); - if (t instanceof OutOfMemoryError) - throw (OutOfMemoryError)t; } finally { diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java index b878c3b79..314b534bc 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java @@ -22,9 +22,10 @@ package org.klomp.snark; import java.io.DataOutputStream; import java.io.IOException; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicLong; import net.i2p.I2PAppContext; @@ -42,7 +43,7 @@ class PeerConnectionOut implements Runnable private boolean quit; // Contains Messages. - private final List sendQueue = new ArrayList(); + private final BlockingQueue sendQueue = new LinkedBlockingQueue(); private static final AtomicLong __id = new AtomicLong(); private final long _id; @@ -124,6 +125,16 @@ class PeerConnectionOut implements Runnable if (state.choking) { it.remove(); //SimpleTimer.getInstance().removeEvent(nm.expireEvent); + if (peer.supportsFast()) { + Message r = new Message(); + r.type = Message.REJECT; + r.piece = nm.piece; + r.begin = nm.begin; + r.length = nm.length; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Send " + peer + ": " + r); + r.sendMessage(dout); + } } nm = null; } @@ -141,8 +152,8 @@ class PeerConnectionOut implements Runnable it.remove(); } } - if (m == null && !sendQueue.isEmpty()) { - m = sendQueue.remove(0); + if (m == null) { + m = sendQueue.poll(); //SimpleTimer.getInstance().removeEvent(m.expireEvent); } } @@ -159,6 +170,8 @@ class PeerConnectionOut implements Runnable lastSent = System.currentTimeMillis(); // Remove all piece messages after sending a choke message. + // FiXME this causes REJECT messages to be sent before sending the CHOKE; + // BEP 6 recommends sending them after. if (m.type == Message.CHOKE) removeMessage(Message.PIECE); @@ -233,7 +246,7 @@ class PeerConnectionOut implements Runnable { synchronized(sendQueue) { - sendQueue.add(m); + sendQueue.offer(m); sendQueue.notifyAll(); } } @@ -277,11 +290,22 @@ class PeerConnectionOut implements Runnable while (it.hasNext()) { Message m = it.next(); - if (m.type == type) - { + if (m.type == type) { it.remove(); removed = true; - } + if (type == Message.PIECE && peer.supportsFast()) { + Message r = new Message(); + r.type = Message.REJECT; + r.piece = m.piece; + r.begin = m.begin; + r.length = m.length; + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Send " + peer + ": " + r); + try { + r.sendMessage(dout); + } catch (IOException ioe) {} + } + } } sendQueue.notifyAll(); } @@ -296,7 +320,7 @@ class PeerConnectionOut implements Runnable synchronized(sendQueue) { if(sendQueue.isEmpty()) - sendQueue.add(m); + sendQueue.offer(m); sendQueue.notifyAll(); } } @@ -349,12 +373,19 @@ class PeerConnectionOut implements Runnable void sendBitfield(BitField bitfield) { - Message m = new Message(); - m.type = Message.BITFIELD; - m.data = bitfield.getFieldBytes(); - m.off = 0; - m.len = m.data.length; - addMessage(m); + boolean fast = peer.supportsFast(); + if (fast && bitfield.complete()) { + sendHaveAll(); + } else if (fast && bitfield.count() <= 0) { + sendHaveNone(); + } else { + Message m = new Message(); + m.type = Message.BITFIELD; + m.data = bitfield.getFieldBytes(); + m.off = 0; + m.len = m.data.length; + addMessage(m); + } } /** reransmit requests not received in 7m */ @@ -509,7 +540,8 @@ class PeerConnectionOut implements Runnable } /** - * Remove all Request messages from the queue + * Remove all Request messages from the queue. + * Does not send a cancel message. * @since 0.8.2 */ void cancelRequestMessages() { @@ -521,9 +553,12 @@ class PeerConnectionOut implements Runnable } } - // Called by the PeerState when the other side doesn't want this - // request to be handled anymore. Removes any pending Piece Message - // from out send queue. + /** + * Called by the PeerState when the other side doesn't want this + * request to be handled anymore. Removes any pending Piece Message + * from out send queue. + * Does not send a cancel message. + */ void cancelRequest(int piece, int begin, int length) { synchronized (sendQueue) @@ -559,4 +594,50 @@ class PeerConnectionOut implements Runnable m.piece = port; addMessage(m); } + + /** + * Unused + * @since 0.9.21 + */ + void sendSuggest(int piece) { + Message m = new Message(); + m.type = Message.SUGGEST; + m.piece = piece; + addMessage(m); + } + + /** @since 0.9.21 */ + private void sendHaveAll() { + Message m = new Message(); + m.type = Message.HAVE_ALL; + addMessage(m); + } + + /** @since 0.9.21 */ + private void sendHaveNone() { + Message m = new Message(); + m.type = Message.HAVE_NONE; + addMessage(m); + } + + /** @since 0.9.21 */ + void sendReject(int piece, int begin, int length) { + Message m = new Message(); + m.type = Message.REJECT; + m.piece = piece; + m.begin = begin; + m.length = length; + addMessage(m); + } + + /** + * Unused + * @since 0.9.21 + */ + void sendAllowedFast(int piece) { + Message m = new Message(); + m.type = Message.ALLOWED_FAST; + m.piece = piece; + addMessage(m); + } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index e6014becd..2542f8aa8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.atomic.AtomicLong; import net.i2p.I2PAppContext; import net.i2p.data.ByteArray; @@ -69,7 +70,7 @@ class PeerCoordinator implements PeerListener // package local for access by CheckDownLoadersTask final static long CHECK_PERIOD = 40*1000; // 40 seconds - final static int MAX_UPLOADERS = 6; + final static int MAX_UPLOADERS = 8; public static final long MAX_INACTIVE = 8*60*1000; /** @@ -87,8 +88,8 @@ class PeerCoordinator implements PeerListener // final static int MAX_DOWNLOADERS = MAX_CONNECTIONS; // int downloaders = 0; - private long uploaded; - private long downloaded; + private final AtomicLong uploaded = new AtomicLong(); + private final AtomicLong downloaded = new AtomicLong(); final static int RATE_DEPTH = 3; // make following arrays RATE_DEPTH long private final long uploaded_old[] = {-1,-1,-1}; private final long downloaded_old[] = {-1,-1,-1}; @@ -279,7 +280,7 @@ class PeerCoordinator implements PeerListener */ public long getUploaded() { - return uploaded; + return uploaded.get(); } /** @@ -287,7 +288,7 @@ class PeerCoordinator implements PeerListener * @since 0.9.15 */ public void setUploaded(long up) { - uploaded = up; + uploaded.set(up); } /** @@ -295,7 +296,7 @@ class PeerCoordinator implements PeerListener */ public long getDownloaded() { - return downloaded; + return downloaded.get(); } /** @@ -321,16 +322,22 @@ class PeerCoordinator implements PeerListener */ public long getDownloadRate() { + if (halted) + return 0; return getRate(downloaded_old); } public long getUploadRate() { + if (halted) + return 0; return getRate(uploaded_old); } public long getCurrentUploadRate() { + if (halted) + return 0; // no need to synchronize, only one value long r = uploaded_old[0]; if (r <= 0) @@ -396,7 +403,7 @@ class PeerCoordinator implements PeerListener * Formerly used to * reduce max if huge pieces to keep from ooming when leeching * but now we don't - * @return usually 16 + * @return usually I2PSnarkUtil.MAX_CONNECTIONS */ private int getMaxConnections() { if (metainfo == null) @@ -597,11 +604,13 @@ class PeerCoordinator implements PeerListener bitfield = storage.getBitField(); else bitfield = null; + // if we aren't a seed but we don't want any more + final boolean partialComplete = wantedBytes == 0 && bitfield != null && !bitfield.complete(); Runnable r = new Runnable() { public void run() { - peer.runConnection(_util, listener, bitfield, magnetState); + peer.runConnection(_util, listener, bitfield, magnetState, partialComplete); } }; String threadName = "Snark peer " + peer.toString(); @@ -913,6 +922,7 @@ class PeerCoordinator implements PeerListener * Returns a byte array containing the requested piece or null of * the piece is unknown. * + * @return bytes or null for errors such as not having the piece yet * @throws RuntimeException on IOE getting the data */ public ByteArray gotRequest(Peer peer, int piece, int off, int len) @@ -944,7 +954,7 @@ class PeerCoordinator implements PeerListener */ public void uploaded(Peer peer, int size) { - uploaded += size; + uploaded.addAndGet(size); //if (listener != null) // listener.peerChange(this, peer); @@ -955,7 +965,7 @@ class PeerCoordinator implements PeerListener */ public void downloaded(Peer peer, int size) { - downloaded += size; + downloaded.addAndGet(size); //if (listener != null) // listener.peerChange(this, peer); @@ -976,8 +986,9 @@ class PeerCoordinator implements PeerListener } int piece = pp.getPiece(); - synchronized(wantedPieces) - { + // try/catch outside the synch to avoid deadlock in the catch + try { + synchronized(wantedPieces) { Piece p = new Piece(piece); if (!wantedPieces.contains(p)) { @@ -993,8 +1004,7 @@ class PeerCoordinator implements PeerListener } } - try - { + // try/catch moved outside of synch // this takes forever if complete, as it rechecks if (storage.putPiece(pp)) { @@ -1003,26 +1013,38 @@ class PeerCoordinator implements PeerListener } else { + // so we will try again + markUnrequested(peer, piece); + // just in case + removePartialPiece(piece); // Oops. We didn't actually download this then... :( - downloaded -= metainfo.getPieceLength(piece); - _log.warn("Got BAD piece " + piece + "/" + metainfo.getPieces() + " from " + peer + " for " + metainfo.getName()); + downloaded.addAndGet(0 - metainfo.getPieceLength(piece)); + // Mark this peer as not having the piece. PeerState will update its bitfield. + for (Piece pc : wantedPieces) { + if (pc.getId() == piece) { + pc.removePeer(peer); + break; + } + } + if (_log.shouldWarn()) + _log.warn("Got BAD piece " + piece + "/" + metainfo.getPieces() + " from " + peer + " for " + metainfo.getName()); return false; // No need to announce BAD piece to peers. } - } - catch (IOException ioe) - { + + wantedPieces.remove(p); + wantedBytes -= metainfo.getPieceLength(p.getId()); + } // synch + } catch (IOException ioe) { String msg = "Error writing storage (piece " + piece + ") for " + metainfo.getName() + ": " + ioe; _log.error(msg, ioe); if (listener != null) { listener.addMessage(msg); listener.addMessage("Fatal storage error: Stopping torrent " + metainfo.getName()); } + // deadlock was here snark.stopTorrent(); throw new RuntimeException(msg, ioe); - } - wantedPieces.remove(p); - wantedBytes -= metainfo.getPieceLength(p.getId()); - } + } // just in case removePartialPiece(piece); @@ -1134,8 +1156,9 @@ class PeerCoordinator implements PeerListener * * Also mark the piece unrequested if this peer was the only one. * - * @param peer partials, must include the zero-offset (empty) ones too - * No dup pieces, piece.setDownloaded() must be set + * @param peer partials, must include the zero-offset (empty) ones too. + * No dup pieces, piece.setDownloaded() must be set. + * len field in Requests is ignored. * @since 0.8.2 */ public void savePartialPieces(Peer peer, List partials) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index cf295a530..23cbe5690 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -21,6 +21,7 @@ package org.klomp.snark; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -155,12 +156,25 @@ class PeerState implements DataLoader setInteresting(true); } - void bitfieldMessage(byte[] bitmap) - { - synchronized(this) - { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(peer + " rcv bitfield"); + void bitfieldMessage(byte[] bitmap) { + bitfieldMessage(bitmap, false); + } + + /** + * @param bitmap null to use the isAll param + * @param isAll only if bitmap == null: true for have_all, false for have_none + * @since 0.9.21 + */ + private void bitfieldMessage(byte[] bitmap, boolean isAll) { + if (_log.shouldLog(Log.DEBUG)) { + if (bitmap != null) + _log.debug(peer + " rcv bitfield bytes: " + bitmap.length); + else if (isAll) + _log.debug(peer + " rcv bitfield HAVE_ALL"); + else + _log.debug(peer + " rcv bitfield HAVE_NONE"); + } + synchronized(this) { if (bitfield != null) { // XXX - Be liberal in what you accept? @@ -172,10 +186,24 @@ class PeerState implements DataLoader // XXX - Check for weird bitfield and disconnect? // FIXME will have to regenerate the bitfield after we know exactly // how many pieces there are, as we don't know how many spare bits there are. - if (metainfo == null) - bitfield = new BitField(bitmap, bitmap.length * 8); - else - bitfield = new BitField(bitmap, metainfo.getPieces()); + if (metainfo == null) { + if (bitmap != null) { + bitfield = new BitField(bitmap, bitmap.length * 8); + } else { + // we can't handle this situation + if (_log.shouldLog(Log.WARN)) + _log.warn("have_x w/o metainfo: " + isAll); + return; + } + } else { + if (bitmap != null) { + bitfield = new BitField(bitmap, metainfo.getPieces()); + } else { + bitfield = new BitField(metainfo.getPieces()); + if (isAll) + bitfield.setAll(); + } + } } if (metainfo == null) return; @@ -198,14 +226,21 @@ class PeerState implements DataLoader + piece + ", " + begin + ", " + length + ") "); if (metainfo == null) return; - if (choking) - { - if (_log.shouldLog(Log.INFO)) - _log.info("Request received, but choking " + peer); + if (choking) { + if (peer.supportsFast()) { + if (_log.shouldInfo()) + _log.info("Request received, sending reject to choked " + peer); + out.sendReject(piece, begin, length); + } else { + if (_log.shouldInfo()) + _log.info("Request received, but choking " + peer); + } return; - } + } // Sanity check + // There is no check here that we actually have the piece; + // this will be caught in loadData() below if (piece < 0 || piece >= metainfo.getPieces() || begin < 0 @@ -219,6 +254,8 @@ class PeerState implements DataLoader + ", " + begin + ", " + length + "' message from " + peer); + if (peer.supportsFast()) + out.sendReject(piece, begin, length); return; } @@ -227,8 +264,14 @@ class PeerState implements DataLoader // Todo: limit number of requests also? (robert 64 x 4KB) if (out.queuedBytes() + length > MAX_PIPELINE_BYTES) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Discarding request over pipeline limit from " + peer); + if (peer.supportsFast()) { + if (_log.shouldWarn()) + _log.warn("Rejecting request over pipeline limit from " + peer); + out.sendReject(piece, begin, length); + } else { + if (_log.shouldWarn()) + _log.warn("Discarding request over pipeline limit from " + peer); + } return; } @@ -243,7 +286,8 @@ class PeerState implements DataLoader /** * This is the callback that PeerConnectionOut calls * - * @return bytes or null for errors + * @return bytes or null for errors such as not having the piece yet + * @throws RuntimeException on IOE getting the data * @since 0.8.2 */ public ByteArray loadData(int piece, int begin, int length) { @@ -253,6 +297,8 @@ class PeerState implements DataLoader // XXX - Protocol error-> diconnect? if (_log.shouldLog(Log.WARN)) _log.warn("Got request for unknown piece: " + piece); + if (peer.supportsFast()) + out.sendReject(piece, begin, length); return null; } @@ -265,6 +311,8 @@ class PeerState implements DataLoader + ", " + begin + ", " + length + "' message from " + peer); + if (peer.supportsFast()) + out.sendReject(piece, begin, length); return null; } @@ -322,6 +370,11 @@ class PeerState implements DataLoader { if (_log.shouldLog(Log.WARN)) _log.warn("Got BAD " + req.getPiece() + " from " + peer); + synchronized(this) { + // so we don't ask again + if (bitfield != null) + bitfield.clear(req.getPiece()); + } } } @@ -455,7 +508,12 @@ class PeerState implements DataLoader for (Integer p : pcs) { Request req = getLowestOutstandingRequest(p.intValue()); if (req != null) { - req.getPartialPiece().setDownloaded(req.off); + PartialPiece pp = req.getPartialPiece(); + synchronized(pp) { + int dl = pp.getDownloaded(); + if (req.off != dl) + req = new Request(pp, dl, 1); + } rv.add(req); } } @@ -536,6 +594,89 @@ class PeerState implements DataLoader listener.gotPort(peer, port, port + 1); } + /////////// fast message handlers ///////// + + /** + * BEP 6 + * Treated as "have" for now + * @since 0.9.21 + */ + void suggestMessage(int piece) { + if (_log.shouldInfo()) + _log.info("Handling suggest as have(" + piece + ") from " + peer); + haveMessage(piece); + } + + /** + * BEP 6 + * @param isAll true for have_all, false for have_none + * @since 0.9.21 + */ + void haveMessage(boolean isAll) { + bitfieldMessage(null, isAll); + } + + /** + * BEP 6 + * If the peer rejects lower chunks but not higher ones, thus creating holes, + * we won't figure it out and the piece will fail, since we don't currently + * keep a chunk bitmap in PartialPiece. + * As long as the peer rejects all the chunks, or rejects only the last chunks, + * no holes are created and we will be fine. The reject messages may be in any order, + * just don't make a hole when it's over. + * + * @since 0.9.21 + */ + void rejectMessage(int piece, int begin, int length) { + if (_log.shouldInfo()) + _log.info("Got reject(" + piece + ',' + begin + ',' + length + ") from " + peer); + out.cancelRequest(piece, begin, length); + synchronized(this) { + Request deletedRequest = null; + // for this piece only + boolean haveMoreRequests = false; + for (Iterator iter = outstandingRequests.iterator(); iter.hasNext(); ) { + Request req = iter.next(); + if (req.getPiece() == piece) { + if (req.off == begin && req.len == length) { + iter.remove(); + deletedRequest = req; + } else { + haveMoreRequests = true; + } + } + } + if (deletedRequest != null && !haveMoreRequests) { + // We must return the piece to the coordinator + // Create a new fake request so we can set the offset correctly + PartialPiece pp = deletedRequest.getPartialPiece(); + int downloaded = pp.getDownloaded(); + Request req; + if (deletedRequest.off == downloaded) + req = deletedRequest; + else + req = new Request(pp, downloaded, 1); + List pcs = Collections.singletonList(req); + listener.savePartialPieces(this.peer, pcs); + if (_log.shouldWarn()) + _log.warn("Returned to coord. w/ offset " + pp.getDownloaded() + " due to reject(" + piece + ',' + begin + ',' + length + ") from " + peer); + } + if (lastRequest != null && lastRequest.getPiece() == piece && + lastRequest.off == begin && lastRequest.len == length) + lastRequest = null; + } + } + + /** + * BEP 6 + * Ignored for now + * @since 0.9.21 + */ + void allowedFastMessage(int piece) { + if (_log.shouldInfo()) + _log.info("Ignoring allowed_fast(" + piece + ") from " + peer); + } + void unknownMessage(int type, byte[] bs) { if (_log.shouldLog(Log.WARN)) @@ -543,6 +684,8 @@ class PeerState implements DataLoader + " length: " + bs.length); } + /////////// end message handlers ///////// + /** * We now have this piece. * Tell the peer and cancel any requests for the piece. diff --git a/apps/i2psnark/java/src/org/klomp/snark/Request.java b/apps/i2psnark/java/src/org/klomp/snark/Request.java index d6a621b1f..fddbb2b53 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Request.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Request.java @@ -43,13 +43,13 @@ class Request */ Request(PartialPiece piece, int off, int len) { - // Sanity check - if (off < 0 || len <= 0 || off + len > piece.getLength()) - throw new IndexOutOfBoundsException("Illegal Request " + toString()); - this.piece = piece; this.off = off; this.len = len; + + // Sanity check + if (off < 0 || len <= 0 || off + len > piece.getLength()) + throw new IndexOutOfBoundsException("Illegal Request " + toString()); } /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index d5d5be1f8..78e3b33e9 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -290,6 +290,7 @@ public class Snark /** * multitorrent + * @throws RuntimeException via fatal() */ public Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, StorageListener slistener, CoordinatorListener clistener, @@ -304,6 +305,7 @@ public class Snark * multitorrent * * @param baseFile if null, use rootDir/torrentName; if non-null, use it instead + * @throws RuntimeException via fatal() * @since 0.9.11 */ public Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, @@ -478,6 +480,7 @@ public class Snark * @param torrent a fake name for now (not a file name) * @param ih 20-byte info hash * @param trackerURL may be null + * @throws RuntimeException via fatal() * @since 0.8.4 */ public Snark(I2PSnarkUtil util, String torrent, byte[] ih, String trackerURL, @@ -531,6 +534,8 @@ public class Snark /** * Start up contacting peers and querying the tracker. * Blocks if tunnel is not yet open. + * + * @throws RuntimeException via fatal() */ public synchronized void startTorrent() { starting = true; @@ -612,7 +617,6 @@ public class Snark * @since 0.9.1 */ public synchronized void stopTorrent(boolean fast) { - stopped = true; TrackerClient tc = trackerclient; if (tc != null) tc.halt(fast); @@ -620,17 +624,28 @@ public class Snark if (pc != null) pc.halt(); Storage st = storage; + if (!fast) + // HACK: Needed a way to distinguish between user-stop and + // shutdown-stop. stopTorrent(true) is in stopAllTorrents(). + // (#766) + stopped = true; if (st != null) { - boolean changed = storage.isChanged() || getUploaded() != savedUploaded; + // TODO: Cache the config-in-mem to compare vs config-on-disk + // (needed for auto-save to not double-save in some cases) + //boolean changed = storage.isChanged() || getUploaded() != savedUploaded; + boolean changed = true; + if (changed && completeListener != null) + completeListener.updateStatus(this); try { storage.close(); } catch (IOException ioe) { System.out.println("Error closing " + torrent); ioe.printStackTrace(); } - if (changed && completeListener != null) - completeListener.updateStatus(this); } + if (fast) + // HACK: See above if(!fast) + stopped = true; if (pc != null && _peerCoordinatorSet != null) _peerCoordinatorSet.remove(pc); if (_peerCoordinatorSet == null) @@ -730,6 +745,18 @@ public class Snark return storage != null && storage.isChecking(); } + /** + * If checking is in progress, return completion 0.0 ... 1.0, + * else return 1.0. + * @since 0.9.23 + */ + public double getCheckingProgress() { + if (storage != null && storage.isChecking()) + return storage.getCheckingProgress(); + else + return 1.0d; + } + /** * Disk allocation (ballooning) in progress. * @since 0.9.3 @@ -884,6 +911,30 @@ public class Snark return -1; } + /** + * Bytes not received and set to skipped. + * This is not the same as the total of all skipped files, + * since pieces may span multiple files. + * + * @return exact value. or 0 if no storage yet. + * @since 0.9.24 + */ + public long getSkippedLength() { + PeerCoordinator coord = coordinator; + if (coord != null) { + // fast way + long r = getRemainingLength(); + if (r <= 0) + return 0; + long n = coord.getNeededLength(); + return r - n; + } else if (storage != null) { + // slow way + return storage.getSkippedLength(); + } + return 0; + } + /** * Does not account (i.e. includes) for skipped files. * @return number of pieces still needed (magnet mode or not), or -1 if unknown @@ -1249,7 +1300,8 @@ public class Snark public void setWantedPieces(Storage storage) { - coordinator.setWantedPieces(); + if (coordinator != null) + coordinator.setWantedPieces(); } ///////////// End StorageListener methods @@ -1258,7 +1310,7 @@ public class Snark /** SnarkSnutdown callback unused */ public void shutdown() { - // Should not be necessary since all non-deamon threads should + // Should not be necessary since all non-daemon threads should // have died. But in reality this does not always happen. //System.exit(0); } @@ -1277,7 +1329,7 @@ public class Snark * coordinatorListener */ final static int MIN_TOTAL_UPLOADERS = 4; - final static int MAX_TOTAL_UPLOADERS = 10; + final static int MAX_TOTAL_UPLOADERS = 20; public boolean overUploadLimit(int uploaders) { if (_peerCoordinatorSet == null || uploaders <= 0) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index b9370439c..aa463d94d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -8,6 +8,7 @@ import java.io.FilenameFilter; import java.io.IOException; import java.io.OutputStream; import java.io.Serializable; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -89,12 +90,19 @@ public class SnarkManager implements CompleteListener { public static final String PROP_UPBW_MAX = "i2psnark.upbw.max"; public static final String PROP_DIR = "i2psnark.dir"; private static final String PROP_META_PREFIX = "i2psnark.zmeta."; + private static final String PROP_META_RUNNING = "running"; private static final String PROP_META_STAMP = "stamp"; private static final String PROP_META_BASE = "base"; private static final String PROP_META_BITFIELD = "bitfield"; private static final String PROP_META_PRIORITY = "priority"; private static final String PROP_META_PRESERVE_NAMES = "preserveFileNames"; private static final String PROP_META_UPLOADED = "uploaded"; + private static final String PROP_META_ADDED = "added"; + private static final String PROP_META_COMPLETED = "completed"; + private static final String PROP_META_MAGNET = "magnet"; + private static final String PROP_META_MAGNET_DN = "magnet_dn"; + private static final String PROP_META_MAGNET_TR = "magnet_tr"; + private static final String PROP_META_MAGNET_DIR = "magnet_dir"; //private static final String PROP_META_BITFIELD_SUFFIX = ".bitfield"; //private static final String PROP_META_PRIORITY_SUFFIX = ".priority"; private static final String PROP_META_MAGNET_PREFIX = "i2psnark.magnet."; @@ -118,12 +126,14 @@ public class SnarkManager implements CompleteListener { public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers"; public static final String PROP_PRIVATETRACKERS = "i2psnark.privatetrackers"; private static final String PROP_USE_DHT = "i2psnark.enableDHT"; + private static final String PROP_SMART_SORT = "i2psnark.smartSort"; public static final int MIN_UP_BW = 10; public static final int DEFAULT_MAX_UP_BW = 25; public static final int DEFAULT_STARTUP_DELAY = 3; public static final int DEFAULT_REFRESH_DELAY_SECS = 60; private static final int DEFAULT_PAGE_SIZE = 50; + public static final int DEFAULT_TUNNEL_QUANTITY = 3; public static final String CONFIG_DIR_SUFFIX = ".d"; private static final String SUBDIR_PREFIX = "s"; private static final String B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~"; @@ -180,7 +190,7 @@ public class SnarkManager implements CompleteListener { for (int i = 1; i < DEFAULT_TRACKERS.length; i += 2) { if (DEFAULT_TRACKERS[i-1].equals("TheBland") && !SigType.ECDSA_SHA256_P256.isAvailable()) continue; - String urls[] = DEFAULT_TRACKERS[i].split("=", 2); + String urls[] = DataHelper.split(DEFAULT_TRACKERS[i], "=", 2); ann.add(urls[0]); } DEFAULT_TRACKER_ANNOUNCES = Collections.unmodifiableSet(ann); @@ -332,6 +342,17 @@ public class SnarkManager implements CompleteListener { public boolean shouldAutoStart() { return Boolean.parseBoolean(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)); } + + /** + * @return default true + * @since 0.9.23 + */ + public boolean isSmartSortEnabled() { + String val = _config.getProperty(PROP_SMART_SORT); + if (val == null) + return true; + return Boolean.parseBoolean(val); + } /**** public String linkPrefix() { @@ -590,7 +611,9 @@ public class SnarkManager implements CompleteListener { if (!_config.containsKey(PROP_I2CP_PORT)) _config.setProperty(PROP_I2CP_PORT, "7654"); if (!_config.containsKey(PROP_I2CP_OPTS)) - _config.setProperty(PROP_I2CP_OPTS, "inbound.length=3 outbound.length=3 inbound.quantity=3 outbound.quantity=3"); + _config.setProperty(PROP_I2CP_OPTS, "inbound.length=3 outbound.length=3" + + " inbound.quantity=" + DEFAULT_TUNNEL_QUANTITY + + " outbound.quantity=" + DEFAULT_TUNNEL_QUANTITY); //if (!_config.containsKey(PROP_EEP_HOST)) // _config.setProperty(PROP_EEP_HOST, "127.0.0.1"); //if (!_config.containsKey(PROP_EEP_PORT)) @@ -728,19 +751,19 @@ public class SnarkManager implements CompleteListener { /** * all params may be null or need trimming */ - public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, + public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay, String startDelay, String pageSize, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { synchronized(_configLock) { - locked_updateConfig(dataDir, filesPublic, autoStart, refreshDelay, + locked_updateConfig(dataDir, filesPublic, autoStart, smartSort,refreshDelay, startDelay, pageSize, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, useDHT, theme); } } - private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay, + private void locked_updateConfig(String dataDir, boolean filesPublic, boolean autoStart, boolean smartSort, String refreshDelay, String startDelay, String pageSize, String seedPct, String eepHost, String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts, String upLimit, String upBW, boolean useOpenTrackers, boolean useDHT, String theme) { @@ -768,9 +791,9 @@ public class SnarkManager implements CompleteListener { _util.setMaxUploaders(limit); changed = true; _config.setProperty(PROP_UPLOADERS_TOTAL, Integer.toString(limit)); - addMessage(_("Total uploaders limit changed to {0}", limit)); + addMessage(_t("Total uploaders limit changed to {0}", limit)); } else { - addMessage(_("Minimum total uploaders limit is {0}", Snark.MIN_TOTAL_UPLOADERS)); + addMessage(_t("Minimum total uploaders limit is {0}", Snark.MIN_TOTAL_UPLOADERS)); } } } @@ -782,9 +805,9 @@ public class SnarkManager implements CompleteListener { _util.setMaxUpBW(limit); changed = true; _config.setProperty(PROP_UPBW_MAX, Integer.toString(limit)); - addMessage(_("Up BW limit changed to {0}KBps", limit)); + addMessage(_t("Up BW limit changed to {0}KBps", limit)); } else { - addMessage(_("Minimum up bandwidth limit is {0}KBps", MIN_UP_BW)); + addMessage(_t("Minimum up bandwidth limit is {0}KBps", MIN_UP_BW)); } } } @@ -796,7 +819,7 @@ public class SnarkManager implements CompleteListener { _util.setStartupDelay(minutes); changed = true; _config.setProperty(PROP_STARTUP_DELAY, Integer.toString(minutes)); - addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * (60L * 1000)))); + addMessage(_t("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * (60L * 1000)))); } } @@ -807,9 +830,9 @@ public class SnarkManager implements CompleteListener { changed = true; _config.setProperty(PROP_REFRESH_DELAY, Integer.toString(secs)); if (secs >= 0) - addMessage(_("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000))); + addMessage(_t("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000))); else - addMessage(_("Refresh disabled")); + addMessage(_t("Refresh disabled")); } } catch (NumberFormatException nfe) {} } @@ -825,7 +848,7 @@ public class SnarkManager implements CompleteListener { changed = true; pageSize = Integer.toString(size); _config.setProperty(PROP_PAGE_SIZE, pageSize); - addMessage(_("Page size changed to {0}", pageSize)); + addMessage(_t("Page size changed to {0}", pageSize)); } } catch (NumberFormatException nfe) {} } @@ -834,18 +857,18 @@ public class SnarkManager implements CompleteListener { dataDir = DataHelper.stripHTML(dataDir.trim()); File dd = new File(dataDir); if (!dd.isAbsolute()) { - addMessage(_("Data directory must be an absolute path") + ": " + dataDir); + addMessage(_t("Data directory must be an absolute path") + ": " + dataDir); } else if (!dd.exists()) { - addMessage(_("Data directory does not exist") + ": " + dataDir); + addMessage(_t("Data directory does not exist") + ": " + dataDir); } else if (!dd.isDirectory()) { - addMessage(_("Not a directory") + ": " + dataDir); + addMessage(_t("Not a directory") + ": " + dataDir); } else if (!dd.canRead()) { - addMessage(_("Unreadable") + ": " + dataDir); + addMessage(_t("Unreadable") + ": " + dataDir); } else { changed = true; interruptMonitor = true; _config.setProperty(PROP_DIR, dataDir); - addMessage(_("Data directory changed to {0}", dataDir)); + addMessage(_t("Data directory changed to {0}", dataDir)); } } @@ -900,37 +923,37 @@ public class SnarkManager implements CompleteListener { p.putAll(opts); _util.setI2CPConfig(i2cpHost, port, p); _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); - addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents")); + addMessage(_t("I2CP and tunnel changes will take effect after stopping all torrents")); } else if (!reconnect) { // The usual case, the other two are if not in router context _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim()); - addMessage(_("I2CP options changed to {0}", i2cpOpts)); + addMessage(_t("I2CP options changed to {0}", i2cpOpts)); _util.setI2CPConfig(oldI2CPHost, oldI2CPPort, opts); } else { // Won't happen, I2CP host/port, are hidden in the GUI if in router context if (_util.connected()) { _util.disconnect(); - addMessage(_("Disconnecting old I2CP destination")); + addMessage(_t("Disconnecting old I2CP destination")); } - addMessage(_("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts)); + addMessage(_t("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts)); _util.setI2CPConfig(i2cpHost, port, opts); _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW)); boolean ok = _util.connect(); if (!ok) { - addMessage(_("Unable to connect with the new settings, reverting to the old I2CP settings")); + addMessage(_t("Unable to connect with the new settings, reverting to the old I2CP settings")); _util.setI2CPConfig(oldI2CPHost, oldI2CPPort, oldOpts); ok = _util.connect(); if (!ok) - addMessage(_("Unable to reconnect with the old settings!")); + addMessage(_t("Unable to reconnect with the old settings!")); } else { - addMessage(_("Reconnected on the new I2CP destination")); + addMessage(_t("Reconnected on the new I2CP destination")); _config.setProperty(PROP_I2CP_HOST, i2cpHost.trim()); _config.setProperty(PROP_I2CP_PORT, "" + port); _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim()); // no PeerAcceptors/I2PServerSockets to deal with, since all snarks are inactive for (Snark snark : _snarks.values()) { if (snark.restartAcceptor()) { - addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName())); + addMessage(_t("I2CP listener restarted for \"{0}\"", snark.getBaseName())); // this is the common ConnectionAcceptor, so we only need to do it once break; } @@ -944,44 +967,54 @@ public class SnarkManager implements CompleteListener { _config.setProperty(PROP_FILES_PUBLIC, Boolean.toString(filesPublic)); _util.setFilesPublic(filesPublic); if (filesPublic) - addMessage(_("New files will be publicly readable")); + addMessage(_t("New files will be publicly readable")); else - addMessage(_("New files will not be publicly readable")); + addMessage(_t("New files will not be publicly readable")); changed = true; } if (shouldAutoStart() != autoStart) { _config.setProperty(PROP_AUTO_START, Boolean.toString(autoStart)); if (autoStart) - addMessage(_("Enabled autostart")); + addMessage(_t("Enabled autostart")); else - addMessage(_("Disabled autostart")); + addMessage(_t("Disabled autostart")); changed = true; } + + if (isSmartSortEnabled() != smartSort) { + _config.setProperty(PROP_SMART_SORT, Boolean.toString(smartSort)); + if (smartSort) + addMessage(_t("Enabled smart sort")); + else + addMessage(_t("Disabled smart sort")); + changed = true; + } + if (_util.shouldUseOpenTrackers() != useOpenTrackers) { _config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + ""); if (useOpenTrackers) - addMessage(_("Enabled open trackers - torrent restart required to take effect.")); + addMessage(_t("Enabled open trackers - torrent restart required to take effect.")); else - addMessage(_("Disabled open trackers - torrent restart required to take effect.")); + addMessage(_t("Disabled open trackers - torrent restart required to take effect.")); _util.setUseOpenTrackers(useOpenTrackers); changed = true; } if (_util.shouldUseDHT() != useDHT) { _config.setProperty(PROP_USE_DHT, Boolean.toString(useDHT)); if (useDHT) - addMessage(_("Enabled DHT.")); + addMessage(_t("Enabled DHT.")); else - addMessage(_("Disabled DHT.")); + addMessage(_t("Disabled DHT.")); if (_util.connected()) - addMessage(_("DHT change requires tunnel shutdown and reopen")); + addMessage(_t("DHT change requires tunnel shutdown and reopen")); _util.setUseDHT(useDHT); changed = true; } if (theme != null) { if(!theme.equals(_config.getProperty(PROP_THEME))) { _config.setProperty(PROP_THEME, theme); - addMessage(_("{0} theme loaded, return to main i2psnark page to view.", theme)); + addMessage(_t("{0} theme loaded, return to main i2psnark page to view.", theme)); changed = true; } } @@ -991,7 +1024,7 @@ public class SnarkManager implements CompleteListener { // Data dir changed. this will stop and remove all old torrents, and add the new ones _monitor.interrupt(); } else { - addMessage(_("Configuration unchanged.")); + addMessage(_t("Configuration unchanged.")); } } @@ -1023,7 +1056,7 @@ public class SnarkManager implements CompleteListener { if (ot == null) ot = getListConfig(PROP_OPENTRACKERS, DEFAULT_OPENTRACKERS); _util.setOpenTrackers(ot); - addMessage(_("Open Tracker list changed - torrent restart required to take effect.")); + addMessage(_t("Open Tracker list changed - torrent restart required to take effect.")); saveConfig(); } @@ -1033,7 +1066,7 @@ public class SnarkManager implements CompleteListener { */ public void savePrivateTrackers(List pt) { setListConfig(PROP_PRIVATETRACKERS, pt); - addMessage(_("Private tracker list changed - affects newly created torrents only.")); + addMessage(_t("Private tracker list changed - affects newly created torrents only.")); saveConfig(); } @@ -1048,7 +1081,7 @@ public class SnarkManager implements CompleteListener { val = dflt; if (val == null) return Collections.emptyList(); - return Arrays.asList(val.split(",")); + return Arrays.asList(DataHelper.split(val, ",")); } /** @@ -1079,12 +1112,12 @@ public class SnarkManager implements CompleteListener { DataHelper.storeProps(_config, _configFile); } } catch (IOException ioe) { - addMessage(_("Unable to save the config to {0}", _configFile.getAbsolutePath())); + addMessage(_t("Unable to save the config to {0}", _configFile.getAbsolutePath())); } } /** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */ - public static final int MAX_FILES_PER_TORRENT = 512; + public static final int MAX_FILES_PER_TORRENT = 999; /** * Set of canonical .torrent filenames that we are dealing with. @@ -1160,10 +1193,10 @@ public class SnarkManager implements CompleteListener { */ private void addTorrent(String filename, File baseFile, boolean dontAutoStart, File dataDir) { if ((!dontAutoStart) && !_util.connected()) { - addMessage(_("Connecting to I2P")); + addMessage(_t("Connecting to I2P")); boolean ok = _util.connect(); if (!ok) { - addMessage(_("Error connecting to I2P - check your I2CP settings!")); + addMessage(_t("Error connecting to I2P - check your I2CP settings!")); return; } } @@ -1172,7 +1205,7 @@ public class SnarkManager implements CompleteListener { filename = sfile.getCanonicalPath(); } catch (IOException ioe) { _log.error("Unable to add the torrent " + filename, ioe); - addMessage(_("Error: Could not add the torrent {0}", filename) + ": " + ioe); + addMessage(_t("Error: Could not add the torrent {0}", filename) + ": " + ioe); return; } if (dataDir == null) @@ -1195,7 +1228,7 @@ public class SnarkManager implements CompleteListener { fis = new FileInputStream(sfile); } catch (IOException ioe) { // catch this here so we don't try do delete it below - addMessage(_("Cannot open \"{0}\"", sfile.getName()) + ": " + ioe.getMessage()); + addMessage(_t("Cannot open \"{0}\"", sfile.getName()) + ": " + ioe.getMessage()); return; } @@ -1214,53 +1247,59 @@ public class SnarkManager implements CompleteListener { Snark snark = getTorrentByInfoHash(info.getInfoHash()); if (snark != null) { // TODO - if the existing one is a magnet, delete it and add the metainfo instead? - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return; } if (!TrackerClient.isValidAnnounce(info.getAnnounce())) { if (info.isPrivate()) { - addMessage(_("ERROR - No I2P trackers in private torrent \"{0}\"", info.getName())); + addMessage(_t("ERROR - No I2P trackers in private torrent \"{0}\"", info.getName())); } else if (!_util.getOpenTrackers().isEmpty()) { - addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); - //addMessage(_("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and DHT only.", info.getName())); + //addMessage(_t("Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers only.", info.getName())); } else if (_util.shouldUseDHT()) { - addMessage(_("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will announce to DHT only.", info.getName())); } else { - addMessage(_("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); - //addMessage(_("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName())); + addMessage(_t("Warning - No I2P trackers in \"{0}\", and DHT and open trackers are disabled, you should enable open trackers or DHT before starting the torrent.", info.getName())); + //addMessage(_t("Warning - No I2P Trackers found in \"{0}\". Make sure Open Tracker is enabled before starting this torrent.", info.getName())); dontAutoStart = true; } } String rejectMessage = validateTorrent(info); if (rejectMessage != null) { - sfile.delete(); - addMessage(rejectMessage); - return; - } else { - // TODO load saved closest DHT nodes and pass to the Snark ? - // This may take a LONG time - if (baseFile == null) - baseFile = getSavedBaseFile(info.getInfoHash()); - if (_log.shouldLog(Log.INFO)) - _log.info("New Snark, torrent: " + filename + " base: " + baseFile); - torrent = new Snark(_util, filename, null, -1, null, null, this, - _peerCoordinatorSet, _connectionAcceptor, - false, dataDir.getPath(), baseFile); - loadSavedFilePriorities(torrent); - synchronized (_snarks) { - _snarks.put(filename, torrent); - } + throw new IOException(rejectMessage); + } + + // TODO load saved closest DHT nodes and pass to the Snark ? + // This may take a LONG time + if (baseFile == null) + baseFile = getSavedBaseFile(info.getInfoHash()); + if (_log.shouldLog(Log.INFO)) + _log.info("New Snark, torrent: " + filename + " base: " + baseFile); + torrent = new Snark(_util, filename, null, -1, null, null, this, + _peerCoordinatorSet, _connectionAcceptor, + shouldAutoStart(), dataDir.getPath(), baseFile); + loadSavedFilePriorities(torrent); + synchronized (_snarks) { + _snarks.put(filename, torrent); } } catch (IOException ioe) { - String err = _("Torrent in \"{0}\" is invalid", sfile.getName()) + ": " + ioe.getMessage(); + // close before rename/delete for windows + if (fis != null) try { fis.close(); fis = null; } catch (IOException ioe2) {} + String err = _t("Torrent in \"{0}\" is invalid", sfile.toString()) + ": " + ioe.getMessage(); addMessage(err); _log.error(err, ioe); - if (sfile.exists()) - sfile.delete(); + File rename = new File(filename + ".BAD"); + if (rename.exists()) { + if (sfile.delete()) + addMessage(_t("Torrent file deleted: {0}", sfile.toString())); + } else { + if (FileUtil.rename(sfile, rename)) + addMessage(_t("Torrent file moved from {0} to {1}", sfile.toString(), rename.toString())); + } return; } catch (OutOfMemoryError oom) { - addMessage(_("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); + addMessage(_t("ERROR - Out of memory, cannot create torrent from {0}", sfile.getName()) + ": " + oom.getMessage()); return; } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} @@ -1270,11 +1309,21 @@ public class SnarkManager implements CompleteListener { return; } // ok, snark created, now lets start it up or configure it further - if (!dontAutoStart && shouldAutoStart()) { - torrent.startTorrent(); - addMessage(_("Torrent added and started: \"{0}\"", torrent.getBaseName())); + Properties config = getConfig(torrent); + boolean running; + String prop = config.getProperty(PROP_META_RUNNING); + if(prop == null || Boolean.parseBoolean(prop)) { + running = true; } else { - addMessage(_("Torrent added: \"{0}\"", torrent.getBaseName())); + running = false; + } + // Were we running last time? + String link = linkify(torrent); + if (!dontAutoStart && shouldAutoStart() && running) { + torrent.startTorrent(); + addMessageNoEscape(_t("Torrent added and started: {0}", link)); + } else { + addMessageNoEscape(_t("Torrent added: {0}", link)); } } @@ -1339,28 +1388,28 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(ih); if (snark != null) { - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return null; } // Tell the dir monitor not to delete us _magnets.add(name); if (updateStatus) - saveMagnetStatus(ih); + saveMagnetStatus(ih, dirPath, trackerURL, name); _snarks.put(name, torrent); } if (autoStart) { startTorrent(ih); - addMessage(_("Fetching {0}", name)); + addMessage(_t("Fetching {0}", name)); DHT dht = _util.getDHT(); boolean shouldWarn = _util.connected() && _util.getOpenTrackers().isEmpty() && ((!_util.shouldUseDHT()) || dht == null || dht.size() <= 0); if (shouldWarn) { - addMessage(_("Open trackers are disabled and we have no DHT peers. " + + addMessage(_t("Open trackers are disabled and we have no DHT peers. " + "Fetch of {0} may not succeed until you start another torrent, enable open trackers, or enable DHT.", name)); } } else { - addMessage(_("Adding {0}", name)); + addMessage(_t("Adding {0}", name)); } return torrent; } @@ -1393,7 +1442,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(torrent.getInfoHash()); if (snark != null) { - addMessage(_("Download already running: {0}", snark.getBaseName())); + addMessage(_t("Download already running: {0}", snark.getBaseName())); return; } String name = torrent.getName(); @@ -1427,17 +1476,18 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { Snark snark = getTorrentByInfoHash(metainfo.getInfoHash()); if (snark != null) { - addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return false; + } else { + saveTorrentStatus(metainfo, bitfield, null, baseFile, true, 0, true); // no file priorities } - // so addTorrent won't recheck - saveTorrentStatus(metainfo, bitfield, null, baseFile, true, 0); // no file priorities + // so addTorrent won't recheck try { locked_writeMetaInfo(metainfo, filename, areFilesPublic()); // hold the lock for a long time addTorrent(filename, baseFile, dontAutoStart); } catch (IOException ioe) { - addMessage(_("Failed to copy torrent file to {0}", filename)); + addMessage(_t("Failed to copy torrent file to {0}", filename)); _log.error("Failed to write torrent file", ioe); return false; } @@ -1463,7 +1513,7 @@ public class SnarkManager implements CompleteListener { synchronized (_snarks) { boolean success = FileUtil.copy(fromfile.getAbsolutePath(), filename, false); if (!success) { - addMessage(_("Failed to copy torrent file to {0}", filename)); + addMessage(_t("Failed to copy torrent file to {0}", filename)); _log.error("Failed to write torrent file to " + filename); return; } @@ -1564,7 +1614,7 @@ public class SnarkManager implements CompleteListener { return; int filecount = metainfo.getFiles().size(); int[] rv = new int[filecount]; - String[] arr = pri.split(","); + String[] arr = DataHelper.split(pri, ","); for (int i = 0; i < filecount && i < arr.length; i++) { if (arr[i].length() > 0) { try { @@ -1612,6 +1662,25 @@ public class SnarkManager implements CompleteListener { } return 0; } + + /** + * Get setting for a torrent from the config file. + * @return non-null, rv[0] is added time or 0; rv[1] is completed time or 0 + * @since 0.9.23 + */ + public long[] getSavedAddedAndCompleted(Snark snark) { + long[] rv = new long[2]; + Properties config = getConfig(snark); + if (config != null) { + try { + rv[0] = Long.parseLong(config.getProperty(PROP_META_ADDED)); + } catch (NumberFormatException nfe) {} + try { + rv[1] = Long.parseLong(config.getProperty(PROP_META_COMPLETED)); + } catch (NumberFormatException nfe) {} + } + return rv; + } /** * Save the completion status of a torrent and other data in the config file @@ -1626,7 +1695,7 @@ public class SnarkManager implements CompleteListener { return; saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities(), storage.getBase(), storage.getPreserveFileNames(), - snark.getUploaded()); + snark.getUploaded(), snark.isStopped()); } /** @@ -1636,32 +1705,41 @@ public class SnarkManager implements CompleteListener { * The status is either a bitfield converted to Base64 or "." for a completed * torrent to save space in the config file and in memory. * + * @param metainfo non-null * @param bitfield non-null * @param priorities may be null * @param base may be null */ private void saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities, - File base, boolean preserveNames, long uploaded) { + File base, boolean preserveNames, long uploaded, boolean stopped) { synchronized (_configLock) { - locked_saveTorrentStatus(metainfo, bitfield, priorities, base, preserveNames, uploaded); + locked_saveTorrentStatus(metainfo, bitfield, priorities, base, preserveNames, uploaded, stopped); } } private void locked_saveTorrentStatus(MetaInfo metainfo, BitField bitfield, int[] priorities, - File base, boolean preserveNames, long uploaded) { + File base, boolean preserveNames, long uploaded, boolean stopped) { byte[] ih = metainfo.getInfoHash(); + Properties config = getConfig(ih); + String now = Long.toString(System.currentTimeMillis()); + config.setProperty(PROP_META_STAMP, now); + if (config.getProperty(PROP_META_ADDED) == null) + config.setProperty(PROP_META_ADDED, now); String bfs; if (bitfield.complete()) { bfs = "."; + if (config.getProperty(PROP_META_COMPLETED) == null) + config.setProperty(PROP_META_COMPLETED, now); } else { byte[] bf = bitfield.getFieldBytes(); bfs = Base64.encode(bf); + config.remove(PROP_META_COMPLETED); } - Properties config = getConfig(ih); - config.setProperty(PROP_META_STAMP, Long.toString(System.currentTimeMillis())); config.setProperty(PROP_META_BITFIELD, bfs); config.setProperty(PROP_META_PRESERVE_NAMES, Boolean.toString(preserveNames)); config.setProperty(PROP_META_UPLOADED, Long.toString(uploaded)); + boolean running = !stopped; + config.setProperty(PROP_META_RUNNING, Boolean.toString(running)); if (base != null) config.setProperty(PROP_META_BASE, base.getAbsolutePath()); @@ -1690,15 +1768,28 @@ public class SnarkManager implements CompleteListener { } else { config.remove(PROP_META_PRIORITY); } + // magnet properties, no longer apply, we have the metainfo + config.remove(PROP_META_MAGNET); + config.remove(PROP_META_MAGNET_DIR); + config.remove(PROP_META_MAGNET_DN); + config.remove(PROP_META_MAGNET_TR); // TODO save closest DHT nodes too + locked_saveTorrentStatus(ih, config); + } + /** + * @since 0.9.23 + */ + private void locked_saveTorrentStatus(byte[] ih, Properties config) { File conf = configFile(_configDir, ih); File subdir = conf.getParentFile(); if (!subdir.exists()) subdir.mkdirs(); try { DataHelper.storeProps(config, conf); + if (_log.shouldInfo()) + _log.info("Saved config to " + conf); } catch (IOException ioe) { _log.error("Unable to save the config to " + conf); } @@ -1738,7 +1829,7 @@ public class SnarkManager implements CompleteListener { int totalDeleted = 0; synchronized (_snarks) { for (Snark snark : _snarks.values()) { - torrents.add(new SHA1Hash(snark.getMetaInfo().getInfoHash())); + torrents.add(new SHA1Hash(snark.getInfoHash())); } synchronized (_configLock) { for (int i = 0; i < B64.length(); i++) { @@ -1783,14 +1874,38 @@ public class SnarkManager implements CompleteListener { } /** - * Just remember we have it + * Just remember we have it. + * This used to simply store a line in the config file, + * but now we also save it in its own config file, + * just like other torrents, so we can remember the directory, tracker, etc. + * + * @param dir may be null + * @param trackerURL may be null + * @param dn may be null * @since 0.8.4 */ - public void saveMagnetStatus(byte[] ih) { + public void saveMagnetStatus(byte[] ih, String dir, String trackerURL, String dn) { + // i2psnark.config file String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); _config.setProperty(PROP_META_MAGNET_PREFIX + infohash, "."); - saveConfig(); + // its own config file + Properties config = new OrderedProperties(); + config.setProperty(PROP_META_MAGNET, "true"); + if (dir != null) + config.setProperty(PROP_META_MAGNET_DIR, dir); + if (trackerURL != null) + config.setProperty(PROP_META_MAGNET_TR, trackerURL); + if (dn != null) + config.setProperty(PROP_META_MAGNET_DN, dn); + String now = Long.toString(System.currentTimeMillis()); + config.setProperty(PROP_META_ADDED, now); + config.setProperty(PROP_META_STAMP, now); + // save + synchronized (_configLock) { + saveConfig(); + locked_saveTorrentStatus(ih, config); + } } /** @@ -1800,8 +1915,8 @@ public class SnarkManager implements CompleteListener { public void removeMagnetStatus(byte[] ih) { String infohash = Base64.encode(ih); infohash = infohash.replace('=', '$'); - _config.remove(PROP_META_MAGNET_PREFIX + infohash); - saveConfig(); + if (_config.remove(PROP_META_MAGNET_PREFIX + infohash) != null) + saveConfig(); } /** @@ -1812,18 +1927,18 @@ public class SnarkManager implements CompleteListener { private String validateTorrent(MetaInfo info) { List> files = info.getFiles(); if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) { - return _("Too many files in \"{0}\" ({1}), deleting it!", info.getName(), files.size()); + return _t("Too many files in \"{0}\" ({1})!", info.getName(), files.size()); } else if ( (files == null) && (info.getName().endsWith(".torrent")) ) { - return _("Torrent file \"{0}\" cannot end in \".torrent\", deleting it!", info.getName()); + return _t("Torrent file \"{0}\" cannot end in \".torrent\"!", info.getName()); } else if (info.getPieces() <= 0) { - return _("No pieces in \"{0}\", deleting it!", info.getName()); + return _t("No pieces in \"{0}\"!", info.getName()); } else if (info.getPieces() > Storage.MAX_PIECES) { - return _("Too many pieces in \"{0}\", limit is {1}, deleting it!", info.getName(), Storage.MAX_PIECES); + return _t("Too many pieces in \"{0}\", limit is {1}!", info.getName(), Storage.MAX_PIECES); } else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) { - return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + - _("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); + return _t("Pieces are too large in \"{0}\" ({1}B)!", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' + + _t("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE)); } else if (info.getTotalLength() <= 0) { - return _("Torrent \"{0}\" has no data, deleting it!", info.getName()); + return _t("Torrent \"{0}\" has no data!", info.getName()); } else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) { System.out.println("torrent info: " + info.toString()); List lengths = info.getLengths(); @@ -1831,7 +1946,7 @@ public class SnarkManager implements CompleteListener { for (int i = 0; i < lengths.size(); i++) System.out.println("File " + i + " is " + lengths.get(i) + " long."); - return _("Torrents larger than {0}B are not supported yet, deleting \"{1}\"", Storage.MAX_TOTAL_SIZE, info.getName()); + return _t("Torrents larger than {0}B are not supported yet \"{1}\"!", Storage.MAX_TOTAL_SIZE, info.getName()); } else { // ok return null; @@ -1848,7 +1963,7 @@ public class SnarkManager implements CompleteListener { filename = sfile.getCanonicalPath(); } catch (IOException ioe) { _log.error("Unable to remove the torrent " + filename, ioe); - addMessage(_("Error: Could not remove the torrent {0}", filename) + ": " + ioe.getMessage()); + addMessage(_t("Error: Could not remove the torrent {0}", filename) + ": " + ioe.getMessage()); return null; } int remaining = 0; @@ -1871,7 +1986,7 @@ public class SnarkManager implements CompleteListener { if (shouldRemove) removeTorrentStatus(torrent); if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent stopped: {0}", linkify(torrent))); } return torrent; } @@ -1890,7 +2005,7 @@ public class SnarkManager implements CompleteListener { boolean wasStopped = torrent.isStopped(); torrent.stopTorrent(); if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName())); + addMessageNoEscape(_t("Torrent stopped: {0}", linkify(torrent))); if (shouldRemove) removeTorrentStatus(torrent); } @@ -1910,7 +2025,7 @@ public class SnarkManager implements CompleteListener { File torrentFile = new File(filename); torrentFile.delete(); } - addMessage(_("Torrent removed: \"{0}\"", torrent.getBaseName())); + addMessage(_t("Torrent removed: \"{0}\"", torrent.getBaseName())); } private class DirMonitor implements Runnable { @@ -1918,7 +2033,7 @@ public class SnarkManager implements CompleteListener { // don't bother delaying if auto start is false long delay = (60L * 1000) * getStartupDelayMinutes(); if (delay > 0 && shouldAutoStart()) { - addMessage(_("Adding torrents in {0}", DataHelper.formatDuration2(delay))); + addMessage(_t("Adding torrents in {0}", DataHelper.formatDuration2(delay))); try { Thread.sleep(delay); } catch (InterruptedException ie) {} // Remove that first message if (_messages.size() == 1) @@ -1933,27 +2048,33 @@ public class SnarkManager implements CompleteListener { File dir = getDataDir(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Directory Monitor loop over " + dir.getAbsolutePath()); + boolean ok; try { // Don't let this interfere with .torrent files being added or deleted synchronized (_snarks) { - monitorTorrents(dir); + ok = monitorTorrents(dir); } - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("Error in the DirectoryMonitor", e); + ok = false; } if (doMagnets) { // first run only try { addMagnets(); doMagnets = false; - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("Error in the DirectoryMonitor", e); } if (!_snarks.isEmpty()) - addMessage(_("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); + addMessage(_t("Up bandwidth limit is {0} KBps", _util.getMaxUpBW())); // To fix bug where files were left behind, // but also good for when user removes snarks when i2p is not running - cleanupTorrentStatus(); + // Don't run if there was an error, as we would delete the torrent config + // file(s) and we don't want to do that. We'll do the cleanup the next + // time i2psnark starts. See ticket #1658. + if (ok) + cleanupTorrentStatus(); } try { Thread.sleep(60*1000); } catch (InterruptedException ie) {} } @@ -1970,13 +2091,8 @@ public class SnarkManager implements CompleteListener { Storage storage = snark.getStorage(); if (meta == null || storage == null) return; - StringBuilder buf = new StringBuilder(256); - String base = DataHelper.escapeHTML(storage.getBaseName()); - buf.append("").append(base).append(""); - addMessageNoEscape(_("Download finished: {0}", buf.toString())); // + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')'); + if (snark.getDownloaded() > 0) + addMessageNoEscape(_t("Download finished: {0}", linkify(snark))); updateStatus(snark); } @@ -1988,7 +2104,8 @@ public class SnarkManager implements CompleteListener { Storage storage = snark.getStorage(); if (meta != null && storage != null) saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities(), - storage.getBase(), storage.getPreserveFileNames(), snark.getUploaded()); + storage.getBase(), storage.getPreserveFileNames(), snark.getUploaded(), + snark.isStopped()); } /** @@ -2011,7 +2128,8 @@ public class SnarkManager implements CompleteListener { return null; } saveTorrentStatus(meta, storage.getBitField(), null, - storage.getBase(), storage.getPreserveFileNames(), 0); + storage.getBase(), storage.getPreserveFileNames(), 0, + snark.isStopped()); // temp for addMessage() in case canonical throws String name = storage.getBaseName(); try { @@ -2029,11 +2147,11 @@ public class SnarkManager implements CompleteListener { } _magnets.remove(snark.getName()); removeMagnetStatus(snark.getInfoHash()); - addMessage(_("Metainfo received for {0}", snark.getName())); - addMessage(_("Starting up torrent {0}", storage.getBaseName())); + addMessage(_t("Metainfo received for {0}", snark.getName())); + addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark))); return name; } catch (IOException ioe) { - addMessage(_("Failed to copy torrent file to {0}", name)); + addMessage(_t("Failed to copy torrent file to {0}", name)); _log.error("Failed to write torrent file", ioe); } } @@ -2045,7 +2163,7 @@ public class SnarkManager implements CompleteListener { * @since 0.9 */ public void fatal(Snark snark, String error) { - addMessage(_("Error on torrent {0}", snark.getName()) + ": " + error); + addMessage(_t("Error on torrent {0}", snark.getName()) + ": " + error); } /** @@ -2064,29 +2182,67 @@ public class SnarkManager implements CompleteListener { // End Snark.CompleteListeners + /** + * An HTML link to the file if complete and a single file, + * to the directory if not complete or not a single file, + * or simply the unlinkified name of the snark if a magnet + * + * @since 0.9.23 + */ + private String linkify(Snark snark) { + MetaInfo meta = snark.getMetaInfo(); + Storage storage = snark.getStorage(); + if (meta == null || storage == null) + return DataHelper.escapeHTML(snark.getBaseName()); + StringBuilder buf = new StringBuilder(256); + String base = DataHelper.escapeHTML(storage.getBaseName()); + buf.append("").append(base).append(""); + return buf.toString(); + } + /** * Add all magnets from the config file + * * @since 0.8.4 */ private void addMagnets() { - for (Object o : _config.keySet()) { - String k = (String) o; + boolean changed = false; + for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { + String k = (String) iter.next(); if (k.startsWith(PROP_META_MAGNET_PREFIX)) { String b64 = k.substring(PROP_META_MAGNET_PREFIX.length()); b64 = b64.replace('$', '='); byte[] ih = Base64.decode(b64); // ignore value - TODO put tracker URL in value - if (ih != null && ih.length == 20) - addMagnet(_("Magnet") + ' ' + I2PSnarkUtil.toHex(ih), ih, null, false); - // else remove from config? + if (ih != null && ih.length == 20) { + Properties config = getConfig(ih); + String name = config.getProperty(PROP_META_MAGNET_DN); + if (name == null) + name = _t("Magnet") + ' ' + I2PSnarkUtil.toHex(ih); + String tracker = config.getProperty(PROP_META_MAGNET_TR); + String dir = config.getProperty(PROP_META_MAGNET_DIR); + File dirf = (dir != null) ? (new File(dir)) : null; + addMagnet(name, ih, tracker, false, dirf); + } else { + iter.remove(); + changed = true; + } } } + if (changed) + saveConfig(); } /** * caller must synchronize on _snarks + * + * @return success, false if an error adding any torrent. */ - private void monitorTorrents(File dir) { + private boolean monitorTorrents(File dir) { + boolean rv = true; String fileNames[] = dir.list(TorrentFilenameFilter.instance()); List foundNames = new ArrayList(0); if (fileNames != null) { @@ -2108,14 +2264,15 @@ public class SnarkManager implements CompleteListener { // already known. noop } else { if (shouldAutoStart() && !_util.connect()) - addMessage(_("Unable to connect to I2P!")); + addMessage(_t("Unable to connect to I2P!")); try { // Snark.fatal() throws a RuntimeException // don't let one bad torrent kill the whole loop addTorrent(name, null, !shouldAutoStart()); - } catch (Exception e) { - addMessage(_("Error: Could not add the torrent {0}", name) + ": " + e); + } catch (RuntimeException e) { + addMessage(_t("Error: Could not add the torrent {0}", name) + ": " + e); _log.error("Unable to add the torrent " + name, e); + rv = false; } } } @@ -2131,25 +2288,26 @@ public class SnarkManager implements CompleteListener { // Snark.fatal() throws a RuntimeException // don't let one bad torrent kill the whole loop stopTorrent(name, true); - } catch (Exception e) { + } catch (RuntimeException e) { // don't bother with message } } } + return rv; } /** translate */ - private String _(String s) { + private String _t(String s) { return _util.getString(s); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return _util.getString(s, o); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return _util.getString(s, o, o2); } @@ -2187,12 +2345,12 @@ public class SnarkManager implements CompleteListener { if ( (trackers == null) || (trackers.trim().length() <= 0) ) { setDefaultTrackerMap(true); } else { - String[] toks = trackers.split(","); + String[] toks = DataHelper.split(trackers, ","); for (int i = 0; i < toks.length; i += 2) { String name = toks[i].trim().replace(",", ","); String url = toks[i+1].trim().replace(",", ","); if ( (name.length() > 0) && (url.length() > 0) ) { - String urls[] = url.split("=", 2); + String urls[] = DataHelper.split(url, "=", 2); String url2 = urls.length > 1 ? urls[1] : ""; _trackerMap.put(name, new Tracker(name, urls[0], url2)); } @@ -2212,7 +2370,7 @@ public class SnarkManager implements CompleteListener { String name = DEFAULT_TRACKERS[i]; if (name.equals("TheBland") && !SigType.ECDSA_SHA256_P256.isAvailable()) continue; - String urls[] = DEFAULT_TRACKERS[i+1].split("=", 2); + String urls[] = DataHelper.split(DEFAULT_TRACKERS[i+1], "=", 2); String url2 = urls.length > 1 ? urls[1] : null; _trackerMap.put(name, new Tracker(name, urls[0], url2)); } @@ -2254,28 +2412,36 @@ public class SnarkManager implements CompleteListener { public void startTorrent(byte[] infoHash) { for (Snark snark : _snarks.values()) { if (DataHelper.eq(infoHash, snark.getInfoHash())) { - if (snark.isStarting() || !snark.isStopped()) { - addMessage("Torrent already started"); - return; - } - boolean connected = _util.connected(); - if ((!connected) && !_util.isConnecting()) - addMessage(_("Opening the I2P tunnel")); - addMessage(_("Starting up torrent {0}", snark.getBaseName())); - if (connected) { - snark.startTorrent(); - } else { - // mark it for the UI - snark.setStarting(); - (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start(); - try { Thread.sleep(200); } catch (InterruptedException ie) {} - } + startTorrent(snark); return; } } addMessage("Torrent not found?"); } + /** + * If not connected, thread it, otherwise inline + * @since 0.9.23 + */ + public void startTorrent(Snark snark) { + if (snark.isStarting() || !snark.isStopped()) { + addMessage("Torrent already started"); + return; + } + boolean connected = _util.connected(); + if ((!connected) && !_util.isConnecting()) + addMessage(_t("Opening the I2P tunnel")); + addMessageNoEscape(_t("Starting up torrent {0}", linkify(snark))); + if (connected) { + snark.startTorrent(); + } else { + // mark it for the UI + snark.setStarting(); + (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start(); + try { Thread.sleep(200); } catch (InterruptedException ie) {} + } + } + /** * If not connected, thread it, otherwise inline * @since 0.9.1 @@ -2284,7 +2450,7 @@ public class SnarkManager implements CompleteListener { if (_util.connected()) { startAll(); } else { - addMessage(_("Opening the I2P tunnel and starting all torrents.")); + addMessage(_t("Opening the I2P tunnel and starting all torrents.")); for (Snark snark : _snarks.values()) { // mark it for the UI snark.setStarting(); @@ -2304,7 +2470,7 @@ public class SnarkManager implements CompleteListener { public void run() { try { run2(); - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("Error starting", e); } } @@ -2347,7 +2513,7 @@ public class SnarkManager implements CompleteListener { for (Snark snark : _snarks.values()) { if (!snark.isStopped()) { if (count == 0) - addMessage(_("Stopping all torrents and closing the I2P tunnel.")); + addMessage(_t("Stopping all torrents and closing the I2P tunnel.")); count++; if (finalShutdown) snark.stopTorrent(true); @@ -2366,14 +2532,14 @@ public class SnarkManager implements CompleteListener { // Schedule this even for final shutdown, as there's a chance // that it's just this webapp that is stopping. _context.simpleTimer2().addEvent(new Disconnector(), 60*1000); - addMessage(_("Closing I2P tunnel after notifying trackers.")); + addMessage(_t("Closing I2P tunnel after notifying trackers.")); if (finalShutdown) { try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} } } else { _util.disconnect(); _stopping = false; - addMessage(_("I2P tunnel closed.")); + addMessage(_t("I2P tunnel closed.")); } } } @@ -2384,7 +2550,57 @@ public class SnarkManager implements CompleteListener { if (_util.connected()) { _util.disconnect(); _stopping = false; - addMessage(_("I2P tunnel closed.")); + addMessage(_t("I2P tunnel closed.")); + } + } + } + + /** + * Threaded. Torrent must be stopped. + * @since 0.9.23 + */ + public void recheckTorrent(Snark snark) { + if (snark.isStarting() || !snark.isStopped()) { + addMessage("Cannot check " + snark.getBaseName() + ", torrent already started"); + return; + } + Storage storage = snark.getStorage(); + if (storage == null) { + addMessage("Cannot check " + snark.getBaseName() + ", no storage"); + return; + } + (new I2PAppThread(new ThreadedRechecker(snark), "TorrentRechecker", true)).start(); + try { Thread.sleep(200); } catch (InterruptedException ie) {} + } + + /** + * @since 0.9.23 + */ + private class ThreadedRechecker implements Runnable { + private final Snark snark; + /** must have non-null storage */ + public ThreadedRechecker(Snark s) { snark = s; } + public void run() { + try { + if (_log.shouldWarn()) + _log.warn("Starting recheck of " + snark.getBaseName()); + boolean changed = snark.getStorage().recheck(); + if (changed) + updateStatus(snark); + if (_log.shouldWarn()) + _log.warn("Finished recheck of " + snark.getBaseName() + " changed? " + changed); + String link = linkify(snark); + if (changed) { + int pieces = snark.getPieces(); + double completion = (pieces - snark.getNeeded()) / (double) pieces; + String complete = (new DecimalFormat("0.00%")).format(completion); + addMessageNoEscape(_t("Finished recheck of torrent {0}, now {1} complete", link, complete)); + } else { + addMessageNoEscape(_t("Finished recheck of torrent {0}, unchanged", link)); + } + } catch (IOException e) { + _log.error("Error rechecking " + snark.getBaseName(), e); + addMessage(_t("Error checking the torrent {0}", snark.getBaseName()) + ": " + e); } } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 682d6f700..1a8349f5f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -20,6 +20,7 @@ package org.klomp.snark; +import java.io.Closeable; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -38,6 +39,8 @@ import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; +import gnu.getopt.Getopt; + import net.i2p.I2PAppContext; import net.i2p.crypto.SHA1; import net.i2p.data.ByteArray; @@ -50,7 +53,7 @@ import net.i2p.util.SystemVersion; /** * Maintains pieces on disk. Can be used to store and retrieve pieces. */ -public class Storage +public class Storage implements Closeable { private final MetaInfo metainfo; private final List _torrentFiles; @@ -70,18 +73,20 @@ public class Storage private boolean changed; private volatile boolean _isChecking; private final AtomicInteger _allocateCount = new AtomicInteger(); + private final AtomicInteger _checkProgress = new AtomicInteger(); /** The default piece size. */ private static final int DEFAULT_PIECE_SIZE = 256*1024; /** bigger than this will be rejected */ - public static final int MAX_PIECE_SIZE = 8*1024*1024; + public static final int MAX_PIECE_SIZE = 16*1024*1024; /** The maximum number of pieces in a torrent. */ - public static final int MAX_PIECES = 10*1024; + public static final int MAX_PIECES = 32*1024; public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES; private static final Map _filterNameCache = new ConcurrentHashMap(); private static final boolean _isWindows = SystemVersion.isWindows(); + private static final boolean _isARM = SystemVersion.isARM(); private static final int BUFSIZE = PeerState.PARTSIZE; private static final ByteCache _cache = ByteCache.getInstance(16, BUFSIZE); @@ -122,10 +127,12 @@ public class Storage * * @param announce may be null * @param listener may be null + * @param created_by may be null * @throws IOException when creating and/or checking files fails. */ public Storage(I2PSnarkUtil util, File baseFile, String announce, List> announce_list, + String created_by, boolean privateTorrent, StorageListener listener) throws IOException { @@ -159,7 +166,7 @@ public class Storage else pc_size = DEFAULT_PIECE_SIZE; int pcs = (int) ((total - 1)/pc_size) + 1; - while (pcs > (MAX_PIECES * 2 / 3) && pc_size < MAX_PIECE_SIZE) + while (pcs > (MAX_PIECES / 3) && pc_size < MAX_PIECE_SIZE) { pc_size *= 2; pcs = (int) ((total - 1)/pc_size) +1; @@ -194,7 +201,7 @@ public class Storage byte[] piece_hashes = fast_digestCreate(); metainfo = new MetaInfo(announce, baseFile.getName(), null, files, lengthsList, piece_size, piece_hashes, total, privateTorrent, - announce_list); + announce_list, created_by); } @@ -306,6 +313,18 @@ public class Storage return _isChecking; } + /** + * If checking is in progress, return completion 0.0 ... 1.0, + * else return 1.0. + * @since 0.9.23 + */ + public double getCheckingProgress() { + if (_isChecking) + return _checkProgress.get() / (double) pieces; + else + return 1.0d; + } + /** * Disk allocation (ballooning) in progress. * Always false on Windows. @@ -336,29 +355,28 @@ public class Storage * @return number of bytes remaining; -1 if unknown file * @since 0.7.14 */ +/**** public long remaining(int fileIndex) { if (fileIndex < 0 || fileIndex >= _torrentFiles.size()) return -1; + if (complete()) + return 0; long bytes = 0; for (int i = 0; i < _torrentFiles.size(); i++) { TorrentFile tf = _torrentFiles.get(i); if (i == fileIndex) { - File f = tf.RAFfile; - if (complete()) - return 0; - int psz = piece_size; long start = bytes; long end = start + tf.length; - int pc = (int) (bytes / psz); + int pc = (int) (bytes / piece_size); long rv = 0; if (!bitfield.get(pc)) - rv = Math.min(psz - (start % psz), tf.length); - for (int j = pc + 1; (((long)j) * psz) < end && j < pieces; j++) { + rv = Math.min(piece_size - (start % piece_size), tf.length); + for (int j = pc + 1; (((long)j) * piece_size) < end && j < pieces; j++) { if (!bitfield.get(j)) { - if (((long)(j+1))*psz < end) - rv += psz; + if (((long)(j+1))*piece_size < end) + rv += piece_size; else - rv += end - (((long)j) * psz); + rv += end - (((long)j) * piece_size); } } return rv; @@ -367,6 +385,40 @@ public class Storage } return -1; } +****/ + + /** + * For efficiency, calculate remaining bytes for all files at once + * + * @return number of bytes remaining for each file, use indexOf() to get index for a file + * @since 0.9.23 + */ + public long[] remaining() { + long[] rv = new long[_torrentFiles.size()]; + if (complete()) + return rv; + long bytes = 0; + for (int i = 0; i < _torrentFiles.size(); i++) { + TorrentFile tf = _torrentFiles.get(i); + long start = bytes; + long end = start + tf.length; + int pc = (int) (bytes / piece_size); + long rvi = 0; + if (!bitfield.get(pc)) + rvi = Math.min(piece_size - (start % piece_size), tf.length); + for (int j = pc + 1; (((long)j) * piece_size) < end && j < pieces; j++) { + if (!bitfield.get(j)) { + if (((long)(j+1))*piece_size < end) + rvi += piece_size; + else + rvi += end - (((long)j) * piece_size); + } + } + rv[i] = rvi; + bytes += tf.length; + } + return rv; + } /** * @param fileIndex as obtained from indexOf @@ -450,9 +502,8 @@ public class Storage int file = 0; long pcEnd = -1; long fileEnd = _torrentFiles.get(0).length - 1; - int psz = piece_size; for (int i = 0; i < rv.length; i++) { - pcEnd += psz; + pcEnd += piece_size; int pri = _torrentFiles.get(file).priority; while (fileEnd <= pcEnd && file < _torrentFiles.size() - 1) { file++; @@ -467,6 +518,31 @@ public class Storage return rv; } + /** + * Call setPriority() for all changed files first, + * then call this. + * The length of all the pieces that are not yet downloaded, + * and are set to skipped. + * This is not the same as the total of all skipped files, + * since pieces may span multiple files. + * + * @return 0 on error, if complete, or if only one file + * @since 0.9.24 + */ + public long getSkippedLength() { + int[] pri = getPiecePriorities(); + if (pri == null) + return 0; + long rv = 0; + final int end = pri.length - 1; + for (int i = 0; i <= end; i++) { + if (pri[i] <= -9 && !bitfield.get(i)) { + rv += (i != end) ? piece_size : metainfo.getPieceLength(i); + } + } + return rv; + } + /** * The BitField that tells which pieces this storage contains. * Do not change this since this is the current state of the storage. @@ -496,6 +572,9 @@ public class Storage /** * Creates (and/or checks) all files from the metainfo file list. * Only call this once, and only after the constructor with the metainfo. + * Use recheck() to check again later. + * + * @throws IllegalStateException if called more than once */ public void check() throws IOException { @@ -506,6 +585,9 @@ public class Storage * Creates (and/or checks) all files from the metainfo file list. * Use a saved bitfield and timestamp from a config file. * Only call this once, and only after the constructor with the metainfo. + * Use recheck() to check again later. + * + * @throws IllegalStateException if called more than once */ public void check(long savedTime, BitField savedBitField) throws IOException { @@ -691,7 +773,7 @@ public class Storage } rv = repl; } - } catch (Exception ex) { + } catch (RuntimeException ex) { ex.printStackTrace(); } } @@ -763,6 +845,14 @@ public class Storage return rv; } + /** + * Does not include directories. + * @since 0.9.23 + */ + public int getFileCount() { + return _torrentFiles.size(); + } + /** * Includes the base for a multi-file torrent. * Sorted bottom-up for easy deletion. @@ -784,6 +874,24 @@ public class Storage return rv; } + /** + * Blocking. Holds lock. + * Recommend running only when stopped. + * Caller should thread. + * Calls listener.setWantedPieces() on completion if anything changed. + * + * @return true if anything changed, false otherwise + * @since 0.9.23 + */ + public boolean recheck() throws IOException { + int previousNeeded = needed; + checkCreateFiles(true); + boolean changed = previousNeeded != needed; + if (listener != null && changed) + listener.setWantedPieces(this); + return changed; + } + /** * This is called at the beginning, and at presumed completion, * so we have to be careful about locking. @@ -808,6 +916,7 @@ public class Storage private void locked_checkCreateFiles(boolean recheck) throws IOException { + _checkProgress.set(0); // Whether we are resuming or not, // if any of the files already exists we assume we are resuming. boolean resume = false; @@ -824,13 +933,16 @@ public class Storage // Make sure all files are available and of correct length // The files should all exist as they have been created with zero length by createFilesFromNames() + long lengthProgress = 0; for (TorrentFile tf : _torrentFiles) { long length = tf.RAFfile.length(); + lengthProgress += tf.length; if(tf.RAFfile.exists() && length == tf.length) { if (listener != null) listener.storageAllocated(this, length); + _checkProgress.set(0); resume = true; // XXX Could dynamicly check } else if (length == 0) { @@ -842,6 +954,8 @@ public class Storage tf.closeRAF(); } catch (IOException ioe) {} } + if (!resume) + _checkProgress.set((int) (pieces * lengthProgress / total_length)); } else { String msg = "File '" + tf.name + "' exists, but has wrong length (expected " + tf.length + " but found " + length + ") - repairing corruption"; @@ -850,6 +964,7 @@ public class Storage _log.error(msg); changed = true; resume = true; + _checkProgress.set(0); _probablyComplete = false; // to force RW synchronized(tf) { RandomAccessFile raf = tf.checkRAF(); @@ -870,17 +985,16 @@ public class Storage long pieceEnd = 0; for (int i = 0; i < pieces; i++) { + _checkProgress.set(i); int length = getUncheckedPiece(i, piece); boolean correctHash = metainfo.checkPiece(i, piece, 0, length); // close as we go so we don't run out of file descriptors pieceEnd += length; while (fileEnd <= pieceEnd) { TorrentFile tf = _torrentFiles.get(file); - synchronized(tf) { - try { - tf.closeRAF(); - } catch (IOException ioe) {} - } + try { + tf.closeRAF(); + } catch (IOException ioe) {} if (++file >= _torrentFiles.size()) break; fileEnd += _torrentFiles.get(file).length; @@ -896,6 +1010,7 @@ public class Storage } } + _checkProgress.set(pieces); _probablyComplete = complete(); // close all the files so we don't end up with a zillion open ones; // we will reopen as needed @@ -952,9 +1067,7 @@ public class Storage for (TorrentFile tf : _torrentFiles) { try { - synchronized(tf) { tf.closeRAF(); - } } catch (IOException ioe) { _log.error("Error closing " + tf, ioe); // gobble gobble @@ -1179,17 +1292,15 @@ public class Storage return length; } - private static final long RAFCloseDelay = 4*60*1000; + private static final long RAF_CLOSE_DELAY = 4*60*1000; /** * Close unused RAFs - call periodically */ public void cleanRAFs() { - long cutoff = System.currentTimeMillis() - RAFCloseDelay; + long cutoff = System.currentTimeMillis() - RAF_CLOSE_DELAY; for (TorrentFile tf : _torrentFiles) { - synchronized(tf) { tf.closeRAF(cutoff); - } } } @@ -1315,7 +1426,9 @@ public class Storage // Windows will zero-fill up to the point of the write, which // will make the file fairly unfragmented, on average, at least until // near the end where it will get exponentially more fragmented. - if (!_isWindows) + // Also don't ballon on ARM, as a proxy for solid state disk, where fragmentation doesn't matter too much. + // Actual detection of SSD is almost impossible. + if (!_isWindows && !_isARM) isSparse = true; } @@ -1372,18 +1485,44 @@ public class Storage * @since 0.9.4 */ public static void main(String[] args) { - if (args.length < 1 || args.length > 2) { - System.err.println("Usage: Storage file-or-dir [announceURL]"); + boolean error = false; + String created_by = null; + String announce = null; + Getopt g = new Getopt("Storage", args, "a:c:"); + try { + int c; + while ((c = g.getopt()) != -1) { + switch (c) { + case 'a': + announce = g.getOptarg(); + break; + + case 'c': + created_by = g.getOptarg(); + break; + + case '?': + case ':': + default: + error = true; + break; + } // switch + } // while + } catch (RuntimeException e) { + e.printStackTrace(); + error = true; + } + if (error || args.length - g.getOptind() != 1) { + System.err.println("Usage: Storage [-a announceURL] [-c created-by] file-or-dir"); System.exit(1); } - File base = new File(args[0]); - String announce = args.length == 2 ? args[1] : null; + File base = new File(args[g.getOptind()]); I2PAppContext ctx = I2PAppContext.getGlobalContext(); I2PSnarkUtil util = new I2PSnarkUtil(ctx); File file = null; FileOutputStream out = null; try { - Storage storage = new Storage(util, base, announce, null, false, null); + Storage storage = new Storage(util, base, announce, null, created_by, false, null); MetaInfo meta = storage.getMetaInfo(); file = new File(storage.getBaseName() + ".torrent"); out = new FileOutputStream(file); diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index ab1116722..5397cd757 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -23,8 +23,8 @@ package org.klomp.snark; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -875,18 +875,20 @@ public class TrackerClient implements Runnable { } /** - * @param ann an announce URL + * @param ann an announce URL, may be null, returns false if null * @return true for i2p hosts only * @since 0.7.12 */ public static boolean isValidAnnounce(String ann) { - URL url; + if (ann == null) + return false; + URI url; try { - url = new URL(ann); - } catch (MalformedURLException mue) { - return false; + url = new URI(ann); + } catch (URISyntaxException use) { + return false; } - return url.getProtocol().equals("http") && + return "http".equals(url.getScheme()) && url.getHost() != null && (url.getHost().endsWith(".i2p") || url.getHost().equals("i2p")); } @@ -896,15 +898,17 @@ public class TrackerClient implements Runnable { * @since 0.9.5 */ private static Hash getHostHash(String ann) { - URL url; + URI url; try { - url = new URL(ann); - } catch (MalformedURLException mue) { + url = new URI(ann); + } catch (URISyntaxException use) { return null; } - if (!url.getProtocol().equals("http")) + if (!"http".equals(url.getScheme())) return null; String host = url.getHost(); + if (host == null) + return null; if (host.endsWith(".i2p")) return ConvertToHash.getHash(host); if (host.equals("i2p")) { @@ -912,7 +916,7 @@ public class TrackerClient implements Runnable { if (path == null || path.length() < 517 || !path.startsWith("/")) return null; - String[] parts = path.substring(1).split("[/\\?&;]", 2); + String[] parts = DataHelper.split(path.substring(1), "[/\\?&;]", 2); return ConvertToHash.getHash(parts[0]); } return null; diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java index 0664065fb..4fd943c89 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import net.i2p.data.Base64; +import net.i2p.data.DataHelper; /** * Holds different types that a bencoded byte array can represent. @@ -208,7 +209,7 @@ public class BEValue } else if (bin) { buf.append(bs.length).append(" bytes: ").append(Base64.encode(bs)); } else { - buf.append('"').append(new String(bs)).append('"'); + buf.append('"').append(DataHelper.getUTF8(bs)).append('"'); } valueString = buf.toString(); } else diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java index 3b7b1d99c..784d8e6bf 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTTracker.java @@ -106,6 +106,7 @@ class DHTTracker { * @param noSeeds true if we do not want seeds in the result * @return list or empty list (never null) */ + @SuppressWarnings({"unchecked", "rawtypes"}) List getPeers(InfoHash ih, int max, boolean noSeeds) { Peers peers = _torrents.get(ih); if (peers == null || max <= 0) diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java index 58e0f39fc..27325ee6f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -40,6 +40,7 @@ import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; +import org.klomp.snark.I2PSnarkUtil; import org.klomp.snark.SnarkManager; import org.klomp.snark.TrackerClient; import org.klomp.snark.bencode.BDecoder; @@ -128,8 +129,10 @@ public class KRPC implements I2PSessionMuxedListener, DHT { /** Max number of nodes to return. BEP 5 says 8 */ private static final int K = 8; - /** Max number of peers to return. BEP 5 doesn't say. We'll use the same as I2PSnarkUtil.MAX_CONNECTIONS */ - private static final int MAX_WANT = 16; + /** Max number of peers to return. BEP 5 doesn't say. + * We'll use more than I2PSnarkUtil.MAX_CONNECTIONS since lots could be old. + */ + private static final int MAX_WANT = I2PSnarkUtil.MAX_CONNECTIONS * 3 / 2; /** overloads error codes which start with 201 */ private static final int REPLY_NONE = 0; @@ -243,6 +246,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param maxWait how long to wait for each to reply (not total) must be > 0 * @param parallel how many outstanding at once (unimplemented, always 1) */ + @SuppressWarnings("unchecked") private void explore(NID target, int maxNodes, long maxWait, int parallel) { List nodes = _knownNodes.findClosest(target, maxNodes); if (nodes.isEmpty()) { @@ -327,6 +331,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param noSeeds true if we do not want seeds in the result * @return possibly empty (never null) */ + @SuppressWarnings("unchecked") public Collection getPeersAndAnnounce(byte[] ih, int max, long maxWait, int annMax, long annMaxWait, boolean isSeed, boolean noSeeds) { @@ -858,6 +863,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param repliable true for all but announce * @return null on error */ + @SuppressWarnings("unchecked") private ReplyWaiter sendQuery(NodeInfo nInfo, Map map, boolean repliable) { if (nInfo.equals(_myNodeInfo)) throw new IllegalArgumentException("wtf don't send to ourselves"); @@ -907,6 +913,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { * @param toPort the query port, we will increment here * @return success */ + @SuppressWarnings("unchecked") private boolean sendResponse(NodeInfo nInfo, MsgID msgID, Map map) { if (nInfo.equals(_myNodeInfo)) throw new IllegalArgumentException("wtf don't send to ourselves"); @@ -1408,7 +1415,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { private List receivePeers(NodeInfo nInfo, List peers) throws InvalidBEncodingException { if (_log.shouldLog(Log.INFO)) _log.info("Rcvd peers from: " + nInfo); - int max = Math.min(MAX_WANT, peers.size()); + int max = Math.min(MAX_WANT * 2, peers.size()); List rv = new ArrayList(max); for (BEValue bev : peers) { byte[] b = bev.getBytes(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java b/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java index c6fce8f14..708d2d276 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/NodeInfo.java @@ -102,7 +102,7 @@ class NodeInfo extends SimpleDataStructure { */ public NodeInfo(String s) throws DataFormatException { super(); - String[] parts = s.split(":", 4); + String[] parts = DataHelper.split(s, ":", 4); if (parts.length != 4) throw new DataFormatException("Bad format"); byte[] nid = Base64.decode(parts[0]); @@ -225,7 +225,7 @@ class NodeInfo extends SimpleDataStructure { NodeInfo ni = (NodeInfo) o; // assume dest matches, ignore it return this.hash.equals(ni.hash) && nID.equals(ni.nID) && port == ni.port; - } catch (Exception e) { + } catch (RuntimeException e) { return false; } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java index 99e2f62a6..5537b33f1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/FetchAndAdd.java @@ -77,7 +77,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl _log = ctx.logManager().getLog(FetchAndAdd.class); _mgr = mgr; _url = url; - _name = _("Download torrent file from {0}", url); + _name = _t("Download torrent file from {0}", url); _dataDir = dataDir; byte[] fake = null; try { @@ -90,7 +90,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl * Set off by startTorrent() */ public void run() { - _mgr.addMessageNoEscape(_("Fetching {0}", urlify(_url))); + _mgr.addMessageNoEscape(_t("Fetching {0}", urlify(_url))); File file = get(); if (!_isRunning) // stopped? return; @@ -100,7 +100,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl _mgr.deleteMagnet(this); add(file); } else { - _mgr.addMessageNoEscape(_("Torrent was not retrieved from {0}", urlify(_url)) + + _mgr.addMessageNoEscape(_t("Torrent was not retrieved from {0}", urlify(_url)) + ((_failCause != null) ? (": " + DataHelper.stripHTML(_failCause)) : "")); } if (file != null) @@ -127,7 +127,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl out.deleteOnExit(); if (!_mgr.util().connected()) { - _mgr.addMessage(_("Opening the I2P tunnel")); + _mgr.addMessage(_t("Opening the I2P tunnel")); if (!_mgr.util().connect()) return null; } @@ -154,7 +154,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl * This Snark may then be deleted. */ private void add(File file) { - _mgr.addMessageNoEscape(_("Torrent fetched from {0}", urlify(_url))); + _mgr.addMessageNoEscape(_t("Torrent fetched from {0}", urlify(_url))); FileInputStream in = null; try { in = new FileInputStream(file); @@ -163,7 +163,7 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl try { in.close(); } catch (IOException ioe) {} Snark snark = _mgr.getTorrentByInfoHash(fileInfoHash); if (snark != null) { - _mgr.addMessage(_("Torrent with this info hash is already running: {0}", snark.getBaseName())); + _mgr.addMessage(_t("Torrent with this info hash is already running: {0}", snark.getBaseName())); return; } @@ -175,9 +175,9 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl if (torrentFile.exists()) { if (_mgr.getTorrent(canonical) != null) - _mgr.addMessage(_("Torrent already running: {0}", name)); + _mgr.addMessage(_t("Torrent already running: {0}", name)); else - _mgr.addMessage(_("Torrent already in the queue: {0}", name)); + _mgr.addMessage(_t("Torrent already in the queue: {0}", name)); } else { // This may take a LONG time to create the storage. _mgr.copyAndAddTorrent(file, canonical, _dataDir); @@ -188,9 +188,9 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl throw new IOException("Unknown error - check logs"); } } catch (IOException ioe) { - _mgr.addMessageNoEscape(_("Torrent at {0} was not valid", urlify(_url)) + ": " + DataHelper.stripHTML(ioe.getMessage())); + _mgr.addMessageNoEscape(_t("Torrent at {0} was not valid", urlify(_url)) + ": " + DataHelper.stripHTML(ioe.getMessage())); } catch (OutOfMemoryError oom) { - _mgr.addMessageNoEscape(_("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + DataHelper.stripHTML(oom.getMessage())); + _mgr.addMessageNoEscape(_t("ERROR - Out of memory, cannot create torrent from {0}", urlify(_url)) + ": " + DataHelper.stripHTML(oom.getMessage())); } finally { try { if (in != null) in.close(); } catch (IOException ioe) {} } @@ -345,11 +345,11 @@ public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnabl // End of EepGet status listeners - private String _(String s) { + private String _t(String s) { return _mgr.util().getString(s); } - private String _(String s, String o) { + private String _t(String s, String o) { return _mgr.util().getString(s, o); } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 9df86b3b9..754ea8148 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -31,6 +31,8 @@ import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.util.Log; import net.i2p.util.SecureFile; +import net.i2p.util.SystemVersion; +import net.i2p.util.Translate; import org.klomp.snark.I2PSnarkUtil; import org.klomp.snark.MagnetURI; @@ -265,14 +267,14 @@ public class I2PSnarkServlet extends BasicServlet { "\n" + ""); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write(" - "); if (isConfigure) - out.write(_("Configuration")); + out.write(_t("Configuration")); else - out.write(_("Anonymous BitTorrent Client")); + out.write(_t("Anonymous BitTorrent Client")); String peerParam = req.getParameter("p"); if ("2".equals(peerParam)) out.write(" | Debug Mode"); @@ -286,7 +288,7 @@ public class I2PSnarkServlet extends BasicServlet { //out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n"); out.write("<script src=\"/js/ajax.js\" type=\"text/javascript\"></script>\n" + "<script type=\"text/javascript\">\n" + - "var failMessage = \"<div class=\\\"routerdown\\\"><b>" + _("Router is down") + "<\\/b><\\/div>\";\n" + + "var failMessage = \"<div class=\\\"routerdown\\\"><b>" + _t("Router is down") + "<\\/b><\\/div>\";\n" + "function requestAjax1() { ajax(\"" + _contextPath + "/.ajax/xhr1.html" + peerString.replace("&", "&") + // don't html escape in js "\", \"mainsection\", " + (delay*1000) + "); }\n" + @@ -303,27 +305,27 @@ public class I2PSnarkServlet extends BasicServlet { List<Tracker> sortedTrackers = null; if (isConfigure) { out.write("<div class=\"snarknavbar\"><a href=\"" + _contextPath + "/\" title=\""); - out.write(_("Torrents")); + out.write(_t("Torrents")); out.write("\" class=\"snarkRefresh\">"); out.write(toThemeImg("arrow_refresh")); out.write("  "); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write("</a>"); } else { out.write("<div class=\"snarknavbar\"><a href=\"" + _contextPath + '/' + peerString + "\" title=\""); - out.write(_("Refresh page")); + out.write(_t("Refresh page")); out.write("\" class=\"snarkRefresh\">"); out.write(toThemeImg("arrow_refresh")); out.write("  "); if (_contextName.equals(DEFAULT_NAME)) - out.write(_("I2PSnark")); + out.write(_t("I2PSnark")); else out.write(_contextName); out.write("</a> <a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\" target=\"_blank\">"); - out.write(_("Forum")); + out.write(_t("Forum")); out.write("</a>\n"); sortedTrackers = _manager.getSortedTrackers(); @@ -338,7 +340,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</div>\n"); String newURL = req.getParameter("newURL"); if (newURL != null && newURL.trim().length() > 0 && req.getMethod().equals("GET")) - _manager.addMessage(_("Click \"Add torrent\" button to fetch torrent")); + _manager.addMessage(_t("Click \"Add torrent\" button to fetch torrent")); out.write("<div class=\"page\"><div id=\"mainsection\" class=\"mainsection\">"); writeMessages(out, isConfigure, peerString); @@ -391,7 +393,7 @@ public class I2PSnarkServlet extends BasicServlet { else out.write("?"); out.write("action=Clear&nonce=" + _nonce + "\">"); - String tx = _("clear messages"); + String tx = _t("clear messages"); out.write(toThemeImg("delete", tx, tx)); out.write("</a>" + "<ul>"); @@ -446,9 +448,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort)); out.write("\">"); } - String tx = _("Status"); + String tx = _t("Status"); out.write(toThemeImg("status", tx, - showSort ? _("Sort by {0}", tx) + showSort ? _t("Sort by {0}", tx) : tx)); if (showSort) out.write("</a>"); @@ -457,14 +459,15 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" <a href=\"" + _contextPath + '/'); if (peerParam != null) { // disable peer view + out.write(getQueryString(req, "", null, null)); out.write("\">"); - tx = _("Hide Peers"); + tx = _t("Hide Peers"); out.write(toThemeImg("hidepeers", tx, tx)); } else { // enable peer view out.write(getQueryString(req, "1", null, null)); out.write("\">"); - tx = _("Show Peers"); + tx = _t("Show Peers"); out.write(toThemeImg("showpeers", tx, tx)); } out.write("</a><br>\n"); @@ -487,9 +490,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + '/' + getQueryString(req, null, null, sort)); out.write("\">"); } - tx = _("Torrent"); + tx = _t("Torrent"); out.write(toThemeImg("torrent", tx, - showSort ? _("Sort by {0}", (isTypeSort ? _("File type") : tx)) + showSort ? _t("Sort by {0}", (isTypeSort ? _t("File type") : tx)) : tx)); if (showSort) out.write("</a>"); @@ -505,10 +508,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("ETA"); + tx = _t("ETA"); out.write(toThemeImg("eta", tx, - showSort ? _("Sort by {0}", _("Estimated time remaining")) - : _("Estimated time remaining"))); + showSort ? _t("Sort by {0}", _t("Estimated time remaining")) + : _t("Estimated time remaining"))); if (showSort) out.write("</a>"); } @@ -531,10 +534,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("RX"); + tx = _t("RX"); out.write(toThemeImg("head_rx", tx, - showSort ? _("Sort by {0}", (isDlSort ? _("Downloaded") : _("Size"))) - : _("Downloaded"))); + showSort ? _t("Sort by {0}", (isDlSort ? _t("Downloaded") : _t("Size"))) + : _t("Downloaded"))); if (showSort) out.write("</a>"); out.write("</th>\n<th align=\"right\">"); @@ -562,10 +565,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("TX"); + tx = _t("TX"); out.write(toThemeImg("head_tx", tx, - showSort ? _("Sort by {0}", (nextRatSort ? _("Upload ratio") : _("Uploaded"))) - : _("Uploaded"))); + showSort ? _t("Sort by {0}", (nextRatSort ? _t("Upload ratio") : _t("Uploaded"))) + : _t("Uploaded"))); if (showSort) out.write("</a>"); } @@ -577,10 +580,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("RX Rate"); + tx = _t("RX Rate"); out.write(toThemeImg("head_rxspeed", tx, - showSort ? _("Sort by {0}", _("Down Rate")) - : _("Down Rate"))); + showSort ? _t("Sort by {0}", _t("Down Rate")) + : _t("Down Rate"))); if (showSort) out.write("</a>"); } @@ -592,10 +595,10 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\">"); } // Translators: Please keep short or translate as " " - tx = _("TX Rate"); + tx = _t("TX Rate"); out.write(toThemeImg("head_txspeed", tx, - showSort ? _("Sort by {0}", _("Up Rate")) - : _("Up Rate"))); + showSort ? _t("Sort by {0}", _t("Up Rate")) + : _t("Up Rate"))); if (showSort) out.write("</a>"); } @@ -611,9 +614,9 @@ public class I2PSnarkServlet extends BasicServlet { //out.write("<input type=\"image\" name=\"action\" value=\"StopAll\" title=\""); out.write("<input type=\"image\" name=\"action_StopAll\" value=\"foo\" title=\""); } - out.write(_("Stop all torrents and the I2P tunnel")); + out.write(_t("Stop all torrents and the I2P tunnel")); out.write("\" src=\"" + _imgPath + "stop_all.png\" alt=\""); - out.write(_("Stop All")); + out.write(_t("Stop All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -625,9 +628,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + "/?action=StartAll&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_StartAll\" value=\"foo\" title=\""); - out.write(_("Start all stopped torrents")); + out.write(_t("Start all stopped torrents")); out.write("\" src=\"" + _imgPath + "start_all.png\" alt=\""); - out.write(_("Start All")); + out.write(_t("Start All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -639,9 +642,9 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath + "/?action=StartAll&nonce=" + _nonce + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_StartAll\" value=\"foo\" title=\""); - out.write(_("Start all torrents and the I2P tunnel")); + out.write(_t("Start all torrents and the I2P tunnel")); out.write("\" src=\"" + _imgPath + "start_all.png\" alt=\""); - out.write(_("Start All")); + out.write(_t("Start All")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -664,13 +667,13 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<tr class=\"snarkTorrentNoneLoaded\">" + "<td class=\"snarkTorrentNoneLoaded\"" + " colspan=\"11\"><i>"); - out.write(_("No torrents loaded.")); + out.write(_t("No torrents loaded.")); out.write("</i></td></tr>\n"); } else /** if (snarks.size() > 1) */ { out.write("<tfoot><tr>\n" + " <th align=\"left\" colspan=\"6\">"); out.write(" "); - out.write(_("Totals")); + out.write(_t("Totals")); out.write(": "); out.write(ngettext("1 torrent", "{0} torrents", total)); out.write(", "); @@ -686,6 +689,17 @@ public class I2PSnarkServlet extends BasicServlet { out.write(", "); out.write(ngettext("1 DHT peer", "{0} DHT peers", dhts)); } + } + String IPString = _manager.util().getOurIPString(); + if(!IPString.equals("unknown")) { + // Only truncate if it's an actual dest + out.write("; "); + out.write(_t("Dest")); + out.write(": <tt>"); + out.write(IPString.substring(0, 4)); + out.write("</tt>"); + } + if (dht != null) { if (showDebug) out.write(dht.renderStatusHTML()); } @@ -808,7 +822,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<a href=\"" + _contextPath); out.write(getQueryString(req, null, "", null)); out.write("\">"); - out.write(toThemeImg("control_rewind_blue", _("First"), _("First page"))); + out.write(toThemeImg("control_rewind_blue", _t("First"), _t("First page"))); out.write("</a> "); int prev = Math.max(0, start - pageSize); //if (prev > 0) { @@ -818,7 +832,7 @@ public class I2PSnarkServlet extends BasicServlet { String sprev = (prev > 0) ? Integer.toString(prev) : ""; out.write(getQueryString(req, null, sprev, null)); out.write("\">"); - out.write(toThemeImg("control_back_blue", _("Prev"), _("Previous page"))); + out.write(toThemeImg("control_back_blue", _t("Prev"), _t("Previous page"))); out.write("</a> "); } } else { @@ -840,7 +854,7 @@ public class I2PSnarkServlet extends BasicServlet { page = pages; else page = 1 + (start / pageSize); - //out.write(" " + _("Page {0}", page) + thinsp(noThinsp) + pages + " "); + //out.write(" " + _t("Page {0}", page) + thinsp(noThinsp) + pages + " "); out.write("  " + page + thinsp(noThinsp) + pages + "  "); } if (start + pageSize < total) { @@ -851,7 +865,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" <a href=\"" + _contextPath); out.write(getQueryString(req, null, Integer.toString(next), null)); out.write("\">"); - out.write(toThemeImg("control_play_blue", _("Next"), _("Next page"))); + out.write(toThemeImg("control_play_blue", _t("Next"), _t("Next page"))); out.write("</a> "); } // Last @@ -859,7 +873,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" <a href=\"" + _contextPath); out.write(getQueryString(req, null, Integer.toString(last), null)); out.write("\">"); - out.write(toThemeImg("control_fastforward_blue", _("Last"), _("Last page"))); + out.write(toThemeImg("control_fastforward_blue", _t("Last"), _t("Last page"))); out.write("</a> "); } else { out.write(" " + @@ -905,7 +919,7 @@ public class I2PSnarkServlet extends BasicServlet { if ( (newFile != null) && (newFile.trim().length() > 0) ) f = new File(newFile.trim()); if ( (f != null) && (!f.exists()) ) { - _manager.addMessage(_("Torrent file {0} does not exist", newFile)); + _manager.addMessage(_t("Torrent file {0} does not exist", newFile)); } if ( (f != null) && (f.exists()) ) { // NOTE - All this is disabled - load from local file disabled @@ -916,16 +930,16 @@ public class I2PSnarkServlet extends BasicServlet { if (local.exists()) { if (_manager.getTorrent(canonical) != null) - _manager.addMessage(_("Torrent already running: {0}", newFile)); + _manager.addMessage(_t("Torrent already running: {0}", newFile)); else - _manager.addMessage(_("Torrent already in the queue: {0}", newFile)); + _manager.addMessage(_t("Torrent already in the queue: {0}", newFile)); } else { boolean ok = FileUtil.copy(f.getAbsolutePath(), local.getAbsolutePath(), true); if (ok) { - _manager.addMessage(_("Copying torrent to {0}", local.getAbsolutePath())); + _manager.addMessage(_t("Copying torrent to {0}", local.getAbsolutePath())); _manager.addTorrent(canonical); } else { - _manager.addMessage(_("Unable to copy the torrent to {0}", local.getAbsolutePath()) + ' ' + _("from {0}", f.getAbsolutePath())); + _manager.addMessage(_t("Unable to copy the torrent to {0}", local.getAbsolutePath()) + ' ' + _t("from {0}", f.getAbsolutePath())); } } } catch (IOException ioe) { @@ -941,11 +955,11 @@ public class I2PSnarkServlet extends BasicServlet { if (newDir.length() > 0) { dir = new SecureFile(newDir); if (!dir.isAbsolute()) { - _manager.addMessage(_("Data directory must be an absolute path") + ": " + dir); + _manager.addMessage(_t("Data directory must be an absolute path") + ": " + dir); return; } if (!dir.isDirectory() && !dir.mkdirs()) { - _manager.addMessage(_("Data directory cannot be created") + ": " + dir); + _manager.addMessage(_t("Data directory cannot be created") + ": " + dir); return; } Collection<Snark> snarks = _manager.getTorrents(); @@ -955,7 +969,7 @@ public class I2PSnarkServlet extends BasicServlet { continue; File sbase = storage.getBase(); if (isParentOf(sbase, dir)) { - _manager.addMessage(_("Cannot add torrent {0} inside another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} inside another torrent: {1}", dir.getAbsolutePath(), sbase)); return; } @@ -968,9 +982,15 @@ public class I2PSnarkServlet extends BasicServlet { } else if (newURL.startsWith(MagnetURI.MAGNET) || newURL.startsWith(MagnetURI.MAGGOT)) { addMagnet(newURL, dir); } else if (newURL.length() == 40 && newURL.replaceAll("[a-fA-F0-9]", "").length() == 0) { + // hex + newURL = newURL.toUpperCase(Locale.US); + addMagnet(MagnetURI.MAGNET_FULL + newURL, dir); + } else if (newURL.length() == 32 && newURL.replaceAll("[a-zA-Z2-7]", "").length() == 0) { + // b32 + newURL = newURL.toUpperCase(Locale.US); addMagnet(MagnetURI.MAGNET_FULL + newURL, dir); } else { - _manager.addMessage(_("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", + _manager.addMessage(_t("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", MagnetURI.MAGNET, MagnetURI.MAGGOT)); } } else { @@ -1011,7 +1031,7 @@ public class I2PSnarkServlet extends BasicServlet { // magnet - remove and delete are the same thing // Remove not shown on UI so we shouldn't get here _manager.deleteMagnet(snark); - _manager.addMessage(_("Magnet deleted: {0}", name)); + _manager.addMessage(_t("Magnet deleted: {0}", name)); return; } _manager.stopTorrent(snark, true); @@ -1019,7 +1039,7 @@ public class I2PSnarkServlet extends BasicServlet { // yeah, need to, otherwise it'll get autoadded again (at the moment File f = new File(name); f.delete(); - _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); + _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath())); break; } } @@ -1038,34 +1058,35 @@ public class I2PSnarkServlet extends BasicServlet { // magnet - remove and delete are the same thing _manager.deleteMagnet(snark); if (snark instanceof FetchAndAdd) - _manager.addMessage(_("Download deleted: {0}", name)); + _manager.addMessage(_t("Download deleted: {0}", name)); else - _manager.addMessage(_("Magnet deleted: {0}", name)); + _manager.addMessage(_t("Magnet deleted: {0}", name)); return; } _manager.stopTorrent(snark, true); File f = new File(name); f.delete(); - _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); - List<List<String>> files = meta.getFiles(); - String dataFile = snark.getBaseName(); - f = new File(_manager.getDataDir(), dataFile); - if (files == null) { // single file torrent - if (f.delete()) - _manager.addMessage(_("Data file deleted: {0}", f.getAbsolutePath())); - else - _manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath())); - break; - } + _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath())); Storage storage = snark.getStorage(); if (storage == null) break; + List<List<String>> files = meta.getFiles(); + if (files == null) { // single file torrent + for (File df : storage.getFiles()) { + // should be only one + if (df.delete()) + _manager.addMessage(_t("Data file deleted: {0}", df.getAbsolutePath())); + else + _manager.addMessage(_t("Data file could not be deleted: {0}", df.getAbsolutePath())); + } + break; + } // step 1 delete files for (File df : storage.getFiles()) { if (df.delete()) { - //_manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath())); + //_manager.addMessage(_t("Data file deleted: {0}", df.getAbsolutePath())); } else { - _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Data file could not be deleted: {0}", df.getAbsolutePath())); } } // step 2 delete dirs bottom-up @@ -1078,17 +1099,17 @@ public class I2PSnarkServlet extends BasicServlet { for (File df : dirs) { if (df.delete()) { ok = true; - //_manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath())); + //_manager.addMessage(_t("Data dir deleted: {0}", df.getAbsolutePath())); } else { ok = false; - _manager.addMessage(_("Directory could not be deleted: {0}", df.getAbsolutePath())); + _manager.addMessage(_t("Directory could not be deleted: {0}", df.getAbsolutePath())); if (_log.shouldLog(Log.WARN)) _log.warn("Could not delete dir " + df); } } // step 3 message for base (last one) if (ok) - _manager.addMessage(_("Directory deleted: {0}", storage.getBase())); + _manager.addMessage(_t("Directory deleted: {0}", storage.getBase())); break; } } @@ -1098,6 +1119,7 @@ public class I2PSnarkServlet extends BasicServlet { String dataDir = req.getParameter("nofilter_dataDir"); boolean filesPublic = req.getParameter("filesPublic") != null; boolean autoStart = req.getParameter("autoStart") != null; + boolean smartSort = req.getParameter("smartSort") != null; String seedPct = req.getParameter("seedPct"); String eepHost = req.getParameter("eepHost"); String eepPort = req.getParameter("eepPort"); @@ -1113,7 +1135,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean useDHT = req.getParameter("useDHT") != null; //String openTrackers = req.getParameter("openTrackers"); String theme = req.getParameter("theme"); - _manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel, pageSize, + _manager.updateConfig(dataDir, filesPublic, autoStart, smartSort, refreshDel, startupDel, pageSize, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, useDHT, theme); // update servlet @@ -1139,18 +1161,18 @@ public class I2PSnarkServlet extends BasicServlet { if (baseFile.exists()) { String torrentName = baseFile.getName(); if (torrentName.toLowerCase(Locale.US).endsWith(".torrent")) { - _manager.addMessage(_("Cannot add a torrent ending in \".torrent\": {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot add a torrent ending in \".torrent\": {0}", baseFile.getAbsolutePath())); return; } Snark snark = _manager.getTorrentByBaseName(torrentName); if (snark != null) { - _manager.addMessage(_("Torrent with this name is already running: {0}", torrentName)); + _manager.addMessage(_t("Torrent with this name is already running: {0}", torrentName)); return; } if (isParentOf(baseFile,_manager.getDataDir()) || isParentOf(baseFile, _manager.util().getContext().getBaseDir()) || isParentOf(baseFile, _manager.util().getContext().getConfigDir())) { - _manager.addMessage(_("Cannot add a torrent including an I2P directory: {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot add a torrent including an I2P directory: {0}", baseFile.getAbsolutePath())); return; } Collection<Snark> snarks = _manager.getTorrents(); @@ -1160,12 +1182,12 @@ public class I2PSnarkServlet extends BasicServlet { continue; File sbase = storage.getBase(); if (isParentOf(sbase, baseFile)) { - _manager.addMessage(_("Cannot add torrent {0} inside another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} inside another torrent: {1}", baseFile.getAbsolutePath(), sbase)); return; } if (isParentOf(baseFile, sbase)) { - _manager.addMessage(_("Cannot add torrent {0} including another torrent: {1}", + _manager.addMessage(_t("Cannot add torrent {0} including another torrent: {1}", baseFile.getAbsolutePath(), sbase)); return; } @@ -1191,7 +1213,7 @@ public class I2PSnarkServlet extends BasicServlet { if (!backupURLs.isEmpty()) { // BEP 12 - Put primary first, then the others, each as the sole entry in their own list if (announceURL == null) { - _manager.addMessage(_("Error - Cannot include alternate trackers without a primary tracker")); + _manager.addMessage(_t("Error - Cannot include alternate trackers without a primary tracker")); return; } backupURLs.add(0, announceURL); @@ -1204,7 +1226,7 @@ public class I2PSnarkServlet extends BasicServlet { hasPublic = true; } if (hasPrivate && hasPublic) { - _manager.addMessage(_("Error - Cannot mix private and public trackers in a torrent")); + _manager.addMessage(_t("Error - Cannot mix private and public trackers in a torrent")); return; } announceList = new ArrayList<List<String>>(backupURLs.size()); @@ -1217,7 +1239,7 @@ public class I2PSnarkServlet extends BasicServlet { // it shouldn't be THAT bad, so keep it in this thread. // TODO thread it for big torrents, perhaps a la FetchAndAdd boolean isPrivate = _manager.getPrivateTrackers().contains(announceURL); - Storage s = new Storage(_manager.util(), baseFile, announceURL, announceList, isPrivate, null); + Storage s = new Storage(_manager.util(), baseFile, announceURL, announceList, null, isPrivate, null); s.close(); // close the files... maybe need a way to pass this Storage to addTorrent rather than starting over MetaInfo info = s.getMetaInfo(); File torrentFile = new File(_manager.getDataDir(), s.getBaseName() + ".torrent"); @@ -1226,18 +1248,18 @@ public class I2PSnarkServlet extends BasicServlet { boolean ok = _manager.addTorrent(info, s.getBitField(), torrentFile.getAbsolutePath(), baseFile, true); if (!ok) return; - _manager.addMessage(_("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); + _manager.addMessage(_t("Torrent created for \"{0}\"", baseFile.getName()) + ": " + torrentFile.getAbsolutePath()); if (announceURL != null && !_manager.util().getOpenTrackers().contains(announceURL)) - _manager.addMessage(_("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); + _manager.addMessage(_t("Many I2P trackers require you to register new torrents before seeding - please do so before starting \"{0}\"", baseFile.getName())); } catch (IOException ioe) { - _manager.addMessage(_("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe); + _manager.addMessage(_t("Error creating a torrent for \"{0}\"", baseFile.getAbsolutePath()) + ": " + ioe); _log.error("Error creating a torrent", ioe); } } else { - _manager.addMessage(_("Cannot create a torrent for the nonexistent data: {0}", baseFile.getAbsolutePath())); + _manager.addMessage(_t("Cannot create a torrent for the nonexistent data: {0}", baseFile.getAbsolutePath())); } } else { - _manager.addMessage(_("Error creating torrent - you must enter a file or directory")); + _manager.addMessage(_t("Error creating torrent - you must enter a file or directory")); } } else if ("StopAll".equals(action)) { _manager.stopAllTorrents(false); @@ -1268,7 +1290,7 @@ public class I2PSnarkServlet extends BasicServlet { /** @since 0.9 */ private void processTrackerForm(String action, HttpServletRequest req) { - if (action.equals(_("Delete selected")) || action.equals(_("Save tracker configuration"))) { + if (action.equals(_t("Delete selected")) || action.equals(_t("Save tracker configuration"))) { boolean changed = false; Map<String, Tracker> trackers = _manager.getTrackerMap(); List<String> removed = new ArrayList<String>(); @@ -1285,7 +1307,7 @@ public class I2PSnarkServlet extends BasicServlet { Tracker t; if ((t = trackers.remove(k)) != null) { removed.add(t.announceURL); - _manager.addMessage(_("Removed") + ": " + DataHelper.stripHTML(k)); + _manager.addMessage(_t("Removed") + ": " + DataHelper.stripHTML(k)); changed = true; } } else if (k.startsWith("ttype_")) { @@ -1317,7 +1339,7 @@ public class I2PSnarkServlet extends BasicServlet { if (!priv.equals(oldPriv)) _manager.savePrivateTrackers(priv); - } else if (action.equals(_("Add tracker"))) { + } else if (action.equals(_t("Add tracker"))) { String name = req.getParameter("tname"); String hurl = req.getParameter("thurl"); String aurl = req.getParameter("taurl"); @@ -1340,15 +1362,15 @@ public class I2PSnarkServlet extends BasicServlet { _manager.savePrivateTrackers(newPriv); } } else { - _manager.addMessage(_("Enter valid tracker name and URLs")); + _manager.addMessage(_t("Enter valid tracker name and URLs")); } } else { - _manager.addMessage(_("Enter valid tracker name and URLs")); + _manager.addMessage(_t("Enter valid tracker name and URLs")); } - } else if (action.equals(_("Restore defaults"))) { + } else if (action.equals(_t("Restore defaults"))) { _manager.setDefaultTrackerMap(); _manager.saveOpenTrackers(null); - _manager.addMessage(_("Restored default trackers")); + _manager.addMessage(_t("Restored default trackers")); } else { _manager.addMessage("Unknown POST action: \"" + action + '\"'); } @@ -1381,6 +1403,10 @@ public class I2PSnarkServlet extends BasicServlet { sort = Integer.parseInt(ssort); } catch (NumberFormatException nfe) {} } + if (_manager.isSmartSortEnabled()) + Sorters.setPattern(Translate.getLanguage(_manager.util().getContext())); + else + Sorters.setPattern(null); try { Collections.sort(rv, Sorters.getComparator(sort, this)); } catch (IllegalArgumentException iae) { @@ -1456,38 +1482,40 @@ public class I2PSnarkServlet extends BasicServlet { String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); String statusString; if (snark.isChecking()) { - statusString = toThemeImg("stalled", "", _("Checking")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Checking"); + statusString = toThemeImg("stalled", "", _t("Checking")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Checking") + ' ' + + (new DecimalFormat("0.00%")).format(snark.getCheckingProgress()); } else if (snark.isAllocating()) { - statusString = toThemeImg("stalled", "", _("Allocating")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Allocating"); - } else if (err != null && curPeers == 0) { + statusString = toThemeImg("stalled", "", _t("Allocating")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Allocating"); + } else if (err != null && isRunning && curPeers == 0) { + //} else if (err != null && curPeers == 0) { // Also don't show if seeding... but then we won't see the not-registered error // && remaining != 0 && needed != 0) { // let's only show this if we have no peers, otherwise PEX and DHT should bail us out, user doesn't care //if (isRunning && curPeers > 0 && !showPeers) // statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td>" + - // "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") + + // "<td class=\"snarkTorrentStatus " + rowClass + "\">" + _t("Tracker Error") + // ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" + // curPeers + thinsp(noThinsp) + // ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; //else if (isRunning) - if (isRunning) + //if (isRunning) { statusString = toThemeImg("trackererror", "", err) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Tracker Error") + + "<td class=\"snarkTorrentStatus\">" + _t("Tracker Error") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); - else { - if (err.length() > MAX_DISPLAYED_ERROR_LENGTH) - err = DataHelper.escapeHTML(err.substring(0, MAX_DISPLAYED_ERROR_LENGTH)) + "…"; - else - err = DataHelper.escapeHTML(err); - statusString = toThemeImg("trackererror", "", err) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Tracker Error"); - } + //} else { + // if (err.length() > MAX_DISPLAYED_ERROR_LENGTH) + // err = DataHelper.escapeHTML(err.substring(0, MAX_DISPLAYED_ERROR_LENGTH)) + "…"; + // else + // err = DataHelper.escapeHTML(err); + // statusString = toThemeImg("trackererror", "", err) + "</td>" + + // "<td class=\"snarkTorrentStatus\">" + _t("Tracker Error"); + //} } else if (snark.isStarting()) { - statusString = toThemeImg("stalled", "", _("Starting")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Starting"); + statusString = toThemeImg("stalled", "", _t("Starting")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Starting"); } else if (remaining == 0 || needed == 0) { // < 0 means no meta size yet // partial complete or seeding if (isRunning) { @@ -1495,11 +1523,11 @@ public class I2PSnarkServlet extends BasicServlet { String txt; if (remaining == 0) { img = "seeding"; - txt = _("Seeding"); + txt = _t("Seeding"); } else { // partial img = "complete"; - txt = _("Complete"); + txt = _t("Complete"); } if (curPeers > 0 && !showPeers) statusString = toThemeImg(img, "", txt) + "</td>" + @@ -1513,42 +1541,42 @@ public class I2PSnarkServlet extends BasicServlet { ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); } else { - statusString = toThemeImg("complete", "", _("Complete")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Complete"); + statusString = toThemeImg("complete", "", _t("Complete")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Complete"); } } else { if (isRunning && curPeers > 0 && downBps > 0 && !showPeers) - statusString = toThemeImg("downloading", "", _("OK")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("OK") + + statusString = toThemeImg("downloading", "", _t("OK")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("OK") + ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0 && downBps > 0) - statusString = toThemeImg("downloading", "", _("OK")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("OK") + + statusString = toThemeImg("downloading", "", _t("OK")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("OK") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); else if (isRunning && curPeers > 0 && !showPeers) - statusString = toThemeImg("stalled", "", _("Stalled")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stalled") + + statusString = toThemeImg("stalled", "", _t("Stalled")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stalled") + ": <a href=\"" + uri + getQueryString(req, Base64.encode(snark.getInfoHash()), null, null) + "\">" + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers) + "</a>"; else if (isRunning && curPeers > 0) - statusString = toThemeImg("stalled", "", _("Stalled")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stalled") + + statusString = toThemeImg("stalled", "", _t("Stalled")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stalled") + ": " + curPeers + thinsp(noThinsp) + ngettext("1 peer", "{0} peers", knownPeers); else if (isRunning && knownPeers > 0) - statusString = toThemeImg("nopeers", "", _("No Peers")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("No Peers") + + statusString = toThemeImg("nopeers", "", _t("No Peers")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("No Peers") + ": 0" + thinsp(noThinsp) + knownPeers ; else if (isRunning) - statusString = toThemeImg("nopeers", "", _("No Peers")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("No Peers"); + statusString = toThemeImg("nopeers", "", _t("No Peers")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("No Peers"); else - statusString = toThemeImg("stopped", "", _("Stopped")) + "</td>" + - "<td class=\"snarkTorrentStatus\">" + _("Stopped"); + statusString = toThemeImg("stopped", "", _t("Stopped")) + "</td>" + + "<td class=\"snarkTorrentStatus\">" + _t("Stopped"); } out.write("<tr class=\"" + rowClass + "\">"); @@ -1577,7 +1605,7 @@ public class I2PSnarkServlet extends BasicServlet { // gets us to the details page instead of the file. StringBuilder buf = new StringBuilder(128); buf.append("<a href=\"").append(encodedBaseName) - .append("/\" title=\"").append(_("Torrent details")) + .append("/\" title=\"").append(_t("Torrent details")) .append("\">"); out.write(buf.toString()); } @@ -1612,9 +1640,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append('/'); buf.append("\" title=\""); if (isMultiFile) - buf.append(_("View files")); + buf.append(_t("View files")); else - buf.append(_("Open file")); + buf.append(_t("Open file")); buf.append("\">"); out.write(buf.toString()); } @@ -1666,9 +1694,9 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Stop_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Stop the torrent")); + out.write(_t("Stop the torrent")); out.write("\" src=\"" + _imgPath + "stop.png\" alt=\""); - out.write(_("Stop")); + out.write(_t("Stop")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1681,9 +1709,9 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Start_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Start the torrent")); + out.write(_t("Start the torrent")); out.write("\" src=\"" + _imgPath + "start.png\" alt=\""); - out.write(_("Start")); + out.write(_t("Start")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1696,16 +1724,16 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Remove_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Remove the torrent from the active list, deleting the .torrent file")); + out.write(_t("Remove the torrent from the active list, deleting the .torrent file")); out.write("\" onclick=\"if (!confirm('"); // Can't figure out how to escape double quotes inside the onclick string. // Single quotes in translate strings with parameters must be doubled. // Then the remaining single quote must be escaped - out.write(_("Are you sure you want to delete the file \\''{0}\\'' (downloaded data will not be deleted) ?", + out.write(_t("Are you sure you want to delete the file \\''{0}\\'' (downloaded data will not be deleted) ?", escapeJSString(snark.getName()))); out.write("')) { return false; }\""); out.write(" src=\"" + _imgPath + "remove.png\" alt=\""); - out.write(_("Remove")); + out.write(_t("Remove")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1718,16 +1746,16 @@ public class I2PSnarkServlet extends BasicServlet { getQueryString(req, "", null, null).replace("?", "&") + "\"><img title=\""); else out.write("<input type=\"image\" name=\"action_Delete_" + b64 + "\" value=\"foo\" title=\""); - out.write(_("Delete the .torrent file and the associated data file(s)")); + out.write(_t("Delete the .torrent file and the associated data file(s)")); out.write("\" onclick=\"if (!confirm('"); // Can't figure out how to escape double quotes inside the onclick string. // Single quotes in translate strings with parameters must be doubled. // Then the remaining single quote must be escaped - out.write(_("Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?", + out.write(_t("Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded data?", escapeJSString(fullBasename))); out.write("')) { return false; }\""); out.write(" src=\"" + _imgPath + "delete.png\" alt=\""); - out.write(_("Delete")); + out.write(_t("Delete")); out.write("\">"); if (isDegraded) out.write("</a>"); @@ -1747,7 +1775,7 @@ public class I2PSnarkServlet extends BasicServlet { String ch = pid != null ? pid.toString().substring(0, 4) : "????"; String client; if ("AwMD".equals(ch)) - client = _("I2PSnark"); + client = _t("I2PSnark"); else if ("BFJT".equals(ch)) client = "I2PRufus"; else if ("TTMt".equals(ch)) @@ -1763,7 +1791,7 @@ public class I2PSnarkServlet extends BasicServlet { else if ("LUtU".equals(ch)) client = "KTorrent" + getAzVersion(pid.getID()); else - client = _("Unknown") + " (" + ch + ')'; + client = _t("Unknown") + " (" + ch + ')'; out.write(client + "  <tt>" + peer.toString().substring(5, 9)+ "</tt>"); if (showDebug) out.write(" inactive " + (peer.getInactiveTime() / 1000) + "s"); @@ -1775,7 +1803,7 @@ public class I2PSnarkServlet extends BasicServlet { if (isValid) { pct = (float) (100.0 * peer.completed() / meta.getPieces()); if (pct >= 100.0) - out.write(_("Seed")); + out.write(_t("Seed")); else { String ps = String.valueOf(pct); if (ps.length() > 5) @@ -1798,9 +1826,9 @@ public class I2PSnarkServlet extends BasicServlet { } else { out.write("<span class=\"choked\"><a title=\""); if (!peer.isInteresting()) - out.write(_("Uninteresting (The peer has no pieces we need)")); + out.write(_t("Uninteresting (The peer has no pieces we need)")); else - out.write(_("Choked (The peer is not allowing us to request pieces)")); + out.write(_t("Choked (The peer is not allowing us to request pieces)")); out.write("\">"); out.write(formatSize(peer.getDownloadRate()) + "ps</a></span>"); } @@ -1820,9 +1848,9 @@ public class I2PSnarkServlet extends BasicServlet { } else { out.write("<span class=\"choked\"><a title=\""); if (!peer.isInterested()) - out.write(_("Uninterested (We have no pieces the peer needs)")); + out.write(_t("Uninterested (We have no pieces the peer needs)")); else - out.write(_("Choking (We are not allowing the peer to request pieces)")); + out.write(_t("Choking (We are not allowing the peer to request pieces)")); out.write("\">"); out.write(formatSize(peer.getUploadRate()) + "ps</a></span>"); } @@ -1938,7 +1966,7 @@ public class I2PSnarkServlet extends BasicServlet { StringBuilder buf = new StringBuilder(128); buf.append("<a href=\"").append(baseURL).append("details.php?dllist=1&filelist=1&info_hash=") .append(TrackerClient.urlencode(infohash)) - .append("\" title=\"").append(_("Details at {0} tracker", name)).append("\" target=\"_blank\">"); + .append("\" title=\"").append(_t("Details at {0} tracker", name)).append("\" target=\"_blank\">"); return buf.toString(); } } @@ -1955,7 +1983,7 @@ public class I2PSnarkServlet extends BasicServlet { if (linkUrl != null) { StringBuilder buf = new StringBuilder(128); buf.append(linkUrl); - toThemeImg(buf, "details", _("Info"), ""); + toThemeImg(buf, "details", _t("Info"), ""); buf.append("</a>"); return buf.toString(); } @@ -2028,31 +2056,31 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">"); out.write(toThemeImg("add")); out.write(' '); - out.write(_("Add Torrent")); + out.write(_t("Add Torrent")); out.write("</span><hr>\n<table border=\"0\"><tr><td>"); - out.write(_("From URL")); + out.write(_t("From URL")); out.write(":<td><input type=\"text\" name=\"nofilter_newURL\" size=\"85\" value=\"" + newURL + "\" spellcheck=\"false\""); out.write(" title=\""); - out.write(_("Enter the torrent file download URL (I2P only), magnet link, maggot link, or info hash")); + out.write(_t("Enter the torrent file download URL (I2P only), magnet link, maggot link, or info hash")); out.write("\"> \n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>"); out.write("<input type=\"submit\" class=\"add\" value=\""); - out.write(_("Add torrent")); + out.write(_t("Add torrent")); out.write("\" name=\"foo\" ><br>\n" + "<tr><td>"); - out.write(_("Data dir")); + out.write(_t("Data dir")); out.write(":<td><input type=\"text\" name=\"nofilter_newDir\" size=\"85\" value=\"\" spellcheck=\"false\""); out.write(" title=\""); - out.write(_("Enter the directory to save the data in (default {0})", _manager.getDataDir().getAbsolutePath())); + out.write(_t("Enter the directory to save the data in (default {0})", _manager.getDataDir().getAbsolutePath())); out.write("\"></td></tr>\n"); out.write("<tr><td> <td><span class=\"snarkAddInfo\">"); - out.write(_("You can also copy .torrent files to: {0}.", "<code>" + _manager.getDataDir().getAbsolutePath() + "</code>")); + out.write(_t("You can also copy .torrent files to: {0}.", "<code>" + _manager.getDataDir().getAbsolutePath() + "</code>")); out.write("\n"); - out.write(_("Removing a .torrent will cause it to stop.")); + out.write(_t("Removing a .torrent will cause it to stop.")); out.write("<br></span></table>\n"); out.write("</div></form></div>"); } @@ -2065,24 +2093,24 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<span class=\"snarkConfigTitle\">"); out.write(toThemeImg("create")); out.write(' '); - out.write(_("Create Torrent")); + out.write(_t("Create Torrent")); out.write("</span><hr>\n<table border=\"0\"><tr><td>"); //out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br>\n"); - out.write(_("Data to seed")); + out.write(_t("Data to seed")); out.write(":<td>" + "<input type=\"text\" name=\"nofilter_baseFile\" size=\"85\" value=\"" + "\" spellcheck=\"false\" title=\""); - out.write(_("File or directory to seed (full path or within the directory {0} )", + out.write(_t("File or directory to seed (full path or within the directory {0} )", _manager.getDataDir().getAbsolutePath() + File.separatorChar)); out.write("\" ><tr><td>\n"); - out.write(_("Trackers")); + out.write(_t("Trackers")); out.write(":<td><table style=\"width: 30%;\"><tr><td></td><td align=\"center\">"); - out.write(_("Primary")); + out.write(_t("Primary")); out.write("</td><td align=\"center\">"); - out.write(_("Alternates")); + out.write(_t("Alternates")); out.write("</td><td rowspan=\"0\">" + " <input type=\"submit\" class=\"create\" value=\""); - out.write(_("Create torrent")); + out.write(_t("Create torrent")); out.write("\" name=\"foo\" >" + "</td></tr>\n"); for (Tracker t : sortedTrackers) { @@ -2100,16 +2128,16 @@ public class I2PSnarkServlet extends BasicServlet { out.write("\" value=\"foo\"></td></tr>\n"); } out.write("<tr><td><i>"); - out.write(_("none")); + out.write(_t("none")); out.write("</i></td><td align=\"center\"><input type=\"radio\" name=\"announceURL\" value=\"none\""); if (_lastAnnounceURL == null) out.write(" checked"); out.write("></td><td></td></tr></table>\n"); // make the user add a tracker on the config form now - //out.write(_("or")); + //out.write(_t("or")); //out.write(" <input type=\"text\" name=\"announceURLOther\" size=\"57\" value=\"http://\" " + // "title=\""); - //out.write(_("Specify custom tracker announce URL")); + //out.write(_t("Specify custom tracker announce URL")); //out.write("\" > " + out.write("</td></tr>" + "</table>\n" + @@ -2122,6 +2150,7 @@ public class I2PSnarkServlet extends BasicServlet { String dataDir = _manager.getDataDir().getAbsolutePath(); boolean filesPublic = _manager.areFilesPublic(); boolean autoStart = _manager.shouldAutoStart(); + boolean smartSort = _manager.isSmartSortEnabled(); boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers(); //String openTrackers = _manager.util().getOpenTrackerString(); boolean useDHT = _manager.util().shouldUseDHT(); @@ -2133,32 +2162,40 @@ public class I2PSnarkServlet extends BasicServlet { out.write("<span class=\"snarkConfigTitle\">"); out.write(toThemeImg("config")); out.write(' '); - out.write(_("Configuration")); + out.write(_t("Configuration")); out.write("</span><hr>\n" + "<table border=\"0\"><tr><td>"); - out.write(_("Data directory")); + out.write(_t("Data directory")); out.write(": <td><input name=\"nofilter_dataDir\" size=\"80\" value=\"" + DataHelper.escapeHTML(dataDir) + "\" spellcheck=\"false\"></td>\n" + "<tr><td>"); - out.write(_("Files readable by all")); + out.write(_t("Files readable by all")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"filesPublic\" value=\"true\" " + (filesPublic ? "checked " : "") + "title=\""); - out.write(_("If checked, other users may access the downloaded files")); + out.write(_t("If checked, other users may access the downloaded files")); out.write("\" >" + "<tr><td>"); - out.write(_("Auto start torrents")); + out.write(_t("Auto start torrents")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" " + (autoStart ? "checked " : "") + "title=\""); - out.write(_("If checked, automatically start torrents that are added")); + out.write(_t("If checked, automatically start torrents that are added")); out.write("\" >" + "<tr><td>"); - out.write(_("Theme")); + out.write(_t("Smart torrent sorting")); + out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"smartSort\" value=\"true\" " + + (smartSort ? "checked " : "") + + "title=\""); + out.write(_t("If checked, ignore words such as 'the' when sorting")); + out.write("\" >" + + + "<tr><td>"); + out.write(_t("Theme")); out.write(": <td><select name='theme'>"); String theme = _manager.getTheme(); String[] themes = _manager.getThemes(); @@ -2172,7 +2209,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</select>\n" + "<tr><td>"); - out.write(_("Refresh time")); + out.write(_t("Refresh time")); out.write(": <td><select name=\"refreshDelay\">"); int delay = _manager.getRefreshDelaySeconds(); for (int i = 0; i < times.length; i++) { @@ -2185,21 +2222,21 @@ public class I2PSnarkServlet extends BasicServlet { if (times[i] > 0) out.write(DataHelper.formatDuration2(times[i] * 1000)); else - out.write(_("Never")); + out.write(_t("Never")); out.write("</option>\n"); } out.write("</select><br>" + "<tr><td>"); - out.write(_("Startup delay")); + out.write(_t("Startup delay")); out.write(": <td><input name=\"startupDelay\" size=\"4\" class=\"r\" value=\"" + _manager.util().getStartupDelay() + "\"> "); - out.write(_("minutes")); + out.write(_t("minutes")); out.write("<br>\n" + "<tr><td>"); - out.write(_("Page size")); + out.write(_t("Page size")); out.write(": <td><input name=\"pageSize\" size=\"4\" maxlength=\"6\" class=\"r\" value=\"" + _manager.getPageSize() + "\"> "); - out.write(_("torrents")); + out.write(_t("torrents")); out.write("<br>\n"); @@ -2223,39 +2260,39 @@ public class I2PSnarkServlet extends BasicServlet { out.write("</select><br>\n"); */ out.write("<tr><td>"); - out.write(_("Total uploader limit")); + out.write(_t("Total uploader limit")); out.write(": <td><input type=\"text\" name=\"upLimit\" class=\"r\" value=\"" + _manager.util().getMaxUploaders() + "\" size=\"4\" maxlength=\"3\" > "); - out.write(_("peers")); + out.write(_t("peers")); out.write("<br>\n" + "<tr><td>"); - out.write(_("Up bandwidth limit")); + out.write(_t("Up bandwidth limit")); out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\"" + _manager.util().getMaxUpBW() + "\" size=\"4\" maxlength=\"4\" > KBps <i>"); - out.write(_("Half available bandwidth recommended.")); + out.write(_t("Half available bandwidth recommended.")); out.write(" [<a href=\"/config.jsp\" target=\"blank\">"); - out.write(_("View or change router bandwidth")); + out.write(_t("View or change router bandwidth")); out.write("</a>]</i><br>\n" + "<tr><td>"); - out.write(_("Use open trackers also")); + out.write(_t("Use open trackers also")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" " + (useOpenTrackers ? "checked " : "") + "title=\""); - out.write(_("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file")); + out.write(_t("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file")); out.write("\" ></td></tr>\n" + "<tr><td>"); - out.write(_("Enable DHT")); + out.write(_t("Enable DHT")); out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useDHT\" value=\"true\" " + (useDHT ? "checked " : "") + "title=\""); - out.write(_("If checked, use DHT")); + out.write(_t("If checked, use DHT")); out.write("\" ></td></tr>\n"); // "<tr><td>"); - //out.write(_("Open tracker announce URLs")); + //out.write(_t("Open tracker announce URLs")); //out.write(": <td><input type=\"text\" name=\"openTrackers\" value=\"" // + openTrackers + "\" size=\"50\" ><br>\n"); @@ -2267,26 +2304,28 @@ public class I2PSnarkServlet extends BasicServlet { Map<String, String> options = new TreeMap<String, String>(_manager.util().getI2CPOptions()); out.write("<tr><td>"); - out.write(_("Inbound Settings")); + out.write(_t("Inbound Settings")); out.write(":<td>"); - out.write(renderOptions(1, 10, 3, options.remove("inbound.quantity"), "inbound.quantity", TUNNEL)); + out.write(renderOptions(1, 10, SnarkManager.DEFAULT_TUNNEL_QUANTITY, + options.remove("inbound.quantity"), "inbound.quantity", TUNNEL)); out.write("     "); out.write(renderOptions(0, 4, 3, options.remove("inbound.length"), "inbound.length", HOP)); out.write("<tr><td>"); - out.write(_("Outbound Settings")); + out.write(_t("Outbound Settings")); out.write(":<td>"); - out.write(renderOptions(1, 10, 3, options.remove("outbound.quantity"), "outbound.quantity", TUNNEL)); + out.write(renderOptions(1, 10, SnarkManager.DEFAULT_TUNNEL_QUANTITY, + options.remove("outbound.quantity"), "outbound.quantity", TUNNEL)); out.write("     "); out.write(renderOptions(0, 4, 3, options.remove("outbound.length"), "outbound.length", HOP)); if (!_context.isRouterContext()) { out.write("<tr><td>"); - out.write(_("I2CP host")); + out.write(_t("I2CP host")); out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" + _manager.util().getI2CPHost() + "\" size=\"15\" > " + "<tr><td>"); - out.write(_("I2CP port")); + out.write(_t("I2CP port")); out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" + + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n"); } @@ -2301,12 +2340,12 @@ public class I2PSnarkServlet extends BasicServlet { opts.append(key).append('=').append(val).append(' '); } out.write("<tr><td>"); - out.write(_("I2CP options")); + out.write(_t("I2CP options")); out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >" + opts.toString() + "</textarea><br>\n" + "<tr><td colspan=\"2\"> \n" + // spacer "<tr><td> <td><input type=\"submit\" class=\"accept\" value=\""); - out.write(_("Save configuration")); + out.write(_t("Save configuration")); out.write("\" name=\"foo\" >\n" + "<tr><td colspan=\"2\"> \n" + // spacer "</table></div></div></form>"); @@ -2321,22 +2360,22 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("<span class=\"snarkConfigTitle\">"); toThemeImg(buf, "config"); buf.append(' '); - buf.append(_("Trackers")); + buf.append(_t("Trackers")); buf.append("</span><hr>\n" + "<table class=\"trackerconfig\"><tr><th>") - //.append(_("Remove")) + //.append(_t("Remove")) .append("</th><th>") - .append(_("Name")) + .append(_t("Name")) .append("</th><th>") - .append(_("Website URL")) + .append(_t("Website URL")) .append("</th><th>") - .append(_("Standard")) + .append(_t("Standard")) .append("</th><th>") - .append(_("Open")) + .append(_t("Open")) .append("</th><th>") - .append(_("Private")) + .append(_t("Private")) .append("</th><th>") - .append(_("Announce URL")) + .append(_t("Announce URL")) .append("</th></tr>\n"); List<String> openTrackers = _manager.util().getOpenTrackers(); List<String> privateTrackers = _manager.getPrivateTrackers(); @@ -2348,7 +2387,7 @@ public class I2PSnarkServlet extends BasicServlet { boolean isKnownOpen = _manager.util().isKnownOpenTracker(t.announceURL); boolean isOpen = isKnownOpen || openTrackers.contains(t.announceURL); buf.append("<tr><td><input type=\"checkbox\" class=\"optbox\" name=\"delete_") - .append(name).append("\" title=\"").append(_("Delete")).append("\">" + + .append(name).append("\" title=\"").append(_t("Delete")).append("\">" + "</td><td>").append(name) .append("</td><td>").append(urlify(homeURL, 35)) .append("</td><td><input type=\"radio\" class=\"optbox\" value=\"0\" name=\"ttype_") @@ -2380,7 +2419,7 @@ public class I2PSnarkServlet extends BasicServlet { .append("</td></tr>\n"); } buf.append("<tr><td><b>") - .append(_("Add")).append(":</b></td>" + + .append(_t("Add")).append(":</b></td>" + "<td><input type=\"text\" class=\"trackername\" name=\"tname\" spellcheck=\"false\"></td>" + "<td><input type=\"text\" class=\"trackerhome\" name=\"thurl\" spellcheck=\"false\"></td>" + "<td><input type=\"radio\" class=\"optbox\" value=\"0\" name=\"add_tracker_type\" checked=\"checked\"></td>" + @@ -2389,12 +2428,12 @@ public class I2PSnarkServlet extends BasicServlet { "<td><input type=\"text\" class=\"trackerannounce\" name=\"taurl\" spellcheck=\"false\"></td></tr>\n" + "<tr><td colspan=\"7\"> </td></tr>\n" + // spacer "<tr><td colspan=\"2\"></td><td colspan=\"5\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"default\" value=\"").append(_("Add tracker")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"delete\" value=\"").append(_("Delete selected")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"add\" value=\"").append(_("Add tracker")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_("Save tracker configuration")).append("\">\n" + - // "<input type=\"reset\" class=\"cancel\" value=\"").append(_("Cancel")).append("\">\n" + - "<input type=\"submit\" name=\"taction\" class=\"reload\" value=\"").append(_("Restore defaults")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"default\" value=\"").append(_t("Add tracker")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"delete\" value=\"").append(_t("Delete selected")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"add\" value=\"").append(_t("Add tracker")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"accept\" value=\"").append(_t("Save tracker configuration")).append("\">\n" + + // "<input type=\"reset\" class=\"cancel\" value=\"").append(_t("Cancel")).append("\">\n" + + "<input type=\"submit\" name=\"taction\" class=\"reload\" value=\"").append(_t("Restore defaults")).append("\">\n" + "</td></tr>" + "<tr><td colspan=\"7\"> </td></tr>\n" + // spacer "</table></div></div></form>\n"); @@ -2406,7 +2445,7 @@ public class I2PSnarkServlet extends BasicServlet { "<span class=\"snarkConfigTitle\"><a href=\"configure\">"); out.write(toThemeImg("config")); out.write(' '); - out.write(_("Configuration")); + out.write(_t("Configuration")); out.write("</a></span></span></div>\n"); } @@ -2423,7 +2462,7 @@ public class I2PSnarkServlet extends BasicServlet { String trackerURL = magnet.getTrackerURL(); _manager.addMagnet(name, ih, trackerURL, true, dataDir); } catch (IllegalArgumentException iae) { - _manager.addMessage(_("Invalid magnet URL {0}", url)); + _manager.addMessage(_t("Invalid magnet URL {0}", url)); } } @@ -2458,17 +2497,17 @@ public class I2PSnarkServlet extends BasicServlet { } /** translate */ - private String _(String s) { + private String _t(String s) { return _manager.util().getString(s); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return _manager.util().getString(s, o); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return _manager.util().getString(s, o, o2); } @@ -2598,10 +2637,21 @@ public class I2PSnarkServlet extends BasicServlet { String[] val = postParams.get("nonce"); if (val != null) { String nonce = val[0]; - if (String.valueOf(_nonce).equals(nonce)) - savePriorities(snark, postParams); - else + if (String.valueOf(_nonce).equals(nonce)) { + if (postParams.get("savepri") != null) { + savePriorities(snark, postParams); + } else if (postParams.get("stop") != null) { + _manager.stopTorrent(snark, false); + } else if (postParams.get("start") != null) { + _manager.startTorrent(snark); + } else if (postParams.get("recheck") != null) { + _manager.recheckTorrent(snark); + } else { + _manager.addMessage("Unknown command"); + } + } else { _manager.addMessage("Please retry form submission (bad nonce)"); + } } return null; } @@ -2624,6 +2674,7 @@ public class I2PSnarkServlet extends BasicServlet { r = new File(""); } + boolean showStopStart = snark != null; boolean showPriority = snark != null && snark.getStorage() != null && !snark.getStorage().complete() && r.isDirectory(); @@ -2632,7 +2683,7 @@ public class I2PSnarkServlet extends BasicServlet { if (title.endsWith("/")) title = title.substring(0, title.length() - 1); String directory = title; - title = _("Torrent") + ": " + DataHelper.escapeHTML(title); + title = _t("Torrent") + ": " + DataHelper.escapeHTML(title); buf.append(title); buf.append("\n").append(HEADER_A).append(_themePath).append(HEADER_B) .append("\n"); @@ -2646,14 +2697,15 @@ public class I2PSnarkServlet extends BasicServlet { toThemeImg(buf, "arrow_refresh"); buf.append("  "); if (_contextName.equals(DEFAULT_NAME)) - buf.append(_("I2PSnark")); + buf.append(_t("I2PSnark")); else buf.append(_contextName); buf.append("\n"); if (parent) // always true buf.append("
"); - if (showPriority) { + // for stop/start/check + if (showStopStart || showPriority) { buf.append("
\n"); buf.append("\n"); if (sortParam != null) { @@ -2664,8 +2716,8 @@ public class I2PSnarkServlet extends BasicServlet { if (snark != null) { // first table - torrent info buf.append("\n"); - buf.append("\n"); @@ -2674,16 +2726,16 @@ public class I2PSnarkServlet extends BasicServlet { String baseName = encodePath((new File(fullPath)).getName()); buf.append("\n"); if (snark.getStorage() != null) { buf.append("\n"); @@ -2691,8 +2743,8 @@ public class I2PSnarkServlet extends BasicServlet { String hex = I2PSnarkUtil.toHex(snark.getInfoHash()); buf.append("\n"); @@ -2711,16 +2763,16 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(trackerLink); else toThemeImg(buf, "details"); - buf.append(" ").append(_("Primary Tracker")).append(": "); + buf.append(""); } List> alist = meta.getAnnounceList(); - if (alist != null) { + if (alist != null && !alist.isEmpty()) { buf.append(""); + buf.append("\n"); } } if (meta != null) { String com = meta.getComment(); - if (com != null) { + if (com != null && com.length() > 0) { if (com.length() > 1024) com = com.substring(0, 1024); buf.append("\n"); } long dat = meta.getCreationDate(); + SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); if (dat > 0) { - String date = (new SimpleDateFormat("yyyy-MM-dd HH:mm")).format(new Date(dat)); + String date = fmt.format(new Date(dat)); buf.append("\n"); } String cby = meta.getCreatedBy(); - if (cby != null) { + if (cby != null && cby.length() > 0) { if (cby.length() > 128) cby = com.substring(0, 128); buf.append("\n"); } + long[] dates = _manager.getSavedAddedAndCompleted(snark); + if (dates[0] > 0) { + String date = fmt.format(new Date(dates[0])); + buf.append("\n"); + } + if (dates[1] > 0) { + String date = fmt.format(new Date(dates[1])); + buf.append("\n"); + } } if (meta == null || !meta.isPrivate()) { @@ -2778,8 +2851,8 @@ public class I2PSnarkServlet extends BasicServlet { if (announce != null) buf.append("&tr=").append(announce); buf.append("\">") - .append(toImg("magnet", _("Magnet link"))) - .append("Magnet:\n"); } else { - buf.append("\n"); } // We don't have the hash of the torrent file - //buf.append(""); buf.append("\n"); + + // buttons + if (showStopStart) { + buf.append("\n"); + } } else { + // snark == null // shouldn't happen buf.append("
") - .append(_("Torrent")) + buf.append("
") + .append(_t("Torrent")) .append(": ") .append(DataHelper.escapeHTML(snark.getBaseName())) .append("
"); toThemeImg(buf, "file"); - buf.append(" ") - .append(_("Torrent file")) + buf.append("") + .append(_t("Torrent file")) .append(": ") .append(DataHelper.escapeHTML(fullPath)) .append("
"); toThemeImg(buf, "file"); - buf.append(" ") - .append(_("Data location")) + buf.append("") + .append(_t("Data location")) .append(": ") .append(DataHelper.escapeHTML(snark.getStorage().getBase().getPath())) .append("
"); toThemeImg(buf, "details"); - buf.append(" ") - .append(_("Info hash")) + buf.append("") + .append(_t("Info hash")) .append(": ") .append(hex.toUpperCase(Locale.US)) .append("
").append(_t("Primary Tracker")).append(": "); buf.append(getShortTrackerLink(announce, snark.getInfoHash())); buf.append("
"); toThemeImg(buf, "details"); - buf.append(" ") - .append(_("Tracker List")).append(": "); + buf.append("") + .append(_t("Tracker List")).append(": "); for (List alist2 : alist) { buf.append('['); boolean more = false; @@ -2733,43 +2785,64 @@ public class I2PSnarkServlet extends BasicServlet { } buf.append("] "); } - buf.append("
"); toThemeImg(buf, "details"); - buf.append(" ") - .append(_("Comment")).append(": ") + buf.append("") + .append(_t("Comment")).append(": ") .append(DataHelper.stripHTML(com)) .append("
"); toThemeImg(buf, "details"); - buf.append(" ") - .append(_("Created")).append(": ") - .append(date).append(" UTC") + buf.append("") + .append(_t("Created")).append(": ") + .append(date) .append("
"); toThemeImg(buf, "details"); - buf.append(" ") - .append(_("Created By")).append(": ") + buf.append("") + .append(_t("Created By")).append(": ") .append(DataHelper.stripHTML(cby)) .append("
"); + toThemeImg(buf, "details"); + buf.append("") + .append(_t("Added")).append(": ") + .append(date) + .append("
"); + toThemeImg(buf, "details"); + buf.append("") + .append(_t("Completed")).append(": ") + .append(date) + .append("
Magnet: ") .append("
") - .append(_("Private torrent")) + buf.append("
"); + toThemeImg(buf, "details"); + buf.append("") + .append(_t("Private torrent")) .append("
").append(_("Maggot link")).append(": ") + //buf.append("
").append(_t("Maggot link")).append(": ") // .append(MAGGOT).append(hex).append(':').append(hex).append("
"); toThemeImg(buf, "size"); - buf.append(" ") - .append(_("Size")) + buf.append("") + .append(_t("Size")) .append(": ") .append(formatSize(snark.getTotalLength())); int pieces = snark.getPieces(); @@ -2811,16 +2886,16 @@ public class I2PSnarkServlet extends BasicServlet { toThemeImg(buf, "head_rx"); buf.append(" "); if (completion < 1.0) - buf.append(_("Completion")) + buf.append(_t("Completion")) .append(": ") .append((new DecimalFormat("0.00%")).format(completion)); else - buf.append(_("Complete")).append(""); + buf.append(_t("Complete")).append(""); // up ratio buf.append(" "); toThemeImg(buf, "head_tx"); buf.append(" ") - .append(_("Upload ratio")) + .append(_t("Upload ratio")) .append(": "); long uploaded = snark.getUploaded(); if (uploaded > 0) { @@ -2840,34 +2915,72 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(" "); toThemeImg(buf, "head_rx"); buf.append(" ") - .append(_("Remaining")) + .append(_t("Remaining")) .append(": ") .append(formatSize(needed)); } + long skipped = snark.getSkippedLength(); + if (skipped > 0) { + buf.append(" "); + toThemeImg(buf, "head_rx"); + buf.append(" ") + .append(_t("Skipped")) + .append(": ") + .append(formatSize(skipped)); + } if (meta != null) { List> files = meta.getFiles(); int fileCount = files != null ? files.size() : 1; buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Files")) + .append(_t("Files")) .append(": ") .append(fileCount); } buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Pieces")) + .append(_t("Pieces")) .append(": ") .append(pieces); buf.append(" "); toThemeImg(buf, "file"); buf.append(" ") - .append(_("Piece size")) + .append(_t("Piece size")) .append(": ") .append(formatSize(snark.getPieceLength(0))) .append("
"); + if (snark.isChecking()) { + buf.append("").append(_t("Checking")).append("… ") + .append((new DecimalFormat("0.00%")).format(snark.getCheckingProgress())) + .append("   ") + .append(_t("Refresh page for results")).append(""); + } else if (snark.isStarting()) { + buf.append("").append(_t("Starting")).append("…"); + } else if (snark.isAllocating()) { + buf.append("").append(_t("Allocating")).append("…"); + } else { + boolean isRunning = !snark.isStopped(); + buf.append("\n"); + else + buf.append(_t("Start")).append("\" name=\"start\" class=\"starttorrent\">\n"); + buf.append("   \n"); + else + buf.append("\" class=\"reload\">\n"); + } + buf.append("
Not found
resource=\"").append(r.toString()) .append("\"
base=\"").append(base) @@ -2898,8 +3011,10 @@ public class I2PSnarkServlet extends BasicServlet { Storage storage = snark != null ? snark.getStorage() : null; List fileList = new ArrayList(ls.length); + // precompute remaining for all files for efficiency + long[] remainingArray = (storage != null) ? storage.remaining() : null; for (int i = 0; i < ls.length; i++) { - fileList.add(new Sorters.FileAndIndex(ls[i], storage)); + fileList.add(new Sorters.FileAndIndex(ls[i], storage, remainingArray)); } boolean showSort = fileList.size() > 1; @@ -2917,7 +3032,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n"); buf.append("\n") .append("\n\n"); @@ -3017,21 +3132,21 @@ public class I2PSnarkServlet extends BasicServlet { int priority = 0; if (fai.isDirectory) { complete = true; - //status = toImg("tick") + ' ' + _("Directory"); + //status = toImg("tick") + ' ' + _t("Directory"); } else { if (snark == null || snark.getStorage() == null) { // Assume complete, perhaps he removed a completed torrent but kept a bookmark complete = true; - status = toImg("cancel") + ' ' + _("Torrent not found?"); + status = toImg("cancel") + ' ' + _t("Torrent not found?"); } else { long remaining = fai.remaining; if (remaining < 0) { complete = true; - status = toImg("cancel") + ' ' + _("File not found in torrent?"); + status = toImg("cancel") + ' ' + _t("File not found in torrent?"); } else if (remaining == 0 || length <= 0) { complete = true; - status = toImg("tick") + ' ' + _("Complete"); + status = toImg("tick") + ' ' + _t("Complete"); } else { priority = fai.priority; if (priority < 0) @@ -3041,8 +3156,8 @@ public class I2PSnarkServlet extends BasicServlet { else status = toImg("clock_red"); status += " " + - (100 * (length - remaining) / length) + "% " + _("complete") + - " (" + DataHelper.formatSize2(remaining) + "B " + _("remaining") + ")"; + (100 * (length - remaining) / length) + "% " + _t("complete") + + " (" + DataHelper.formatSize2(remaining) + "B " + _t("remaining") + ")"; } } @@ -3064,7 +3179,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\"\""); } else { - buf.append(toImg(icon, _("Open"))).append(""); + buf.append(toImg(icon, _t("Open"))).append(""); } } else { buf.append(toImg(icon)); @@ -3088,17 +3203,17 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\n 0) buf.append("checked=\"checked\""); - buf.append('>').append(_("High")); + buf.append('>').append(_t("High")); buf.append("\n').append(_("Normal")); + buf.append('>').append(_t("Normal")); buf.append("\n').append(_("Skip")); + buf.append('>').append(_t("Skip")); showSaveButton = true; } buf.append(""); @@ -3108,17 +3223,18 @@ public class I2PSnarkServlet extends BasicServlet { if (showSaveButton) { buf.append("\n"); } buf.append("
"); - String tx = _("Directory"); + String tx = _t("Directory"); // cycle through sort by name or type String sort; boolean isTypeSort = false; @@ -2937,7 +3052,7 @@ public class I2PSnarkServlet extends BasicServlet { .append(getQueryString(sort)).append("\">"); } toThemeImg(buf, "file", tx, - showSort ? _("Sort by {0}", (isTypeSort ? _("File type") : _("Name"))) + showSort ? _t("Sort by {0}", (isTypeSort ? _t("File type") : _t("Name"))) : tx + ": " + directory); if (showSort) buf.append(""); @@ -2952,9 +3067,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Size"); + tx = _t("Size"); toThemeImg(buf, "size", tx, - showSort ? _("Sort by {0}", tx) : tx); + showSort ? _t("Sort by {0}", tx) : tx); if (showSort) buf.append(""); buf.append(""); @@ -2964,9 +3079,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Status"); + tx = _t("Status"); toThemeImg(buf, "status", tx, - showRemainingSort ? _("Sort by {0}", _("Remaining")) : tx); + showRemainingSort ? _t("Sort by {0}", _t("Remaining")) : tx); if (showRemainingSort) buf.append(""); if (showPriority) { @@ -2976,9 +3091,9 @@ public class I2PSnarkServlet extends BasicServlet { buf.append(""); } - tx = _("Priority"); + tx = _t("Priority"); toThemeImg(buf, "priority", tx, - showSort ? _("Sort by {0}", tx) : tx); + showSort ? _t("Sort by {0}", tx) : tx); if (showSort) buf.append(""); } @@ -2988,7 +3103,7 @@ public class I2PSnarkServlet extends BasicServlet { buf.append("\">"); toThemeImg(buf, "up"); buf.append(' ') - .append(_("Up to higher level directory")) + .append(_t("Up to higher level directory")) .append("
 " + "") - .append(toImg("clock_red")).append(_("Set all high")).append("\n" + + .append(toImg("clock_red")).append(_t("Set all high")).append("\n" + "") - .append(toImg("clock")).append(_("Set all normal")).append("\n" + + .append(toImg("clock")).append(_t("Set all normal")).append("\n" + "") - .append(toImg("cancel")).append(_("Skip all")).append("\n" + - "

\n" + + "

\n" + "
\n"); - if (showPriority) + // for stop/start/check + if (showStopStart || showPriority) buf.append(""); buf.append("\n"); @@ -3189,7 +3305,7 @@ public class I2PSnarkServlet extends BasicServlet { icon = "itoopie_xxsm"; else icon = "compress"; - } else if (mime.equals("application/x-gtar") || + } else if (mime.equals("application/x-gtar") || mime.equals("application/x-xz") || mime.equals("application/compress") || mime.equals("application/gzip") || mime.equals("application/x-7z-compressed") || mime.equals("application/x-rar-compressed") || mime.equals("application/x-tar") || mime.equals("application/x-bzip2")) diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java index 3b71cf3f1..964e6d80d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java @@ -6,6 +6,8 @@ import java.text.Collator; import java.util.Collections; import java.util.Comparator; import java.util.Locale; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.klomp.snark.MetaInfo; import org.klomp.snark.Snark; @@ -18,6 +20,13 @@ import org.klomp.snark.Storage; */ class Sorters { + /** + * See below + */ + private static final Pattern PATTERN_DE, PATTERN_EN, PATTERN_ES, PATTERN_FR, + PATTERN_IT, PATTERN_NL, PATTERN_PT; + private static Pattern _pattern; + /** * Negative is reverse * @@ -113,8 +122,8 @@ class Sorters { /** - * Sort alphabetically in current locale, ignore case, ignore leading "the " - * (I guess this is worth it, a lot of torrents start with "The " + * Sort alphabetically in current locale, ignore case, ignore leading + * articles such as "the" if the pattern is set by setPattern() * @since 0.7.14 */ private static class TorrentNameComparator implements Comparator, Serializable { @@ -130,13 +139,16 @@ class Sorters { if (l.getStorage() != null && r.getStorage() == null) return 1; String ls = l.getBaseName(); - String llc = ls.toLowerCase(Locale.US); - if (llc.startsWith("the ") || llc.startsWith("the.") || llc.startsWith("the_")) - ls = ls.substring(4); String rs = r.getBaseName(); - String rlc = rs.toLowerCase(Locale.US); - if (rlc.startsWith("the ") || rlc.startsWith("the.") || rlc.startsWith("the_")) - rs = rs.substring(4); + Pattern p = _pattern; + if (p != null) { + Matcher m = p.matcher(ls); + if (m.matches()) + ls = ls.substring(m.group(1).length()); + m = p.matcher(rs); + if (m.matches()) + rs = rs.substring(m.group(1).length()); + } return Collator.getInstance().compare(ls, rs); } } @@ -356,13 +368,14 @@ class Sorters { /** * @param storage may be null + * @param remainingArray precomputed, non-null iff storage is non-null */ - public FileAndIndex(File file, Storage storage) { + public FileAndIndex(File file, Storage storage, long[] remainingArray) { this.file = file; index = storage != null ? storage.indexOf(file) : -1; if (index >= 0) { isDirectory = false; - remaining = storage.remaining(index); + remaining = remainingArray[index]; priority = storage.getPriority(index); } else { isDirectory = file.isDirectory(); @@ -527,4 +540,104 @@ class Sorters { return r.priority - l.priority; } } + + /* + * Match an indefinite or definite article in the language, + * followed by one or more whitespace, '.', or '_'. + * Does not match "partitive" articles. + * + * https://en.wikipedia.org/wiki/Article_%28grammar%29 + * http://www.loc.gov/marc/bibliographic/bdapndxf.html + */ + static { + PATTERN_DE = Pattern.compile( + // can't make the non-capturing innner group work + //"^((?:" + + "^((" + + "der|die|das|des|dem|den|ein|eine|einer|eines|einem|einen" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_EN = Pattern.compile( + "^((" + + "a|an|the" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_ES = Pattern.compile( + "^((" + + "el|la|lo|los|las|un|una|unos|unas" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_FR = Pattern.compile( + // note l' doesn't require whitespace after + "^(l'|((" + + "le|la|les|un|une|des" + + ")[\\s\\._]+)).*", + Pattern.CASE_INSENSITIVE); + PATTERN_IT = Pattern.compile( + // note l' and un' don't require whitespace after + "^(l'|un'|((" + + "il|lo|la|i|gli|le|uno|una|un" + + ")[\\s\\._]+)).*", + Pattern.CASE_INSENSITIVE); + PATTERN_NL = Pattern.compile( + "^((" + + "de|het|het'n|een|een'n" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + PATTERN_PT = Pattern.compile( + "^((" + + "o|a|os|as|um|uma|uns|umas" + + ")[\\s\\._]+).*", + Pattern.CASE_INSENSITIVE); + } + + /** + * Sets static field, oh well + * @param lang null for none + * @since 0.9.23 + */ + public static void setPattern(String lang) { + Pattern p; + if (lang == null) + p = null; + else if (lang.equals("de")) + p = PATTERN_DE; + else if (lang.equals("en")) + p = PATTERN_EN; + else if (lang.equals("es")) + p = PATTERN_ES; + else if (lang.equals("fr")) + p = PATTERN_FR; + else if (lang.equals("it")) + p = PATTERN_IT; + else if (lang.equals("nl")) + p = PATTERN_NL; + else if (lang.equals("pt")) + p = PATTERN_PT; + else + p = null; + _pattern = p; + } + +/**** + public static final void main(String[] args) { + if (args.length != 2) { + System.out.println("Usage: Sorters lang 'string'"); + System.exit(1); + } + String lang = args[0]; + setPattern(lang); + if (_pattern == null) { + System.out.println("Unsupported " + lang); + System.exit(1); + } + String s = args[1]; + Matcher m = _pattern.matcher(s); + if (m.matches()) { + System.out.println("Match is \"" + m.group(1) + '"'); + } else { + System.out.println("No match for \"" + s + '"'); + } + } +****/ } diff --git a/apps/i2psnark/locale/messages_ar.po b/apps/i2psnark/locale/messages_ar.po index 9d37a395a..48d1b1c4a 100644 --- a/apps/i2psnark/locale/messages_ar.po +++ b/apps/i2psnark/locale/messages_ar.po @@ -10,237 +10,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/I2P/language/ar/)\n" +"Language-Team: Arabic (http://www.transifex.com/otf/I2P/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "تم قفل النفق" #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "تم تغببر مجموع حد الرفع الى {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "اقل حد الرفع الى {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "حولت سرعة الرفع الى {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "اقل سرعة رفع هي{0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "تغير تأخير البداية الى {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "سيتم تفعيل التغيير بعد اعادة التشغيل" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "فك الاتصال" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr " تغيرت الاعدادات الى {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "فشل في الاتصال بالاعدادات الجديدة، سيتم الرجوع الى الاعدادات القديمة" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "فشل في اعادة الاتصال بالاعدادات القديمة!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "اتصال بوجهة جديدة" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "اعادة التشغيل \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "تشغيل عند البداية" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "الغاء التشغيل عند البداية" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "تفعيل open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "الغاء تفعيل open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} تم تحميل التيمة ارجع الى صفحة للمشاهدة i2psnark." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "لم تتغير الاعدادات" -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "تغيير open trackers - يجب اعادة تشغيل التورنت لتفعيل التغيير." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "فشل في حفظ الاعدادات {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "جاري الاتصال بشبكة I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "فشل في الاتصال ب I2P - تخقق من اعدادات I2CP !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "خطأ: فشل في اضافة التورنت {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "فشل في فتح \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "تورنت بهذه المعلومات مشغل: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -248,34 +256,46 @@ msgid "" "torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "تورنت في \"{0}\"غير صحيح" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "تم خذف ملف التورنت: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "خطأ - لا توجد ذاكرة كافية، لا يمكن انشاء تورنت {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "تم اضافة وتشغيل التورنت: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "تمت اضافة: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "يحمل {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -283,132 +303,147 @@ msgid "" "DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "اضافة {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "فشل في نسخ التورنت الى {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "ملفات كثيرة في \"{0}\" ({1}) تم حذف" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 -#, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "ملف التورنت \"{0}\" لا يمكنه الانتهاء ب \".torrent\", سيتم حذفه!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 -#, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "ﻻ أجزاء في \"{0}\", حذف!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 -#, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgid "Too many files in \"{0}\" ({1})!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "الأجزاء كبيرة في \"{0}\" ({1}B), حذف." +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 +#, java-format +msgid "No pieces in \"{0}\"!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "حدود {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" +msgid "Torrent \"{0}\" has no data!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "تورنت أكبر من {0}B غير مدعومة سيحذف \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "خطأ: ﻻيمكن حذف التورنت {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "تورنت متوقف: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "تورنت محذوف: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "اضف تورنت في {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "انتهى التحميل: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "بداية التورنت {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "فشل في اضافة I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "فتح النفق واطلاق جميع التورنت" -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "توقيف جميع التورنت و قفل النفق I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "" @@ -453,178 +488,178 @@ msgstr "تورنت في قائمة الانتظار: {0}" msgid "Torrent at {0} was not valid" msgstr "تورنت غير صحيح {0} " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark برنامج تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "اعدادات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "أنعش الصفحة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "منتدى" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "الحالة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "اخفاء النظائر" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "أظهر النظائر" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "تقدير للوقت الباقي" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "محمل" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "الحجم" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "رفع" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "معدل التحميل" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "توقيف جمبع التورنت و النفق I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "توقيف الجمبع" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "شغل الجمبع" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "شغل جمبع التورنت و النفق I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "لم يحمل تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "مجموع" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -635,7 +670,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -646,7 +681,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -657,203 +692,202 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "تم حذف ملف مغناطيس: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "تم خذف ملف التورنت: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "خذف ملف البيانات: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "فشل في حذف الملف: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "تم انشاء تورنت لـ \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "العديد من trackers يطلبون تسجيل التورنت قبل مشاركتها، قم بذلك قبل البداية {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "فشل في انشاء تورنت لـ \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "لا يمكن انشاء تورنت لبيانات غير موجودة: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "فشل في انشاء تورنت - عليك اختيار ملف أو مجلد" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Tracker خطأ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -864,366 +898,377 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "بشارك" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "اكتمل" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "موافق" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "متوقف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "لا بوجد نظائر" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "متوقف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "تفاصيل التورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "أظهر الملفات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "فتح ملف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "قف التورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "قف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "ابدأ التورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "ابدأ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "حذف التورنت من القائمة، حذف ملف .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "حذف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "خذف ملف التورنت و الملفات المرتبطة به" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "هل أنت متأكد من حذف التورنت \\''{0}\\'' وجمبع البيانات المحملة؟" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "حذف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "غير معروف" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "شارك" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "غير مهم (النظير لا يحتوي على اجزاء نحتاجها)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "مشكلة (لا يمكن الحصول على اجزاء الملف من النظائر)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "تفاصيل حول {0} tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "معلومات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "أضف تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "من عنوان" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "أضف تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "يمكن ايضا .نقل ملفات تورنت الى: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "سيتم القاف التورنت عند حذف الملف torrent." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "أنشئ تورنت" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "البيانات المشاركة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "أنشئ تورنت" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "مجلد البيانات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "اذا تم تفعيل، يقوم بتشغيل التورنت تلقائيا عند اضافته" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "تيمة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "تأخر البداية" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "دقائق" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "اقصى حد للرفع" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "النظائر" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "اقصى حد لسرعة الاتصال" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "ينصح باستعمال نصف سرعة الشبكة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "أظهر أو غير سرعة الموجه" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "استعمال open trackers ايضا" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "اعدادت الاتصال الداخلي" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "اعدادت الاتصال الخارجي" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "حفظ الاعدادات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "فتح" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "غنوان مغناطيس غير صحيح {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1234,7 +1279,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1245,119 +1290,135 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "وصلة مغناطيس" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "انتهاء" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "الملفات" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "القطع" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "حجم القطعة" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "المجلد" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "الأولوية" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "تورنت غير موجود؟" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "الملف غير موجود في التورنت؟" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "اكتمل" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "عالي" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "عادي" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "تجاوز" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "حفظ الأولويات" diff --git a/apps/i2psnark/locale/messages_cs.po b/apps/i2psnark/locale/messages_cs.po index bd68b9086..a727d9cf7 100644 --- a/apps/i2psnark/locale/messages_cs.po +++ b/apps/i2psnark/locale/messages_cs.po @@ -10,237 +10,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Czech (http://www.transifex.com/projects/p/I2P/language/cs/)\n" +"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "Neběží žádné další torrenty." -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P tunel uzavřen." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Celkový limit sdílečů změněn na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Nejmenší celkový limit sdílečů je {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Horní BW limit změněn na {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Nejmenší horní limit přenosové rychlist je {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Prodleva při startu změněna na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Doba aktualizace stavu (refresh time) změněna na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Aktualizace stavu vypnuta" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Změny I2CP a tunelu se projeví až po zastavení všech torrentů" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Nastavení (options) I2CP změněno na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Odpojuji se od starého I2CP cíle" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Nastavení (settings) I2CP změněno na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Nemůžu se připojit s novým nastavením I2CP, vracím se k předhozímu." -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Nemohu se opětovně připojit ani s předchozím nastavením!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Opětovně připojeno k novému I2CP cíli" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP listener restartován pro \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nové soubory budou veřejně přístupné" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nové soubory nebudou veřejně přístupné" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Automatické spuštění zapnuto" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Automatické spuštění vypnuto" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Zapnuto automatické spuštění" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Otevřené trackery vypnuty - aby se změna projevila je nutné restartovat všechny torrenty" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT povoleno." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT zakázáno." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Téma {0} bylo nahráno, přejděte prosím na hlavní stránku i2snark" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Nastavení nebylo změněno." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Seznam otevřených trackerů změněn - aby se změna projevila je nutné restartovat všechny torrenty" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Nemůžu uložit soubor s nastavením do souboru {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Připojuji se k I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Při připojování k I2P nastala chyba, zkontrolujte prosím nastavení I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Chyba: nepodařilo se přidat torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nejde otevřít \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent s tímto infohašišem již běží: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -248,34 +256,46 @@ msgid "" "torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent v \"{0}\" je chybný" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "CHYBA - nedostatek paměti, nemohu vytvořit torrent z {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent přidán a spuštěn: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent přidán: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Získávám {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -283,132 +303,147 @@ msgid "" "DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Přídávám {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Chyba: nepodařilo se zkopírovat soubor torrentu do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "V \"{0}\" ({1}) je příliš mnoho souborů, mažu je!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 -#, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Jméno souboru torrentu \"{0}\" nemůže končit na \".torrent\", mažu ho!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 -#, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "\"{0}\" neobsahuje žádné části, mažu to!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 -#, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Příliš mnoho částí v \"{0}\", maximum je {1}, mažu to!" - -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 -#, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgid "Too many files in \"{0}\" ({1})!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 +#, java-format +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 +#, java-format +msgid "No pieces in \"{0}\"!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 +#, java-format +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 +#, java-format +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" +msgid "Torrent \"{0}\" has no data!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent zastaven: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent smazán: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Stahování dokončeno: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "" @@ -453,178 +488,178 @@ msgstr "" msgid "Torrent at {0} was not valid" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Fórum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Skrýt peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Ukázat peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -632,7 +667,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -640,7 +675,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -648,203 +683,202 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent vytvořen pro \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Přidat tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -852,366 +886,377 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Neznámý" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Přidat torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Z URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Přidat torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Můžete také zkopírovat .torrent soubory do: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Vytvořit torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Hlavní" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Vytvořit torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Vzhled" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1219,7 +1264,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1227,119 +1272,135 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 -msgid "Magnet link" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 -msgid "Private torrent" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 -msgid "Completion" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 +msgid "Private torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 +msgid "Completion" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "" diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po index f5cfc3624..38e34cec5 100644 --- a/apps/i2psnark/locale/messages_de.po +++ b/apps/i2psnark/locale/messages_de.po @@ -12,7 +12,7 @@ # Ettore Atalan , 2014 # foo , 2009 # SteinQuadrat, 2013 -# Lars Schimmer , 2014 +# Lars Schimmer , 2014-2015 # Max Muster , 2014 # mixxy, 2011 # nextloop , 2013 @@ -22,10 +22,10 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-03-07 12:54+0000\n" -"Last-Translator: blabla \n" -"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/de/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-06 08:21+0000\n" +"Last-Translator: Lars Schimmer \n" +"Language-Team: German (http://www.transifex.com/otf/I2P/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -37,222 +37,230 @@ msgid "No more torrents running." msgstr "Keine weiteren Torrents laufen." #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P-Tunnel geschlossen." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Gesamthochladerbegrenzung geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimale Gesamthochladerbegrenzung ist {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Hochladebandbreitenbegrenzung geändert auf {0}kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimale Hochladebandbreitenbegrenzung ist {0} kbyte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Startverzögerung geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Aktualisierungsrate geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Aktualisierung deaktiviert" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Seitengröße geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Datenverzeichnis muss ein absoluter Pfad sein" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Datenverzeichnis nicht vorhanden" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Kein Verzeichnis" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Unlesbar" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Datenverzeichnis geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Änderungen an I2CP und am Tunnel werden nach dem Stoppen aller Torrents wirksam" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP-Optionen geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Altes I2CP-Ziel wird getrennt" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP-Einstellungen geändert auf {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Verbinden mit den neuen Einstellungen nicht möglich, benutze wieder die alten I2CP-Einstellungen" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Verbinden mit den alten Einstellungen nicht möglich!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Verbunden auf dem neuem I2CP-Ziel" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-Lauscher neu gestartet für \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Neu Dateien werden allgemein lesbar sein." -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Neue Dateien werden nicht allgemein lesbar sein." -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Autostart wird aktiviert" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Autostart wird deaktiviert" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "Smarte Sortierung aktivieren" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "Smarte Sortierung deaktivieren" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "OpenTracker aktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "OpenTracker deaktiviert - Um dies anzuwenden, müssen die Torrents neu gestartet werden." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT aktiviert." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT deaktiviert." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "DHT-Änderungen erfordern das Anhalten und erneutes Öffnen des Tunnels" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} Theme geladen. Gehen Sie zurück zur Hauptseite von i2psnark, um die Änderungen zu sehen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Konfiguration nicht geändert." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "OpenTracker-Liste geändert - Um dies anzuwenden, müssen die Torrents neu gestartet werden" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Liste privater Tracker geändert - betrifft nur neu erstellte Torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Konnte Konfiguration nicht in {0} speichern" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Verbinde mit I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Fehler beim Verbinden mit I2P - Überprüfen Sie Ihre I2CP-Einstellungen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Fehler: Konnte den Torrent \"{0}\" nicht hinzufügen" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kann \"{0}\" nicht öffnen" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent mit diesem Infohash läuft schon: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "FEHLER - Keine I2P-Tracker im privaten Torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Warnung - Keine I2P-Tracker in \"{0}\", es wird nur bei I2P-OpenTrackern und mittels DHT bekanntgeben" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Warnung - Keine I2P-Tracker in \"{0}\" und OpenTrackers sind deaktiviert. Bekanntgabe erfolgt nur mittels DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -260,34 +268,46 @@ msgid "" "torrent." msgstr "Warnung - Keine I2P-Tracker in \"{0}\", und DHT und OpenTrackers sind deaktiviert. Sie sollten DHT oder OpenTrackers vor dem Starten des Torrents aktivieren." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent in \"{0}\" ist nicht gültig" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Torrentdatei gelöscht: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "Torrent Datei von {0} nach {1} verschoben" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "FEHLER - Unzureichender Arbeitsspeicher, kann keinen Torrent von {0} erstellen." -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent hinzugefügt und gestartet: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "Torrent hinzugefügt und gestartet: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent hinzugefügt: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "Torrent hinzugefügt: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "{0} wird abgerufen" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -295,131 +315,146 @@ msgid "" "DHT." msgstr "Das Verwenden von OpenTrackern ist deaktiviert und wir haben keine DHT-Gegenstellen. Das Abrufen von {0} könnte scheitern, sofern Sie keinen anderen Torrent starten. Aktivieren Sie OpenTracker oder DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "{0} wird hinzugefügt" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Herunterladen läuft bereits: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Fehler beim Kopieren der Torrentdatei nach {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Zu viele Dateien in \"{0}\" ({1}), wird gelöscht! " +msgid "Too many files in \"{0}\" ({1})!" +msgstr "Zu viele Dateien in \"{0}\" ({1})!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrentdatei \"{0}\" darf nicht auf '.torrent' enden, wird gelöscht!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "Torrent Datei \"{0}\" kann nicht mit \".torrent\" enden!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Keine Teile in \"{0}\", wird gelöscht!" +msgid "No pieces in \"{0}\"!" +msgstr "Keine Teile in \"{0}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Zu viele Teile in \"{0}\", das Limit sind {1}, werden gelöscht!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "Zu viele Teile in \"{0}\", das Limit ist {1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Teile in \"{0}\" sind zu groß ({1}B), werden gelöscht!" +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "Teile sind zu groß in \"{0}\" ({1}B)!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Limit ist \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" enthält keine Daten und wird gelöscht!" +msgid "Torrent \"{0}\" has no data!" +msgstr "Torrent \"{0}\" hat keine Daten!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents größer als \"{0}\"Bytes werden nicht unterstützt, \"{1}\" wird gelöscht." +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "Torrents größer als {0}B sind noch nicht unterstützt \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fehler: Konnte den Torrent \"{0}\" nicht entfernen" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent gestoppt: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "Torrent gestoppt: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent entfernt: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Torrents in {0} werden hinzugefügt" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Hochladebandbreitenbegrenzung ist {0} KByte/s." -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Herunterladen abgeschlossen: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo für {0} erhalten" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Torrent {0} wird gestartet" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Fehler bei Torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Konnte keine Verbindung zu I2P herstellen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "I2P-Tunnel wird geöffnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Den I2P-Tunnel öffnen und alle Torrents starten." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Alle Torrents stoppen und den I2P-Tunnel schließen." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Der I2P-Tunnel wird nach Benachrichtigung der Tracker geschlossen." +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "Überprüfung von Torrent {0} beendet, nun {1} vollständig" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "Überprüfung von Torrent {0} beendet, keine Änderung" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "Fehler bei der Überprüfung von Torrent {0}" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -465,887 +500,913 @@ msgstr "Torrent ist schon in der Warteschlange: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent in {0} war nicht gültig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Konfiguration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Anonymer BitTorrent-Client" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Router ist Offline" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Seite aktualisieren" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Klicken Sie die \"Torrent Hinzufügen\"-Schaltfläche, um den Torrent abzurufen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "Nachrichten löschen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Sortieren nach {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Teilnehmer ausblenden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Teilnehmer einblenden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Dateityp" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Geschätzte verbleibende Zeit" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr " Empf." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Heruntergeladen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Größe" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr " Send." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Hochladeverhältnis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Hochgeladen" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Übertragungsrate für den Empfang" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Herunterladegeschwindigkeit" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Übertragungsrate fürs Senden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Hochladegeschwindigkeit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Alle Torrents und den I2P-Tunnel stoppen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Alle stoppen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Alle gestoppten Torrents fortsetzen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Alle starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Alle Torrents und den I2P-Tunnel starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Keine Torrents geladen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Gesamt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 Torrent" msgstr[1] "{0} Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 verbundener Teilnehmer" msgstr[1] "{0} verbundene Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 DHT-Gegenstelle" msgstr[1] "{0} DHT-Gegenstellen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Ziel" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Erste" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Erste Seite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Vorherige" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Vorherige Seite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Nächste" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Nächste Seite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Letzte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Letzte Seite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "Datenverzeichnis kann nicht erstellt werden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Kann den Torrent {0} nicht hinzufügen, da dieser in einem anderen Torrent ist: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Ungültige URL - muss mit \"http://\", \"{0}\" oder \"{1}\" anfangen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnetlink gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Torrentdatei gelöscht: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Download gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Datendatei gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Daten konnten nicht gelöscht werden: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Das Verzeichnis {0} konnte nicht gelöscht werden." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Verzeichnis gelöscht: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Kann keinen Torrent mit der Endung \".torrent\" hinzufügen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Torrent mit diesem Namen ist schon aktiv: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Kann keinen Torrent hinzufügen, der das I2P Verzeichnis beinhaltet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Kann den Torrent {0} nicht hinzufügen, da dieser den Torrent {1} enthält." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Fehler - Einfügen alternativer Tracker ohne primären Tracker nicht möglich" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Fehler - Mischen von privaten und öffentlichen Trackern in einem Torrent nicht möglich" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent erstellt für \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Viele I2P-Tracker erfordern eine Registrierung, bevor der Torrent verteilt wird. Bitte tun Sie dies vor dem Start von \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Fehler beim Erstellen eines Torrents für \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kann keinen Torrent für nicht existente vorhandene erstellen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Fehler beim Erstellen des Torrents - Sie müssen eine Datei oder ein Verzeichnis angeben." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Ausgewählte löschen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Trackerkonfiguration speichern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Entfernt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Tracker hinzufügen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Geben Sie einen gültigen Tracker-Namen und die URLs ein" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Auf Standardeinstellungen zurücksetzen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Auf Standard-Tracker zurückgesetzt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Überprüfe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Reserviere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Trackerfehler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 Teilnehmer" msgstr[1] "{0} Teilnehmern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Verteile" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Vollständig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Stillstand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Keine Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Gestoppt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Details" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Dateien ansehen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Datei öffnen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Torrent stoppen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Stopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Torrent starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Entfernt den Torrent von der aktiven Liste und löscht die .torrent-Datei" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Sind Sie sicher, dass Sie die Datei \\''{0}\\'' löschen möchten (Heruntergeladene Daten werden nicht gelöscht)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Entfernen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Löscht die .torrent-Datei und (die) dazugehörige Datendatei(en)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Sind Sie sicher, dass Sie die Torrentdatei \\''{0}\\'' und alle heruntergeladenen Daten löschen wollen?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Löschen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Unbekannt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Quelle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uninteressant (Der Teilnehmer hat keine Teile, die wir benötigen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Gedrosselt (Der Teilnehmer hat uns nicht erlaubt, Teile anzufordern)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uninteressiert (Wir haben keine Teile, die der Teilnehmer benötigt)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Gedrosselt (Wir erlauben dem Teilnehmer nicht, Teile anzufordern)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Details beim Tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Torrent hinzufügen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Von URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Geben Sie die URL zum Herunterladen einer Torrentdatei (I2P-Link), einen Magnet-Link, einen Maggot-Link oder einen Info-Hash ein!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Füge Torrent hinzu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Datenverzeichnis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Geben Sie das Verzeichnis zum Speichern der Daten ein (Standardeinstellung {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Alternativ können Sie die .torrent-Dateien auch nach {0} kopieren." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Das Entfernen der .torrent-Datei stoppt den jeweiligen Torrent." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Torrent erstellen" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Daten zum Verteilen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Datei oder Verzeichnis zum Verteilen (Gesamter Pfad oder aus dem Verzeichnis {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primär" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Torrent erstellen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "keiner" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Datenverzeichnis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Dateien von allen lesbar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Wenn abgehakt, können andere Benutzer auf die heruntergeladenen Dateien zugreifen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Torrents automatisch starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Wenn abgehakt, werden hinzugefügte Torrents automatisch gestartet." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "Smarte Torrent Sortierung" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "Ignoriert Wörter wie 'the' bei der Sortierung, falls Aktiv" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Aufmachung" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Aktualisierungsintervall" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Startverzögerung" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "Minuten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Seitengröße" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Gesamtlimit an Hochladern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "Teilnehmer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Bandbreitenbegrenzung beim Hochladen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Halbe verfügbare Bandbreite wird empfohlen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Routerbandbreite ansehen oder ändern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Auch OpenTracker verwenden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Wenn abgehakt, wird der Torrent neben dem in der Torrentdatei angegebenen Tracker auch bei den OpenTrackern bekanntgegeben." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "DHT aktivieren" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Wenn abgehakt, wird DHT verwendet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Einstellungen eingehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Einstellungen ausgehend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP-Host" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP-Port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP-Optionen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Einstellungen speichern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" -msgstr "Name" +msgstr "Namen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "Webseiten-URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Standard" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Offen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Ankündigungs-URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Hinzufügen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Ungültige Magnet-URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 Zwischenstation" msgstr[1] "{0} Zwischenstationen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 Tunnel" msgstr[1] "{0} Tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrentdatei" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Datenadresse" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Info-Hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Primärer Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Tracker-Liste" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Kommentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Erstellt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Erstellt von" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "Hinzugefügt" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "Fertig" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnetlink" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Privater Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Fortschritt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Verbleibend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Dateien" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" -msgstr "Stücke" +msgstr "Teile" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Stückgröße" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "Für Resultate Seite aktualisieren" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "Überprüfung forcieren" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Verzeichnis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Priorität" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Eine Hierarchie nach oben" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrentdatei nicht gefunden?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Datei nicht gefunden im Torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "vollständig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "verbleibend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Hoch" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Überspringen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Alle auf hoch festlegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Alle auf normal festlegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Alle überspringen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Prioritäten speichern" diff --git a/apps/i2psnark/locale/messages_en.po b/apps/i2psnark/locale/messages_en.po index 3c8e6d262..601b06e4c 100644 --- a/apps/i2psnark/locale/messages_en.po +++ b/apps/i2psnark/locale/messages_en.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P i2psnark\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-04-09 10:57+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" "PO-Revision-Date: 2010-06-15 14:09+0100\n" "Last-Translator: duck \n" "Language-Team: duck \n" @@ -23,386 +23,421 @@ msgid "No more torrents running." msgstr "" #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "" #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "" #. TODO - if the existing one is a magnet, delete it and add the metainfo instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and " "DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " "disabled, you should enable open trackers or DHT before starting the torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" +msgid "Torrent added and started: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" +msgid "Torrent added: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " "succeed until you start another torrent, enable open trackers, or enable DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" +msgid "Too many files in \"{0}\" ({1})!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" +msgid "No pieces in \"{0}\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgid "Too many pieces in \"{0}\", limit is {1}!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgid "Pieces are too large in \"{0}\" ({1}B)!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" +msgid "Torrent \"{0}\" has no data!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" +msgid "Torrent stopped: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -448,885 +483,911 @@ msgstr "" msgid "Torrent at {0} was not valid" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2649 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2409 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2967 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2940 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2957 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2969 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2981 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2635 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2668 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2940 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2805 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2395 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "" -#. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2397 +#. "\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2818 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or " "info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2145 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2149 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2157 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2161 -msgid "Theme" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2175 -msgid "Refresh time" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2188 -msgid "Never" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 +msgid "Theme" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 +msgid "Refresh time" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +msgid "Never" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2196 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2200 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2202 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2226 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2236 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2238 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2242 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2246 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed " "in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2250 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2254 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2276 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2284 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2304 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2309 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2329 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2940 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2331 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2333 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2335 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3067 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2337 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2339 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2383 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2426 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2435 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2678 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2695 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2723 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2748 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2769 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2781 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2794 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2814 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2843 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2969 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2860 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2866 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2920 -msgid "Directory" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2979 -msgid "Priority" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2991 -msgid "Up to higher level directory" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 -msgid "Torrent not found?" +msgid "Directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3031 -msgid "File not found in torrent?" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 -msgid "complete" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 -msgid "remaining" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3091 -msgid "High" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 +msgid "Priority" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 +msgid "Up to higher level directory" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 +msgid "Torrent not found?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 +msgid "File not found in torrent?" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 +msgid "complete" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 +msgid "remaining" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 +msgid "High" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3101 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3111 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3113 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3116 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "" diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po index 337bdad1d..46afe9bf5 100644 --- a/apps/i2psnark/locale/messages_es.po +++ b/apps/i2psnark/locale/messages_es.po @@ -14,16 +14,16 @@ # mixxy, 2011 # punkibastardo , 2011, 2012 # punkibastardo , 2011 -# strel, 2013-2014 +# strel, 2013-2015 # Trolly, 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-02-23 21:33+0000\n" -"Last-Translator: blabla \n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/I2P/language/es/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Spanish (http://www.transifex.com/otf/I2P/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -35,222 +35,230 @@ msgid "No more torrents running." msgstr "No hay más torrents intercambiandose." #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Túnel I2P cerrado." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Enlace magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "El límite total de usuarios subiendo ha cambiado a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "El límite mínimo total de usuarios subiendo es {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "El límite de ancho de banda de subida cambió a {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "El límite mínimo de ancho de banda de subida es {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "El retardo en el arranque cambió a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Hora de actualización cambiado a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Actualización deshabilitada" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Tamaño de página cambiado a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "La carpeta de datos tiene que ser una ruta absoluta" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "La carpeta de datos no existe" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "No es una carpeta" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "No se pudo leer" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Carpeta de datos cambiada a {0} " -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Los cambios de I2CP (protocolo cliente I2P) y túnel serán efectivos después de detener todos los torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Opciones I2CP cambiadas a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Desconectando destino I2CP antiguo" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Preferencias de I2CP cambiadas a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "No se pudo conectar usando las nuevas preferencias de I2CP (protocolo cliente I2P), volviendo a las antiguas" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "¡No se pudo reconectar usando las preferencias antiguas!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Reconectado con el nuevo destino I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "El escuchador de I2CP se reinició para \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Los ficheros nuevos serán públicamente legibles" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Los ficheros nuevos no serán públicamente legibles" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Arranque automático activado" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Arranque automático desactivado" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Trackers (rastreadores) abiertos activados - requiere reiniciar el torrent para que sea efectivo." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Trackers (rastreadores) abiertos desactivados - requiere reiniciar el torrent para que sea efectivo." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT habilitada." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT deshabilitada." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Cambiar la DHT (tabla de hash distribuida) requiere cerrar el túnel y volver a abrirlo" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Tema {0} cargado, vuelva a la página principal de i2psnark para verlo" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "La configuración no cambió." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "La lista de trackers (rastreadores) abiertos cambió - requiere reiniciar el torrent para que sea efectiva." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "La lista de trackers (rastreadores) privados cambió - afactará sólo a los torrents creados a partir de ahora." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "No se pudo guardar la configuración en {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Conectando a I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Error al conectar a I2P - ¡compruebe sus preferencias de I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Error: No se pudo añadir el torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "No se pudo abrir \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Ya hay un torrent con esta información de hash (identificador criptográfico): {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "ERROR - No hay trackers I2P en el torrent privado \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Advertencia - No hay trackers (rastreadores) I2P en \"{0}\", sólo se anunciará a trackers abiertos I2P y a la DHT (tabla de hash distribuida)." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Advertencia - No hay trackers (rastreadores) I2P en \"{0}\", y los trackers abiertos están deshabilitados. Sólo se anunciará a la DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -258,34 +266,46 @@ msgid "" "torrent." msgstr "Advertencia - No hay trackers (rastreadores) I2P en \"{0}\", y la DHT (tabla de hash distribuida) y los trackers abiertos están deshabilitados, debe habilitar los trackers abiertos o la DHT antes de iniciar el torrent." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "El torrent en \"{0}\" no es válido." -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Fichero torrent borrado: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ERROR - Sin memoria disponible, no se pudo crear un torrent a partir de {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent añadido e iniciado: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent añadido: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Obteniendo {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -293,131 +313,146 @@ msgid "" "DHT." msgstr "Los rastreadores abiertos están desactivados y no hay pares DHT. Es posible que no se puedan obtener para {0} hasta que no inicie otro torrent, active los rastreadores abiertos o active la DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Añadiendo {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Descarga ya en marcha: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "No se pudo copiar el fichero torrent a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Hay demasiados ficheros en \"{0}\" ({1}), ¡borrándolos!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "El fichero torrent \"{0}\" no puede terminar en \".torrent\". ¡borrándolo!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "No hay partes en \"{0}\", ¡borrándolo!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Hay demasiadas partes en \"{0}\", el límite es {1}, ¡borrándolo!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Las partes en \"{0}\" ({1}Bytes) son demasiado grandes, ¡borrándolas!" +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "El límite es de \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "El torrent \"{0}\" no contiene datos, ¡borrándolo!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Los torrents mayores de \"{0}\"Bytes aún no están soportados, borrando \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Error: No se pudo eliminar el torrent \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent detenido: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent eliminado: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Añadiendo torrents en {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "El limite de ancho de banda de subida es {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Descarga finalizada: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo recibida para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Iniciando el torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Error en el torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "¡No se pudo conectar con I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Abriendo el túnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Abriendo el túnel I2P e iniciando todos los torrents ..." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Deteniendo todos los torrents y cerrando el túnel I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Cerrando túnel I2P después de avisar a los trackers" +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -463,887 +498,913 @@ msgstr "Torrent ya en cola: {0}" msgid "Torrent at {0} was not valid" msgstr "El torrent en {0} no era válido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Configuración" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Cliente BitTorrent anónimo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "El router está caído" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Actualizar página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Foro" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Haga clic en el botón \"Añadir torrent\" para obtener un torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "eliminar mensajes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Estado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Ordenado por {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Ocultar pares ('peers')" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Mostrar pares ('peers')" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Tipo de fichero" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Llegada" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Tiempo restante estimado" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "Receptor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Descargado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Tamaño" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "Transmisor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Tasa de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Subido" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Tasa de descarga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Tasa de descarga" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Tasa de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Tasa de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Detener todos los torrents y el túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Detener todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Iniciar todos los torrents parados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Iniciar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Iniciar todos los torrents y el túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "No hay torrents cargados." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totales" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 par conectado" msgstr[1] "{0} pares conectados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 par DHT" msgstr[1] "{0} pares DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Dest" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Primera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Primera página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Anterior" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Página anterior" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Siguiente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Página siguiente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Última" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Última página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "No se pudo crear el directorio de datos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "No puede añadir un torrent {0} dentro de otro torrent: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL no válida: debe comenzar con \"http://\", \"{0}\", o \"{1}\"." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet borrado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Fichero torrent borrado: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Descarga borrada: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Fichero de datos borrado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "No se pudo borrar el fichero de datos: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "No se pudo borrar la carpeta {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Carpeta borrada: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "No se pudo añadir un torrent que acaba en \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Un torrent con este nombre ya está intercambiandose: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "No puede añadir un torrent que incluye un directorio I2P: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "No puede añadir un torrent {0} que incluye otro torrent: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Error - No se pueden incluir trackers alternativos sin un tracker principal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Error - No se pueden mezclar trackers privados y públicos en un torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent creado para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Muchos trackers (rastreadores) I2P requieren que registre los nuevos torrents antes del seeding (sembrado) - por favor hágalo antes de iniciar \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Error al crear un torrent para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "No se pudo crear un torrent para los datos inexistentes: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Error al crear torrent - ha de introducir un fichero o carpeta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Borrar seleccionados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Guardar configuración de tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Eliminado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Añadir tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Introduzca nombre y URLs de tracker (rastreador) válidos" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Restaurar predeterminados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Trackers (rastreadores) predeterminados restaurados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Comprobando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Asignando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Error del tracker (rastreador)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 par" msgstr[1] "{0} pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Iniciando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Sembrando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "Bien" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Estancado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Sin pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Detenido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Detalles del torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Ver ficheros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Abrir fichero" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Detener el torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Detener" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Iniciar el torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Iniciar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Eliminar el torrent de la lista de torrents activos, borrando el fichero .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "¿Está seguro de que quiere borrar el fichero \\''{0}\\'' (los datos descargados no serán borrados)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Eliminar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Borrar el fichero .torrent y el(los) ficheros(s) de datos asociado(s)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "¿Está seguro de que quiere borrar el torrent \\''{0}\\'' y todos los datos descargados correspondientes?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Borrar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Desconocido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Semilla (seed)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Sin interés (el par no tiene las partes que necesitamos)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Restringido (el par no nos está permitiendo solicitar partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "No interesado (no tenemos las partes que el par precisa)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Restringiendo (no estamos permitiendo al par solicitar partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detalles en el tracker (rastreador) {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Información" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Añadir torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Desde la URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Introduzca URL de descarga del fichero torrent (sólo I2P), enlace magnet, enlace maggot, o información de hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Añadir torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Dir de datos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Introduzca el directorio en el que guardar los datos (por defecto {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "También puede copiar ficheros .torrent a: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Eliminar un fichero .torrent provocará que se detengan sus transferencias." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Crear un torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Datos a sembrar ('seed')" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Fichero o directorio a sembrar (seed) (ruta completa o dentro del directorio {0} ) " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Principal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Crear torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "ninguno" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Carpeta de datos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Ficheros legibles por todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Si está marcada, otros usuarios pueden acceder a los ficheros descargados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Auto iniciar torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Si está marcado, iniciará automáticamente los torrents se añadan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Hora de actualización" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nunca" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Retardo al arrancar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minutos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Tamaño de página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Límite total de usuarios subiendo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Límite de velocidad de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Se recomienda la mitad del ancho de banda disponible." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Mostrar o cambiar ancho de banda del router (enrutador)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Usar también trackers (rastreadores) abiertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Si está marcado, anuncia los torrents a los trackers (rastreadores) abiertos así como a los listados en el fichero torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Habilitar DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Si está marcada, usar DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Preferencias de entrada" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Preferencias de salida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Anfitrión I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Puerto I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Opciones de I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Guardar configuración" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nombre" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL del sitio web" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Estándar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Abrir" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL de anunciamientos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Añadir" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "URL de magnet no válida: {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 salto" msgstr[1] "{0} saltos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 túnel" msgstr[1] "{0} túneles" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Fichero torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Ubicación de los datos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Información de hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Tracker principal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Lista de trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Comentario" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Creado en" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Creado por" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Enlace de magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Torrent privado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Finalización" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Restante" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Ficheros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Partes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Tamaño de las partes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Carpeta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioridad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Subir a la carpeta del siguiente nivel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "¿No se encotró el fichero torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "¿No se encontró el fichero en el torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "restante" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Alta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Saltar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Configurar todos a alto " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Configurar todos a normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Omitir todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Guardar prioridades" diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po index 08437ba71..9b64f87fa 100644 --- a/apps/i2psnark/locale/messages_fr.po +++ b/apps/i2psnark/locale/messages_fr.po @@ -12,15 +12,15 @@ # Boxoa590, 2012 # jackjack , 2011 # syl_, 2015 -# Towinet, 2013-2014 +# Towinet, 2013-2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-03-01 02:59+0000\n" -"Last-Translator: syl_\n" -"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:50+0000\n" +"Last-Translator: Towinet\n" +"Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -32,222 +32,230 @@ msgid "No more torrents running." msgstr "Il n'y a plus de torrents en fonctionnement." #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Tunnel I2P fermé." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite totale uploaders modifiée à : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "La limite de nombre minimal d''uploaders est {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Limite d’envoi modifiée à : {0} ko/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "La limite minimale d’envoi est {0} ko/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Délai de démarrage modifié à {0} minutes" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Temps de rafraîchissement changé pour {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Rafraîchissement désactivé" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Taille de la page changée pour {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Répertoire des données doit être un chemin absolu" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Répertoire de données n'existe pas" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Pas un répertoire" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Illisible" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Répertoire des données changé pour {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Les modifications sur I2CP et les tunnels seront pris en compte après avoir arrêté tous les torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Options I2CP changées pour {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Déconnexion des anciennes destination I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Les paramètres I2CP ont été changés à {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Impossible de se connecter avec les nouveaux paramètres, retour à l'ancienne configuration I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Impossible de se reconnecter avec les anciens paramètres!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Reconnexion sur la nouvelle destination I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Écouteur I2CP redémarré pour \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Les nouveaux fichiers seront publiquement lisibles" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Les nouveaux fichiers ne seront pas publiquement lisibles" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Démarrage automatique activé" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Démarrage automatique désactivé" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "Tri intelligent permis" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "Tri intelligent non-permis" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Trackers ouverts activés - redémarrage des torrents requis pour prise en compte." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Trackers ouverts désactivés - redémarrage des torrents requis pour prise en compte." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT activée." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT désactivée." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Le changement DHT nécessite la fermeture puis réouverture du tunnel" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Thème {0} chargé, revenez à la page d''accueil d''i2psnark pour voir comme il est beau !" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Aucun changement de configuration." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Liste des trackers ouverts modifiée - redémarrage des torrents requis pour prise en compte" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Liste tracker privé modifiée - affecte seulement les torrents nouvellement créés." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Impossible de sauvegarder la configuration vers {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Connexion à I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Erreur de connexion à I2P - Vérifiez vos paramètres I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Erreur : Impossible d’ajouter le torrent : {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Impossible d’ouvrir: \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Un torrent avec cette empreinte est déjà actif: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "ERREUR - Pas de trackers I2P dans le torrent privé \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", vais annoncer aux trackers I2P ouverts et DHT seulement." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", et les trackers ouverts sont désactivés, vais annoncer à DHT seulement." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -255,34 +263,46 @@ msgid "" "torrent." msgstr "Avertissement - Pas de trackers I2P dans \"{0}\", et DHT et les trackers ouverts sont désactivés, vous devriez activer les trackers ouverts ou DHT avant de démarrer le torrent." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Le torrent dans \"{0}\" est invalide" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Fichier torrent effacé: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "Fichier torrent déplacé depuis {0} vers {1}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ERREUR - Mémoire insuffisante, impossible de créer le torrent depuis {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent ajouté et démarré: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "Torrent ajouté et démarré : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent ajouté: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "Torrent ajouté : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Envoi {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -290,131 +310,146 @@ msgid "" "DHT." msgstr "Les trackers ouverts sont désactivés et nous n''avons pas de pairs DHT. La recherche de {0} pourrait ne pas réussir jusqu''à ce que vous démarriez un autre torrent, activiez trackers ouverts, ou activeiz DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Ajout {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Téléchargements déjà en cours: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Impossible de copier le torrent vers {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Trop de fichiers dans \"{0}\" ({1}), suppression! " +msgid "Too many files in \"{0}\" ({1})!" +msgstr "Trop de fichiers dans \"{0}\" ({1}) !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Le fichier torrent \"{0}\" ne peut pas se terminer par \".torrent\", suppression!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "Le fichier torrent \"{0}\" peut pas finir en \".torrent\" !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Pas de tronçon dans \"{0}\", suppression!" +msgid "No pieces in \"{0}\"!" +msgstr "Pas de tronçons dans \"{0}\" !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Trop de tronçons dans \"{0}\" , la limite est {1}, suppression!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "Trop de tronçons dans \"{0}\", la limite est de {1} !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Les tronçons sont trop larges dans \"{0}\" ({1}B), suppression." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "Les tronçons sont trop grands dans \"{0}\" ({1}B) !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "La limite est de \"{0}\"octets" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Le fichier torrent \"{0}\" n'a pas de données, suppression!" +msgid "Torrent \"{0}\" has no data!" +msgstr "Le torrent \"{0}\" n'a pas de donnée !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Les torrents dont la taille est supérieure à \"{0}\"octets ne sont pas encore supportés, suppression \"{1}\"." +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "Les torrents plus grands que {0}B ne sont pas encore supportés \"{1}\" !" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Erreur: Impossible de supprimer le torrent \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent arrêté: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "Torrent stoppé : {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent supprimé: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Ajout des torrents dans {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limite bande passante haute est {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Téléchargement terminé: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo reçue pour {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Démarrage du torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Erreur sur torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Impossible de se connecter à I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Ouverture du tunnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Ouverture du tunnel I2P et démarrage de tous les torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Arrêt de tous les torrents et fermeture du tunnel I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Fermeture du tunnel I2P après notification aux trackers." +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "Vérification du torrent {0} terminée, maintenant {1} complet" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "Vérification du torrent {0} terminée, inchangé" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "Erreur lors de la vérification du torrent {0}" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -460,887 +495,913 @@ msgstr "Torrent déjà dans la file d''attente: {0}" msgid "Torrent at {0} was not valid" msgstr "Le torrent {0} est invalide" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Configuration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Client BitTorrent anonyme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Le routeur est tombé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Rafraîchir la page" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Cliquer le bouton \"Ajout torrent\" pour aller chercher le torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "nettoyer messages" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "État" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Trier par {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Cacher les pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Afficher les pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Type de fichier" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Temps" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Temps restant estimé" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "Reçu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Téléchargé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Taille" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "Envoyé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Ratio en upload" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Envoyé" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Taux RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Taux de téléchargement" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Taux TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Taux d'envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Arrêter tous les torrents et le tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Arrêter tout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Démarrer tous les torrents arrêtés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Démarrer tout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Démarrer tous les torrents et le tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Aucun torrent chargé." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totaux" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "{0} torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "{0} pair connecté" msgstr[1] "{0} pairs connectés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 pair DHT" msgstr[1] "{0} pairs DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Dest" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Premier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Première page" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Préc" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Page suivante" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Suivant" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Page suivante" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Dernier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Dernière page" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "Le répertoire données ne peut pas être créé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Ne peut pas ajouter le torrent {0} à l'intérieur d'un autre torrent: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL incorrecte - elle doit débuter par \"http://\", \"{0}\", ou \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet supprimé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Fichier torrent effacé: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Téléchargement effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Fichier de données effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Le fichier de données ne peut être effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Le répertoire n''a pas pu être effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Répertoire effacé: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Ne peut pas ajouter un torrent se terminant par \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Un torrent avec ce nom est déjà en cours: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Ne peut pas ajouter un torrent incluant un dossier d''I2P: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Ne peut pas ajouter le torrent {0} incluant un autre torrent: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Erreur - Ne peut pas inclure de trackers trackers alternatifs sans un tracker primaire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Erreur - Ne peut pas mixer dans un torrent trackers public et privés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent créé pour \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "De nombreux trackers I2P nécessitent d’enregistrer les nouveaux torrents avant de seeder - faites-le avant de démarrer \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Erreur de création du torrent pour \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Impossible de créer un torrent pour des données inexistantes: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Erreur de création du torrent - vous devez saisir un fichier ou un répertoire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Effacer les sélectionnés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Sauvegarder la configuration du tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Retiré" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Ajout tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Entrez nom de tracker valide et URLs" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Restaurer les paramètres d'origine" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Restaurer les trackers d'origine" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Vérification" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Allocation" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Erreur du tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "{0} pair" msgstr[1] "{0} pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Démarrage" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seed en cours" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Figé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Pas de pair" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Arrêté" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Détails du torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Voir les fichiers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Ouvrir fichier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Arrêter le torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Arrêter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Démarrer le torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Démarrer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Enlever le torrent de la liste active, suprression du fichier .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Êtes-vous sûr que vous voulez supprimer le fichier \\''{0}\\'' (les données téléchargées ne seront pas supprimées) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Enlever" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Supprimer le fichier .torrent et le(s) fichier(s) de données associé(s)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Êtes-vous certain de vouloir supprimer le torrent \\''{0}\\'' ainsi que toutes les données téléchargées ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Supprimer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Inconnu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Aucun intérêt (le pair n'a aucun tronçon utile)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "bridé (le pair ne nous permet pas de demander des tronçons)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Pas intéressé (aucun tronçon utile au pair)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "bridage (nous ne permettons pas au pair de demander un tronçon)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Détails au tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Ajouter torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Depuis l'URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Entrez l'URL de téléchargement du fichier torrent (I2P seulement), lien magnet, lien maggot, or l'info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Ajouter torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Répertoire données" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Saisissez le répertoire où sauvegarder les données par défaut (default {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Vous pouvez aussi copier les fichiers .torrent vers {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "La suppression d'un fichier .torrent entraîne l'arrêt du torrent." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Créer torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Données à seeder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Fichier ou dossier à seeder (chemin complet ou dans le dossier {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primaire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternatifs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Créer torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "aucun" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Répertoire de données" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Fichiers lisibles par tous" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Si coché, les autres utilisateurs pourront accéder aux fichiers téléchargés." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Démarrer automatiquement les torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Si coché, les torrents démarreront automatiquement lors de l'ajout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "Triage intelligent de torrent" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "Si coché, ignore des mots tels que 'the' lors du tri" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Thème" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Temps de rafraîchissement " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Jamais" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Délais de démarrage" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minutes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Taille page" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Limite totale d'envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "pairs" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Limite de bande passante en envoi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "La moitié de la bande passante est recommandée." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Consulter ou modifier la bande passante du routeur" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Utiliser également les trackers ouverts" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Si coché, les torrents seront annoncés vers les open trackers ainsi que vers les trackers indiqués dans le fichier torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Active DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Si coché, utilise DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Paramètres entrants" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Paramètres sortants" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Hôte I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Port I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Options I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Sauvegarder la configuration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nom" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL du site web" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Standard" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Ouvrir le fichier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Annoncer URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Ajout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "URL magnet {0} incorrecte" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "{0} saut" msgstr[1] "{0} sauts" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "{0} tunnel" msgstr[1] "{0} tunnels" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Fichier torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Emplacement donnée" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Info hachage" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Tracker primaire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Liste tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Commentaire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Créé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Créé par" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "Ajouté" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "Complété" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Lien magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Torrent privé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Finalisation" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Restant" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Fichiers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Tronçons" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Taille des tronçons" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "Rafraîchir la page pour des résultats" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "Forcer revérification" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Répertoire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Priorité" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Vers le répertoire parent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent non trouvé?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Fichier non trouvé dans le torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "restant" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Haut" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Ignorer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Mettre tous à haute" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Mettre tous à normale" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Tout sauter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Sauvegarder les priorités" diff --git a/apps/i2psnark/locale/messages_hu.po b/apps/i2psnark/locale/messages_hu.po index d5a03b354..e5bb98038 100644 --- a/apps/i2psnark/locale/messages_hu.po +++ b/apps/i2psnark/locale/messages_hu.po @@ -5,241 +5,250 @@ # # Translators: # omgitsadalek , 2013 +# benewfy , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/I2P/language/hu/)\n" +"Language-Team: Hungarian (http://www.transifex.com/otf/I2P/language/hu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." -msgstr "" +msgstr "Nincs több futó torrent." -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P alagút lezárva." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Mágnes" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Teljes feltöltők korlátja megváltoztatva a következőre: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Teljes feltöltők minimum korlátja a következő: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Feltöltési sávszélesség korlátja megváltoztatva a következőre: {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "A minimum feltöltési sávszélesség korlátja {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Késleltetés indításkor megváltoztatva a következőre: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Frissítési idő a következőre változott: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Frissítés kikapcsolva" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Az I2CP-re és alagutakra vonatkozó változtatások az összes torrent leállítása után lépnek érvénybe" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP opciók a következőre lettek változtatva: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Lekapcsolódás a régi I2CP célállomásról" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP beállítások a következőre változtak: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Sikertelen kapcsolódás az új beállításokat használva, visszatérés a régi I2CP beállításokhoz" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Sikertelen újrakapcsolódás a régi beállításokat használva!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Újracsatlakozva az új I2CP célállomásra" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP figyelő újraindítva a következőhöz: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Az új fájlok nyilvánosan olvashatók lesznek" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Az új fájlok nyilvánosan nem lesznek olvashatók" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Automatikus indítás engedélyezve" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Automatikus indítás kikapcsolva" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Nyílt követők (tracker) engedélyezve - az érvénybe lépéshez a torrent újraindítása szükséges." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Nyílt követők (tracker) kikapcsolva - az érvénybe lépéshez a torrent újraindítása szükséges." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT engedélyezve." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT letiltva." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} téma betöltve, megtekintéséhez térj vissza az i2psnark főoldalára." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Beállítások nem lettek megváltoztatva." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Nyílt Követők (tracker) listája megváltozott - az érvénybe lépéshez a torrent újraindítása szükséges." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Megváltozott a privát tracker lista - csak az újonnan létrehozott torrentekre vonatkozik." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Nem sikerült a beállítások mentése a következőre: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Kapcsolódás az I2P-hez" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Hiba az I2P-hez való csatlakozáskor - ellenőrizd az I2CP beállításait!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Hiba: a következő torrent hozzáadása sikertelen: {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "\"{0}\" megnyitása sikertelen" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "A torrent már fut ezzel az infó hash-el: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "HIBA - Nincsenek I2P követők (trackerek) a következő privát torrentben: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -247,34 +256,46 @@ msgid "" "torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Érvénytelen torrent a következőben: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Torrent fájl törölve: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "HIBA - nincs több memória, torrent létrehozása sikertelen a következőből: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent hozzáadva és elindítva: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent hozzáadva: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Leszedés: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -282,132 +303,147 @@ msgid "" "DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "{0} Hozzáadása" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Futó letöltés: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Nem sikerült a torrent fájl másolása a következőre: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Túl sok fájl a következőben: \"{0}\" ({1}), törlésre kerül!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrent fájl \"{0}\" nem végződhet így: \".torrent\", törlésre kerül!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Nincsenek részek a következőben: \"{0}\", törlésre kerül!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Túl sok rész a következőben: \"{0}\", a határ {1}, törlésre kerül!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "A részek túl nagyok a következőben: \"{0}\" ({1}B), törlésre kerül." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "A határ {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "\"{0}\" torrent nem tartalmaz adatot, törlésre kerül!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Nincsenek támogatva torrentek, melyek nagyobbak, mint {0}B, \"{1}\" törlésre kerül" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Hiba: a következő torrent eltávolítása sikertelen: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent leállítva: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent eltávolítva: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Torrentek hozzáadása a következőben: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Feltöltési sebesség korlát {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "A letöltés befejeződött: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainformáció letöltve a következőhöz: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "{0} torrent indítása" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Hiba a következő torrenten: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Sikertelen csatlakozás az I2P-hez!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Az I2P alagút megnyitása" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Az I2P alagút megnyitás, minden torrent indítás alatt." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Az összes torrent leállítás és az I2P alagút lezárás alatt." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "" @@ -452,887 +488,913 @@ msgstr "Torrent már a sorban van: {0}" msgid "Torrent at {0} was not valid" msgstr "Érvénytelen torrent a következő helyen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Beállítások" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Router leállva" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrentek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Lap újratöltése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Fórum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Torrent leszedéséhez kattints a \"Torrent hozzáadása\" gombra" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "üzenetek törlése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Állapot" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Társak Elrejtése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Társak Megjelenítése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "BIE" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Becsült hátralévő idő" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "Be" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Letöltött" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Méret" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "Ki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Feltöltött" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Letöltési Sebesség" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Feltöltési Sebesség" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Minden torrent és az I2P alagút leállítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Mindet Leállít" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Mind Indítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Minden torrent és az I2P alagút indítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Egy torrent sem került betöltésre." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Összesen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 csatlakozott társ" msgstr[1] "{0} csatlakzott társ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Érvénytelen URL: \"http://\", \"{0}\", vagy \"{1}\" kell kezdődnie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Mágnes észlelve: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Torrent fájl törölve: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Letöltés törölve: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Adatfájl törölve: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Adatfájl törlése nem sikerült: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Könyvtár nem törölhető: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Könyvtár törölve: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent létrehozva a következőnek: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Sok I2P követő (tracker) megköveteli az új torrentek regisztrációját táplálás (seed) előtt - kérlek, regisztrálj, mielőtt elindítod a következőt: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Hiba történt a torrent létrehozásakor \"{0}\" számára" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nem sikerült torrent létrehozása, nemlétező adat: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Hiba a torrent létrehozásakor - Fájl vagy könyvtár megadása kötelező" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Kijelöltek törlése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Eltávolítva" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Követő (tracker) hozzáadása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Adj meg érvényes követő (tracker) nevet és URL címeket" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Alapértelmezések visszaállítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Alapértelmezett követők (trackerek) visszaállítva" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Ellenőrzés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Helyfoglalás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Követő (tracker) Hiba" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 társ" msgstr[1] "{0} társ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Indítás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Táplálás (seeding)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Kész" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "Rendben" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Beragadt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Nincsenek Társak" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Leállítva" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Torrent részletek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Fájlok megtekintése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Fájl megnyitása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Torrent leállítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Leállítás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Torrent indítása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Indítás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Torrent eltávolítása az aktív listáról, a .torrent fájl törlésével" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Eltávolítás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr ".torrent fájl törlése a hozzá tartozó adatfájlokkal együtt" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Biztos, hogy törlöd a következő torrentet és az összes letöltött adatot: \\''{0}\\'' ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Törlés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Ismeretlen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Táplálás (Seed)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Érdektelen (társ nem rendelkezik számunkra szükséges részekkel)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Eltömődött (a társ nem engedi részek igénylését)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Érdektelen (nem rendelkezünk a társak számára szükséges részekkel)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Eltömődött (a társak számára a részek igénylése nem engedélyezett)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Részletek a következő követőn (tracker): {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Infó" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Torrent Hozzáadása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "URL címről" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Add meg a torrent fájl letöltési URL-jét (csak I2P), mágnes linket, maggot linket vagy infó hash-t" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Torrent hozzáadása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Másolhatsz .torrent fájlokat a következőhöz is: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "A .torrent fájl eltávolításával meg fog állni." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Torrent létrehozása" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Adat táplálásra (seed)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Követők (trackerek)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Torrent létrehozása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Adatkönyvtár" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Mindenki által olvasható fájlok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Ha be van jelölve, más felhasználók is elérhetik a letöltött fájlokat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Ha be van jelölve, a hozzáadott torrentek automatikusan elindulnak" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Téma" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Idő frissítése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Soha" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Indítási késleltetés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "perc" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Teljes feltöltők korlát" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "társak" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Feltöltési sávszélesség korlát" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "A rendelkezésre álló sávszélesség fele javasolt." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "A router sávszélesség megtekintése vagy megváltoztatása" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Nyílt követőket (tracker) is használjon" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Ha be van jelölve, bejelenti a torrenteket a nyílt követőkre (tracker) és torrent fájlban feltüntetett követőre is" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "DHT engedélyezése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Bejövő Beállítások" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Kimenő Beállítások" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP hoszt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP opciók" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Beállítások mentése" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Név" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "Weboldal URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Megnyitás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privát" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Bejelentési URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Hozzáadás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Érvénytelen mágnes URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 ugrás" msgstr[1] "{0} ugrás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 alagút" msgstr[1] "{0} alagút" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrent fájl" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Mágnes link" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Privát torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Befejezés" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Hátralévő" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Fájlok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Részek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Rész méret" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Könyvtár" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioritás" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Vissza a felsőbb szintű könyvtárba" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent nem található?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "File nem található a torrentben?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "kész" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "hátralévő" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Magas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normál" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Kihagy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Tulajdonságok mentése" diff --git a/apps/i2psnark/locale/messages_it.po b/apps/i2psnark/locale/messages_it.po index 150d39fc1..b97d05b67 100644 --- a/apps/i2psnark/locale/messages_it.po +++ b/apps/i2psnark/locale/messages_it.po @@ -14,237 +14,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/otf/I2P/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Tunnel I2P chiuso." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite del totale di uploaders modificato a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Il minimo limite del totale di uploaders è {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Il minimo limite della banda in up modificato a {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Il minimo limite della banda in up è {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Ritardo startup modificato a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Tempo di aggiornamento cambiato in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Aggiornamento disabilitato" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Dimensione pagina cambiata a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "La cartella dei dati deve essere un percorso assoluto" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "La cartella dei dati non esiste" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Non è una cartella" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Illeggibile" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Cartella dei dati cambiata a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I cambiamenti di tunnel ed I2CP saranno effettivi dopo aver fermato tutti i torrent " -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Opzioni I2CP modificate in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "La vecchia destinazione I2CP è in disconnessione" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Impostazioni I2CP cambiate a {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Impossibile connettersi con le nuove impostazioni, ritorno alle vecchie impostazioni I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Impossibile riconnettersi con le vecchie impostazioni!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Riconnesso sulla nuova destinazione I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Listener I2CP riavviato per \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "I nuovi file saranno visibili pubblicamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "I nuovi file non saranno visibili pubblicamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Autostart abilitato" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Autostart disabilitato" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Tracker aperti abilitati - è richiesto il riavvio dei torrent perchè la modifica abbia effetto." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Tracker aperti disabilitati - è richiesto il riavvio dei torrent perchè la modifica abbia effetto." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "Abilita DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "Disabilita DHT" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "La modifica DHT richiede il riavvio dei tunnel" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} tema caricato, ritornare alla pagina i2psnark principale per vederlo." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Configurazione non modificata." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Lista dei tracker aperti modificata - è richiesto il riavvio dei torrent perchè la modifica abbia effetto." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Elenco tracker privati modificato - solo per i nuovi torrent creati." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Impossibile salvare la configurazione su {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "In connessione a I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Errore nella connessione a I2P - controlla le tue impostazioni I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Errore: Non è stato possibile aggiungere il torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Impossibile aprire \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Un torrent con questo info hash è già attivo: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "ERRORE - Nessun tracker I2P nel torrent privato \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Attenzione - No i2P trackers entranti (in) \"{0}\", sarà richiesto alla rete i2P di aprire solamente trackers e peers DHT" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Attenzione - No i2P trackers entranti (in) \"{0}\", l'apertura di trackers è disabilitata e sarà richiesto di aprire solo peers DHT" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -252,34 +260,46 @@ msgid "" "torrent." msgstr "Attenzione - No i2P trackers entranti (in) \"{0}\", l'apertura di trackers e client DHT sono disabilitati. Dovresti, prima di far partire un torrent, abilitare l'apertura di trackers o peers DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Il torrent in \"{0}\" non è valido" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "File torrent eliminato: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ERRORE - Memoria piena, impossibile creare torrent da {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent aggounto e avviato: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent aggiunto: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Recupero di {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -287,132 +307,147 @@ msgid "" "DHT." msgstr "I trackers aperti sono disabilitati e non ci sono peers DHT. Il recupero {0} potrebbe non riuscire fino a che non fai partire un altro torrent, abiliti i trackers aperti o abiliti il DHT. " -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "{0} in aggiunta" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Download già attivo: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Fallimento nella copia del file torrent su {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Troppi file in \"{0}\" ({1}), in rimozione!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Il file torrent \"{0}\" non può finire in \".torrent\", in rimozione!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Non ci sono pezzi in \"{0}\", in rimozione!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Troppi pezzi in \"{0}\", il limite è {1}, in rimozione!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "I pezzi sono troppo larghi in \"{0}\" ({1}B), in rimozione." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Il limite è {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Il torrent \"{0}\" non ha dati, in rimozione!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrent più grandi di {0}B non sono ancora supportati, \"{1}\" in rimozione" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Errore: Non è stato possibile rimuovere il torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent fermato: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent rimosso: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Torrent in aggiunta in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "La banda di Upload massima è {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Download completato: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo ricevute per {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Avvio del torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Errore sul torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Impossibile connettersi a I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Apertura tunnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Avvio di tutti i torrent e apertura del tunnel I2P in corso. " -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stop di tutti i torrent e chiusura del tunnel I2P in corso." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Chiusura tunnel I2P dopo la notifica ai trackers." -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Trackers non validi {0} - abilitare i trackers aperti o il DHT?" @@ -457,887 +492,913 @@ msgstr "Torrent già in coda: {0}" msgid "Torrent at {0} was not valid" msgstr "Il torrent a {0} non è stato valido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Configurazione" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Il router non è in funzione" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Ricarica pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Clicca il bottone \"Aggiungi torrent\" per scaricare il torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "pulisci messaggi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Stato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Nascondi Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Mostra Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Stima del tempo rimanente" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Scaricato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Dimensione" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Inviato" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Velocità Ricezione (RX) " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Tasso di Download" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Velocità Trasmissione (TX)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Tasso di Upload" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Ferma tutti i torrent e il tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Ferma Tutto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Avvia tutti i torrent fermati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Avvia Tutti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Avvia tutti i torrent e il tunnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Nessun torrent caricato." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totali" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 peer connesso" msgstr[1] "{0} peer connessi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "uno: 1 DHT peer" msgstr[1] "altri: {0} DHT peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Primo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Prima pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Ind" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Pagina precedente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Avanti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Pagina successiva" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Ultimo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Ultima pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL non valido: Deve cominciare con \"http://\", \"{0}\", o \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet eliminato: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "File torrent eliminato: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Downloads cancellati: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "File di dati eliminato: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Non è stato possibile eliminare il file di dati: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "La Cartella non può essere cancellata: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Cartella cancellata: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Errore - Impossibile includere tracker alternativi senza un tracker primario" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Errore - Impossibile fare un mix di tracker privati e pubblici in un torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent creato per \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Molti tracker I2P ti richiedono di registrare nuovi torrent prima del seeding - per cortesia fallo, prima di avviare \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Errore nella creazione di un torrent per \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Impossibile creare un torrent per i dati nonesistenti: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Errore nella creazione del torrent - devi inserire un file o una directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Elimina selezionati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Salva configurazione tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Rimosso" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Aggiungi tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Inserisci nome e URL validi per il tracker" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Ripristina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Ripristina tracker di default" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Controllo (Check)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Allocando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Errore del Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 peer" msgstr[1] "{0} peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "In partenza" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seeding" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "In Stallo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Nessun Peer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Fermato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Dettagli torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Vedi files" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Apri file" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Ferma il torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Ferma" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Avvia il torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Avvia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Rimuovi il torrent dalla lista attiva eliminando il file .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Sei sicuro di voler cancellare il file \\\"{0}\\\" (i dati scaricati non verranno cancellati)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Rimuovi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Elimina il file .torrent e i file dati associati" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Sei sicuro di voler eliminare il torrent \\\"{0}\\\" e tutti i dati scaricati?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Elimina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Sconosciuto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Non interessante (Il peer non ha pezzi di nostro interesse)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Soffocato (Il peer non ci sta permettendo di richiedere pezzi)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Non interessato (Non abbiamo pezzi di interesse per il peer)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Soffocando (Non stiamo permettendo al peer di richiedere pezzi)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Dettagli al tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Aggiungi Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Da URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Inserisci l'URL del file torrent da scaricare (solo I2P), link magnet, link maggot o info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Aggiungi torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Puoi anche copiare files .torrent su: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Rimuovere un .torrent lo fermerà." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Crea Torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Dati da mandare in seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primario" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Crea torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "nessuno" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Directory dati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "File visibili da tutti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Se selezionato, gli altri utenti potrebbero accedere ai file scaricati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Se selezionato, avvia automaticamente torrent che vengono aggiunti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Tempo di aggiornamento" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Mai" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Ritardo di avvio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minuti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Dimensione pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Limite di uploader totale" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Limite di banda in upload" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Raccomandata metà della banda disponibile." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Vedi o cambia la banda del router" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Usa anche tracker aperti" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Se selezionato, annuncia i torrent sia a tracker aperti che ai tracker elencati nel file torrent " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Abilita DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Se selezionato, usa DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Impostazioni d'Entrata" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Impostazioni d'Uscita" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Host I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Porta I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Opzioni I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Salva configurazione" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nome" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL Sitoweb" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Apri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL Announce" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Aggiungi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Magnet URL {0} non valido" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hop" msgstr[1] "{0} hop" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "File torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Tracker primario" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Elenco dei tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Commento" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Creato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Creato da" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Link magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Torrent privato" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Completamento" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Rimanente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Files" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Pezzi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Dimensione pezzo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Cartella" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Priorità" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Fino a cartella di livello superiore" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent non trovato?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "File non trovato nel torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "rimanente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Alto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normale" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Salta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Salva priorità " diff --git a/apps/i2psnark/locale/messages_nb.po b/apps/i2psnark/locale/messages_nb.po index 259289868..33e6ff25e 100644 --- a/apps/i2psnark/locale/messages_nb.po +++ b/apps/i2psnark/locale/messages_nb.po @@ -9,237 +9,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/I2P/language/nb/)\n" +"Language-Team: Norwegian Bokmål (http://www.transifex.com/otf/I2P/language/nb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P tunnelen lukket." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Total opplaster grense satt til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimum total opplaster grense er {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Opp båndbredde endret til {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimum opp båndbredde grense er {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Oppstart utsettelse sett til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Oppdaterings tid endret til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Oppdatering skrudd av" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP og tunnel endringer vil ta effekt etter sopping av alle torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP instillinger endret til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Frakobler fra gammel I2CP destinasjon" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP instillinger endret til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Umulig å få tilkobling med de nye instillingene, går tilbake til de gamle I2CP instillingene" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Umulig å koble seg til på nytt med gammle instillinger!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Gjentilkobler på den nye I2CP destinasjonen" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP lytter omstartet for \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nye filer vil bli lesbar for alle" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nye filer vil ikke bli lesbar for alle" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Autostart er skrudd på" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Autostart er avslått" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Skru på åpne trackers - krever torrent omstart for å ta effekt." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Skru av åpne trackers - krever torrent omstart for å ta effekt." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT skrudd på" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT skrudd av" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "DHT endring krever tunnel avslutting og gjennåpning" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} tema lastet, returner til hovedsiden for i2psnart for å se." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Konfigurasjon uendret." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Åpen tracker listen endret - torrent omstart kreves før det tar effekt." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Privat tracker list endret - vil kun påvirke ny opprettet torrent filer." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Umulig å lagre konfigurasjon til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Kobler til I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Feil ved tilkobling til I2P - Sjekk dine I2CP instillinger!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Feil: kan ikke legge til torrenten {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kan ikke åpne \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent med samme info hash kjører allerede: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "FEIL - Ingen I2P trackers i privat torrent \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Advarsel - Ingen I2P trackers i \"{0}\", vil bare annonsere til I2P åpne trackers og DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Advarsel - Ingen I2P tracker i \"{0}\", og åpne trackers er skrudd av, vil annonsere kun på DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -247,34 +255,46 @@ msgid "" "torrent." msgstr "Advarsel - Ingen I2P trackers i \"{0}\", og DHT og åpne trackers er avskrudd, du burde skru på åpen tracker eller DHT før du starter torrenten." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent i \"{0}\" er ugyldig" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Torrent fil slettet: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "FEIL - Tomt for minne, kan ikke lage torrent fra {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent lagt til og startet: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent lagt til: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Henter {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -282,132 +302,147 @@ msgid "" "DHT." msgstr "Åpne trackers er skrudd av og vi har ingen DHT peers. Mottak av {0} blir muligens ikke fullført før du starter en annen torrent, starter åpne trackers, eller DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Legger til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Nedlastning kjører alt: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Feilet med å kopiere torrent fil til {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "For mange filer i \"{0}\" ({1}), sletter det!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrent filen \"{0}\" kan ikke avsluttes i \".torrent\", sletter den!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Ingen biter i \"{0}\", sletter den!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "For mange biter i \"{0}\", grensen er {1}, sletter den!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Bitene er for store i \"{0}\" ({1}B), sletter den." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Grensen er {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" har ingen data, sletter den!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents større enn {0}B er ikke supportet ennå, sletter \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Feil: kan ikke fjerne torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent stoppet: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent fjernet: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Legger til torrents i {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Opp hastighet grense er {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Nedlastning fullført: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Meta informasjon mottatt for {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Starter opp torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Feil i torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Umulig å koble til I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Åpner I2P tunnelen" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Åpner I2P tunnelen og starter alle torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stopper alle torrents og lukker I2P tunnelen." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Lukker I2P tunnel etter beskjed til trackers." -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Ingen valid tracker for {0} - skru på åpne trackers eller DHT?" @@ -452,887 +487,913 @@ msgstr "Torrent allerede i kø: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent ved {0} var ikke valid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Konfigurasjon" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Ruter er nede" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Oppdater side" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Klikk \"Legg til trorrent\" knappen for å motta torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "fjern meldinger" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Gjem peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Vis peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Beregnet tid som gjenstår" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Lastet ned" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Størrelse" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Lastet opp" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "RX Fart" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Ned hastighet" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "TX Fart" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Opp hastighet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Stopp alle torrents og I2P tunellen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Stopp alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Start alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Start alle torrents og I2P tunellen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Ingen torrent lastet." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totaler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 tilkoblet peer" msgstr[1] "{0} tilkoblet peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 DHT peer" msgstr[1] "{0} DHT peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Ugyldig URL: Den må starte med \"http://\", \"{0}\", eller \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Torrent fil slettet: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Nedlastning slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Data fil slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Data fil kunne ikke bli slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Mappen kunne ikke bli slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Mappe slettet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent laget for \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Mange I2P trackers krever at du registerer nye torrents før seeding - Vennligst gjør det før du starter \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Feil ved laging av torrent for \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kan ikke lage torrent fra den ikke-eksisterende data: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Feil ved opprettelse av torrent - du må velge en fil eller mappe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Slett markerte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Lagre tracker konfigurasjon" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Fjernet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Legg til tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Skriv inn valid tracker navn og URLer" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Gjenopprett standarder" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Gjenopprettet standard trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Sjekker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Tildeling" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Tracker Feil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 peer" msgstr[1] "{0} peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Starter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Deler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Ferdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Fastlåst" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Ingen Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Stoppet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Torrent detaljer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Vis filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Åpne fil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Stopp torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Stopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Start torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Fjern torrent fra den aktive listen, og slette .torrent filen" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Fjern" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Slett .torrent filen og all tilhørende data fil(er)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Er du sikker på at du vil slette torrent \\\"{0}\\\" og all nedlastet data?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Slett" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Ukjent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Deler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uinteressang (Peeren har ingen biter vi trenger)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Skjult (Peeren gir oss ikke lov til å be om biter)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uinteresang (Vi har ingen biter peeren trenger)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Hoster (Vi tillater ikke peeren til å be om biter)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detaljer hos {0} tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Informasjon" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Legg til torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Fra URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Skriv inn torrent fil nedlastings URL (kun I2P), magnet link, maggot link, eller info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Legg til torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Du kan også kopiere .torrent filer til: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Fjerning av .torrent vil få den til å stoppe." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Opprett Torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Data for deling" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Opprett torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Data mappe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Filer tilgjengelig for alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Hvis merket, andre lokale brukere kan få tilgang til nedlastninger" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Hvis avmerket, vil torrents som blir lagt til automatisk startet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Theme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Oppdater tid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Aldri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Oppstarts utsettelse" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minutter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Total opplaster grense" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Opp båndbredde grense" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Halve tilgjengelige hastigheten er anbefalt." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Vis eller endre router båndbredde" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Bruk åpne trackers også" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Hvis avmerked, annonser torrenter til åpne trackers i tillegg til tracker listen i torrent filen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Skru på DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Hvis markert, bruk DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Inngående instillinger" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Utgående instillinger" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP vert" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP alternativer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Lagre konfigurasjon" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Navn" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "Webside URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Åpne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Annonserings URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Legg til" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Invalid magnet URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hopp" msgstr[1] "{0} hopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunneler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrent fil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnet link" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Privat torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Fullføring" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Gjennstår" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Biter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Bit størrelse" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Mappe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Opp en level i mappe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent ikke funnet?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Fil ikke funnet i torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "ferdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "gjennstår" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Høy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Dropp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Lagre prioriteter" diff --git a/apps/i2psnark/locale/messages_nl.po b/apps/i2psnark/locale/messages_nl.po index 5f7750c17..c01117700 100644 --- a/apps/i2psnark/locale/messages_nl.po +++ b/apps/i2psnark/locale/messages_nl.po @@ -12,10 +12,10 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-02-18 19:51+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Dutch (http://www.transifex.com/projects/p/I2P/language/nl/)\n" +"Language-Team: Dutch (http://www.transifex.com/otf/I2P/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -27,222 +27,230 @@ msgid "No more torrents running." msgstr "Er draaien geen torrents meer." #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P tunnel gesloten." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magneet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Totale uploaders limiet gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimum totale uploaders limiet is {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Up bandbreedte limiet gewijzigd in {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimum up bandbreedte limiet is {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Opstartvertraging gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Ververstijd gewijzigd naar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Verversen uitgezet" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Paginagrootte gewijzigd naar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Data-directory moet een absoluut pad zijn" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Data-directory bestaat niet" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Geen directory" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Onleesbaar" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Data-directory gewijzigd naar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP en tunnel wijzigingen hebben pas effect na het stoppen van alle torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP-opties gewijzigd naar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Oude I2CP destination wordt afgesloten" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP instellingen gewijzigd in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Kan geen connectie maken met de nieuwe instellingen, we keren terug naar oude I2CP instellingen" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Kan niet opnieuw verbinden met de oude instellingen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Opnieuw verbonden met de nieuwe I2CP destination" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP listener herstart voor \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nieuwe bestanden zullen publiek bereikbaar zijn" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nieuwe bestanden zullen niet publiek bereikbaar zijn" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Autostart ingeschakeld" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Autostart uitgeschakeld" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Open Trackers ingeschakeld - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Open Trackers uitgeschakeld - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT aangezet." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT uitgezet." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "DHT-wijziging vereist afsluiten en opnieuw openen van tunnel" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} thema geladen, ga naar de hoofd i2psnark pagina om deze te bekijken." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Configuratie ongewijzigd." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Open Tracker lijst gewijzigd - torrent herstart nodig." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Privé trackerlijst gewijzigd - beïnvloedt enkel nieuw aangemaakte torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Kan de configuratie niet opslaan in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Verbinden met I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Fout bij verbinden met I2P - controlleer je I2CP instellingen!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Fout: Kan de torrent {0} niet toevoegen" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kan \"{0}\" niet openen" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent met deze info hash is al actief: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "FOUT - Geen I2P-trackers in privé-torrent \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Waarschuwing - Geen I2P-trackers in \"{0}\", zal alleen aankondigen aan open trackers en DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Waarschuwing - Geen I2P-trackers in \"{0}\", en open trackers zijn uitgezet, zal alleen aankondigen aan DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -250,34 +258,46 @@ msgid "" "torrent." msgstr "Waarschuwing - Geen I2P-trackers in \"{0}\", en DHT en open trackers zijn uitgezet, je moet open trackers of DHT aanzetten alvorens de torrent te starten." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent in \"{0}\" is ongeldig" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Torrent bestand verwijderd: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ERROR - Geen geheugen meer, kan geen torrent maken van {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent toegevoegd en gestart: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent toegevoegd: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Downloaden {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -285,131 +305,146 @@ msgid "" "DHT." msgstr "Open trackers zijn uitgezet en we hebben geen DHT peers. Ophalen van {0} zal misschien niet lukken tot je een andere torrent start, open trackers aanzet, of DHT aanzet." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Toevoegen van {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Download is al bezig: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Kan het torrent bestand niet kopieren naar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Te veel bestanden in \"{0}\" ({1}), wordt verwijderd!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrent bestand \"{0}\" kan niet eindigen in \".torrent\", wordt verwijderd!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Geen stukken in \"{0}\", wordt verwijderd!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Te veel stukken in \"{0}\", limiet is {1}, wordt verwijderd!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Stukken zijn te groot in \"{0}\" ({1}B), wordt verwijderd." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Limiet is {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" heeft geen data en wordt verwijderd!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents groter dan {0}B worden nog niet ondersteund, verwijder \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fout: Kan de torrent {0} niet verwijderen" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent gestopt: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent verwijderd: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Toevoegen van torrents in {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Bandbreedtelimiet omhoog is {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Download gereed: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo ontvangen voor {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Starten met torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Fout bij torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Kan niet verbinden met I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Bezig met openen van I2P-tunnel" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Openen van de I2P tunnel en starten van alle torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stoppen van alle torrents en sluiten van I2P tunnel." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Bezig met sluiten van I2P-tunnel na verwittigen van trackers." +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -455,887 +490,913 @@ msgstr "Torrent zit al in de wachtrij: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent op {0} was niet geldig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Configuratie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Anonieme BitTorrent-cliënt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Router is uitgeschakeld" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Ververs pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Klik op de \"Torrent toevoegen\"-knop om de torrent op te halen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "berichten wissen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Sorteren op {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Verberg Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Toon Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Bestandstype" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Schatting resterende tijd" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Gedownload" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Grootte" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Upload-ratio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Geupload" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "RX-ratio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Down Snelheid" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "TX-ratio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Up Snelheid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Stop alle torrents en de I2P tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Stop Alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Start alle gestopte torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Start Alle" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Start alle torrents en de I2P tunnel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Geen torrents geladen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totalen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 verbonden peer" msgstr[1] "{0} verbonden peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 DHT peer" msgstr[1] "{0} DHT peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Eerste" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Eerste pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Vorige" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Vorige pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Volgende" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Volgende pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Laatste" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Laatste pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "Data-directory kan niet aangemaakt worden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Kan torrent {0} niet toevoegen binnen andere torrent: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Ongeldige URL: moet beginnen met \"http://\", \"{0}\", of \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Torrent bestand verwijderd: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Download verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Data bestand verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Kan data bestand niet verwijderen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Directory kon niet worden verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Map verwijderd: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Kan geen torrent toevoegen die eindig op \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Torrent met deze naam is al bezig: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Kan geen torrent toevoegen die een I2P-directory bevat: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Kan torrent {0} die een andere torrent bevat niet toevoegen: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Fout - Kan geen alternatieve trackers toevoegen zonder een primaire tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Fout - Kan privé en publieke trackers in een torrent niet mengen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent gemaakt voor \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Veel I2P trackers vereisen dat je de nieuwe torrent registreert voor het seeden - doe dit voordat je \"{0}\" start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Fout bij het maken van een torrent voor \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kan geen torrent maken voor niet-bestaande data: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Fout bij het maken van de torrent - je moet een bestand of directory invullen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Geselecteerde verwijderen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Trackerconfiguratie opslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Verwijderd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Tracker toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Geef een geldige trackernaam en URLs in" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Standaardtrackers herstellen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Standaardtrackers hersteld" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Bezig met controleren" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Bezig met toewijzen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Tracker Fout" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 peer" msgstr[1] "{0} peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Bezig met starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seeding" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Voltooid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Vastgelopen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Geen Peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Gestopt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Torrent details" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Bekijk bestanden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Open bestand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Stop de torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Stop" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Start de torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Verwijder de torrent van de actieve lijst, het .torrent bestand wordt verwijderd" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Ben je zeker dat je het bestand \\''{0}\\'' wil verwijderen (gedownloade data zullen niet verwijderd worden)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Weghalen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Verwijder het .torrent bestand en de gerelateerde data bestand(en)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Weet je zeker dat je de torrent \\''{0}\\'' en alle gedownloade data wilt verwijderen?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Verwijderen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Onbekend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Niet interessant (De peer heeft geen stukken die we nodig hebben)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Verstikt (De peer laat ons niet toe om stukken op te vragen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Niet geïnteresseerd (We heben geen stukken die de peer nodig heeft)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Verstikt (We laten de peer niet toe om stukken op te vragen)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Details op de {0} tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Torrent Toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Van URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Voer de download-URL (alleen I2P), magneetlink, maggotlink of infohash van het torrentbestand in" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Torrent toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Datamap" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Voer de directory om de gegevens in op te slaan in (standaard {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Je kan ook .torrent bestanden kopieren naar: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Verwijderen van een .torrent zorgt dat deze stopt." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Creëer Torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Data om te seeden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Bestand of directory om te seeden (volledig pad of binnen de directory {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primair" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternatieven" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Creëer torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "geen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Data directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Bestanden leesbaar door iedereen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Indien aangevinkt hebben andere gebruikers toegang tot de gedownloade bestanden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Torrents automatisch starten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Indien aangevinkt, start toegevoegde torrents automatisch" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Thema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Ververstijd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nooit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Startup vertraging" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minuten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Paginagrootte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Totale uploader limiet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "peers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Up bandbreedte limiet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Helft van beschikbare bandbreedte aanbevolen." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Bekijk of wijzig router bandbreedte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Gebruik ook open trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Indien aangevinkt, kondig torrents ook aan bij de tracker uit het torrent bestand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "DHT aanzetten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Gebruik DHT indien aangevinkt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Inkomende Instellingen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Uitgaande Instellingen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP host" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP poort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP opties" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Configuratie opslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Naam" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "Website-URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Standaard" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Open" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Kondig URL aan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Toevoegen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Ongeldige magnet URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hop" msgstr[1] "{0} hops" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnels" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrentbestand" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Datalocatie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Infohash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Primaire tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Trackerlijst" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Opmerking" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Aangemaakt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Aangemaakt door" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnet link" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Privé-torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Voltooiing" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Resterend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Bestanden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Stukken" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Stukgrootte" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioriteit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Naar bovenliggende directory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent niet gevonden?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Bestand niet gevonden in torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "voltooid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "resterend" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Hoog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normaal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Overslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Stel alle in als hoog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Stel alle in als normaal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Alle overslaan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Prioriteiten opslaan" diff --git a/apps/i2psnark/locale/messages_pl.po b/apps/i2psnark/locale/messages_pl.po index c4ef204ee..d5cf89343 100644 --- a/apps/i2psnark/locale/messages_pl.po +++ b/apps/i2psnark/locale/messages_pl.po @@ -11,241 +11,250 @@ # polacco , 2012 # seb, 2014 # Smert i2p , 2013 +# Taporpo Ne , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-02-06 18:28+0000\n" -"PO-Revision-Date: 2015-02-17 20:52+0000\n" -"Last-Translator: polacco \n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "Nie ma więcej uruchomionych torrentów." -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Zamknięto tunel I2P." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Ograniczenie liczby uploaderów zmieniono do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimalny całkowity limit uploadera: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Ograniczenie pasma wyjściowego zmieniono na: {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimalne pasmo wyjściowe to: {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Opóźnienie uruchamiania zmieniono na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Czas odświerzania zmieniony na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Odświeżanie wyłączone" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Rozmiar strony zmieniony do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Katalog danych musi być pełną ścieżką" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Katalog danych nie istnieje" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "To nie jest katalog" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Nieczytelne" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Katalog danych zmieniony do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Zmiany dotyczące I2CP i tuneli będą wprowadzone po zatrzymaniu wszystkich torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Opcje I2CP zmienione na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Rozłączanie starych celów I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Ustawienia I2CP zmienione do: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Nie można połączyć się z nowymi ustawieniami, powrót do starych ustawień I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Nie można się połączyć ze starymi ustawieniami!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Ponowne podłączanie do nowych celów I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Nasłuch I2CP zrestartowany dla \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nowe pliki będą publicznie dostępne" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nowe pliki nie będą publicznie dostępne" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Włączono automatyczne uruchamianie" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Wyłączono automatyczne uruchamianie" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Włączono otwarte trackery - wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Wyłączono otwarte trackery - wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT włączone." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT wyłączone." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Zmiana DHT wymaga zamknięcia tunelu i jego ponownego otwarcia" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Załadowano temat {0}. Przejdź do strony głównej i2psnark, by zobaczyć." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Ustawienia niezmienione." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Lista otwartych trackerów została zmieniona – wymagane ponowne uruchomienie torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Lista prywatnych trackerów została zmieniona – dotyczy tylko nowo utworzonych torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Nie można zapisać konfiguracji do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Łączenie z I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Nie można się połączyć z I2P, sprawdź swoje ustawienia I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Błąd: Nie można dodać torrenta {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nie można otworzyć \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent o tym hashu jest już uruchomiony: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "BŁĄD – brak trackerów w prywatnym torrencie \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Uwaga – Nie ma trackerów I2P w \"{0}\", zostanie to zameldowane tylko do otwartych trackerów i DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Uwaga – Brak trackerów I2P w \"{0}\", a otwarte trackery są wyłączone. Torrent będzie działał wyłącznie w oparciu o DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -253,34 +262,46 @@ msgid "" "torrent." msgstr "Uwaga – Brak trackerów I2P w \"{0}\". Otwarte trackery i DHT również są wyłączone. Należy włączyć otwarte trackery lub DHT przed rozpoczęciem torrenta." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent w \"{0}\" jest niepoprawny" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Plik torrenta usunięto: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "BŁĄD – Brak pamięci, nie można utworzyć pliku torrent z {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent dodany i uruchomiony: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent dodany: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Pobieranie: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -288,132 +309,147 @@ msgid "" "DHT." msgstr "Otwarte trackery są wyłączone i nie mamy żadnych peerów DHT. Pobranie z {0} może się nie udać, dopóki nie uruchomisz innego torrenta, włączysz otwarte trackery lub włączysz DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Dodawanie {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Pobieranie już zostało uruchomione: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Nie udało się skopiować pliku torrent do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Za dużo plików w \"{0}\" ({1}), usuwanie go!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrent \"{0}\" nie może się kończyć w \".torrent\", usuwanie go!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "W torrencie \"{0}\" nie ma piece'ów, usuwanie go!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Za dużo piece''ów w \"{0}\" (limit to {1}), usuwanie go!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Za duże piece''y w torrencie \"{0}\" ({1}B), usuwanie go." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Granica to {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" nie zawiera danych, usuwanie!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrenty większe niż {0}B nie są jeszcze wspierane, usunięcie \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Błąd: nie można usunąć torrenta {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent zatrzymany: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent usunięty: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Dodawanie torrentów w {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limit transferu połączeń wychodzcych to {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Pobieranie ukończone: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo otrzymane dla {0} " -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Uruchamianie torrenta: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Błąd w torrencie {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Nie można podłączyć się do I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Otwieranie tunelu I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Otwieranie tunelu I2P i uruchamianie wszystkich torrentów." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Zatrzymywanie wszystkich torrentów i zamykanie tunelu I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Zamknięcie tunelu I2P po powiadomieniu trackerów." -#: ../java/src/org/klomp/snark/TrackerClient.java:244 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Brak prawidłowych trackerów dla {0} – włączyć otwarte trackery lub DHT?" @@ -458,178 +494,178 @@ msgstr "Torrent już w kolejce: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent pobrany z {0} jest niepoprawny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Ustawienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Anonimowy klient protokołu BitTorrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Węzeł jest wyłączony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Odśwież stronę" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Kliknij \"Dodaj torrent\" by pobrać torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "wyczyść komunikaty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Stan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Sortuj wg {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Ukryj peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Pokaż peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Rodzaj pliku" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Szacowany pozostały czas" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Pobrano" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Rozmiar" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Współczynnik wysyłania (ratio)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Wysłano" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "↓" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Prędkość pobierania" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "↑" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Prędkość wysyłania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Zatrzymaj wszystkie torrenty i tunel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Zatrzymaj wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Uruchom wszystkie zatrzymane torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Uruchom wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Uruchom wszystkie torrenty i tunel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Nie załadowano torrentów." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Łącznie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -637,7 +673,7 @@ msgstr[0] "{0} torrent" msgstr[1] "{0} torrenty" msgstr[2] "{0} torrentów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -645,7 +681,7 @@ msgstr[0] "{0} podłączony peer" msgstr[1] "{0} podłączone peery" msgstr[2] "{0} podłączonych peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -653,203 +689,202 @@ msgstr[0] "{0} peer DHT" msgstr[1] "{0} peery DHT" msgstr[2] "{0} peerów DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Cel" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Pierwsza" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Pierwsza strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Poprzednia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Poprzednia strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Następna" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Następna strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Ostatnia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Ostatnia strona" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "Katalog nie może zostać utworzony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Nie można dodać torrenta {0} wewnątrz innego torrenta {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Nieprawidłowy URL: musi zaczynać się od \"http://\", \"{0}\" lub \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Odnośnik Magnet usunięty: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Plik torrenta usunięto: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Pobrane usunięte: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Pliki z danymi usunięte: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Nie można usunąć pliku z danymi: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Katalog nie może być usunięty: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Usunięto katalog: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Nie można dodać torrent kończącego się \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Torrent z tą nazwą już jest uruchomiony: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Nie można dodać torrenta zawierającego katalog I2P: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Nie można dodać torrenta {0} zawierającego inny torrent {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Błąd – Nie można dodać alternatywnych trackerów bez głównego trackera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Błąd – Nie można mieszać prywatnych i publicznych trackerów w torrencie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Utworzono torrent dla \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Wiele trackerów w I2P wymaga zarejestrowania torrenta przed seedowaniem – proszę, zrób tak przed uruchomieniem \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Błąd podczas tworzenia torrenta dla: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nie można utworzyć torrenta dla nieistniejących danych: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Błąd przy tworzeniu torrenta – musisz podać plik lub katalog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Usuń zaznaczone" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Zapisz ustawienia trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Usunięto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Dodaj tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Podaj prawidłową nazwę trackera i URL" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Przywróć domyślne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Przywrócono domyślne trackery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Sprawdzanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Alokowanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Błąd trackera" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -857,366 +892,377 @@ msgstr[0] "{0} peer" msgstr[1] "{0} peery" msgstr[2] "{0} peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Uruchamianie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seedowanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Utknięto" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Brak peerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Zatrzymany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Szczegóły torrenta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Zobacz pliki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Otwórz plik" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Zatrzymaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Zatrzymaj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Uruchom torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Uruchom" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Usuń torrent z aktywnej listy, usuwając plik .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Czy jesteś pewnien, że chcesz usunąć plik \\''{0}\\'' (pobrane dane nie będą usunięte) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Usuń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Usuń plik .torrent i związane z nim pliki z danymi" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Czy na pewno chcesz usunąć plik \\''{0}.torrent\\'' oraz pobrane dane?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Usuń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Nieznany" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uninteresting (peer nie ma piece'ów, które potrzebujemy)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Choked (peer nie pozwala nam na prośbę o piece)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uninterested (nie mamy piece'ów, których peer potrzebuje)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Choking (nie pozwalamy peerowi na prośbę o piece)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Szczegóły na trackerze {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Dodaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Z adresu URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Wpisz adres URL pliku torrent (tylko I2P), Magnet link, link maggot lub info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Dodaj torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Katalog na pobrane dane" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Podaj katalog do zapisu danych (domyślnie: {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Możesz także skopiować pliki .torrent do: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Usunięcie pliku .torrent spowoduje jego zatrzymanie." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Utwórz torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Dane do seedowania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Plik lub katalog do seedowania (pełna ścieżka lub katalog wewnątrz \"{0}\")" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Główne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternatywne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Utwórz torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "brak" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Katalog z danymi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Pliki dostępne dla wszystkich" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Jeśli zaznaczone, inni użytkownicy mogą mieć dostęp do pobranych plików" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Uruchamiaj automatycznie torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Jeśli zaznaczone – automatycznie uruchamiaj dodane torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Motyw" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Czas odświerzania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nigdy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Opóźnienie uruchomienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minuty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Rozmiar strony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Całkowity limit uploaderów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "peery" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Ograniczenie pasma wyjściowego" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Zalecana połowa dostępnego pasma." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Zobacz lub zmień pasmo węzła" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Używaj również otwartych trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Jeśli zaznaczone, zgłaszaj torrenty do otwartych trackerów, jak również do trackerów podanych w pliku torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Włącz DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Jeśli zaznaczone, używa DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Tunele wejściowe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Tunele wyjściowe" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Adres I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Port I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Parametry I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Zapisz ustawienia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nazwa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL strony www" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Standardowy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Otwarty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Prywatny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL rozgłaszania" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Dodaj" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Nieprawidłowy link magnet {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1224,7 +1270,7 @@ msgstr[0] "{0} skok" msgstr[1] "{0} skoki" msgstr[2] "{0} skoków" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1232,119 +1278,135 @@ msgstr[0] "{0} tunel" msgstr[1] "{0} tunele" msgstr[2] "{0} tuneli" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Plik torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Położenie danych" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Główny Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Lista Trackerów" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Komentarz" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Utworzony" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Utworzony przez" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Link magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Prywatny torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Pliki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Części" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Rozmiar części" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Katalog" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Priorytet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Do katalogu nadrzędnego" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent nie znaleziony?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Plik nie znaleziony w torrencie?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "zakończono" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "pozostało" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Wysoki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normalny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Pomiń" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Ustaw wszystkie na wysoki" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Ustaw wszystkie na normalny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Pomiń wszystkie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Zapisz priorytety" diff --git a/apps/i2psnark/locale/messages_pt.po b/apps/i2psnark/locale/messages_pt.po index b116a00d7..9b9923ca9 100644 --- a/apps/i2psnark/locale/messages_pt.po +++ b/apps/i2psnark/locale/messages_pt.po @@ -18,237 +18,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-09 03:40+0000\n" "Last-Translator: kytv \n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/otf/I2P/language/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Túnel I2P fechado" #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite total de uploaders alterado para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Limite mínimo de uploaders alterado para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Largura de banda para a envio alterada para {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Largura de banda mínima para envio é {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Demora na inicialização alterada para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Tempo de actualização alterado para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Actualização desactivada" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Tamanho de pagina alterado para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Diretório de dados deve ter um caminho absoluto" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Diretório de dados não existe" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Não é um diretório" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Ilegível" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Diretório de dados alterado para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Mudanças do I2CP e do túnel farão efeito após interromper todos os torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "opções de I2cp alteradas para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Desconectando destinação anterior do I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Preferências do I2CP alteradas para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Conectar-se não foi posível com as novas preferências I2CP, utilizarei as anteriores." -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Impossível se conectar usando as preferências anteriores!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Conectado com a nova Destinação I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Conexão I2CP re-estabelecida para \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Novos ficheiros serão lidos pelo publico" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Novos ficheiros não serão lidos pelo publico" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Ativado o iniciar automáticamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Desativado o iniciar automáticamente" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Uso de rastreadores abertos ativado - Para ter efeito é necesário reiniciar os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Uso dos rastreadores abertos desativado - Para ter efeito é necesário reiniciar os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "Habilitar DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "Desabilitar DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Mudança no DHT requer fechamento e reabertura do túnel" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Tema {0} foi carregado. Volte no menú principal para vê-lo." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Configuração não mudada." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Listado de rastreadores abertos mudado - Para ter efeito é necesário reiniciar os torrentes." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Lista de rastreadores privados alterada - somente afetará os novos torrentes criados." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Não se pode guardar a configuração em {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Conectando com I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Erro ao se conectar com I2P - Verifique a sua configuração I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Erro: Não se pode adicionar o torrente {0}." #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Não pode se abrir \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "torrente com este info hash já em marcha: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "ERRO - Não há tracker I2P no torrent privado \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", o anúncio será feito apenas por rastreadores I2P abertos e DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e rastreadores I2P abertos estão desabilitados. O anúncio será feito apenas por DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -256,34 +264,46 @@ msgid "" "torrent." msgstr "Aviso - Nenhum rastreador I2P em \"{0}\", e DHT e rastreadores abertos estão desabilitados. Rastreadores abertos ou DHT devem ser habilitados antes de começar o torrente." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "O arquivo .torrent em \"{0}\" não é válido." -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Apagado o arquivo torrente: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ERRO - Não ha espaço suficente, não se pode crear um torrente desde {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "torrente adicionado e iniciado: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "torrente adicionado: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Buscando {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -291,132 +311,147 @@ msgid "" "DHT." msgstr "Rastreadores abertos estão desabilitados e não há participantes DHT. Descarregamento de {0} pode não prosseguir enquanto outra torrente não for iniciada, rastreadores abertos forem habilitados ou DHT habilitado." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Adicionando {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "arquivo já descarregando: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Não se pode copiar o torrente para {0}." -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Ha arquivos demais no \"{0}\", se apagará ({1}). " +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "O arquivo de dados do torrente \"{0}\" não pode terminar em \".torrent' e será apagado." +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Não ha peças no \"{0}\", se apagará." +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Ha peças demais no \"{0}\" e o limite é {1}. Se apagarão." +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Peças no \"{0}\" são grandes demais ({1}B). Se apagarão." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "O limite são \"{0}\"Bytes" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "O torrente \"{0}\" não contem dados e será apagado." +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "torrentes maiores que \"{0}\" Bytes ainda não funcionam, se apagará \"{1}\"." +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Erro: Não se pode quitar o torrente \"{0}\"." -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "torrente detido: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "torrente quitado: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Os torrentes serão adicionados em {0} ..." -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limite de transmissão de dados é {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Finalizada a descarga de \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo recibido para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Iniciando o torrente {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Erro no torrente {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Impossível de se conectar com I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Abrindo o túnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Abrendo o túnel I2P e iniciando os torrentes ..." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Detindo todos os torrentes e fechando o túnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Fechando túnel I2P após notificar os rastreadores." -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Nenhum rastreador válido para {0} - habilitar rastreadores abertos ou DHT?" @@ -461,887 +496,913 @@ msgstr "torrente já na cola: {0}" msgid "Torrent at {0} was not valid" msgstr "torrente em {0} não foi válido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Preferências" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Roteador não está funcionando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "torrentes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Atualizar página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Foro" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Clique no botão \"Adicionar torrent\" para obter o torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "limpar mensagens" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Estado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "ocultar parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "mostrar parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Tempo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Tempo que falta para completar" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "Baixado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Descarregado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Tamanho" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "Subido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Subido" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Taxa de recepção" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Taxa de descarga" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Taxa de transmissão" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Taxa de subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Deter todos os torrentes e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Deter tudos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Iniciar todos os torrents interrompidos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Arrancar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Iniciar todos os torrentes e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Não carregado nenhum torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Total" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrente" msgstr[1] "{0} torrentes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 parceiro conectado" msgstr[1] "{0} parceiros conectados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 parceiros DHT" msgstr[1] "{0} parceiros DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Prim." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Primeira página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Ant." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Página anterior" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Próx." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Próxima página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Últ." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Última página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Endereço não válido - tem que começar com \"http://\", \"{0}\", ou \"{1}\"." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Apagada o magnet: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Apagado o arquivo torrente: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Download excluído: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Apagado o arquivo de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Não se pode apagar o arquivo de dados: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Pasta não pôde ser excluída: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Pasta excluída: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Erro - Impossível incluir rastreadores alternativos sem o rastreador primário" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Erro - Impossível misturar rastreadores públicos e privados num torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "torrente criado para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Muitos rastreadores no I2P exigem que você registre novos torrentes antes de poder semeá-los. Por favor, faça isto antes de iniciar \"{0}\"!" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Erro ao criar o torrente \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Não se pode criar um torrente para dados que não existam: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Erro ao criar o torrente - Tens que especificar um arquivo ou uma pasta." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Excluir selecionado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Salvar configurações do rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Excluído" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Adicionar tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Insira um nome válido para o tracker e URLs" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Voltar aos padrões" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Voltar aos rastreadores padrão" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Verificando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Reservando espaço" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Erro do rastreador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 parceiro" msgstr[1] "{0} parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Iniciando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "semeando" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "bem" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "estancado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "sem parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "detenido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Detalhes do torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "mostrar arquivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "abrir arquivo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Deter o torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Deter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Iniciar o torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Iniciar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Retire o torrente da lista ativa, apagando o arquivo .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Tem a certeza que deseja apagar o ficheiro \\\"{0}\\\" (dados transferidos não serão apagados) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Quitar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Apagar o arquivo torrente e o(s) arquivo(s) de dados pertenecentes" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Está seguro de que quer apagar o arquivo torrente \\''{0}\\'' e todos os dados descarregados deste torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Apagar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "desconhecido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Semeador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "não interessante (O parceiro não tem peças que precisamos.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "sufocado (De momento o parceiro não está nos permitindo pedir mais peças.c)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "desinteressado (Não temos as peças que o parceiro quer.)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "sufocando (De momento não estamos permitindo que os parceiros peçam mais peças)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detalhes no rastreador {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Adicionar um torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "URL fonte:" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Digite a URL para download do arquivo torrent (só I2P), ou magnet link, maggo link, ou ainda o seu hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Adicionar torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Também pode copiar arquivos torrentes a {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "A remoção de um arquivo .torrent fará com que ele pare." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Criar um torrente" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Dados para semear" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Rastreadores" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primário" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Criar torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "nenhum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Pasta de dados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Ficheiro legível por todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Se marcado, outros usuários poderão acessar os ficheiros descarregados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "se marcado, os torrentes adicionados se iniciarão automaticamente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Tempo de actualização" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nunca" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Demora do arranque" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minutos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Tamanho da página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Limite global de subidores" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "parceiros" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Limite de largura de banda para a subida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Se recomenda a metade da largura de banda disponível." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "mostrar e mudar as preferências da largura de banda do roteador" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "usar também rastreadores abertos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Se marcado, anunciar os torrentes aos rastreadores abertos, assim como aos rastreadores listados no arquivo torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Habilitar DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Se marcado, usar DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Preferências de entrada" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Preferências de saida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Anfitrião I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Porto I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Opções I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Guardar configuração" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nome" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL do Website" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "abrir" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL para anúncio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Adicionar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "URL magnet {0} não válida" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 salto" msgstr[1] "{0} saltos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 túnel" msgstr[1] "{0} túneles" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Arquivo torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Rastreador Primário" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Lista de Rastreadores" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Commentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Criado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Criado por" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "URL magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Torrente privado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Finalização" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Restantes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Arquivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Peças" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Tamanho das peças" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Pasta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioridade" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Subir uma herarquia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Não achei o arquivo torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Arquivo não achado no torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "restantes" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "alta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Ignorar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Guardar prioridades" diff --git a/apps/i2psnark/locale/messages_pt_bR.po b/apps/i2psnark/locale/messages_pt_bR.po index 7f9f09ce3..e0baae5de 100644 --- a/apps/i2psnark/locale/messages_pt_bR.po +++ b/apps/i2psnark/locale/messages_pt_bR.po @@ -10,10 +10,10 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-29 14:30+0000\n" -"PO-Revision-Date: 2015-04-05 13:44+0000\n" -"Last-Translator: blueboy\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/otf/I2P/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -25,222 +25,230 @@ msgid "No more torrents running." msgstr "" #: ../java/src/org/klomp/snark/IdleChecker.java:76 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Túnel I2P fechado" #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limite de uploaders totais alterada para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Mínimo de uploaders totais alterada para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Limite de Up BW alterada para {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "O limite de mínimo de banda larga é {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Atraso de inicialização alterada para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Alterações em túneis e I2C entrarão em vigor depois de parar todos torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Desconectando destinação do velho I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Configurações de I2CP alteradas para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Não é possível conectar com as novas configurações. Revertendo para as prévias configurações de I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Não é possível conectar com as novas configurações!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Reconectado à nova destinação de I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "Auditor I2CP recomeçadas a \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Autocomeço permitido" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Autocomeço não permitido" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Trackers abertos permitidos - reinício de torrents é preciso para entrar em vigor" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Trackers abertos não permitidos - reinício de torrents é preciso para entrar em vigor" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "Tema {0} carregado, retornar para a página principal de i2psnark para visualizar." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Configuração sem alteração" -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Lista de trackers abertos alterada - reinício de torrents é preciso para entrar em vigor" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Não é possivel salvar configurações para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Conectando a I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Erro ao conectar a I2P - verifique as configurações de I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Erro: não é possível adicionar o torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Não é possível abrir \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "O torrent com este info has já está sendo executado: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -248,34 +256,46 @@ msgid "" "torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "O torrent em \"{0}\" é inválido" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Arquivo de torrent deletado: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent adicionado e começado: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent adicionado: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Buscando {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -283,131 +303,146 @@ msgid "" "DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Adicionando {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Falha ao copiar arquivo de torrent de {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Arquivos em excesso em \"{0}\" ({1}), deletando!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Arquivo de torrent \"{0}\" não pode terminar em \".torrent\", deletando!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Sem peças em \"{0}\", deletando!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Peças em excesso em \"{0}\". O limite é {1}, deletando!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Peças são muito grande em \"{0}\" ({1}B), deletando." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "O limite é {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" +msgid "Torrent \"{0}\" has no data!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents maiores do que {0}B não são suportados ainda, deletando \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Erro: não foi possível remover o torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent parado: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent removido: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Adicionando torrents em {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Download terminado: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo recebido para {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Iniciando torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Incapaz de conectar ao I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Abrindo o túnel I2P e começando todos os torrents." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Parando todos os torrents e fechando o túnel I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + #: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" @@ -453,887 +488,913 @@ msgstr "" msgid "Torrent at {0} was not valid" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Configuração" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Recarregar página" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Fórum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Ocultar Pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Mostrar Pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Tempo restante estimado" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Baixado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Uploaded" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Taxa de down" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Taxad de up" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Parar todos os torrents e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Parar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Começar todos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Começar todos os torrents e o túnel I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Nenhum torrent carregado." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totais" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrents" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 peer conectado" msgstr[1] "{0} pares conectados" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL inválido: deve começar com \"http://\", \"{0}\", ou \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet deletado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Arquivo de torrent deletado: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Arquivo de data deletado: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Não foi possível apagar o arquivo de data: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent criado para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Muitos I2P trackers requerem o registro de torrents antes de seeding - por favor, faça isso antes de começar \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Erro ao criar torrent para \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Não foi possível criar um torrent para a informação inexistente: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Erro ao criar torrent - é preciso um arquiso ou diretório" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Erro de tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 peer" msgstr[1] "{0} pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seeding" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Completo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Estagnado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Sem pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Parad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Detalhes do torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Ver arquivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Abrir arquivos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Parar o torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Começar o torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Começar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Remover o torrent da lista de ativos, deletando o arquivo .torrent" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Remover" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Deletar o arquivo ;torrent e associar data file(s)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Tem certeza que quer remover o torrent \\''{0}\\'' e todas as informaçoes baixadas?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Deletar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "desconhecido" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Desinteressante (O par não tem partes que precisemos)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Engasgado (O par não está nos permitindo solicitar partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Desinteressado (Não temos quaisquer partes que o par precise)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Engasgando (O par está impossibilitado de solicitar partes)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detalhes em tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Adicionar Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Do URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Acidionar torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Pode também copiar arquivos .torrents de: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "A remoção de um .torrent parará a mesma" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Criar Torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Arquivo para seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Criar torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Diretório de arquivo" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Automaticamente começar torrents adicionados se verificado" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Atraso de inicialização" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minutos" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Limite total do uploader" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "pares" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Up limite de banda larga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Abrir" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "" msgstr[1] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 -msgid "Magnet link" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 -msgid "Private torrent" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 -msgid "Completion" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 +msgid "Private torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 +msgid "Completion" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "" diff --git a/apps/i2psnark/locale/messages_ro.po b/apps/i2psnark/locale/messages_ro.po index 5259dc9c8..c95d1fa06 100644 --- a/apps/i2psnark/locale/messages_ro.po +++ b/apps/i2psnark/locale/messages_ro.po @@ -4,236 +4,253 @@ # To contribute translations, see http://www.i2p2.de/newdevelopers # # Translators: +# Di N., 2015 +# Di N., 2015 +# titus , 2015 +# titus , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 20:06+0000\n" -"PO-Revision-Date: 2013-12-05 15:04+0000\n" -"Last-Translator: polearnik \n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/ro/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" +"Last-Translator: kytv \n" +"Language-Team: Romanian (http://www.transifex.com/otf/I2P/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 -#: ../java/src/org/klomp/snark/SnarkManager.java:1938 -#: ../java/src/org/klomp/snark/SnarkManager.java:1949 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 +msgid "No more torrents running." +msgstr "Nu sunt torrente care rulează" + +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Tunel I2P închis." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1644 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:504 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Limita totala de incarcare schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:506 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Limita totala minimă de incarcare este {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:518 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Limita de incarcare BW schimbat la {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:520 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Limita de lățime de bandă minima la incarcarea este {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:532 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Întârziere de pornire schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:543 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Actualizarea timpului schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:545 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Refresh dezactivat" -#: ../java/src/org/klomp/snark/SnarkManager.java:561 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Schimbat dimensiunea paginii la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:570 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Dosarul de data de lucru trebuie să fie o cale absolută" -#: ../java/src/org/klomp/snark/SnarkManager.java:572 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Dosarul de date nu există" -#: ../java/src/org/klomp/snark/SnarkManager.java:574 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Nu e un dosar" -#: ../java/src/org/klomp/snark/SnarkManager.java:576 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "necitibil" -#: ../java/src/org/klomp/snark/SnarkManager.java:581 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Dosarul de date s-a schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:636 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP și tunel modificările vor intra în vigoare după oprirea tuturor torrentele" -#: ../java/src/org/klomp/snark/SnarkManager.java:640 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Opțiuni I2CP schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:646 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Deconectarea destinației vechi I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:648 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Opțiuni I2CP schimbat la {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:653 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Imposibil de a se conecta cu noile setări, revenirea la vechile setări I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:657 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Nu pot să se reconectez cu setările vechi!" -#: ../java/src/org/klomp/snark/SnarkManager.java:659 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Reconectat la destinație noua I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:666 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP ascultător repornit pentru \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:680 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Fișiere noi vor putea fi citite public" -#: ../java/src/org/klomp/snark/SnarkManager.java:682 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Fișiere noi nu vor putea fi citite public" -#: ../java/src/org/klomp/snark/SnarkManager.java:689 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Activeaza autopornirea" -#: ../java/src/org/klomp/snark/SnarkManager.java:691 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Dezactivează autopornirea" -#: ../java/src/org/klomp/snark/SnarkManager.java:697 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Trackere deschise activat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:699 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Trackere deschise dezactivat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:706 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT activat." -#: ../java/src/org/klomp/snark/SnarkManager.java:708 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT dezactivat." -#: ../java/src/org/klomp/snark/SnarkManager.java:710 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Schimbare DHT necesită oprirea tunel și redeschiderea lui" -#: ../java/src/org/klomp/snark/SnarkManager.java:717 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} temă încărcata, a reveni la pagina principală i2psnark pentru a vizualiza." -#: ../java/src/org/klomp/snark/SnarkManager.java:727 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Configuraţia neschimbată" -#: ../java/src/org/klomp/snark/SnarkManager.java:759 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Trackere deschise schimbat - repornirea torrentui este necesara să aibă efect." -#: ../java/src/org/klomp/snark/SnarkManager.java:769 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Lista trackerilor private schimbat - afectează doar nou-create torrente." -#: ../java/src/org/klomp/snark/SnarkManager.java:815 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Imposibil de a salva configurarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Conectarea la I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:896 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Eroare la conectarea la I2P - verificați setările I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:905 -#: ../java/src/org/klomp/snark/SnarkManager.java:1681 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Eroare: Nu sa putut adăuga torentul {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nu se poate deschide \"{0}\"." #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:946 -#: ../java/src/org/klomp/snark/SnarkManager.java:1047 -#: ../java/src/org/klomp/snark/SnarkManager.java:1129 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:159 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent cu aceste informații hash este deja pornit: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:952 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "EROARE - Nu sunt trackere I2P in torrent privat \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:954 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", va anunța numai la I2P trackers deschise și DHT ." -#: ../java/src/org/klomp/snark/SnarkManager.java:957 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", și trackere deschise sunt dezactivate, se va anunța numai prin DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:959 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -241,34 +258,46 @@ msgid "" "torrent." msgstr "Avertisment - Nu sunt trackere I2P în \"{0}\", și DHT și trackere deschise sunt dezactivate, ar trebui să permiteti trackere deschise sau DHT înainte de a începe torrent." -#: ../java/src/org/klomp/snark/SnarkManager.java:981 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent în \"{0}\" este incorect" -#: ../java/src/org/klomp/snark/SnarkManager.java:988 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:183 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Fișier torrent șters: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "EROARE - Out de memorie, nu se pot crea torrent din {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1000 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent adăugat și pornit: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1002 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent adăugat: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1058 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:87 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Preluarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1064 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -276,311 +305,363 @@ msgid "" "DHT." msgstr "Trackere deschise sunt dezactivate și nu avem colegii DHT. Descarcarea din{0} nu poate reuși până când veți începe un alt torrent, permite trackere deschise, sau permite DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1068 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Adăugarea {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1100 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Descarcarea deja rulează: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1139 -#: ../java/src/org/klomp/snark/SnarkManager.java:1162 -#: ../java/src/org/klomp/snark/SnarkManager.java:1600 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr " Copierea fisieurului torent in {0} a esuat" -#: ../java/src/org/klomp/snark/SnarkManager.java:1389 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Prea multe fișiere în \"{0}\" ({1}), ștergeti-le!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1391 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrent \"{0}\" nu se poate termina cu \". Torrent\", ștergeti!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1393 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Nu sunt piese din \"{0}\", ștergeti!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1395 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Prea multe piese în \"{0}\", limita este de {1}, ștergeti!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1397 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Piese sunt prea mari în \"{0}\" ({1} B), ștergeti." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1398 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Limita este de {0} B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1400 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" nu dispune de date, șterge-o!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1408 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrents mai mari de {0} B nu sunt acceptate încă, ștergerea \"{1}\"Torrents mai mari de {0} B nu sunt acceptate încă, ștergerea \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1424 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Eroare: Nu am putut șterge torentul {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1445 -#: ../java/src/org/klomp/snark/SnarkManager.java:1463 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent oprit: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1484 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent sters: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1492 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Adăugarea torrente în {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1523 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limita de lățime de bandă la incarcarea este {0} Kbps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1545 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Descarcare finisata: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1596 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo primit pentru {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1597 -#: ../java/src/org/klomp/snark/SnarkManager.java:1826 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Pornirea torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1612 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Eroare pe torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1675 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Nu se poate stabili o conexiune la I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1825 -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:124 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Deschiderea tunelului I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1849 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Deschiderea tunelului I2P și pornirea tuturor torrentelor." -#: ../java/src/org/klomp/snark/SnarkManager.java:1912 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Oprirea tuturor torrentelor și inchiderea tunelului I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1931 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Închiderea tunelului I2P după notificarea trackere." -#: ../java/src/org/klomp/snark/TrackerClient.java:234 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Nu sunt trackere valabile pentru {0} - permite opentrackers sau DHT?" #: ../java/src/org/klomp/snark/UpdateHandler.java:49 -#: ../java/src/org/klomp/snark/UpdateRunner.java:227 +#: ../java/src/org/klomp/snark/UpdateRunner.java:228 msgid "Updating" msgstr "Actualizare" -#: ../java/src/org/klomp/snark/UpdateRunner.java:114 +#: ../java/src/org/klomp/snark/UpdateRunner.java:115 #, java-format msgid "Updating from {0}" msgstr "Actualizarea din {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:75 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:80 #, java-format msgid "Download torrent file from {0}" msgstr "Descărca fișierul torrent de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:97 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:103 #, java-format msgid "Torrent was not retrieved from {0}" msgstr "Torrent nu a fost preluat de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:150 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:157 #, java-format msgid "Torrent fetched from {0}" msgstr "Torrent preluat de la {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:171 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178 #, java-format msgid "Torrent already running: {0}" msgstr "Torrent deja rulează: {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:173 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:180 #, java-format msgid "Torrent already in the queue: {0}" msgstr "Torrent deja în coada de așteptare: {0}" -#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:181 +#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:191 #, java-format msgid "Torrent at {0} was not valid" msgstr "Torrent la {0} nu a fost valid" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:254 -msgid "I2PSnark - Anonymous BitTorrent Client" -msgstr "I2PSnark - BitTorrent Client Anonim" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:267 -msgid "Router is down" -msgstr "Router-ul este deactivat" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:284 -msgid "Torrents" -msgstr "Torente" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:288 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2255 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:294 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 +msgid "Configuration" +msgstr "Configurație" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 +msgid "Anonymous BitTorrent Client" +msgstr "Client Bittorrent anonim" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 +msgid "Router is down" +msgstr "Router-ul este deactivat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 +msgid "Torrents" +msgstr "Torente" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "refresh pagina" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:302 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:315 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Faceți clic pe \"Adauga torrent\" pentru a aduce torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:352 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "stergerea mesajelor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:405 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:407 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2440 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2442 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Stare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:418 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:420 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 +#, java-format +msgid "Sort by {0}" +msgstr "Sortează după {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Ascunde utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:430 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:432 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Arată utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:439 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:441 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +msgid "File type" +msgstr "Tip fișier" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +msgid "ETA" +msgstr "eta" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Estimare timp rămas" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:452 -msgid "ETA" -msgstr "eta" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:457 -msgid "Downloaded" -msgstr "Descărcat" - -#. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:465 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 +msgid "Downloaded" +msgstr "Descărcat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 +msgid "Size" +msgstr "Dimensiune" + +#. Translators: Please keep short or translate as " " +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +msgid "TX" +msgstr "TX" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 +msgid "Upload ratio" +msgstr "Rată de încărcare" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Încărcat" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:468 -msgid "TX" -msgstr "TX" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +msgid "RX Rate" +msgstr "RX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:474 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Rata de descarcare " #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:477 -msgid "RX Rate" -msgstr "RX Rate" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:483 -msgid "Up Rate" -msgstr "Rata de incarcare " - -#. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "TX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:501 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 +msgid "Up Rate" +msgstr "Rata de incarcare " + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Opreste toate torrentele și tunelul I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:503 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Oprește toate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:515 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Începeți toate torrentele oprite" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:531 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Pornește toate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:529 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Porneste toate torrentele și tunelul I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Niciun torent încărcat." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totaluri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:563 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -588,7 +669,7 @@ msgstr[0] "1 torrent" msgstr[1] "{0} torrente" msgstr[2] "{0} torrentу" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -596,7 +677,7 @@ msgstr[0] "{0} utilizator conectat " msgstr[1] "{0} utilizatori conectati" msgstr[2] "{0} utilizatori conectati" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -604,174 +685,202 @@ msgstr[0] "1 partener DHT" msgstr[1] "{0} parteneri DHT" msgstr[2] "{0} parteneri DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:611 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Dest" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Primul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:611 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "P&rima pagină" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Prev" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:622 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Pagina anterioară" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Următorul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:657 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Pagina următoare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Ultimul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Ultima pagină" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:750 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 +msgid "Data directory cannot be created" +msgstr "Directorul de date nu poate fi creat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 +#, java-format +msgid "Cannot add torrent {0} inside another torrent: {1}" +msgstr "Nu se poate adăuga torrentul {0} în interiorul altui torrent: {1}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "URL incorect: trebuie să înceapă cu \"http://\", \"{0}\", sau \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:793 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet sters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:801 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:829 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Fișier torrent șters: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Descarcă șterse: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Fișier data șters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:837 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:848 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Fișier de date nu a putut fi șters: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:863 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:872 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Dosarul nu a putut fi sters {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:870 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Directorii șterse: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:942 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 +#, java-format +msgid "Cannot add a torrent ending in \".torrent\": {0}" +msgstr "Nu se poate adăuga un torrent terminat în \".torrent\": {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 +#, java-format +msgid "Torrent with this name is already running: {0}" +msgstr "Torrentul cu acest nume deja rulează: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 +#, java-format +msgid "Cannot add a torrent including an I2P directory: {0}" +msgstr "Nu se poate adăuga un torent ce include un director I2P: {0}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 +#, java-format +msgid "Cannot add torrent {0} including another torrent: {1}" +msgstr "Nu se poate adăuga torrent {0} ce include un alt torrent: {1}" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Eroare - Nu pot conține trackere alternative fără un tracker primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Eroare - Nu se poate amesteca trackere publice și private într-un torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent creat pentru \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:977 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Multe trackere I2P cer să vă înregistrați torrentele noi înainte de seedat - vă rugăm să faceți acest lucru înainte de a începe \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:979 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Eroare la crearea unui torrent pentru \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:983 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nu se poate crea un torrent pentru datele inexistente: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:986 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Eroare la crearea torrent - trebuie să introduceți un fișier sau director" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1017 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Șterge pe cel ales" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1017 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2032 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Salvați configurația tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Șters" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2030 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2035 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Adaugă tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1086 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Introduceți numele tracker valid și URL-uri" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Restabileşte implicitele" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1094 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Trackers implicite restaurate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1215 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Se verifică" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1218 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1219 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Alocare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Eroare tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1235 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1263 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1279 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1284 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1290 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1295 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -779,356 +888,377 @@ msgstr[0] "1 partener" msgstr[1] "{0} parteneri" msgstr[2] "{0} parteneri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1243 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Începere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1252 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Încărcare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1256 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1270 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2496 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Complet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1275 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1276 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1281 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1282 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1287 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1292 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Întrerupt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1297 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1298 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1301 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1302 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Nu sunt utilizatori" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1304 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1305 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Oprit" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Detalii torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1367 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Vizualizare fișierilor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1369 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Deschide fișier" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1411 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Oprește torentul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1413 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Stop" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Pornește torentul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1427 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Start" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1439 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Scoateți torrent din lista torentelor activi, ștergem fișierul torrent." #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1444 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Sigur doriți să ștergeți dosarul \\'' {0} \\'' (datele descărcate nu vor fi șterse)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1447 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Șterge" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Ștergeți fișierul torrent. Și fișier(e) de date asociat(e)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1464 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Sigur doriți să ștergeți torrent \\'' {0} \\'' și toate datele descărcate?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1467 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1997 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Șterge" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Necunoscut" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Neinteresante (partener nu are piese de care avem nevoie)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Înecat (partener nu ne permite să solicitam bucăți)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1559 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Neinteresat (Nu avem piese de care are nevoie partener)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "partenerSufocare (Noi nu permitem partenerului solicitarea bucăților)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detalii la tracker {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Adaugă torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Din URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1689 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Introduceți URL-ul de descarcare fișierilor torrent (I2P numai), link-ul magnet, maggot-link, sau info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Adaugă torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 +msgid "Data dir" +msgstr "Dir date" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 +#, java-format +msgid "Enter the directory to save the data in (default {0})" +msgstr "Introdu directorul în care să se salveze datele (default {0})" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "De asemenea, puteți copia fișiere torrent la: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Stergerea .torrent va face ca acesta să se oprească." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Creează un torent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1725 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Date pentru seedare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1729 -msgid "File or directory to seed (must be within the specified path)" -msgstr "Fișier sau director de seedare (trebuie să fie în calea specificată)" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#, java-format +msgid "File or directory to seed (full path or within the directory {0} )" +msgstr "Fișier sau director de seedare (calea completă sau în director {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1731 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1975 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1733 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1735 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1738 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Creează un torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1756 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "nici unul" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1789 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 -msgid "Configuration" -msgstr "Configurație" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Dosar cu date" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1797 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Fișiere lizibile de către toți" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Dacă este bifată, utilizatorii pot accesa fișierele descărcate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1805 -msgid "Auto start" -msgstr "Start automat" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 +msgid "Auto start torrents" +msgstr "Pornește automat torrente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1809 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Dacă este bifată, începe automat torrentele care sunt adăugate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Teme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1826 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Timp de reîmprospătare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1839 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Niciodată" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1845 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "întârziere de pornire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1847 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minute" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Mărimea paginii" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "Torente" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1877 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Limită totală de încărcare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1880 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "Parteneri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1884 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "limita de incarcare de lățime de bandă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1887 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Jumătate lățime de bandă disponibilă este recomandat." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1889 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Vizualizeaza sau modifica lățime de bandă router" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1893 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Utilizați trackere deschise, de asemenea," -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1897 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Dacă este bifată, anunta torrente pentru a urmări trackere deschise , precum și trackere listate în fișierul torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1901 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Activează DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1905 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Dacă este bifată, utilizați DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1921 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Setări de intrare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1927 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Setări de ieșire" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1935 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Portul I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1940 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Portul I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1955 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Opțiuni I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1960 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Salvare configurări" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Nume" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1982 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL website" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1984 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 +msgid "Standard" +msgstr "Standard" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Deschis" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1988 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL de anuntare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2022 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Adaugă" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "URL-ul magnet invalid {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1136,7 +1266,7 @@ msgstr[0] "1 hop" msgstr[1] "{0} hop-uri" msgstr[2] "{0} hop-uri" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1144,106 +1274,135 @@ msgstr[0] "1 tunel" msgstr[1] "{0} tunele" msgstr[2] "{0} tunele" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2278 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Fișier torent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 +msgid "Data location" +msgstr "Locaţie date" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 +msgid "Info hash" +msgstr "Informație index" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Tracker primar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2300 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Lista Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Comentariu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2333 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Creat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2343 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Creat de" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2353 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Legătură Magnet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2360 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Torrent privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2436 -msgid "Size" -msgstr "Dimensiune" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2377 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Completare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2387 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Rămas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Fișiere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2399 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Piese:" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2403 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Dimensiune piesei" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2426 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Dosar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2447 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2449 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioritate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2455 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Spre dosarul de nivel superior" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent nu a fost găsit?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Fișierul nu a fost găsit în torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2506 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "încheiat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "Rămas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2556 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Ridicat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Omitere" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 +msgid "Set all high" +msgstr "Configurează toate ca înalte" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 +msgid "Set all normal" +msgstr "Configurează toate ca normal" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 +msgid "Skip all" +msgstr "Omite tot" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Salvați priorități" diff --git a/apps/i2psnark/locale/messages_ru.po b/apps/i2psnark/locale/messages_ru.po index d6078a74a..cafbe3c72 100644 --- a/apps/i2psnark/locale/messages_ru.po +++ b/apps/i2psnark/locale/messages_ru.po @@ -11,245 +11,254 @@ # Eugene, 2013 # foo , 2009 # mama__1 , 2013 -# Roman A. , 2013 +# Foster Snowhill, 2013 # sr4d , 2014 -# Roman A. , 2013 -# yume, 2014 +# vertnis , 2015 +# Foster Snowhill, 2013 +# yume, 2014-2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-27 16:05+0000\n" -"Last-Translator: yume\n" -"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-14 16:31+0000\n" +"Last-Translator: vertnis \n" +"Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru_RU\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" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "Нет запущенных торрентов." -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Соединение с I2P закрыто." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Новое значение лимита количества слотов отдачи: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Минимально допустимое значение для количества слотов: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Новое значение лимита скорости отдачи: {0} КБ/с" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Минимально допустимое значение для лимита скорости отдачи: {0} КБ/с" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Задержка запуска изменена на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Время обновления изменено на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Обновление отключено" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Размер страницы изменён на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Директория данных должна быть абсолютным путём" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Директория данных не существует" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Не директория" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Нечитаемо" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Директория данных изменена на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Изменения настроек I2CP и туннелей вступят в силу после остановки всех торрентов." -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Параметры I2CP изменены на {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Разрываем старое I2CP соединение" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Новые параметры I2CP: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Не удалось соединиться с использованием новых настроек I2CP, возвращаемся к старым настройкам" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Не удалось пересоединиться с использованием старых настроек I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Пересоединились по новому адресу I2CP" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-приёмник перезапущен для \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Новые файлы будут доступны на чтение публично" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Новые файлы не будут доступны на чтение публично" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Автостарт включен" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Автостарт выключен" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "Включена \"умная\" сортировка" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "Отключена \"умная\" сортировка" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Включено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Отключено использование открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT включено." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT выключено." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Изменение DHT требует повторного открытия туннеля" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} тема загружена, вернитесь на основную страницу i2psnark для просмотра." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Настройки не изменились." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Изменен список открытых трекеров. Требуется перезапуск торрента, чтобы изменения вступили в силу." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Список частных трекеров изменился - влияет только на заново созданные торренты." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Не удалось сохранить настройки в {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Устанавливается соединение с I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Ошибка соединения с I2P, проверьте настройки I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Ошибка: Не удалось добавить торрент {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Не удалось открыть \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Торрент с таким info hash уже запущен: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "ОШИБКА - нет I2P-трекеров в частном торренте \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Предупреждение - Нет I2P трекеров в \"{0}\", анонсирование будет выполняться только на открытых трекерах и в DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Предупреждение - Нет I2P трекеров в \"{0}\" и использование открытых трекеров запрещено, анонсирование будет выполняться только в DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -257,34 +266,46 @@ msgid "" "torrent." msgstr "Предупреждение - Нет I2P трекеров в \"{0}\" и использование открытых трекеров и DHT запрещено. Следует разрешить их использование перед запуском торрента." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Торрент в \"{0}\" некорректен" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Удален торрент: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "Торрент файл перемещен из {0} в {1}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "ОШИБКА - нехватка памяти, невозможно создать торрент из {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Торрент добавлен и запущен: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "Торрент добавлен и запущен: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Торрент добавлен: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "Добавлен торрент: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Получение торрента: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -292,132 +313,147 @@ msgid "" "DHT." msgstr "Использование открытых трекеров запрещено и нет DHT-пиров. Передача {0} не может быть завершена. Запустите другой торрент или разрешите использование открытых трекеров и/или DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Добавление {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Закачка уже запущена: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Не удалось скопировать торрент в: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Слишком много файлов в торренте \"{0}\" ({1}), удаляем его!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "Слишком много файлов в \"{0}\" ({1})!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Торрент \"{0}\" содержит единственный файл заканчивающийся на \".torrent\", удаляем его!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "Торрент файл \"{0}\" не может оканчиваться на \".torrent\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "В торренте \"{0}\" не оказалось ни одной части, удаляем его!" +msgid "No pieces in \"{0}\"!" +msgstr "Нет частей в \"{0}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "Слишком много частей в \"{0}\" (предел — {1}), удаляем торрент!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "Слишком много частей в \"{0}\", предел {1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Слишком крупные части в \"{0}\" ({1}Б), удаляем торрент." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "Слишком большой размер части в \"{0}\" ({1}B)!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Наш предел {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Торрент \"{0}\" не содержит данных, удаляем его!" +msgid "Torrent \"{0}\" has no data!" +msgstr "Торрент \"{0}\" не содержит данных!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Торренты крупнее чем {0}Б пока не поддерживается, удаляем \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "Торренты больше, чем {0} В не поддерживаются \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Ошибка: Невозможно удалить торрент {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Торрент остановлен: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "Торрент остановлен {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Торрент удален: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Добавление торрентов через {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Ограничение отдачи {0} КБ/с" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Закачка завершена: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Метаданные получены для {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Запускаем торрент: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Ошибка в торренте {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Не удалось установить соединение с I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Открытие I2P туннеля" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Соединяемся с I2P и запускаем все торренты." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Останавливаем все торренты и закрываем соединение с I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Закрытие туннеля I2P после уведомления трекеров" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "Закончена перепроверка торрента {0}, теперь {1} завершен" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "Закончена перепроверка торрента {0}, без изменений" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "Ошибка проверки торрента {0}" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Нет трекеров для {0} — включены ли открытые трекеры или DHT?" @@ -462,893 +498,925 @@ msgstr "Торрент уже в очереди: {0}" msgid "Torrent at {0} was not valid" msgstr "Торрент полученный из {0} некорректен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Настройки" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "Анонимный BitTorrent клиент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Маршрутизатор выключен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Торренты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Обновить страницу" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Форум" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Нажмите \"Добавить торрент\", чтобы получить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "очистить сообщения" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Статус" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "Сортировать по {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "скрыть список пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "показать список пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "Тип файла" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Осталось" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Примерное оставшееся время" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "Принято" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Получено" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Размер" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "Отдано" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "Коэффициент отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Отдано" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "Скорость получения" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Скорость загрузки" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "Скорость отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Скорость отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Остановить все торренты и закрыть соединение с I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Остановить все" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Запустить все остановленные торренты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Запустить все" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Запустить все торренты и открыть соединение с I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Нет загруженных торрентов." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Всего" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "{0} торрент" msgstr[1] "{0} торрента" msgstr[2] "{0} торрентов" +msgstr[3] "{0} торрентов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "{0} подсоединенный пир" msgstr[1] "{0} подсоединенных пиров" msgstr[2] "{0} подсоединенных пиров" +msgstr[3] "{0} подсоединенных пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "{0} DHT пир" msgstr[1] "{0} DHT пира" msgstr[2] "{0} DHT пиров" +msgstr[3] "{0} DHT пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Адрес назначения" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Первый" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Первая страница" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Предыдущее" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Предыдущая страница" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Следующее" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Следующая страница" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Последний" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Последняя страница" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "Не удалось создать директорию для файлов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "Не могу добавить торрент {0} в состав другого торрента: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Некорректный URL: должен начинаться с \"http://\", \"{0}\", или \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet удален: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Удален торрент: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Закачка удалена: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Файл удален: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Не удалось удалить файл: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Каталог не может быть удалён: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Каталог удалён: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "Не могу добавить окончание торрента в файл \".torrent\": {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "Торрент с таким именем уже запущен: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "Не могу добавить торрент с I2P директорией: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "Не могу добавить торрент {0}, включающий в себя другой торрент: {1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Ошибка - нельза добавить альтернативные трекеры без основного" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Ошибка - невозможно объединить приватный и публичные трекеры в торренте" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Создан торрент для \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Многие I2P трекеры требуют зарегистрировать на них торрент перед началом раздачи — пожалуйста проверьте требуется ли это перед запуском \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Ошибка при создании торрента для: \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Невозможно создать торрент для несуществующего файла или директории: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Торрент не создан — вы должны указать файл или директорию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Удалить выбранное" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Сохранить настройки трекеров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Удален" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Добавить трекер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Введите действительное название и URL трекера" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Восстановить значения по-умолчанию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Восстановить трекеры по-умолчанию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Проверка" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Выделение места" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Ошибка Трекера" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "{0} пир" msgstr[1] "{0} пира" msgstr[2] "{0} пиров" +msgstr[3] "{0} пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Запускается" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Раздается" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Завершен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "Загружается" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Простаивает" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Нет пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Остановлен" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Подробная информация" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Открыть директорию" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Открыть файл" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Остановить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Остановить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Запустить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Запустить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Удалить торрент из списка и с диска" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Вы уверены, что хотите удалить файл \\''{0}\\'' (скачанные данные не будут удалены) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Удалить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Удалить торрент и стереть загруженные файлы" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Вы действительно хотите удалить торрент \\''{0}\\'' и все загруженные файлы?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Стереть" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Неизвестный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Сид" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Uninteresting (У пира нет нужных нам частей торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Choked (Этот пир не позволяет нам запрашивать части торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Uninterested (У нас нужных этому пиру частей торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Choking (Мы не позволяем этому пиру запрашивать у нас части торрента)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Детали на трекере {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Информация" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Добавить Торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Из URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Введите URL для скачивания torrent-файла (только I2P), magnet-/maggot-ссылку или хэш" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Добавить торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "Директория для файлов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "Путь для сохранения файлов (по умолчанию {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Либо вы можете просто скопировать .torrent-файлы в директорию {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Удаление .torrent-файла приведёт к остановке торрента." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Создать Торрент" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Файлы для раздачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "Файл или директория для раздачи (полный путь или относительно директории {0} )" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Трекеры" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Основной" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Альтернативный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Создать торрент" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "нет" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Директория для файлов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Файлы доступны для чтения всеми" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Если отмечено, другие пользователи могут иметь доступ к скачанным файлам" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "Автоматически стартовать торренты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Автоматически запускать торренты после добавления" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "\"Умная\" сортировка торрентов" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "Если отмечено, игнорировать такие слова, как 'the' при сортировке" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Тема" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Время обновления интерфейса" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Никогда" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Задержка запуска" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "минут" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Размер страницы" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "торренты" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Ограничение количества слотов отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "пиров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Ограничение скорости отдачи" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Рекомендуется использовать половину от доступной пропускной способности." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Посмотреть/настроить ограничения скорости в маршрутизаторе I2P" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Дополнительно использовать открытые трекеры" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Анонсировать торренты на открытых трекерах, дополнительно к тем, что указаны внутри торрента" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Включить DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Если выбрано, используется DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Входящие туннели" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Исходящие туннели" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "Адрес I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "Порт I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Параметры I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Сохранить настройки" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Имя" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL сайта" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "Стандартный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Открыть" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Частный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "URL анонсирования" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Добавить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Неправильный magnet URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "{0} хоп" msgstr[1] "{0} хопа" msgstr[2] "{0} хопов" +msgstr[3] "{0} хопов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "{0} туннель" msgstr[1] "{0} туннеля" msgstr[2] "{0} туннелей" +msgstr[3] "{0} туннелей" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Торрент-файл" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "Расположение данных" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "Инфо хэш" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Первичный трекер" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Список трекеров" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Комментарий" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Создан" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Создан кем" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "Добавлено" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "Завершено" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnet-ссылка" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Частный Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Загружено" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Осталось" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Файлов" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Части" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Размер части" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "Обновите страницу для получения результатов" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "Быстрая повторная проверка" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Директория" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Приоритет" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Перейти в директорию уровнем выше" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent not found?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "File not found in torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "скачано" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "осталось" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Высокий" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Нормальный" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Пропустить" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "Всем высокий приоритет" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "Всем нормальный приоритет" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "Пропустить все" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Сохранить приоритеты" diff --git a/apps/i2psnark/locale/messages_sk.po b/apps/i2psnark/locale/messages_sk.po index 9a7d03bbe..6a7113e70 100644 --- a/apps/i2psnark/locale/messages_sk.po +++ b/apps/i2psnark/locale/messages_sk.po @@ -9,237 +9,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/otf/I2P/language/sk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P tunel je zatvorený." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Celkový limit uploaderov bol zmenený na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minimálny celkový limit uploaderov je {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Limit nárastu ŠP bol zmenený na {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minimálny limit nárastu šírky pásma je {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Zdržanie pri spustení bolo zmenené na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Čas refreshu bol zmenený na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Refresh zakázaný" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Veľkosť stránky bola zmenená na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Dátový priečinok musí byť absolútna cesta" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Dátový priečinok neexistuje" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Nie je priečinok" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Nečitateľné" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Dátový priečinok bol zmenený na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "Zmeny I2CP a tunelov sa prejavia po zastavení všetkých torrentov" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP nastavenia boli zmenené na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Odpája sa starý I2CP cieľ" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP nastavenia boli zmenené na {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Nie je možné sa pripojiť pomocou nových nastavení, vracia sa naspäť k starým I2CP nastaveniam" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Nie je možné sa znova pripojiť pomocou starých nastavení!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Znova sa pripája k novému I2CP cieľu" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP listener bol reštartovaný pre \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nové súbory budú verejne čitateľné" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nové súbory nebudú verejne čitateľné" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Povolené automatické spustenie" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Zakázané automatické spustenie" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Povolené otvorené stopovače - pre prejavenie efektu sa vyžaduje reštart torrentu." -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Zakázané otvorené stopovače - pre prejavenie efektu sa vyžaduje reštart torrentu." -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "Povolené DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "Zakázané DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Zmena DHT vyžaduje vypnutie a znovuotvorenie tunela" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} téma bola načítaná, vráťte sa na hlavnú stránku i2psnark pre zobrazenie." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Konfigurácia nebola zmenená." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Zoznam otvorených stopovačov sa zmenil - pre prejavenie efektu sa vyžaduje reštart torrentu." -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Súkromný zoznam stopovačov bol zmenený - to sa bude týkať iba novo vytvorených torrentov." -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Nebolo možné uložiť konfiguráciu do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Pripája sa k I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Chyba pri pripájaní sa k I2P - skontrolujte si vaše I2CP nastavenia!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Chyba: Nebolo možné pridať torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Nie je možné otvoriť \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent s týmto info hashom je už spustený: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "CHYBA - Žiadne I2P stopovače v súkromnom torrente \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Varovanie - V \"{0}\" nie sú žiadne I2P stopovače, oznámené to bude iba DHT a otvoreným stopovačom I2P." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Varovanie - V \"{0}\" nie sú žiadne I2P stopovače, pričom otvorené stopovače sú zakázané, oznámené to bude iba DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -247,34 +255,46 @@ msgid "" "torrent." msgstr "Varovanie - V \"{0}\" nie sú žiadne I2P stopovače, pričom otvorené stopovače aj DHT sú zakázané, mali by ste otvorené stopovače alebo DHT pred spustením torrentu povoliť." -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent v \"{0}\" je neplatný" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Súbor torrentu bol odstránený: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "CHYBA - Nedostatok pamäte, nie je možné vytvoriť torrent z {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent bol pridaný a spustený: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent bol pridaný: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Získava sa {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -282,132 +302,147 @@ msgid "" "DHT." msgstr "Otvorené stopovače sú zakázané a my nemáme žiadnych DHT peerov. Získanie {0} nemusí uspieť, pokiaľ nespustíte ďalší torrent, prípadne nepovolíte otvorené stopovače alebo DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Pridáva sa {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Sťahovanie je už spustené: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Nepodarilo sa skopírovať súbor torrentu do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "Príliš veľa súborov v \"{0}\" ({1}), odstraňuje sa!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Súbor torrentu \"{0}\" nemôže končiť na \".torrent\", odstraňuje sa!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "V \"{0}\" nie sú žiadne kúsky, odstraňuje sa!" +msgid "No pieces in \"{0}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "V \"{0}\" je príliš veľa kúskov, limit je {1}, odstraňuje sa!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "Kúsky v \"{0}\" ({1}B) sú príliš veľké, odstraňuje sa." +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Limit je {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrent \"{0}\" neobsahuje žiadne dáta, odstraňuje sa!" +msgid "Torrent \"{0}\" has no data!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrenty väčšie než {0}B zatiaľ nie sú podporované, odstraňuje sa \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Chyba: Nebolo možné odstrániť torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent bol zastavený: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent bol odstránený: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Pridávajú sa torrenty do {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Limit nárastu šírky pásma je {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Sťahovanie bolo dokončené: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainformácie pre {0} boli doručené" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Spúšťa sa torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Chyba na torrente {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Nie je možné sa pripojiť k I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Otvára sa I2P tunel" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Otvára sa I2P tunel a spúšťajú sa všetky torrenty." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Zastavujú sa všetky torrenty a zatvára sa I2P tunel." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Po upozornení stopovačov sa zatvára I2P tunel." -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Nie sú žiadne platné stopovače pre {0} - povoliť otvorené stopovače alebo DHT?" @@ -452,178 +487,178 @@ msgstr "Torrent už vo fronte je: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent na {0} nebol platný." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Konfigurácia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Router nie je spustený" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Obnoviť stránku" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Fórum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Kliknite na tlačidlo \"Pridať torrent\" pre získanie torrentu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "zmazať správy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Stav" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Skryť peerov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Zobraziť peerov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "ETA" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Odhadovaný zostávajúci čas" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Stiahnuté" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Veľkosť" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Uploadnuté" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "RX sadzba" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Dolná sadzba" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "TX sadzba" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Horná sadzba" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Zastaviť všetky torrenty a I2P tunel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Zastaviť všetko" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Spustiť všetky zastavené torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Spustiť všetko" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Spustiť všetky torrenty a I2P tunel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Neboli načítané žiadne torrenty." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Súhrny" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" @@ -631,7 +666,7 @@ msgstr[0] "1 torrent" msgstr[1] "{0} torrenty" msgstr[2] "{0} torrentov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" @@ -639,7 +674,7 @@ msgstr[0] "1 pripojený peer" msgstr[1] "{0} pripojení peerovia" msgstr[2] "{0} pripojených peerov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" @@ -647,203 +682,202 @@ msgstr[0] "1 DHT peer" msgstr[1] "{0} DHT peerovia" msgstr[2] "{0} DHT peerov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Prvé" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Prvá stránka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Predchádzajúce" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Predchádzajúca stránka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Nasledujúce" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Nasledujúca stránka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Posledné" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Posledná stránka" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Neplatná URL: Musí začínať na \"http://\", \"{0}\" alebo \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet bol odstránený: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Súbor torrentu bol odstránený: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Sťahovanie odstránené: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Dátový súbor bol odstránený: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Dátový súbor nemohol byť odstránený: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Priečinok nemohol byť odstránený: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Priečinok bol odstránený: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Chyba - Nie je možné zahrnúť alternatívne stopovače bez toho primárneho" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Chyba - Nie je možné zmiešať v torrente súkromné aj verejné stopovače" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Pre \"{0}\" bol vytvorený torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Mnoho I2P stopovačov od vás vyžaduje registrovať pred seedovaním nové torrenty - prosím urobte tak pred spustením \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Chyba pri vytváraní torrentu pre \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Nie je možné vytvoriť torrent pre neexistujúce dáta: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Chyba pri vytváraní torrentu - musíte zadať súbor alebo priečinok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Zvolená možnosť odstrániť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Uložiť konfiguráciu stopovača" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Odstránené" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Pridať stopovač" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Zadajte platný názov a URL stopovača" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Obnoviť predvolené nastavenia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Obnoviť predvolené stopovače" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Kontroluje sa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Alokuje sa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Chyba stopovača" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" @@ -851,366 +885,377 @@ msgstr[0] "1 peer" msgstr[1] "{0} peerovia" msgstr[2] "{0} peerov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Spúšťa sa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Seeduje sa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Dokončené" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Zablokované" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Žiadni peerovia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Zastavené" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Detaily torrentu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Zobraziť súbory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Otvoriť súbor" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Zastaviť torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Zastaviť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Spustiť torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Spustiť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Odstrániť torrent zo zoznamu aktívnych zmazaním .torrent súboru." #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Ste si istý, že chcete odstrániť súbor \\\"{0}\\\"\n(stiahnuté dáta nebudú odstránené) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Odstrániť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Odstrániť .torrent súbor a aj príslušný dátový súbor(y)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Ste si istý, že chcete odstrániť torrent \\\"{0}\\\" a s ním aj všetky stiahnuté dáta?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Zmazať" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Neznáme" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Seed" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Nezaujímavý (Peer nemá žiadne kúsky, ktoré potrebujeme)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Zapchaný (Peer nám neumožňuje žiadať o kúsky)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Nezaujímajúci sa (Nemáme žiadne kúsky, ktoré peer potrebuje)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Zapchaný (Neumožňujeme peerovi žiadať o kúsky)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detaily sú v {0} stopovači" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Informácie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Pridať torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Z URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Zadajte URL (iba I2P) pre stiahnutie torrentu, magnetový alebo maggotový link, prípadne info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Pridať torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Môžete tiež skopírovať .torrent súbory do: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Odstránenie .torrent spôsobí jeho zastavenie." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Vytvoriť torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Dáta na seedovanie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Stopovače" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primárne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternatívne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Vytvoriť torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "žiadne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Dátový priečinok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Súbory čitateľné všetkými" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Ak je zaškrtnuté, ostatní užívatelia budú môcť pristupovať k stiahnutým súborom" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Ak je zaškrtnuté, automaticky sa spustia pridané torrenty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Téma" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Čas refreshu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Nikdy" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Zdržanie pri spustení" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minúty" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Veľkosť stránky" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrentov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Celkový limit uploaderov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "peerovia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Limit nárastu šírky pásma" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Odporúča sa polovica dostupnej šírky pásma." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Zobraziť alebo zmeniť šírku pásma routra" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Použiť aj otvorené stopovače" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Ak je zaškrtnuté, otvorené stopovače tak isto ako aj stopovače vypísané v súbore torrentu sa oboznámia so všetkými torrentmi" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Povoliť DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Ak je zaškrtnuté, použije sa DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Nastavenia prichádzajúcich dát" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Nastavenia odchádzajúcich dát" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP host" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP nastavenia" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Uložiť konfiguráciu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Názov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "URL webovej stránky" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Otvoriť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Súkromné" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Oznámiť URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Pridať" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Neplatná magnetová URL {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" @@ -1218,7 +1263,7 @@ msgstr[0] "1 hop" msgstr[1] "{0} hopy" msgstr[2] "{0} hopov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" @@ -1226,119 +1271,135 @@ msgstr[0] "1 tunel" msgstr[1] "{0} tunely" msgstr[2] "{0} tunelov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Súbor torrentu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Primárny stopovač" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Zoznam stopovačov" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Komentár" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Vytvorené" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Vytvorené užívateľom" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnetový link" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Súkromný torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Dokončenie" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Zostávajúce" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Súbory" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Kúsky" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Veľkosť kúsku" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Priečinok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Priorita" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Hore do priečinka vyššej úrovne" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent nenájdený?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Súbor nenájdený v torrente?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "dokončiť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "zostávajúcich" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Vysoká" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normálna" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Preskočiť" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Uložiť priority" diff --git a/apps/i2psnark/locale/messages_sv.po b/apps/i2psnark/locale/messages_sv.po index 59e5912b1..60bf28a92 100644 --- a/apps/i2psnark/locale/messages_sv.po +++ b/apps/i2psnark/locale/messages_sv.po @@ -5,8 +5,10 @@ # # Translators: # 123hund123 , 2011 +# Anders Nilsson , 2015 # Calle Rundgren , 2013 # ducki2p , 2011 +# cacapo , 2015 # hottuna , 2011 # hottuna , 2013 # hottuna , 2011-2012 @@ -17,237 +19,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/language/sv_SE/)\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-08 21:08+0000\n" +"Last-Translator: Anders Nilsson \n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv_SE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." -msgstr "" +msgstr "Inga fler torrents kör." -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P-tunneln är stängd." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "Gräns för totalt antal uppladdare är bytt till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "Minsta tillåtna gräns för uppladdare är {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Uppladdningsbandbredd bytt till {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Minsta uppladdningsbandbredd bytt till {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "Fördröjning vid uppstart bytt till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "Uppdateringstiden ändrad till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "Uppdatering inaktiverad" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "Torrentar per sida ändrat till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "Datamappen måste vara en absolut sökväg" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "Datamappen finns ej" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "Inte en mapp" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "Oläsbar" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "Datamappen ändrad till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP- och tunnelförändringar kommer träda i kraft efter alla torrentar stoppats" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "Alternativ för I2CP ändrade till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "Kopplar ifrån gammal I2CP destination" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "Inställningar för I2CP ändrade till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "Misslyckades med anslutningsförsök med nya inställningar, återställer de gamla I2CP inställningarna" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "Misslyckades med anslutningsförsök med gamla inställningar!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "Återanslöt mot den nya I2CP destinationen" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "I2CP-lyssnare omstartad för \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "Nya filer kommer vara publikt läsbara" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "Nya filer kommer inte vara publikt läsbara" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "Aktiverade automatisk start" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "Inaktiverade automatisk start" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "Aktiverade smart sortering" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "Inaktiverade smart sortering" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "Aktiverade publika trackers - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "Inaktiverade publika trackers - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "Aktivera DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "Inaktiverade DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "Förändring i DHT kräver att tunneln stängs och öppnas igen " -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} tema laddat, återgå till huvudvyn för i2psnark." -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "Inställningar oförändrade." -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "Listan över publika trackers förändrad - torrenten måste startas om för att inställningen ska träda i kraft" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "Privat trackerlista ändrad - påverkar bara nyligen skapade torrents" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "Misslyckades med att spara inställningar till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Ansluter till I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "Problem vid anslutning till I2P - kontrollera dina inställningar för I2CP!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "Problem: Kunde inte lägga till torrent {0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "Kan inte öppna \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "Torrent med denna infohash körs redan: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "FEL - Inga I2P trackers i den privata torrenten \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "Varning - Ingen I2P tracker i \"{0}\", kommer enbart att annonsera till publika I2P trackers och DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "Varning - Ingen I2P tracker i \"{0}\" och publika trackers är inaktiverade, kommer enbart att annonsera till DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -255,34 +265,46 @@ msgid "" "torrent." msgstr "Varning - Ingen I2P tracker i \"{0}\" och både DHT och publika trackers är inaktiverade, du bör aktivera publika trackers eller DHT innan du startar torrenten. " -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "Torrent i \"{0}\" är ogiltig" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "Torrentfil borttagen: {0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "Torrentfil flyttad från {0} till {1}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "FEL - Minnet har tagit slut, kan inte skapa torrent från {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "Torrent tillagd och startad: \"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "Torrent tillagd och startad: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "Torrent tillagd: \"{0}\"" +msgid "Torrent added: {0}" +msgstr "Torrent tillagd: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "Hämtar {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -290,132 +312,147 @@ msgid "" "DHT." msgstr "Publika trackers är inaktiverade och vi har inga DHT klienter. Hämtningen av {0} kan kanske inte genomföras innan du startar en annan torrent eller aktiverar publika trackers eller DHT." -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "Lägger till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "Hämtar redan: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "Misslyckades att kopiera torrentfil till {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "För många filer i \"{0}\" ({1}), tar bort den!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "För många filer i \"{0}\" ({1})!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "Torrenten \"{0}\" får inte sluta med \".torrent\", tar bort den!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "Torrentfilen \"{0}\" kan inte sluta på \".torrent\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "Inga delar i \"{0}\", tar bort den!" +msgid "No pieces in \"{0}\"!" +msgstr "Inga delar i \"{0}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "För många delar i \"{0}\", gränsen är {1}, tar bort den!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "För många delar i \"{0}\", gränsen är {1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "För stora delar i \"{0}\" ({1}B), tar bort den!" +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "Delarna är för stora i \"{0}\" ({1}B)!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "Gränsen är {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "Torrenten \"{0}\" har ingen data, tar bort den!" +msgid "Torrent \"{0}\" has no data!" +msgstr "Torrent \"{0}\" har ingen data!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "Torrentar större än {0}B stöds inte än, tar bort \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "Torrents större än {0}B stöds inte än \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "Fel: Kunde ej ta bort torrenten {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "Torrent stannad: \"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "Torrent stoppad: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "Torrent borttagen: \"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "Lägger till torrentar i {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "Upp bandbredds gräns är {0} KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "Hämtning klar: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "Metainfo mottagen för {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "Startar torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "Fel på torrent {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "Misslyckades med att ansluta till I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "Öppnar I2P tunneln" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "Öppnar I2P-tunneln och startar torrentar." -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "Stoppar alla torrentar och stänger I2P-tunneln." -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "Stänger I2P tunnel efter att ha meddelat trackers." -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "Avslutade omkontroll av torrent {0}, nu {1} färdig" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "Avslutade omkontroll av torrent {0}, oförändrad" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "Fel vid kontroll av torrent {0}" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "Ingen giltig tracker för {0} - aktivera publika trackers eller DHT?" @@ -460,887 +497,913 @@ msgstr "Torrent finns redan i kön: {0}" msgid "Torrent at {0} was not valid" msgstr "Torrent vid {0} var inte giltig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Inställningar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" -msgstr "" +msgstr "Anonym BitTorrent Klient" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "Routern är avstängd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "Torrentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Ladda om sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Forum" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "Klicka på \"Lägg till torrent\" för att hämta en torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "rensa meddelandena" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Status" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" -msgstr "" +msgstr "Sortera efter{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "Dölj klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "Visa klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "Torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" -msgstr "" +msgstr "Filtyp" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "Förväntas klar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "Uppskattad återstående tid" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "RX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Hämtade" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Storlek" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "TX" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" -msgstr "" +msgstr "Upload ratio" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Uppladdat" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "RX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "Nerhastighet" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "TX Rate" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "Upphastighet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "Stoppa alla torrents och I2P-tunneln" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "Stoppa alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "Starta alla stannade torrentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "Starta alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "Starta alla torrents och I2P-tunneln" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "Inga torrents laddade." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Totalt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "1 torrent" msgstr[1] "{0} torrentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "1 ansluten klient" msgstr[1] "{0} anslutna klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "1 DHT klient" msgstr[1] "{0} DHT klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "Destination" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "Första" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "Första sidan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "Bakåt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "Föregående sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "Nästa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "Nästa sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "Sista" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "Sista sidan" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" -msgstr "" +msgstr "Data directory kan inte skapas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" -msgstr "" +msgstr "Kan inte lägga till torrent{0} inuti annan torrent:{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "Ogiltig adress: Måste inledas med \"http://\", \"{0}\" eller \"{1}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "Torrentfil borttagen: {0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "Hämtning borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "Datafil borttagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "Datafil kunde inte tas bort: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "Katalogen kunde inta tas bort: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "Katalogen bort tagen: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" -msgstr "" +msgstr "Kan inte lägga till en torrent som slutar på \".torrent\":{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" -msgstr "" +msgstr "Torrent med detta namn kör redan: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" -msgstr "" +msgstr "Kan inte lägga till en torrent som inkluderar en I2P directory:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" -msgstr "" +msgstr "Kan inte lägga till en torrent{0} som inkluderar en annan torrent{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "Fel - Kan inte inkludera alternativa trackers utan en primär tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "Fel - Kan inte blanda privata och publika trackers i samma torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "Torrent skapad för \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "Många I2P trackers kräver att du registrerar nya torrentar innan uppladdningen påbörjas - gör det innan \"{0}\" startas" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "Misslyckades med att skapa torrent för \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "Kan ej skapa torrent för data som ej finns: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "Misslyckades med att skapa torrent - en fil eller mapp måste anges" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "Ta bort valda" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "Spara tracker konfiguration" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "Borttagen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "Lägg till tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "Ange giltigt namn och adresser för trackern " #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "Återställ standardvärden" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "Återställ standard trackers " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "Kontrollerar " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "Allokerar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Trackerfel" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "1 klient" msgstr[1] "{0} klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "Startar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "Uppladdning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Färdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "Ok" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Avstannad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "Inga klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Stoppad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "Torrentdetaljer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Se filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Öppna fil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "Stoppa torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Stoppa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "Starta torrenten" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Starta" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "Ta bort torrenten från den aktiva listan, tar bort .torrent filen" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "Är du säker på att du vill radera filen \\''{0}\\' (hämtad data kommer ej raderas) ?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Ta bort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "Ta bort .torrent filen och tillhörande datafil(er)" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "Är du säker på att du vill ta bort torrenten \"{0}\" och all hämtad data?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Ta bort" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Okänd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "Källa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "Ointressant (klienten har inga delar vi behöver)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "Strypt (klienten låter oss inte be om delar)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "Ointresserad (vi har inga delar klienten behöver)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "Stryper (vi låter inte klienten be om delar)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Detaljer för {0} tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Info" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "Lägg till torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "Adress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "Ange torrentfilens adress (enbart I2P), magnet-länk, maggot-länk eller infohash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "Lägg till torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" -msgstr "" +msgstr "Data dir" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" -msgstr "" +msgstr "Ange katalogen att spara datan i (förval {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "Du kan även kopiera .torrent filer till: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "Borttagning av .torrent fil kommer stanna den." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "Skapa torrent" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "Data att ladda upp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" -msgstr "" +msgstr "Fil eller katalog att seeda (fullständig sökväg eller inom katalog {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "Primär" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "Alternativ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "Skapa torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "inga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "Datamapp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "Filer läsbara för alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "Välj detta för att ge andra användare tillgång till hämtade filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" -msgstr "" +msgstr "Starta torrents automatiskt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "Välj detta för att automatiskt starta tillagda torrentfiler" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "Smart torrent-sortering" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "Om valt, ignorera ord som \"the\" vid sortering" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "Tema" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "Uppdateringsintervall" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "Aldrig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "Fördröjning av uppstart" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "minuter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "Per sida" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "torrentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "Gräns för totalt antal uppladdare" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "klienter" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Gräns för bandbredd uppåt" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "Hälften av tillgänglig bandbredd rekommenderas." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "Se eller ändra routerns bandbredd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "Använd också publika trackers" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "Välj detta för att annonsera torrentar till publika trackers såväl som de listade i torrentfilen" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "Aktivera DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "Välj detta för att använda DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "Inställningar för inkommande" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "Inställningar för utgående" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP-värd" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP-port" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "Alternativ för I2CP" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Spara inställningar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "Namn" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "Webbplatsadress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" -msgstr "" +msgstr "Standard" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Publik" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "Privat" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "Annonseringsadress" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "Lägg till" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "Ogiltig magnet-adress {0}" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "1 hopp" msgstr[1] "{0} hopp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "1 tunnel" msgstr[1] "{0} tunnlar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrentfil" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" -msgstr "" +msgstr "Plats för data" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" -msgstr "" +msgstr "Info hash" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "Primär tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Trackerlista" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "Kommentar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "Skapad" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "Skapad av" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "Tillagd" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "Färdig" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnet länk" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "Privat torrent" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "Färdigställning" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "Kvar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Filer" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Delar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Delstorlek" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "Ladda om sidan för resultat" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "Tvinga omkontroll" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Mapp" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Prioritet" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "Upp till högre mappnivå" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "Torrent hittades ej?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "Fil hittades ej i torrent?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "färdig" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "kvar" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Hög" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Normal" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Hoppa över" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" -msgstr "" +msgstr "Sätt alla höga" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" -msgstr "" +msgstr "Sätt alla normala" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" -msgstr "" +msgstr "Hoppa över alla" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "Spara prioriteter" diff --git a/apps/i2psnark/locale/messages_vi.po b/apps/i2psnark/locale/messages_vi.po index 261b49889..0894f625a 100644 --- a/apps/i2psnark/locale/messages_vi.po +++ b/apps/i2psnark/locale/messages_vi.po @@ -9,237 +9,245 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-19 21:48+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 17:17+0000\n" "Last-Translator: kytv \n" -"Language-Team: Vietnamese (http://www.transifex.com/projects/p/I2P/language/vi/)\n" +"Language-Team: Vietnamese (http://www.transifex.com/otf/I2P/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "Đường hầm I2P đóng lại." #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" msgstr "Giới hạn băng thông lên đổi thành {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" msgstr "Tối thiểu băng thông lên là {0}KBps" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "Nối kết vào I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -247,34 +255,46 @@ msgid "" "torrent." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" +msgid "Torrent added and started: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" +msgid "Torrent added: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -282,132 +302,147 @@ msgid "" "DHT." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" +msgid "Too many files in \"{0}\" ({1})!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" +msgid "No pieces in \"{0}\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" +msgid "Too many pieces in \"{0}\", limit is {1}!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." +msgid "Pieces are too large in \"{0}\" ({1}B)!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" +msgid "Torrent \"{0}\" has no data!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" +msgid "Torrent stopped: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "" @@ -452,881 +487,907 @@ msgstr "" msgid "Torrent at {0} was not valid" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "Cấu hình" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "Nạp lại trang" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "Diễn đàn" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "Tình trạng" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "Đã tải xuống" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "Kích thước" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "Đã tải lên" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "Tổng cộng" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "Hoàn tất" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" msgstr "OK" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "Khựng" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "Ngưng" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "Xem tập tin" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "Mở tập tin" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "Ngưng" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "Bắt đầu" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "Bỏ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "Xóa" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "Không rõ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "Thông tin" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "phút" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "Giới hạn băng thông lên" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "Lưu cấu hình" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "Mở" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 -msgid "Magnet link" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 -msgid "Private torrent" -msgstr "" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 -msgid "Completion" +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" msgstr "" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +msgid "Completed" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 +msgid "Magnet link" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 +msgid "Private torrent" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 +msgid "Completion" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "Tập tin" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "Mảnh" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "Kích thước mảnh" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "Danh mục" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "Ưu tiên" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "hoàn tất" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "Cao" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "Thường" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "Lờ" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "" diff --git a/apps/i2psnark/locale/messages_zh.po b/apps/i2psnark/locale/messages_zh.po index 2a812a8d2..4a78516fc 100644 --- a/apps/i2psnark/locale/messages_zh.po +++ b/apps/i2psnark/locale/messages_zh.po @@ -8,242 +8,250 @@ # foo , 2009 # walking , 2013 # wwj402 , 2013 -# YF , 2014 +# YF , 2014-2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-11-19 21:48+0000\n" -"PO-Revision-Date: 2014-11-20 07:17+0000\n" +"POT-Creation-Date: 2015-11-05 17:12+0000\n" +"PO-Revision-Date: 2015-11-05 19:20+0000\n" "Last-Translator: YF \n" -"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/I2P/language/zh_CN/)\n" +"Language-Team: Chinese (China) (http://www.transifex.com/otf/I2P/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../java/src/org/klomp/snark/IdleChecker.java:69 +#: ../java/src/org/klomp/snark/IdleChecker.java:75 msgid "No more torrents running." msgstr "没有更多种子正在运行。" -#: ../java/src/org/klomp/snark/IdleChecker.java:70 -#: ../java/src/org/klomp/snark/SnarkManager.java:2283 -#: ../java/src/org/klomp/snark/SnarkManager.java:2294 +#: ../java/src/org/klomp/snark/IdleChecker.java:76 +#: ../java/src/org/klomp/snark/SnarkManager.java:2539 +#: ../java/src/org/klomp/snark/SnarkManager.java:2550 msgid "I2P tunnel closed." msgstr "I2P隧道已关闭" #: ../java/src/org/klomp/snark/MagnetURI.java:42 #: ../java/src/org/klomp/snark/MagnetURI.java:52 -#: ../java/src/org/klomp/snark/SnarkManager.java:1987 +#: ../java/src/org/klomp/snark/SnarkManager.java:2221 msgid "Magnet" msgstr "Magnet" -#: ../java/src/org/klomp/snark/SnarkManager.java:749 +#: ../java/src/org/klomp/snark/SnarkManager.java:791 #, java-format msgid "Total uploaders limit changed to {0}" msgstr "总上传种子数限制已更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:751 +#: ../java/src/org/klomp/snark/SnarkManager.java:793 #, java-format msgid "Minimum total uploaders limit is {0}" msgstr "最低上传种子数限制为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:763 +#: ../java/src/org/klomp/snark/SnarkManager.java:805 #, java-format msgid "Up BW limit changed to {0}KBps" -msgstr "上传带宽限制改为 {0} KBps" +msgstr "上传带宽限制改为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:765 +#: ../java/src/org/klomp/snark/SnarkManager.java:807 #, java-format msgid "Minimum up bandwidth limit is {0}KBps" -msgstr "最小上传带宽限制为 {0} KBps" +msgstr "最小上传带宽限制为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:777 +#: ../java/src/org/klomp/snark/SnarkManager.java:819 #, java-format msgid "Startup delay changed to {0}" msgstr "下载前的延迟已更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:788 +#: ../java/src/org/klomp/snark/SnarkManager.java:830 #, java-format msgid "Refresh time changed to {0}" msgstr "刷新时间更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:790 +#: ../java/src/org/klomp/snark/SnarkManager.java:832 msgid "Refresh disabled" msgstr "刷新已禁用" -#: ../java/src/org/klomp/snark/SnarkManager.java:806 +#: ../java/src/org/klomp/snark/SnarkManager.java:848 #, java-format msgid "Page size changed to {0}" msgstr "页面容量更新为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:815 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:857 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 msgid "Data directory must be an absolute path" msgstr "数据存放目录必须是绝对路径" -#: ../java/src/org/klomp/snark/SnarkManager.java:817 +#: ../java/src/org/klomp/snark/SnarkManager.java:859 msgid "Data directory does not exist" msgstr "数据存放目录不存在" -#: ../java/src/org/klomp/snark/SnarkManager.java:819 +#: ../java/src/org/klomp/snark/SnarkManager.java:861 msgid "Not a directory" msgstr "不是文件夹" -#: ../java/src/org/klomp/snark/SnarkManager.java:821 +#: ../java/src/org/klomp/snark/SnarkManager.java:863 msgid "Unreadable" msgstr "不可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:826 +#: ../java/src/org/klomp/snark/SnarkManager.java:868 #, java-format msgid "Data directory changed to {0}" msgstr "数据存放目录更新至{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:881 +#: ../java/src/org/klomp/snark/SnarkManager.java:923 msgid "I2CP and tunnel changes will take effect after stopping all torrents" msgstr "I2CP与隧道设置的变化在所有种子停止后才能生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:885 +#: ../java/src/org/klomp/snark/SnarkManager.java:927 #, java-format msgid "I2CP options changed to {0}" msgstr "I2CP 选项改为 {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:891 +#: ../java/src/org/klomp/snark/SnarkManager.java:933 msgid "Disconnecting old I2CP destination" msgstr "正在断开旧的I2CP目标" -#: ../java/src/org/klomp/snark/SnarkManager.java:893 +#: ../java/src/org/klomp/snark/SnarkManager.java:935 #, java-format msgid "I2CP settings changed to {0}" msgstr "I2CP设置改为{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:898 +#: ../java/src/org/klomp/snark/SnarkManager.java:940 msgid "" "Unable to connect with the new settings, reverting to the old I2CP settings" msgstr "无法通过新设置连接,恢复I2CP的旧设置" -#: ../java/src/org/klomp/snark/SnarkManager.java:902 +#: ../java/src/org/klomp/snark/SnarkManager.java:944 msgid "Unable to reconnect with the old settings!" msgstr "旧设置也无法连接!" -#: ../java/src/org/klomp/snark/SnarkManager.java:904 +#: ../java/src/org/klomp/snark/SnarkManager.java:946 msgid "Reconnected on the new I2CP destination" msgstr "重新连接新I2CP目标" -#: ../java/src/org/klomp/snark/SnarkManager.java:911 +#: ../java/src/org/klomp/snark/SnarkManager.java:953 #, java-format msgid "I2CP listener restarted for \"{0}\"" msgstr "\"{0}\"的I2CP监听端口已启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:925 +#: ../java/src/org/klomp/snark/SnarkManager.java:967 msgid "New files will be publicly readable" msgstr "新文件将对公共可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:927 +#: ../java/src/org/klomp/snark/SnarkManager.java:969 msgid "New files will not be publicly readable" msgstr "新文件不会对公共可读" -#: ../java/src/org/klomp/snark/SnarkManager.java:934 +#: ../java/src/org/klomp/snark/SnarkManager.java:976 msgid "Enabled autostart" msgstr "启用自动启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:936 +#: ../java/src/org/klomp/snark/SnarkManager.java:978 msgid "Disabled autostart" msgstr "禁用自动启动" -#: ../java/src/org/klomp/snark/SnarkManager.java:942 +#: ../java/src/org/klomp/snark/SnarkManager.java:985 +msgid "Enabled smart sort" +msgstr "已启用智能排序" + +#: ../java/src/org/klomp/snark/SnarkManager.java:987 +msgid "Disabled smart sort" +msgstr "已禁用智能排序" + +#: ../java/src/org/klomp/snark/SnarkManager.java:994 msgid "Enabled open trackers - torrent restart required to take effect." msgstr "启用OpenTracker-重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:944 +#: ../java/src/org/klomp/snark/SnarkManager.java:996 msgid "Disabled open trackers - torrent restart required to take effect." msgstr "禁用OpenTracker - 重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:951 +#: ../java/src/org/klomp/snark/SnarkManager.java:1003 msgid "Enabled DHT." msgstr "DHT 已启用" -#: ../java/src/org/klomp/snark/SnarkManager.java:953 +#: ../java/src/org/klomp/snark/SnarkManager.java:1005 msgid "Disabled DHT." msgstr "DHT 已禁用" -#: ../java/src/org/klomp/snark/SnarkManager.java:955 +#: ../java/src/org/klomp/snark/SnarkManager.java:1007 msgid "DHT change requires tunnel shutdown and reopen" msgstr "DHT 修改生效需要关闭或重启。" -#: ../java/src/org/klomp/snark/SnarkManager.java:962 +#: ../java/src/org/klomp/snark/SnarkManager.java:1014 #, java-format msgid "{0} theme loaded, return to main i2psnark page to view." msgstr "{0} 主题已加载,浏览效果请到 i2psnark 主页。" -#: ../java/src/org/klomp/snark/SnarkManager.java:972 +#: ../java/src/org/klomp/snark/SnarkManager.java:1024 msgid "Configuration unchanged." msgstr "设置未改变" -#: ../java/src/org/klomp/snark/SnarkManager.java:1004 +#: ../java/src/org/klomp/snark/SnarkManager.java:1056 msgid "Open Tracker list changed - torrent restart required to take effect." msgstr "OpenTracker列表已改变 - 重新启动种子后生效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1014 +#: ../java/src/org/klomp/snark/SnarkManager.java:1066 msgid "Private tracker list changed - affects newly created torrents only." msgstr "PT 列表已更改 - 仅对新创建的种子有效" -#: ../java/src/org/klomp/snark/SnarkManager.java:1060 +#: ../java/src/org/klomp/snark/SnarkManager.java:1112 #, java-format msgid "Unable to save the config to {0}" msgstr "无法保存设置到{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1141 +#: ../java/src/org/klomp/snark/SnarkManager.java:1193 msgid "Connecting to I2P" msgstr "正在连接到I2P" -#: ../java/src/org/klomp/snark/SnarkManager.java:1144 +#: ../java/src/org/klomp/snark/SnarkManager.java:1196 msgid "Error connecting to I2P - check your I2CP settings!" msgstr "连接I2P时发生错误 - 请检查I2CP设置!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1153 -#: ../java/src/org/klomp/snark/SnarkManager.java:2024 +#: ../java/src/org/klomp/snark/SnarkManager.java:1205 +#: ../java/src/org/klomp/snark/SnarkManager.java:2270 #, java-format msgid "Error: Could not add the torrent {0}" msgstr "错误:无法添加种子{0}" #. catch this here so we don't try do delete it below -#: ../java/src/org/klomp/snark/SnarkManager.java:1176 +#: ../java/src/org/klomp/snark/SnarkManager.java:1228 #, java-format msgid "Cannot open \"{0}\"" msgstr "无法打开 \"{0}\"" #. TODO - if the existing one is a magnet, delete it and add the metainfo #. instead? -#: ../java/src/org/klomp/snark/SnarkManager.java:1195 -#: ../java/src/org/klomp/snark/SnarkManager.java:1320 -#: ../java/src/org/klomp/snark/SnarkManager.java:1407 +#: ../java/src/org/klomp/snark/SnarkManager.java:1247 +#: ../java/src/org/klomp/snark/SnarkManager.java:1388 +#: ../java/src/org/klomp/snark/SnarkManager.java:1476 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166 #, java-format msgid "Torrent with this info hash is already running: {0}" msgstr "具有相同Hash链接的种子已在下载中:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1201 +#: ../java/src/org/klomp/snark/SnarkManager.java:1253 #, java-format msgid "ERROR - No I2P trackers in private torrent \"{0}\"" msgstr "错误 - 私有种子\"{0}\"中缺少 I2P Tracker" -#: ../java/src/org/klomp/snark/SnarkManager.java:1203 +#: ../java/src/org/klomp/snark/SnarkManager.java:1255 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and" " DHT only." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,程序将仅通过 I2P 中的开放式 Tracker 和 DHT 下载。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1206 +#: ../java/src/org/klomp/snark/SnarkManager.java:1258 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will " "announce to DHT only." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,已禁用 I2P Open Tracker,程序将仅通过 DHT 下载。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1208 +#: ../java/src/org/klomp/snark/SnarkManager.java:1260 #, java-format msgid "" "Warning - No I2P trackers in \"{0}\", and DHT and open trackers are " @@ -251,34 +259,46 @@ msgid "" "torrent." msgstr "警告 - \"{0}\"中缺少 I2P Tracker,已禁用 I2P Open Tracker 和 DHT,下载先您需要先启用 OpenTracker 或 DHT 。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1234 +#: ../java/src/org/klomp/snark/SnarkManager.java:1286 #, java-format msgid "Torrent in \"{0}\" is invalid" msgstr "无效种子 \"{0}\" " -#: ../java/src/org/klomp/snark/SnarkManager.java:1241 +#: ../java/src/org/klomp/snark/SnarkManager.java:1292 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1069 +#, java-format +msgid "Torrent file deleted: {0}" +msgstr "种子文件已删除:{0}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1295 +#, java-format +msgid "Torrent file moved from {0} to {1}" +msgstr "种子文件已从 {0} 移动到 {1}" + +#: ../java/src/org/klomp/snark/SnarkManager.java:1299 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:193 #, java-format msgid "ERROR - Out of memory, cannot create torrent from {0}" msgstr "错误: 内存不足,无法为 {0} 创建种子。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1253 +#: ../java/src/org/klomp/snark/SnarkManager.java:1321 #, java-format -msgid "Torrent added and started: \"{0}\"" -msgstr "已添加并启动种子:\"{0}\"" +msgid "Torrent added and started: {0}" +msgstr "种子已添加并开始:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1255 +#: ../java/src/org/klomp/snark/SnarkManager.java:1323 #, java-format -msgid "Torrent added: \"{0}\"" -msgstr "已添加种子:\"{0}\"" +msgid "Torrent added: {0}" +msgstr "种子已添加:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1331 +#: ../java/src/org/klomp/snark/SnarkManager.java:1399 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93 #, java-format msgid "Fetching {0}" msgstr "正在获取{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1337 +#: ../java/src/org/klomp/snark/SnarkManager.java:1405 #, java-format msgid "" "Open trackers are disabled and we have no DHT peers. Fetch of {0} may not " @@ -286,132 +306,147 @@ msgid "" "DHT." msgstr "OpenTracker被禁用,程序目前没有DHT节点。{0}的下载不会成功,直到您启动另一个种子的下载、重新启用OpenTracker或DHT。" -#: ../java/src/org/klomp/snark/SnarkManager.java:1341 +#: ../java/src/org/klomp/snark/SnarkManager.java:1409 #, java-format msgid "Adding {0}" msgstr "正在添加{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1373 +#: ../java/src/org/klomp/snark/SnarkManager.java:1442 #, java-format msgid "Download already running: {0}" msgstr "已经在下载中:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1417 -#: ../java/src/org/klomp/snark/SnarkManager.java:1443 -#: ../java/src/org/klomp/snark/SnarkManager.java:1943 +#: ../java/src/org/klomp/snark/SnarkManager.java:1487 +#: ../java/src/org/klomp/snark/SnarkManager.java:1513 +#: ../java/src/org/klomp/snark/SnarkManager.java:2151 #, java-format msgid "Failed to copy torrent file to {0}" msgstr "无法复制种子文件到{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1729 +#: ../java/src/org/klomp/snark/SnarkManager.java:1927 #, java-format -msgid "Too many files in \"{0}\" ({1}), deleting it!" -msgstr "\"{0}\" ({1}) 含有太多文件,删除之!" +msgid "Too many files in \"{0}\" ({1})!" +msgstr "\"{0}\" ({1}) 含有太多文件!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1731 +#: ../java/src/org/klomp/snark/SnarkManager.java:1929 #, java-format -msgid "Torrent file \"{0}\" cannot end in \".torrent\", deleting it!" -msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾,正在删除!" +msgid "Torrent file \"{0}\" cannot end in \".torrent\"!" +msgstr "种子文件 \"{0}\" 不以 \".torrent\"结尾!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1733 +#: ../java/src/org/klomp/snark/SnarkManager.java:1931 #, java-format -msgid "No pieces in \"{0}\", deleting it!" -msgstr "\"{0}\" 中没有数据片,删除之!" +msgid "No pieces in \"{0}\"!" +msgstr "\"{0}\" 中没有文件分片!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1735 +#: ../java/src/org/klomp/snark/SnarkManager.java:1933 #, java-format -msgid "Too many pieces in \"{0}\", limit is {1}, deleting it!" -msgstr "\"{0}\" 中文件分片太多,限额为{1},删除之!" +msgid "Too many pieces in \"{0}\", limit is {1}!" +msgstr "\"{0}\" 中文件分片太多,限额为{1}!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1737 +#: ../java/src/org/klomp/snark/SnarkManager.java:1935 #, java-format -msgid "Pieces are too large in \"{0}\" ({1}B), deleting it." -msgstr "\"{0}\" ({1}B) 中文件分片过大,删除之。" +msgid "Pieces are too large in \"{0}\" ({1}B)!" +msgstr "\"{0}\"({1}B)中分片过大!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1738 +#: ../java/src/org/klomp/snark/SnarkManager.java:1936 #, java-format msgid "Limit is {0}B" msgstr "限额为 {0}B" -#: ../java/src/org/klomp/snark/SnarkManager.java:1740 +#: ../java/src/org/klomp/snark/SnarkManager.java:1938 #, java-format -msgid "Torrent \"{0}\" has no data, deleting it!" -msgstr "种子\"{0}\"中无数据,正在删除!" +msgid "Torrent \"{0}\" has no data!" +msgstr "种子 \"{0}\" 中无数据!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1748 +#: ../java/src/org/klomp/snark/SnarkManager.java:1946 #, java-format -msgid "Torrents larger than {0}B are not supported yet, deleting \"{1}\"" -msgstr "目前不支持大于{0}B 的种子,正在删除\"{1}\"" +msgid "Torrents larger than {0}B are not supported yet \"{1}\"!" +msgstr "目前不支持大于 {0}B 的种子 \"{1}\"!" -#: ../java/src/org/klomp/snark/SnarkManager.java:1764 +#: ../java/src/org/klomp/snark/SnarkManager.java:1963 #, java-format msgid "Error: Could not remove the torrent {0}" msgstr "错误:无法删除种子{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1785 -#: ../java/src/org/klomp/snark/SnarkManager.java:1803 +#: ../java/src/org/klomp/snark/SnarkManager.java:1986 +#: ../java/src/org/klomp/snark/SnarkManager.java:2005 #, java-format -msgid "Torrent stopped: \"{0}\"" -msgstr "种子已停止:\"{0}\"" +msgid "Torrent stopped: {0}" +msgstr "种子已停止:{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1824 +#: ../java/src/org/klomp/snark/SnarkManager.java:2025 #, java-format msgid "Torrent removed: \"{0}\"" msgstr "种子已删除:\"{0}\"" -#: ../java/src/org/klomp/snark/SnarkManager.java:1832 +#: ../java/src/org/klomp/snark/SnarkManager.java:2033 #, java-format msgid "Adding torrents in {0}" msgstr "{0} 分钟内完成添加" -#: ../java/src/org/klomp/snark/SnarkManager.java:1863 +#: ../java/src/org/klomp/snark/SnarkManager.java:2067 #, java-format msgid "Up bandwidth limit is {0} KBps" -msgstr "最小上传带宽限制为 {0} KBps" +msgstr "上传带宽限制为 {0} KB/s" -#: ../java/src/org/klomp/snark/SnarkManager.java:1886 +#: ../java/src/org/klomp/snark/SnarkManager.java:2092 #, java-format msgid "Download finished: {0}" msgstr "下载已完成: {0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1939 +#: ../java/src/org/klomp/snark/SnarkManager.java:2147 #, java-format msgid "Metainfo received for {0}" msgstr "已获得 {0} 的 Metainfo" -#: ../java/src/org/klomp/snark/SnarkManager.java:1940 -#: ../java/src/org/klomp/snark/SnarkManager.java:2171 +#: ../java/src/org/klomp/snark/SnarkManager.java:2148 +#: ../java/src/org/klomp/snark/SnarkManager.java:2431 #, java-format msgid "Starting up torrent {0}" msgstr "正在启动种子{0}" -#: ../java/src/org/klomp/snark/SnarkManager.java:1955 +#: ../java/src/org/klomp/snark/SnarkManager.java:2163 #, java-format msgid "Error on torrent {0}" msgstr "种子 {0} 发生错误" -#: ../java/src/org/klomp/snark/SnarkManager.java:2018 +#: ../java/src/org/klomp/snark/SnarkManager.java:2264 msgid "Unable to connect to I2P!" msgstr "无法连接至I2P!" -#: ../java/src/org/klomp/snark/SnarkManager.java:2170 +#: ../java/src/org/klomp/snark/SnarkManager.java:2430 #: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130 msgid "Opening the I2P tunnel" msgstr "正在建立 I2P 隧道" -#: ../java/src/org/klomp/snark/SnarkManager.java:2194 +#: ../java/src/org/klomp/snark/SnarkManager.java:2450 msgid "Opening the I2P tunnel and starting all torrents." msgstr "正在打开I2P隧道并启动所有种子" -#: ../java/src/org/klomp/snark/SnarkManager.java:2257 +#: ../java/src/org/klomp/snark/SnarkManager.java:2513 msgid "Stopping all torrents and closing the I2P tunnel." msgstr "正在停用所有种子并关闭I2P隧道。" -#: ../java/src/org/klomp/snark/SnarkManager.java:2276 +#: ../java/src/org/klomp/snark/SnarkManager.java:2532 msgid "Closing I2P tunnel after notifying trackers." msgstr "正在关闭 I2P 隧道,已通知 Tracker。" -#: ../java/src/org/klomp/snark/TrackerClient.java:240 +#: ../java/src/org/klomp/snark/SnarkManager.java:2594 +#, java-format +msgid "Finished recheck of torrent {0}, now {1} complete" +msgstr "已完成对种子 {0} 的重新检查,现在 {1} 已完成" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2596 +#, java-format +msgid "Finished recheck of torrent {0}, unchanged" +msgstr "已完成对种子 {0} 的重新检查,未变更" + +#: ../java/src/org/klomp/snark/SnarkManager.java:2600 +#, java-format +msgid "Error checking the torrent {0}" +msgstr "检查种子 {0} 时出错" + +#: ../java/src/org/klomp/snark/TrackerClient.java:245 #, java-format msgid "No valid trackers for {0} - enable opentrackers or DHT?" msgstr "{0} 中 Tracker 无效 - 要启用 opentrackers 或 DHT 吗?" @@ -456,881 +491,907 @@ msgstr "种子排队中:{0}" msgid "Torrent at {0} was not valid" msgstr "{0}的种子中有错误" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:268 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:311 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:322 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1750 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2648 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:270 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:313 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:324 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2698 msgid "I2PSnark" msgstr "I2PSnark" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:273 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2136 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2408 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2165 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2446 msgid "Configuration" msgstr "设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:277 msgid "Anonymous BitTorrent Client" msgstr "匿名的 BitTorrent 客户端" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:289 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:291 msgid "Router is down" msgstr "路由器已关闭" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:306 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Torrents" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:317 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:319 msgid "Refresh page" msgstr "刷新页面" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:326 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:328 msgid "Forum" msgstr "论坛" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:341 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:343 msgid "Click \"Add torrent\" button to fetch torrent" msgstr "点击 \"添加种子\" 按钮来获取种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:396 msgid "clear messages" msgstr "清除消息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:449 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2966 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3072 msgid "Status" msgstr "状态" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:451 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2980 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:453 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3062 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3086 #, java-format msgid "Sort by {0}" msgstr "排序按 {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:461 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:464 msgid "Hide Peers" msgstr "隐藏用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:467 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:470 msgid "Show Peers" msgstr "显示用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:490 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2634 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:493 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2718 msgid "Torrent" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:492 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:495 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "File type" msgstr "文件类型" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:508 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 msgid "ETA" msgstr "预计剩余时间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:510 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:511 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:513 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:514 msgid "Estimated time remaining" msgstr "预计剩余时间" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:534 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 msgid "RX" msgstr "已接收" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:540 msgid "Downloaded" msgstr "已下载" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2804 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2878 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3060 msgid "Size" msgstr "大小" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:565 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 msgid "TX" msgstr "已发送" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2822 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2896 msgid "Upload ratio" msgstr "上传率" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:567 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:568 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:570 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:571 msgid "Uploaded" msgstr "已上传" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 msgid "RX Rate" msgstr "接收速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:582 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:583 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:585 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:586 msgid "Down Rate" msgstr "下载速度" #. Translators: Please keep short or translate as " " -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:595 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 msgid "TX Rate" msgstr "发送速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:597 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:598 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:600 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:601 msgid "Up Rate" msgstr "上传速度" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:614 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:617 msgid "Stop all torrents and the I2P tunnel" msgstr "停止全部种子及I2P隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:616 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:619 msgid "Stop All" msgstr "停止全部" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:628 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:631 msgid "Start all stopped torrents" msgstr "启动所有已停止的种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:630 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:644 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:633 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:647 msgid "Start All" msgstr "启动全部" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:642 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:645 msgid "Start all torrents and the I2P tunnel" msgstr "启动全部种子及I2P隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:667 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:670 msgid "No torrents loaded." msgstr "未载入任何种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:673 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:676 msgid "Totals" msgstr "总计" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:675 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:678 #, java-format msgid "1 torrent" msgid_plural "{0} torrents" msgstr[0] "{0}个种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:680 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:683 #, java-format msgid "1 connected peer" msgid_plural "{0} connected peers" msgstr[0] "{0}个已连接用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:687 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:690 #, java-format msgid "1 DHT peer" msgid_plural "{0} DHT peers" msgstr[0] "{0}个DHT节点" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:697 +msgid "Dest" +msgstr "目标" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First" msgstr "首页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:811 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:825 msgid "First page" msgstr "第一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Prev" msgstr "前页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:821 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:835 msgid "Previous page" msgstr "上一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next" msgstr "下页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:854 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:868 msgid "Next page" msgstr "下一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last" msgstr "末页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:862 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:876 msgid "Last page" msgstr "最后一页" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:948 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:962 msgid "Data directory cannot be created" msgstr "无法创建数据目录" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:958 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1163 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:972 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1185 #, java-format msgid "Cannot add torrent {0} inside another torrent: {1}" msgstr "无法添加内含另一个种子的种子 {0}:{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:973 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:993 #, java-format msgid "Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"" msgstr "无效链接 - 链接必须以“http://”,“{0}”或“{1}”开头" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1014 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1063 #, java-format msgid "Magnet deleted: {0}" msgstr "Magnet 已删除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1022 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049 -#, java-format -msgid "Torrent file deleted: {0}" -msgstr "种子文件已删除:{0}" - -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1041 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1061 #, java-format msgid "Download deleted: {0}" msgstr "下载已删除: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1078 #, java-format msgid "Data file deleted: {0}" msgstr "数据文件已删除:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1057 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1089 #, java-format msgid "Data file could not be deleted: {0}" msgstr "无法删除数据文件:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1084 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1105 #, java-format msgid "Directory could not be deleted: {0}" msgstr "无法删除目录:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1091 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1112 #, java-format msgid "Directory deleted: {0}" msgstr "目录已经删除: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1142 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1164 #, java-format msgid "Cannot add a torrent ending in \".torrent\": {0}" msgstr "无法添加一个以 \".torrent\" 结尾的种子: {0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1147 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1169 #, java-format msgid "Torrent with this name is already running: {0}" msgstr "此名称的种子已在运行:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1153 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1175 #, java-format msgid "Cannot add a torrent including an I2P directory: {0}" msgstr "无法添加包含一个 I2P 目录的种子:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1168 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1190 #, java-format msgid "Cannot add torrent {0} including another torrent: {1}" msgstr "无法添加包含另一个种子的种子 {0}:{1}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1194 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1216 msgid "Error - Cannot include alternate trackers without a primary tracker" msgstr "错误 - 缺少主Tracker则无法添加替换Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1207 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 msgid "Error - Cannot mix private and public trackers in a torrent" msgstr "错误 - PT和公共Tracker无法在同一种子中混用。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1229 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251 #, java-format msgid "Torrent created for \"{0}\"" msgstr "种子创建成功\"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1231 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1253 #, java-format msgid "" "Many I2P trackers require you to register new torrents before seeding - " "please do so before starting \"{0}\"" msgstr "多数I2PTracker需要用户在做种前注册新种子 - 请在启动 \"{0}\"前到所使用的Tracker进行注册。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1233 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1255 #, java-format msgid "Error creating a torrent for \"{0}\"" msgstr "创建种子时发生错误 \"{0}\"" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1259 #, java-format msgid "Cannot create a torrent for the nonexistent data: {0}" msgstr "无法为不存在的数据文件创建种子:{0}" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1240 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1262 msgid "Error creating torrent - you must enter a file or directory" msgstr "创建种子时发生错误 - 必须指定文件或文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2392 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2430 msgid "Delete selected" msgstr "删除选中项目" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1271 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2394 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1293 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2432 msgid "Save tracker configuration" msgstr "保存 Tracker 设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1310 msgid "Removed" msgstr "已删除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1320 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2391 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2393 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1342 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2429 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2431 msgid "Add tracker" msgstr "添加 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1343 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1346 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1365 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1368 msgid "Enter valid tracker name and URLs" msgstr "请输入有效的 Tracker 名称与链接" #. "\n" + -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1348 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2396 +#. value=\"").append(_t("Cancel")).append("\">\n" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1370 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 msgid "Restore defaults" msgstr "恢复默认值" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1351 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1373 msgid "Restored default trackers" msgstr "恢复默认 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1459 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1460 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1485 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2949 msgid "Checking" msgstr "正在检查" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1462 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1463 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2956 msgid "Allocating" msgstr "正在分配空间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1477 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1505 msgid "Tracker Error" msgstr "Tracker错误" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1479 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1509 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1514 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1525 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1536 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1541 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1507 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1537 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1542 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1553 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1558 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1564 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1569 #, java-format msgid "1 peer" msgid_plural "{0} peers" msgstr[0] "{0}个用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1489 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1490 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1518 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2954 msgid "Starting" msgstr "正在启动" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1498 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1526 msgid "Seeding" msgstr "正做种" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1502 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1516 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1517 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2817 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3033 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1530 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1545 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2891 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3139 msgid "Complete" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1521 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1522 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1527 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1528 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1549 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1555 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1556 msgid "OK" -msgstr "确定" +msgstr "正常" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1532 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1533 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1538 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1539 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1560 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1561 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1566 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1567 msgid "Stalled" msgstr "等待" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1543 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1544 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1547 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1548 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1571 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1572 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1575 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1576 msgid "No Peers" msgstr "没有用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1550 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1551 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1578 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1579 msgid "Stopped" msgstr "已停用" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1580 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1608 msgid "Torrent details" msgstr "种子详情" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1615 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1643 msgid "View files" msgstr "浏览文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1617 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1645 msgid "Open file" msgstr "打开文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1669 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1697 msgid "Stop the torrent" msgstr "停止种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1671 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2961 msgid "Stop" msgstr "停止" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1684 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1712 msgid "Start the torrent" msgstr "启动种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1686 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1714 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2963 msgid "Start" msgstr "启动" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1699 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1727 msgid "Remove the torrent from the active list, deleting the .torrent file" msgstr "取消下载任务并删除对应种子文件。" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1704 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1732 #, java-format msgid "" "Are you sure you want to delete the file \\''{0}\\'' (downloaded data will " "not be deleted) ?" msgstr "你确定你要删除文件 \\“{0} \\” (下载的数据不会被删除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1708 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1736 msgid "Remove" msgstr "移除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1721 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1749 msgid "Delete the .torrent file and the associated data file(s)" msgstr "删除种子及所下载的文件" #. Can't figure out how to escape double quotes inside the onclick string. #. Single quotes in translate strings with parameters must be doubled. #. Then the remaining single quote must be escaped -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1726 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1754 #, java-format msgid "" "Are you sure you want to delete the torrent \\''{0}\\'' and all downloaded " "data?" msgstr "您确定要删除种子“{0}”(下载的数据文件会一并被删除)?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1730 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2350 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2388 msgid "Delete" msgstr "删除" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1766 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1794 msgid "Unknown" msgstr "未知" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1778 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1806 msgid "Seed" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1801 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1829 msgid "Uninteresting (The peer has no pieces we need)" msgstr "无需要部分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1803 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1831 msgid "Choked (The peer is not allowing us to request pieces)" msgstr "拒绝请求" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1823 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1851 msgid "Uninterested (We have no pieces the peer needs)" msgstr "无需要部分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1825 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1853 msgid "Choking (We are not allowing the peer to request pieces)" msgstr "拒绝请求" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1941 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1969 #, java-format msgid "Details at {0} tracker" msgstr "Tracker {0} 上的详细信息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1958 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1986 msgid "Info" msgstr "信息" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2031 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2059 msgid "Add Torrent" msgstr "添加种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2034 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2062 msgid "From URL" msgstr "从URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2037 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2065 msgid "" "Enter the torrent file download URL (I2P only), magnet link, maggot link, or" " info hash" msgstr "输入种子文件的下载链接(仅支持I2P内网链接),magnet, maggot 链接或信息散列值" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2042 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2070 msgid "Add torrent" msgstr "添加种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2046 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2074 msgid "Data dir" msgstr "数据目录" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2049 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2077 #, java-format msgid "Enter the directory to save the data in (default {0})" msgstr "请输入保存数据的目录(默认 {0})" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2053 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2081 #, java-format msgid "You can also copy .torrent files to: {0}." msgstr "您也可以将.torrent文件复制到: {0}." -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2055 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2083 msgid "Removing a .torrent will cause it to stop." -msgstr "删除种子文件将导致该下载任务中止。" +msgstr "移除一个种子文件 (.torrent) 将导致它中止。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2068 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2096 msgid "Create Torrent" msgstr "创建种子" #. out.write("From file:
\n"); -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2071 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2099 msgid "Data to seed" msgstr "做种数据" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2075 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 #, java-format msgid "File or directory to seed (full path or within the directory {0} )" msgstr "要做种的文件或目录(完整路径或包含在 {0} 目录中)" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2078 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2323 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2106 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2361 msgid "Trackers" msgstr "Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2080 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2108 msgid "Primary" msgstr "主 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2082 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2110 msgid "Alternates" msgstr "备选 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2085 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2113 msgid "Create torrent" msgstr "创建种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2103 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2131 msgid "none" msgstr "无" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2140 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2169 msgid "Data directory" msgstr "数据文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2144 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 msgid "Files readable by all" msgstr "文件对所有人可读" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2148 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2178 msgid "If checked, other users may access the downloaded files" msgstr "选中后,其他用户可以访问您下载的文件。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2152 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2182 msgid "Auto start torrents" msgstr "自动开始种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2156 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2186 msgid "If checked, automatically start torrents that are added" msgstr "选中后Snark将自动启动已添加的所有种子。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2160 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2190 +msgid "Smart torrent sorting" +msgstr "智能种子排序" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2194 +msgid "If checked, ignore words such as 'the' when sorting" +msgstr "如果选中,排序时忽略诸如 'the' 的单词" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2198 msgid "Theme" msgstr "主题" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2174 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2212 msgid "Refresh time" msgstr "刷新时间" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2187 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 msgid "Never" msgstr "从不" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2193 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2231 msgid "Startup delay" msgstr "启动延迟" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2195 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2233 msgid "minutes" msgstr "分" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2199 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 msgid "Page size" msgstr "页面容量" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2201 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2239 msgid "torrents" msgstr "种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2225 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2263 msgid "Total uploader limit" msgstr "限制总上传种子数为" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2228 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2266 msgid "peers" msgstr "用户" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2232 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2270 msgid "Up bandwidth limit" msgstr "上传带宽限制" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2235 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2273 msgid "Half available bandwidth recommended." msgstr "推荐设置为可用带宽的一半。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2237 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 msgid "View or change router bandwidth" msgstr "浏览或修改路由器带宽" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2241 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2279 msgid "Use open trackers also" msgstr "同时使用OpenTracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2245 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 msgid "" "If checked, announce torrents to open trackers as well as the tracker listed" " in the torrent file" msgstr "选择后在OpenTracker及种子文件中的Tracker上同时发布。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2249 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2287 msgid "Enable DHT" msgstr "启用 DHT" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2253 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2291 msgid "If checked, use DHT" msgstr "如果选中,则使用 DHT。" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2269 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2307 msgid "Inbound Settings" msgstr "入站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2275 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2313 msgid "Outbound Settings" msgstr "出站设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2283 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2321 msgid "I2CP host" msgstr "I2CP主机" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2288 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2326 msgid "I2CP port" msgstr "I2CP端口" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2303 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2341 msgid "I2CP options" msgstr "I2CP选项" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2308 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2346 msgid "Save configuration" msgstr "保存设置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2328 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2366 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3045 msgid "Name" msgstr "名称" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2330 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2368 msgid "Website URL" msgstr "网站 URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2332 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2370 msgid "Standard" msgstr "标准" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2334 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3066 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2372 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3172 msgid "Open" msgstr "打开" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2336 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2374 msgid "Private" msgstr "私有" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2338 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2376 msgid "Announce URL" msgstr "发布 URL" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2382 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2420 msgid "Add" msgstr "添加" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2425 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2463 #, java-format msgid "Invalid magnet URL {0}" msgstr "磁性链接 {0} 无效" #. * dummies for translation -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2433 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2471 #, java-format msgid "1 hop" msgid_plural "{0} hops" msgstr[0] "{0}跳" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2434 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2472 #, java-format msgid "1 tunnel" msgid_plural "{0} tunnels" msgstr[0] "{0}隧道" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2677 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2728 msgid "Torrent file" msgstr "Torrent文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2685 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2736 msgid "Data location" msgstr "数据位置" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2694 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2745 msgid "Info hash" msgstr "信息哈希" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2713 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2764 msgid "Primary Tracker" msgstr "主 Tracker" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2722 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2773 msgid "Tracker List" msgstr "Tracker 列表" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2747 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2798 msgid "Comment" msgstr "评论" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2757 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2812 msgid "Created" msgstr "已创建" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2768 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2823 msgid "Created By" msgstr "创建者" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2780 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2833 +msgid "Added" +msgstr "已添加" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 +msgid "Completed" +msgstr "已完成" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2854 msgid "Magnet link" msgstr "Magnet磁性链接" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2793 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2867 msgid "Private torrent" msgstr "私有种子" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2813 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2887 msgid "Completion" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2842 -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2968 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2916 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3074 msgid "Remaining" msgstr "剩余" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2852 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2926 msgid "Files" msgstr "文件" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2859 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2933 msgid "Pieces" msgstr "分块数量" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2865 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2939 msgid "Piece size" msgstr "分块大小" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2919 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2952 +msgid "Refresh page for results" +msgstr "刷新页面获取结果" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2964 +msgid "Force Recheck" +msgstr "强制重新检查" + +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3025 msgid "Directory" msgstr "文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2978 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3084 msgid "Priority" msgstr "优先级" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2990 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3096 msgid "Up to higher level directory" msgstr "上一层文件夹" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3024 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3130 msgid "Torrent not found?" msgstr "种子未找到" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3030 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3136 msgid "File not found in torrent?" msgstr "种子中没有发现文件?" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3043 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3149 msgid "complete" msgstr "完成" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3044 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3150 msgid "remaining" msgstr "剩余" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3090 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3196 msgid "High" msgstr "高" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3095 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3201 msgid "Normal" msgstr "普通" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3100 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3206 msgid "Skip" msgstr "跳过" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3110 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3216 msgid "Set all high" msgstr "设置所有为高" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3112 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3218 msgid "Set all normal" msgstr "设置所有为正常" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3114 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3220 msgid "Skip all" msgstr "忽略所有" -#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3115 +#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:3221 msgid "Save priorities" msgstr "保存优先级" diff --git a/apps/i2psnark/mime.properties b/apps/i2psnark/mime.properties index 6739efc49..8c884cfed 100644 --- a/apps/i2psnark/mime.properties +++ b/apps/i2psnark/mime.properties @@ -3,6 +3,7 @@ 7z = application/x-7z-compressed ape = audio/x-monkeys-audio bz2 = application/x-bzip2 +cue = application/x-cue dmg = application/apple-diskimage epub = application/epub+zip flac = audio/flac @@ -11,6 +12,7 @@ iso = application/x-iso9660-image m4a = audio/mp4a-latm m4b = audio/mp4a-latm m4v = video/x-m4v +mka = audio/x-matroska mkv = video/x-matroska mobi = application/x-mobipocket-ebook mp4 = video/mp4 @@ -31,3 +33,4 @@ war = application/java-archive webm = video/webm wma = audio/x-ms-wma wmv = video/x-ms-wmv +xz = application/x-xz diff --git a/apps/i2psnark/readme.txt.snark b/apps/i2psnark/readme-snark.txt similarity index 100% rename from apps/i2psnark/readme.txt.snark rename to apps/i2psnark/readme-snark.txt diff --git a/apps/i2psnark/readme-standalone.txt b/apps/i2psnark/readme-standalone.txt index 9bc1ddf66..ced04e941 100644 --- a/apps/i2psnark/readme-standalone.txt +++ b/apps/i2psnark/readme-standalone.txt @@ -1,6 +1,4 @@ -To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but -to run it with the web UI, run "launch-i2psnark". I2PSnark is -GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P -(http://www.i2p2.de/) within a webserver (such as the bundled Jetty from -http://jetty.mortbay.org/). For more information about I2PSnark, get in touch -with the folks at http://forum.i2p2.de/ +i2psnark is packaged as a webapp running in the router console. +Command line and standalone operation of i2psnark are not currently supported. +See http://trac.i2p2.i2p/ticket/1191 or http://trac.i2p2.de/ticket/1191 +for the status of restoring standalone support. diff --git a/apps/i2psnark/readme.txt b/apps/i2psnark/readme.txt index 3970e3cba..2680442fa 100644 --- a/apps/i2psnark/readme.txt +++ b/apps/i2psnark/readme.txt @@ -1,11 +1,9 @@ -This is an I2P port of snark [http://klomp.org/snark], a GPL'ed bittorrent client +This is i2psnark, an I2P port of snark http://klomp.org/snark/ , a GPLv2 bittorrent client. +It contains significant enhancements including a web UI and support for +multitorrent, magnet, PEX and DHT. -The build in tracker has been removed for simplicity. +i2psnark is packaged as a webapp running in the router console. -Example usage: - java -jar lib/i2psnark.jar myFile.torrent - -or, a more verbose setting: - java -jar lib/i2psnark.jar --eepproxy 127.0.0.1 4444 \ - --i2cp 127.0.0.1 7654 "inbound.length=2 outbound.length=2" \ - --debug 6 myFile.torrent +See http://i2p-projekt.i2p/en/docs/applications/bittorrent +or https://geti2p.net/en/docs/applications/bittorrent +for the specification of the protocols for bittorrent over I2P. diff --git a/apps/i2ptunnel/java/bundle-messages-proxy.sh b/apps/i2ptunnel/java/bundle-messages-proxy.sh index 6ee98f314..a777a5eed 100755 --- a/apps/i2ptunnel/java/bundle-messages-proxy.sh +++ b/apps/i2ptunnel/java/bundle-messages-proxy.sh @@ -25,12 +25,12 @@ then fi # on windows, one must specify the path of commnad find -# since windows has its own retarded version of find. +# since windows has its own version of find. if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/build/Proxy.java ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java" @@ -62,16 +62,16 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ \ + --keyword=_t \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2ptunnel/java/bundle-messages.sh b/apps/i2ptunnel/java/bundle-messages.sh index 9d38feebb..0b426cb4d 100755 --- a/apps/i2ptunnel/java/bundle-messages.sh +++ b/apps/i2ptunnel/java/bundle-messages.sh @@ -24,12 +24,12 @@ then fi # on windows, one must specify the path of commnad find -# since windows has its own retarded version of find. +# since windows has its own version of find. if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this # add ../java/ so the refs will work in the po file JPATHS="../java/src/net/i2p/i2ptunnel/web ../jsp/WEB-INF" @@ -61,16 +61,16 @@ do echo "Updating the $i file from the tags..." # extract strings from java and jsp files, and update messages.po files # translate calls must be one of the forms: - # _("foo") + # _t("foo") # _x("foo") - # intl._("foo") + # intl._t("foo") # intl.title("foo") # In a jsp, you must use a helper or handler that has the context set. # To start a new translation, copy the header from an old translation to the new .po file, # then ant distclean updater. find $JPATHS -name *.java > $TMPFILE xgettext -f $TMPFILE -F -L java --from-code=UTF-8 --add-comments\ - --keyword=_ --keyword=_x --keyword=intl._ --keyword=intl.title \ + --keyword=_t --keyword=_x --keyword=intl._ --keyword=intl.title \ -o ${i}t if [ $? -ne 0 ] then diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java index c802a9995..26c46e431 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java @@ -7,14 +7,13 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.TimeZone; -import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.util.Clock; import net.i2p.util.Log; import net.i2p.util.SimpleTimer2; +import net.i2p.util.SystemVersion; /** * Count how often something happens with a particular peer and all peers. @@ -57,9 +56,7 @@ class ConnThrottler { _log = log; // for logging _fmt = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); - String systemTimeZone = I2PAppContext.getGlobalContext().getProperty("i2p.systemTimeZone"); - if (systemTimeZone != null) - _fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + _fmt.setTimeZone(SystemVersion.getSystemTimeZone()); new Cleaner(); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java new file mode 100644 index 000000000..6f5a4c3a7 --- /dev/null +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/GunzipOutputStream.java @@ -0,0 +1,372 @@ +package net.i2p.i2ptunnel; + +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.zip.CRC32; +import java.util.zip.Inflater; +import java.util.zip.InflaterOutputStream; + +import net.i2p.data.DataHelper; + +/** + * Gunzip implementation per + * RFC 1952, reusing + * java's standard CRC32 and Inflater and InflaterOutputStream implementations. + * + * Note that the underlying InflaterOutputStream cannot be reused after close(), + * so we don't have a Reusable version of this. + * + * Modified from net.i2p.util.ResettableGZIPInputStream to use Java 6 InflaterOutputstream + * @since 0.9.21 + */ +class GunzipOutputStream extends InflaterOutputStream { + private static final int FOOTER_SIZE = 8; // CRC32 + ISIZE + private final CRC32 _crc32; + private final byte _buf1[] = new byte[1]; + private boolean _complete; + private final byte _footer[] = new byte[FOOTER_SIZE]; + private long _bytesReceived; + private long _bytesReceivedAtCompletion; + + private enum HeaderState { MB1, MB2, CF, MT0, MT1, MT2, MT3, EF, OS, FLAGS, + EH1, EH2, EHDATA, NAME, COMMENT, CRC1, CRC2, DONE } + private HeaderState _state = HeaderState.MB1; + private int _flags; + private int _extHdrToRead; + + /** + * Build a new Gunzip stream + */ + public GunzipOutputStream(OutputStream uncompressedStream) throws IOException { + super(uncompressedStream, new Inflater(true)); + _crc32 = new CRC32(); + } + + @Override + public void write(int b) throws IOException { + _buf1[0] = (byte) b; + write(_buf1, 0, 1); + } + + @Override + public void write(byte buf[]) throws IOException { + write(buf, 0, buf.length); + } + + @Override + public void write(byte buf[], int off, int len) throws IOException { + if (_complete) { + // shortcircuit so the inflater doesn't try to refill + // with the footer's data (which would fail, causing ZLIB err) + return; + } + boolean isFinished = inf.finished(); + for (int i = off; i < off + len; i++) { + if (!isFinished) { + if (_state != HeaderState.DONE) { + verifyHeader(buf[i]); + continue; + } + // ensure we call the same method variant so we don't depend on underlying implementation + super.write(buf, i, 1); + if (inf.finished()) { + isFinished = true; + _bytesReceivedAtCompletion = _bytesReceived; + } + } + _footer[(int) (_bytesReceived++ % FOOTER_SIZE)] = buf[i]; + if (isFinished) { + long footerSize = _bytesReceivedAtCompletion - _bytesReceived; + // could be at 7 or 8... + // we write the first byte of the footer to the Inflater if necessary... + // see comments in ResettableGZIPInputStream for details + if (footerSize >= FOOTER_SIZE - 1) { + try { + verifyFooter(); + inf.reset(); // so it doesn't bitch about missing data... + _complete = true; + return; + } catch (IOException ioe) { + // failed at 7, retry at 8 + if (footerSize == FOOTER_SIZE - 1 && i < off + len - 1) + continue; + _complete = true; + throw ioe; + } + } + } + } + } + + /** + * Inflater statistic + */ + public long getTotalRead() { + try { + return inf.getBytesRead(); + } catch (RuntimeException e) { + return 0; + } + } + + /** + * Inflater statistic + */ + public long getTotalExpanded() { + try { + return inf.getBytesWritten(); + } catch (RuntimeException e) { + // possible NPE in some implementations + return 0; + } + } + + /** + * Inflater statistic + */ + public long getRemaining() { + try { + return inf.getRemaining(); + } catch (RuntimeException e) { + // possible NPE in some implementations + return 0; + } + } + + /** + * Inflater statistic + */ + public boolean getFinished() { + try { + return inf.finished(); + } catch (RuntimeException e) { + // possible NPE in some implementations + return true; + } + } + + @Override + public void close() throws IOException { + _complete = true; + _state = HeaderState.DONE; + super.close(); + } + + @Override + public String toString() { + return "GOS read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished(); + } + + /** + * @throws IOException on CRC or length check fail + */ + private void verifyFooter() throws IOException { + int idx = (int) (_bytesReceivedAtCompletion % FOOTER_SIZE); + byte[] footer; + if (idx == 0) { + footer = _footer; + } else { + footer = new byte[FOOTER_SIZE]; + for (int i = 0; i < FOOTER_SIZE; i++) { + footer[i] = _footer[(int) ((_bytesReceivedAtCompletion + i) % FOOTER_SIZE)]; + } + } + + long actualSize = inf.getTotalOut(); + long expectedSize = DataHelper.fromLongLE(footer, 4, 4); + if (expectedSize != actualSize) + throw new IOException("gunzip expected " + expectedSize + " bytes, got " + actualSize); + + long actualCRC = _crc32.getValue(); + long expectedCRC = DataHelper.fromLongLE(footer, 0, 4); + if (expectedCRC != actualCRC) + throw new IOException("gunzip CRC fail expected 0x" + Long.toHexString(expectedCRC) + + " bytes, got 0x" + Long.toHexString(actualCRC)); + } + + /** + * Make sure the header is valid, throwing an IOException if it is bad. + * Pushes through the state machine, checking as we go. + * Call for each byte until HeaderState is DONE. + */ + private void verifyHeader(byte b) throws IOException { + int c = b & 0xff; + switch (_state) { + case MB1: + if (c != 0x1F) throw new IOException("First magic byte was wrong [" + c + "]"); + _state = HeaderState.MB2; + break; + + case MB2: + if (c != 0x8B) throw new IOException("Second magic byte was wrong [" + c + "]"); + _state = HeaderState.CF; + break; + + case CF: + if (c != 0x08) throw new IOException("Compression format is invalid [" + c + "]"); + _state = HeaderState.FLAGS; + break; + + case FLAGS: + _flags = c; + _state = HeaderState.MT0; + break; + + case MT0: + // ignore + _state = HeaderState.MT1; + break; + + case MT1: + // ignore + _state = HeaderState.MT2; + break; + + case MT2: + // ignore + _state = HeaderState.MT3; + break; + + case MT3: + // ignore + _state = HeaderState.EF; + break; + + case EF: + if ( (c != 0x00) && (c != 0x02) && (c != 0x04) ) + throw new IOException("Invalid extended flags [" + c + "]"); + _state = HeaderState.OS; + break; + + case OS: + // ignore + if (0 != (_flags & (1<<5))) + _state = HeaderState.EH1; + else if (0 != (_flags & (1<<4))) + _state = HeaderState.NAME; + else if (0 != (_flags & (1<<3))) + _state = HeaderState.COMMENT; + else if (0 != (_flags & (1<<6))) + _state = HeaderState.CRC1; + else + _state = HeaderState.DONE; + break; + + case EH1: + _extHdrToRead = c; + _state = HeaderState.EH2; + break; + + case EH2: + _extHdrToRead += (c << 8); + if (_extHdrToRead > 0) + _state = HeaderState.EHDATA; + else if (0 != (_flags & (1<<4))) + _state = HeaderState.NAME; + if (0 != (_flags & (1<<3))) + _state = HeaderState.COMMENT; + else if (0 != (_flags & (1<<6))) + _state = HeaderState.CRC1; + else + _state = HeaderState.DONE; + break; + + case EHDATA: + // ignore + if (--_extHdrToRead <= 0) { + if (0 != (_flags & (1<<4))) + _state = HeaderState.NAME; + if (0 != (_flags & (1<<3))) + _state = HeaderState.COMMENT; + else if (0 != (_flags & (1<<6))) + _state = HeaderState.CRC1; + else + _state = HeaderState.DONE; + } + break; + + case NAME: + // ignore + if (c == 0) { + if (0 != (_flags & (1<<3))) + _state = HeaderState.COMMENT; + else if (0 != (_flags & (1<<6))) + _state = HeaderState.CRC1; + else + _state = HeaderState.DONE; + } + break; + + case COMMENT: + // ignore + if (c == 0) { + if (0 != (_flags & (1<<6))) + _state = HeaderState.CRC1; + else + _state = HeaderState.DONE; + } + break; + + case CRC1: + // ignore + _state = HeaderState.CRC2; + break; + + case CRC2: + // ignore + _state = HeaderState.DONE; + break; + + case DONE: + default: + break; + } + } + +/**** + public static void main(String args[]) { + java.util.Random r = new java.util.Random(); + for (int i = 0; i < 1050; i++) { + byte[] b = new byte[i]; + r.nextBytes(b); + if (!test(b)) return; + } + for (int i = 1; i < 64*1024; i+= 29) { + byte[] b = new byte[i]; + r.nextBytes(b); + if (!test(b)) return; + } + } + + private static boolean test(byte[] b) { + int size = b.length; + try { + java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(size); + java.util.zip.GZIPOutputStream o = new java.util.zip.GZIPOutputStream(baos); + o.write(b); + o.finish(); + o.flush(); + byte compressed[] = baos.toByteArray(); + + java.io.ByteArrayOutputStream baos2 = new java.io.ByteArrayOutputStream(size); + GunzipOutputStream out = new GunzipOutputStream(baos2); + out.write(compressed); + byte rv[] = baos2.toByteArray(); + if (rv.length != b.length) + throw new RuntimeException("read length: " + rv.length + " expected: " + b.length); + + if (!net.i2p.data.DataHelper.eq(rv, 0, b, 0, b.length)) { + throw new RuntimeException("foo, read=" + rv.length); + } else { + System.out.println("match, w00t @ " + size); + return true; + } + } catch (Exception e) { + System.out.println("Error dealing with size=" + size + ": " + e.getMessage()); + e.printStackTrace(); + return false; + } + } +****/ +} diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java index c41c41a4e..2fc344a71 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java @@ -10,20 +10,14 @@ package net.i2p.i2ptunnel; import java.io.FilterOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; import java.util.Locale; -import java.util.concurrent.RejectedExecutionException; import net.i2p.I2PAppContext; import net.i2p.data.ByteArray; -import net.i2p.util.BigPipedInputStream; +import net.i2p.data.DataHelper; import net.i2p.util.ByteCache; -import net.i2p.util.I2PAppThread; import net.i2p.util.Log; -import net.i2p.util.ReusableGZIPInputStream; /** * This does the transparent gzip decompression on the client side. @@ -45,7 +39,10 @@ class HTTPResponseOutputStream extends FilterOutputStream { private final byte _buf1[]; protected boolean _gzip; protected long _dataExpected; + /** lower-case, trimmed */ protected String _contentType; + /** lower-case, trimmed */ + protected String _contentEncoding; private static final int CACHE_SIZE = 8*1024; private static final ByteCache _cache = ByteCache.getInstance(8, CACHE_SIZE); @@ -152,10 +149,12 @@ class HTTPResponseOutputStream extends FilterOutputStream { for (int i = 0; i < _headerBuffer.getValid(); i++) { if (isNL(_headerBuffer.getData()[i])) { if (lastEnd == -1) { - responseLine = new String(_headerBuffer.getData(), 0, i+1); // includes NL + responseLine = DataHelper.getUTF8(_headerBuffer.getData(), 0, i+1); // includes NL responseLine = filterResponseLine(responseLine); responseLine = (responseLine.trim() + "\r\n"); - out.write(responseLine.getBytes()); + if (_log.shouldLog(Log.INFO)) + _log.info("Response: " + responseLine.trim()); + out.write(DataHelper.getUTF8(responseLine)); } else { for (int j = lastEnd+1; j < i; j++) { if (_headerBuffer.getData()[j] == ':') { @@ -163,22 +162,22 @@ class HTTPResponseOutputStream extends FilterOutputStream { int valLen = i-(j+1); if ( (keyLen <= 0) || (valLen < 0) ) throw new IOException("Invalid header @ " + j); - String key = new String(_headerBuffer.getData(), lastEnd+1, keyLen); - String val = null; + String key = DataHelper.getUTF8(_headerBuffer.getData(), lastEnd+1, keyLen); + String val; if (valLen == 0) val = ""; else - val = new String(_headerBuffer.getData(), j+2, valLen).trim(); + val = DataHelper.getUTF8(_headerBuffer.getData(), j+2, valLen).trim(); if (_log.shouldLog(Log.INFO)) _log.info("Response header [" + key + "] = [" + val + "]"); String lcKey = key.toLowerCase(Locale.US); if ("connection".equals(lcKey)) { - out.write("Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Connection: close\r\n")); connectionSent = true; } else if ("proxy-connection".equals(lcKey)) { - out.write("Proxy-Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Proxy-Connection: close\r\n")); proxyConnectionSent = true; } else if ("content-encoding".equals(lcKey) && "x-i2p-gzip".equals(val.toLowerCase(Locale.US))) { _gzip = true; @@ -193,20 +192,24 @@ class HTTPResponseOutputStream extends FilterOutputStream { } catch (NumberFormatException nfe) {} } else if ("content-type".equals(lcKey)) { // save for compress decision on server side - _contentType = val; + _contentType = val.toLowerCase(Locale.US); + } else if ("content-encoding".equals(lcKey)) { + // save for compress decision on server side + _contentEncoding = val.toLowerCase(Locale.US); } else if ("set-cookie".equals(lcKey)) { String lcVal = val.toLowerCase(Locale.US); if (lcVal.contains("domain=b32.i2p") || - lcVal.contains("domain=.b32.i2p")) { - // Strip privacy-damaging "supercookie" for b32.i2p - // Let's presume the user agent ignores a cookie for "i2p" + lcVal.contains("domain=.b32.i2p") || + lcVal.contains("domain=i2p") || + lcVal.contains("domain=.i2p")) { + // Strip privacy-damaging "supercookies" for i2p and b32.i2p // See RFC 6265 and http://publicsuffix.org/ if (_log.shouldLog(Log.INFO)) _log.info("Stripping \"" + key + ": " + val + "\" from response "); break; } } - out.write((key.trim() + ": " + val.trim() + "\r\n").getBytes()); + out.write(DataHelper.getUTF8(key.trim() + ": " + val + "\r\n")); } break; } @@ -217,9 +220,9 @@ class HTTPResponseOutputStream extends FilterOutputStream { } if (!connectionSent) - out.write("Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Connection: close\r\n")); if (!proxyConnectionSent) - out.write("Proxy-Connection: close\r\n".getBytes()); + out.write(DataHelper.getASCII("Proxy-Connection: close\r\n")); finishHeaders(); @@ -240,100 +243,24 @@ class HTTPResponseOutputStream extends FilterOutputStream { protected boolean shouldCompress() { return _gzip; } protected void finishHeaders() throws IOException { - out.write("\r\n".getBytes()); // end of the headers + out.write(DataHelper.getASCII("\r\n")); // end of the headers } @Override public void close() throws IOException { - out.close(); + if (_log.shouldLog(Log.INFO)) + _log.info("Closing " + out + " threaded?? " + shouldCompress(), new Exception("I did it")); + synchronized(this) { + // synch with changing out field below + super.close(); + } } protected void beginProcessing() throws IOException { //out.flush(); - PipedInputStream pi = BigPipedInputStream.getInstance(); - PipedOutputStream po = new PipedOutputStream(pi); - Runnable r = new Pusher(pi, out); - out = po; - // TODO we should be able to do this inline somehow - TunnelControllerGroup tcg = TunnelControllerGroup.getInstance(); - if (tcg != null) { - // Run in the client thread pool, as there should be an unused thread - // there after the accept(). - // Overridden in I2PTunnelHTTPServer, where it does not use the client pool. - try { - tcg.getClientExecutor().execute(r); - } catch (RejectedExecutionException ree) { - // shouldn't happen - throw ree; - } - } else { - // Fallback in case TCG.getInstance() is null, never instantiated - // and we were not started by TCG. - // Maybe a plugin loaded before TCG? Should be rare. - Thread t = new I2PAppThread(r, "Pusher"); - t.start(); - } - } - - private class Pusher implements Runnable { - private final InputStream _inRaw; - private final OutputStream _out; - - public Pusher(InputStream in, OutputStream out) { - _inRaw = in; - _out = out; - } - - public void run() { - ReusableGZIPInputStream _in = ReusableGZIPInputStream.acquire(); - long written = 0; - ByteArray ba = null; - try { - // blocking - _in.initialize(_inRaw); - ba = _cache.acquire(); - byte buf[] = ba.getData(); - int read = -1; - while ( (read = _in.read(buf)) != -1) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Read " + read + " and writing it to the browser/streams"); - _out.write(buf, 0, read); - _out.flush(); - written += read; - } - if (_log.shouldLog(Log.INFO)) - _log.info("Decompressed: " + written + ", " + _in.getTotalRead() + "/" + _in.getTotalExpanded()); - } catch (IOException ioe) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Error decompressing: " + written + ", " + _in.getTotalRead() + "/" + _in.getTotalExpanded(), ioe); - } catch (OutOfMemoryError oom) { - _log.error("OOM in HTTP Decompressor", oom); - } finally { - if (_log.shouldInfo()) - _log.info("After decompression, written=" + written + - " read=" + _in.getTotalRead() - + ", expanded=" + _in.getTotalExpanded() + ", remaining=" + _in.getRemaining() - + ", finished=" + _in.getFinished()); - if (ba != null) - _cache.release(ba); - if (_out != null) try { - _out.close(); - } catch (IOException ioe) {} - try { - _in.close(); - } catch (IOException ioe) {} - } - - double compressed = _in.getTotalRead(); - double expanded = _in.getTotalExpanded(); - ReusableGZIPInputStream.release(_in); - if (compressed > 0 && expanded > 0) { - // only update the stats if we did something - double ratio = compressed/expanded; - _context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio)); - _context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed); - _context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded); - } + OutputStream po = new GunzipOutputStream(out); + synchronized(this) { + out = po; } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java index 621e11a29..e8680e3d3 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java @@ -35,7 +35,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -1605,7 +1604,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { private void runRun(String args[], Logging l) { if (args.length == 1) { try { - BufferedReader br = new BufferedReader(new FileReader(args[0])); + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(args[0]), "UTF-8")); String line; while ((line = br.readLine()) != null) { runCommand(line, l); @@ -1874,7 +1873,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging { try { result.fromByteArray(content); return result; - } catch (Exception ex) { + } catch (RuntimeException ex) { if (log.shouldLog(Log.INFO)) log.info("File is not a binary destination - trying base64"); try { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java index 93785e326..4b1284cfe 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClient.java @@ -3,6 +3,7 @@ */ package net.i2p.i2ptunnel; +import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import java.util.ArrayList; @@ -10,6 +11,7 @@ import java.util.List; import java.util.Properties; import java.util.StringTokenizer; +import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketAddress; import net.i2p.data.Destination; @@ -122,7 +124,17 @@ public class I2PTunnelClient extends I2PTunnelClientBase { // we are called from an unlimited thread pool, so run inline //t.start(); t.run(); - } catch (Exception ex) { + } catch (IOException ex) { + if (_log.shouldLog(Log.INFO)) + _log.info("Error connecting", ex); + //l.log("Error connecting: " + ex.getMessage()); + closeSocket(s); + if (i2ps != null) { + synchronized (sockLock) { + mySockets.remove(sockLock); + } + } + } catch (I2PException ex) { if (_log.shouldLog(Log.INFO)) _log.info("Error connecting", ex); //l.log("Error connecting: " + ex.getMessage()); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index a0a68aa43..32f8213c6 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -25,12 +25,14 @@ import javax.net.ssl.SSLServerSocketFactory; import net.i2p.I2PAppContext; import net.i2p.I2PException; +import net.i2p.client.I2PClient; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManagerFactory; import net.i2p.client.streaming.I2PSocketOptions; +import net.i2p.crypto.SigType; import net.i2p.data.Destination; import net.i2p.util.EventDispatcher; import net.i2p.util.I2PAppThread; @@ -77,11 +79,24 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna private volatile ThreadPoolExecutor _executor; + /** this is ONLY for shared clients */ + private static I2PSocketManager socketManager; + + /** + * Only destroy and replace a static shared client socket manager if it's been connected before + * @since 0.9.20 + */ + private enum SocketManagerState { INIT, CONNECTED } + private static SocketManagerState _socketManagerState = SocketManagerState.INIT; + public static final String PROP_USE_SSL = I2PTunnelServer.PROP_USE_SSL; /** - * This constructor always starts the tunnel (ignoring the i2cp.delayOpen option). - * It is used to add a client to an existing socket manager. + * This constructor is used to add a client to an existing socket manager. + *

+ * As of 0.9.21 this does NOT open the local socket. You MUST call + * {@link #startRunning()} for that. The local socket will be opened + * immediately (ignoring the i2cp.delayOpen option). * * @param localPort if 0, use any port, get actual port selected with getLocalPort() * @param sktMgr the existing socket manager @@ -98,20 +113,19 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna this.l = l; _ownDest = true; // == ! shared client _context = tunnel.getContext(); - _context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.closeNoBacklog", "How many pending sockets remain when it was removed prior to backlog timeout?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.manageTime", "How long it takes to accept a socket and fire it into an i2ptunnel runner (or queue it for the pool)?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + initStats(); _log = _context.logManager().getLog(getClass()); - - startup(); } /** * The main constructor. - * - * As of 0.9.20 this is fast, and does NOT connect the manager to the router, + *

+ * As of 0.9.21 this is fast, and does NOT connect the manager to the router, * or open the local socket. You MUST call startRunning() for that. + *

+ * (0.9.20 claimed to be fast, but due to a bug it DID connect the manager + * to the router. It did NOT open the local socket however, so it was still + * necessary to call startRunning() for that.) * * @param localPort if 0, use any port, get actual port selected with getLocalPort() * @throws IllegalArgumentException if the I2CP configuration is b0rked so @@ -125,9 +139,13 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna /** * Use this to build a client with a persistent private key. - * - * As of 0.9.20 this is fast, and does NOT connect the manager to the router, + *

+ * As of 0.9.21 this is fast, and does NOT connect the manager to the router, * or open the local socket. You MUST call startRunning() for that. + *

+ * (0.9.20 claimed to be fast, but due to a bug it DID connect the manager + * to the router. It did NOT open the local socket however, so it was still + * necessary to call startRunning() for that.) * * @param localPort if 0, use any port, get actual port selected with getLocalPort() * @param pkf Path to the private key file, or null to generate a transient key @@ -146,10 +164,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna _handlerName = handlerName; _context = tunnel.getContext(); - _context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.closeNoBacklog", "How many pending sockets remain when it was removed prior to backlog timeout?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.manageTime", "How long it takes to accept a socket and fire it into an i2ptunnel runner (or queue it for the pool)?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); - _context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + initStats(); _log = _context.logManager().getLog(getClass()); // normalize path so we can find it @@ -168,29 +183,15 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true"); if (tunnel.getClientOptions().getProperty("i2p.streaming.answerPings") == null) tunnel.getClientOptions().setProperty("i2p.streaming.answerPings", "false"); - - boolean openNow = !Boolean.parseBoolean(tunnel.getClientOptions().getProperty("i2cp.delayOpen")); - if (openNow) { - while (sockMgr == null) { - verifySocketManager(); - if (sockMgr == null) { - _log.error("Unable to connect to router and build tunnels for " + handlerName); - // FIXME there is a loop in buildSocketManager(), do we really need another one here? - // no matter, buildSocketManager() now throws an IllegalArgumentException - try { Thread.sleep(10*1000); } catch (InterruptedException ie) {} - } - } - // can't be null unless we limit the loop above - //if (sockMgr == null) { - // l.log("Invalid I2CP configuration"); - // throw new IllegalArgumentException("Socket manager could not be created"); - //} - l.log("Tunnels ready for client: " + handlerName); - - } // else delay creating session until createI2PSocket() is called - } - + + private void initStats() { + _context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("i2ptunnel.client.closeNoBacklog", "How many pending sockets remain when it was removed prior to backlog timeout?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("i2ptunnel.client.manageTime", "How long it takes to accept a socket and fire it into an i2ptunnel runner (or queue it for the pool)?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + _context.statManager().createRateStat("i2ptunnel.client.buildRunTime", "How long it takes to run a queued socket into an i2ptunnel runner?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 }); + } + /** * Create the manager if it doesn't exist, AND connect it to the router and * build tunnels. @@ -239,10 +240,6 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna connectManager(); } - /** this is ONLY for shared clients */ - private static I2PSocketManager socketManager; - - /** * This is ONLY for shared clients. * As of 0.9.20 this is fast, and does NOT connect the manager to the router. @@ -283,14 +280,19 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna Log _log = tunnel.getContext().logManager().getLog(I2PTunnelClientBase.class); if (socketManager != null && !socketManager.isDestroyed()) { I2PSession s = socketManager.getSession(); - if (s.isClosed()) { + if (s.isClosed() && _socketManagerState != SocketManagerState.INIT) { if (_log.shouldLog(Log.INFO)) _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since the old one closed [s=" + s + "]"); tunnel.removeSession(s); // make sure the old one is closed socketManager.destroySocketManager(); + _socketManagerState = SocketManagerState.INIT; // We could be here a LONG time, holding the lock socketManager = buildSocketManager(tunnel, pkf); + // FIXME may not be the right place for this + I2PSession sub = addSubsession(tunnel); + if (sub != null && _log.shouldLog(Log.WARN)) + _log.warn("Added subsession " + sub); } else { if (_log.shouldLog(Log.INFO)) _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Not building a new socket manager since the old one is open [s=" + s + "]"); @@ -303,10 +305,41 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna if (_log.shouldLog(Log.INFO)) _log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Building a new socket manager since there is no other one"); socketManager = buildSocketManager(tunnel, pkf); + I2PSession sub = addSubsession(tunnel); + if (sub != null && _log.shouldLog(Log.WARN)) + _log.warn("Added subsession " + sub); } return socketManager; } + /** + * Add a subsession to a shared client if necessary. + * + * @since 0.9.20 + */ + protected static synchronized I2PSession addSubsession(I2PTunnel tunnel) { + I2PSession sess = socketManager.getSession(); + if (sess.getMyDestination().getSigType() == SigType.DSA_SHA1) + return null; + Properties props = new Properties(); + props.putAll(tunnel.getClientOptions()); + String name = props.getProperty("inbound.nickname"); + if (name != null) + props.setProperty("inbound.nickname", name + " (DSA)"); + name = props.getProperty("outbound.nickname"); + if (name != null) + props.setProperty("outbound.nickname", name + " (DSA)"); + props.setProperty(I2PClient.PROP_SIGTYPE, "DSA_SHA1"); + try { + return socketManager.addSubsession(null, props); + } catch (I2PSessionException ise) { + Log log = tunnel.getContext().logManager().getLog(I2PTunnelClientBase.class); + if (log.shouldLog(Log.WARN)) + log.warn("Failed to add subssession", ise); + return null; + } + } + /** * Kill the shared client, so that on restart in android * we won't latch onto the old one @@ -424,6 +457,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna while (sockMgr.getSession().isClosed()) { try { sockMgr.getSession().connect(); + synchronized(I2PTunnelClientBase.class) { + if (sockMgr == socketManager) + _socketManagerState = SocketManagerState.CONNECTED; + } } catch (I2PSessionException ise) { // shadows instance _log Log _log = getTunnel().getContext().logManager().getLog(I2PTunnelClientBase.class); @@ -525,7 +562,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna if (open && listenerReady) { boolean openNow = !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty("i2cp.delayOpen")); - if (openNow) + if (openNow || chained) l.log("Client ready, listening on " + getTunnel().listenHost + ':' + localPort); else l.log("Client ready, listening on " + getTunnel().listenHost + ':' + localPort + ", delaying tunnel open until required"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java index bb7a763fe..0f5b5dcce 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java @@ -240,7 +240,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R } if (user != null && pw != null) { newRequest.append("Proxy-Authorization: Basic ") - .append(Base64.encode((user + ':' + pw).getBytes(), true)) // true = use standard alphabet + .append(Base64.encode(DataHelper.getUTF8(user + ':' + pw), true)) // true = use standard alphabet .append("\r\n"); } } @@ -265,7 +265,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R else _log.warn(getPrefix(requestId) + "Auth required, sending 407"); } - out.write(getAuthError(result == AuthResult.AUTH_STALE).getBytes()); + out.write(DataHelper.getASCII(getAuthError(result == AuthResult.AUTH_STALE))); s.close(); return; } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java index 74fcaccb1..19ebd8b7c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java @@ -414,7 +414,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn _log.debug(getPrefix(requestId) + "First line [" + line + "]"); } - String[] params = line.split(" ", 3); + String[] params = DataHelper.split(line, " ", 3); if(params.length != 3) { break; } @@ -631,8 +631,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String header = getErrorPage("ahelper-notfound", ERR_AHELPER_NOTFOUND); try { out.write(header.getBytes("UTF-8")); - out.write(("

" + _("This seems to be a bad destination:") + " " + ahelperKey + " " + - _("i2paddresshelper cannot help you with a destination like that!") + + out.write(("

" + _t("This seems to be a bad destination:") + " " + ahelperKey + " " + + _t("i2paddresshelper cannot help you with a destination like that!") + "

").getBytes("UTF-8")); writeFooter(out); reader.drain(); @@ -706,7 +706,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String conflictURL = conflictURI.toASCIIString(); String header = getErrorPage("ahelper-conflict", ERR_AHELPER_CONFLICT); out.write(header.getBytes("UTF-8")); - out.write(_("To visit the destination in your host database, click here. To visit the conflicting addresshelper destination, click here.", + out.write(_t("To visit the destination in your host database, click here. To visit the conflicting addresshelper destination, click here.", trustedURL, conflictURL).getBytes("UTF-8")); out.write("

".getBytes("UTF-8")); writeFooter(out); @@ -881,7 +881,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn } else if(lowercaseLine.startsWith("accept")) { // strip the accept-blah headers, as they vary dramatically from // browser to browser - if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { + // But allow Accept-Encoding: gzip, deflate + if(!lowercaseLine.startsWith("accept-encoding: ") && + !Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) { line = null; continue; } @@ -933,8 +935,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn // according to rfc2616 s14.3, this *should* force identity, even if // an explicit q=0 for gzip doesn't. tested against orion.i2p, and it // seems to work. - if(!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) - newRequest.append("Accept-Encoding: \r\n"); + //if (!Boolean.parseBoolean(getTunnel().getClientOptions().getProperty(PROP_ACCEPT))) + // newRequest.append("Accept-Encoding: \r\n"); if (!usingInternalOutproxy) newRequest.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n"); } @@ -1116,7 +1118,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn header = getErrorPage("dnfb", ERR_DESTINATION_UNKNOWN); } else if(destination.length() == 60 && destination.toLowerCase(Locale.US).endsWith(".b32.i2p")) { header = getErrorPage("nols", ERR_DESTINATION_UNKNOWN); - extraMessage = _("Destination lease set not found"); + extraMessage = _t("Destination lease set not found"); } else { header = getErrorPage("dnfh", ERR_DESTINATION_UNKNOWN); jumpServers = getTunnel().getClientOptions().getProperty(PROP_JUMP_SERVERS); @@ -1250,7 +1252,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn String s = getTunnel().getClientOptions().getProperty(PROP_SSL_OUTPROXIES); if (s == null) return null; - String[] p = s.split("[,; \r\n\t]"); + String[] p = DataHelper.split(s, "[,; \r\n\t]"); if (p.length == 0) return null; // todo doesn't check for "" @@ -1268,31 +1270,31 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn Writer out = new BufferedWriter(new OutputStreamWriter(outs, "UTF-8")); String header = getErrorPage("ahelper-new", ERR_AHELPER_NEW); out.write(header); - out.write("\n"); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java index 16bccdfaf..f26b182a0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigHomeHandler.java @@ -18,15 +18,15 @@ public class ConfigHomeHandler extends FormHandler { protected void processForm() { if (_action == null) return; String group = getJettyString("group"); - boolean deleting = _action.equals(_("Delete selected")); - boolean adding = _action.equals(_("Add item")); - boolean restoring = _action.equals(_("Restore defaults")); - if (_action.equals(_("Save")) && "0".equals(group)) { + boolean deleting = _action.equals(_t("Delete selected")); + boolean adding = _action.equals(_t("Add item")); + boolean restoring = _action.equals(_t("Restore defaults")); + if (_action.equals(_t("Save")) && "0".equals(group)) { boolean old = _context.getBooleanProperty(HomeHelper.PROP_OLDHOME); boolean nnew = getJettyString("oldHome") != null; if (old != nnew) { _context.router().saveConfig(HomeHelper.PROP_OLDHOME, "" + nnew); - addFormNotice(_("Home page changed")); + addFormNotice(_t("Home page changed")); } } else if (adding || deleting || restoring) { String prop; @@ -48,7 +48,7 @@ public class ConfigHomeHandler extends FormHandler { //_context.router().saveConfig(prop, dflt); // remove config so user will see updates _context.router().saveConfig(prop, null); - addFormNotice(_("Restored default settings")); + addFormNotice(_t("Restored default settings")); return; } String config = _context.getProperty(prop, dflt); @@ -58,18 +58,21 @@ public class ConfigHomeHandler extends FormHandler { else apps = HomeHelper.buildApps(_context, config); if (adding) { - String name = getJettyString("name"); + String name = getJettyString("nofilter_name"); if (name == null || name.length() <= 0) { - addFormError(_("No name entered")); + addFormError(_t("No name entered")); return; } - String url = getJettyString("url"); + String url = getJettyString("nofilter_url"); if (url == null || url.length() <= 0) { - addFormError(_("No URL entered")); + addFormError(_t("No URL entered")); return; } - name = DataHelper.escapeHTML(name).replace(",", ","); // HomeHelper.S - url = DataHelper.escapeHTML(url).replace(",", ","); + // these would get double-escaped so we can't do it this way... + //name = DataHelper.escapeHTML(name).replace(",", ","); + //url = DataHelper.escapeHTML(url).replace(",", ","); + name = name.replace(",", "."); + url = url.replace(",", "."); // fail HomeHelper.App app = null; if ("1".equals(group)) app = new HomeHelper.App(name, "", url, "/themes/console/images/eepsite.png"); @@ -78,7 +81,7 @@ public class ConfigHomeHandler extends FormHandler { else app = new HomeHelper.App(name, "", url, "/themes/console/images/question.png"); apps.add(app); - addFormNotice(_("Added") + ": " + app.name); + addFormNotice(_t("Added") + ": " + app.name); } else { // deleting Set toDelete = new HashSet(); @@ -95,13 +98,13 @@ public class ConfigHomeHandler extends FormHandler { HomeHelper.App app = iter.next(); if (toDelete.contains(app.name)) { iter.remove(); - addFormNotice(_("Removed") + ": " + app.name); + addFormNotice(_t("Removed") + ": " + app.name); } } } HomeHelper.saveApps(_context, prop, apps, !("3".equals(group))); } else { - //addFormError(_("Unsupported")); + //addFormError(_t("Unsupported")); } } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java index 97b8cb3a6..b5930895b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHandler.java @@ -15,12 +15,12 @@ public class ConfigKeyringHandler extends FormHandler { @Override protected void processForm() { if (_action == null) return; - boolean adding = _action.equals(_("Add key")); - if (adding || _action.equals(_("Delete key"))) { + boolean adding = _action.equals(_t("Add key")); + if (adding || _action.equals(_t("Delete key"))) { if (_peer == null) - addFormError(_("You must enter a destination")); + addFormError(_t("You must enter a destination")); if (_key == null && adding) - addFormError(_("You must enter a key")); + addFormError(_t("You must enter a key")); if (_peer == null || (_key == null && adding)) return; Hash h = ConvertToHash.getHash(_peer); @@ -31,22 +31,22 @@ public class ConfigKeyringHandler extends FormHandler { } catch (DataFormatException dfe) {} if (h != null && h.getData() != null && sk.getData() != null) { _context.keyRing().put(h, sk); - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("added to keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("added to keyring")); } else { - addFormError(_("Invalid destination or key")); + addFormError(_t("Invalid destination or key")); } } else { // Delete if (h != null && h.getData() != null) { if (_context.keyRing().remove(h) != null) - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("removed from keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("removed from keyring")); else - addFormNotice(_("Key for") + " " + h.toBase64() + " " + _("not found in keyring")); + addFormNotice(_t("Key for") + " " + h.toBase64() + " " + _t("not found in keyring")); } else { - addFormError(_("Invalid destination")); + addFormError(_t("Invalid destination")); } } } else { - //addFormError(_("Unsupported")); + //addFormError(_t("Unsupported")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java index 8c147fcdd..cf0a5be4b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java @@ -1,20 +1,19 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; public class ConfigKeyringHelper extends HelperBase { public ConfigKeyringHelper() {} public String getSummary() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); + StringWriter sw = new StringWriter(4*1024); try { - _context.keyRing().renderStatusHTML(new OutputStreamWriter(baos)); + _context.keyRing().renderStatusHTML(sw); } catch (IOException ioe) { ioe.printStackTrace(); } - return new String(baos.toByteArray()); + return sw.toString(); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java index e98528a96..f574ab85a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHandler.java @@ -4,6 +4,9 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.Properties; +import net.i2p.data.DataHelper; +import net.i2p.util.LogManager; + /** * Handler to deal with form submissions from the logging config form and act * upon the values. @@ -74,12 +77,12 @@ public class ConfigLoggingHandler extends FormHandler { try { Properties props = new Properties(); if (_levels != null) - props.load(new ByteArrayInputStream(_levels.getBytes())); + props.load(new ByteArrayInputStream(DataHelper.getUTF8(_levels))); if (_newLogClass != null) props.setProperty(_newLogClass, _newLogLevel); _context.logManager().setLimits(props); shouldSave = true; - addFormNotice(_("Log overrides updated")); + addFormNotice(_t("Log overrides updated")); } catch (IOException ioe) { // shouldn't ever happen (BAIS shouldnt cause an IOE) _context.logManager().getLog(ConfigLoggingHandler.class).error("Error reading from the props?", ioe); @@ -113,7 +116,7 @@ public class ConfigLoggingHandler extends FormHandler { } if (_fileSize != null) { - int newBytes = _context.logManager().getFileSize(_fileSize); + int newBytes = LogManager.getFileSize(_fileSize); int oldBytes = _context.logManager().getFileSize(); if (newBytes > 0) { if (oldBytes != newBytes) { @@ -160,7 +163,7 @@ public class ConfigLoggingHandler extends FormHandler { boolean saved = _context.logManager().saveConfig(); if (saved) - addFormNotice(_("Log configuration saved")); + addFormNotice(_t("Log configuration saved")); else addFormError("Error saving the configuration (applied but not saved) - please see the error logs"); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java index aa064e627..1a9354a2d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java @@ -42,9 +42,9 @@ public class ConfigLoggingHelper extends HelperBase { buf.append(prefix).append('=').append(level).append('\n'); } buf.append("
\n"); - buf.append("").append(_("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN")).append("
"); - buf.append("").append(_("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN")).append("
"); - buf.append("").append(_("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT")).append("\n"); + buf.append("").append(_t("Add additional logging statements above. Example: net.i2p.router.tunnel=WARN")).append("
"); + buf.append("").append(_t("Or put entries in the logger.config file. Example: logger.record.net.i2p.router.tunnel=WARN")).append("
"); + buf.append("").append(_t("Valid levels are DEBUG, INFO, WARN, ERROR, CRIT")).append("\n"); /**** // this is too big and ugly @@ -78,11 +78,11 @@ public class ConfigLoggingHelper extends HelperBase { buf.append("\n"); + buf.append('>').append(_t(l)).append("\n"); } if (showRemove) - buf.append(""); + buf.append(""); buf.append("\n"); return buf.toString(); } @@ -119,7 +119,7 @@ public class ConfigLoggingHelper extends HelperBase { StringBuilder buf = new StringBuilder(65536); buf.append("
"); + buf.append(""); else if (in.getLength() <= 1 || in.getLength() + in.getLengthVariance() <= 1 || out.getLength() <= 1 || out.getLength() + out.getLengthVariance() <= 1) - buf.append(""); + buf.append(""); if (in.getLength() + Math.abs(in.getLengthVariance()) >= WARN_LENGTH || out.getLength() + Math.abs(out.getLengthVariance()) >= WARN_LENGTH) - buf.append(""); + buf.append(""); if (in.getTotalQuantity() >= WARN_QUANTITY || out.getTotalQuantity() >= WARN_QUANTITY) - buf.append(""); + buf.append(""); - buf.append("\n"); + buf.append("\n"); // buf.append("\n"); // tunnel depth int maxLength = advanced ? MAX_ADVANCED_LENGTH : MAX_LENGTH; - buf.append("\n"); + buf.append("\n"); buf.append("\n"); // tunnel depth variance - buf.append("\n"); + buf.append("\n"); buf.append("\n"); + buf.append("\n"); buf.append("\n"); + buf.append("\n"); buf.append("\n" + + buf.append("\n" + "\n" + + buf.append("\n" + "
" + _("Host") + + out.write("\n"); try { String b32 = Base32.encode(SHA256Generator.getInstance().calculateHash(Base64.decode(ahelperKey)).getData()); - out.write("" + + out.write("" + ""); } catch(Exception e) { } - out.write("
" + _t("Host") + "" + destination + "
" + _("Base 32") + "
" + _t("Base 32") + "" + b32 + ".b32.i2p
" + _("Destination") + "" + + out.write("
" + _t("Destination") + "" + "
\n" + "
" + // FIXME if there is a query remaining it is lost "
" + - "" + + "" + "
\n
" + "\n" + "\n" + "\n" + "
\n"); + _t("Save {0} to router address book and continue to website", destination) + "
\n"); if(_context.namingService().getName().equals("BlockfileNamingService")) { // only blockfile supports multiple books - out.write("

\n"); - out.write("\n"); + out.write("

\n"); + out.write("\n"); } // Firefox (and others?) don't send referer to meta refresh target, which is // what the jump servers use, so this isn't that useful. diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java index 5824f1fc3..e68e38d6b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java @@ -285,7 +285,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem // We send Accept-Charset: UTF-8 in the 407 so hopefully it comes back that way inside the B64 ? try { String dec = new String(decoded, "UTF-8"); - String[] parts = dec.split(":"); + String[] parts = DataHelper.split(dec, ":"); String user = parts[0]; String pw = parts[1]; // first try pw for that user @@ -684,7 +684,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem out.write(""); if (usingWWWProxy) { out.write("

"); - out.write(_("HTTP Outproxy")); + out.write(_t("HTTP Outproxy")); out.write(": " + wwwProxy); } if (extraMessage != null) { @@ -723,7 +723,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem if (first) { first = false; out.write("

"); - out.write(_("Click a link below for an address helper from a jump service")); + out.write(_t("Click a link below for an address helper from a jump service")); out.write("

\n"); } else { out.write("
"); @@ -733,7 +733,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem out.write(uri); out.write("\">"); // Translators: parameter is a host name - out.write(_("{0} jump service", jumphost)); + out.write(_t("{0} jump service", jumphost)); out.write("\n"); } } @@ -778,7 +778,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * Translate * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key) { + protected String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } @@ -787,7 +787,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * {0} * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key, Object o) { + protected String _t(String key, Object o) { return Translate.getString(key, o, _context, BUNDLE_NAME); } @@ -796,7 +796,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem * {0} and {1} * @since 0.9.14 moved from I2PTunnelHTTPClient */ - protected String _(String key, Object o, Object o2) { + protected String _t(String key, Object o, Object o2) { return Translate.getString(key, o, o2, _context, BUNDLE_NAME); } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java index 51425cbd0..656b2c0f9 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientRunner.java @@ -33,6 +33,9 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner { super(s, i2ps, slock, initialI2PData, null, sockList, onFail); } + /** + * Only call once! + */ @Override protected OutputStream getSocketOut() throws IOException { OutputStream raw = super.getSocketOut(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java index 4b06ae078..157a94011 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java @@ -419,12 +419,14 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { setEntry(headers, "Connection", "close"); // we keep the enc sent by the browser before clobbering it, since it may have // been x-i2p-gzip - String enc = getEntryOrNull(headers, "Accept-encoding"); - String altEnc = getEntryOrNull(headers, "X-Accept-encoding"); + String enc = getEntryOrNull(headers, "Accept-Encoding"); + String altEnc = getEntryOrNull(headers, "X-Accept-Encoding"); // according to rfc2616 s14.3, this *should* force identity, even if // "identity;q=1, *;q=0" didn't. - setEntry(headers, "Accept-encoding", ""); + // as of 0.9.23, the client passes this header through, and we do the same, + // so if the server and browser can do the compression/decompression, we don't have to + //setEntry(headers, "Accept-Encoding", ""); socket.setReadTimeout(readTimeout); Socket s = getSocket(socket.getPeerDestination().calculateHash(), socket.getLocalPort()); @@ -432,7 +434,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { // instead of i2ptunnelrunner, use something that reads the HTTP // request from the socket, modifies the headers, sends the request to the // server, reads the response headers, rewriting to include Content-encoding: x-i2p-gzip - // if it was one of the Accept-encoding: values, and gzip the payload + // if it was one of the Accept-Encoding: values, and gzip the payload boolean allowGZIP = true; String val = opts.getProperty("i2ptunnel.gzip"); if ( (val != null) && (!Boolean.parseBoolean(val)) ) @@ -443,7 +445,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { boolean useGZIP = alt || ( (enc != null) && (enc.indexOf("x-i2p-gzip") >= 0) ); // Don't pass this on, outproxies should strip so I2P traffic isn't so obvious but they probably don't if (alt) - headers.remove("X-Accept-encoding"); + headers.remove("X-Accept-Encoding"); String modifiedHeader = formatHeaders(headers, command); if (_log.shouldLog(Log.DEBUG)) @@ -453,7 +455,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { if (allowGZIP && useGZIP) { t = new CompressedRequestor(s, socket, modifiedHeader, getTunnel().getContext(), _log); } else { - t = new I2PTunnelRunner(s, socket, slock, null, modifiedHeader.getBytes(), + t = new I2PTunnelRunner(s, socket, slock, null, DataHelper.getUTF8(modifiedHeader), null, (I2PTunnelRunner.FailCallback) null); } // run in the unlimited client pool @@ -535,7 +537,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { if (_log.shouldLog(Log.INFO)) _log.info("request headers: " + _headers); - serverout.write(_headers.getBytes()); + serverout.write(DataHelper.getUTF8(_headers)); browserin = _browser.getInputStream(); // Don't spin off a thread for this except for POSTs // beware interference with Shoutcast, etc.? @@ -573,7 +575,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { Map> headers = readHeaders(null, serverin, command, SERVER_SKIPHEADERS, _ctx); String modifiedHeaders = formatHeaders(headers, command); - compressedOut.write(modifiedHeaders.getBytes()); + compressedOut.write(DataHelper.getUTF8(modifiedHeaders)); Sender s = new Sender(compressedOut, serverin, "server: server to browser", _log); if (_log.shouldLog(Log.INFO)) @@ -662,7 +664,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { */ @Override protected String filterResponseLine(String line) { - String[] s = line.split(" ", 3); + String[] s = DataHelper.split(line, " ", 3); if (s.length > 1 && (s[1].startsWith("3") || s[1].startsWith("5"))) _dataExpected = 0; @@ -671,6 +673,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { /** * Don't compress small responses or images. + * Don't compress things that are already compressed. * Compression is inline but decompression on the client side * creates a new thread. */ @@ -687,7 +690,11 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { (!_contentType.equals("application/x-bzip")) && (!_contentType.equals("application/x-bzip2")) && (!_contentType.equals("application/x-gzip")) && - (!_contentType.equals("application/zip")))); + (!_contentType.equals("application/zip")))) && + (_contentEncoding == null || + ((!_contentEncoding.equals("gzip")) && + (!_contentEncoding.equals("compress")) && + (!_contentEncoding.equals("deflate")))); } @Override @@ -695,7 +702,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { //if (_log.shouldLog(Log.INFO)) // _log.info("Including x-i2p-gzip as the content encoding in the response"); if (shouldCompress()) - out.write("Content-encoding: x-i2p-gzip\r\n".getBytes()); + out.write(DataHelper.getASCII("Content-encoding: x-i2p-gzip\r\n")); super.finishHeaders(); } @@ -735,7 +742,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { public long getTotalRead() { try { return def.getTotalIn(); - } catch (Exception e) { + } catch (RuntimeException e) { // j2se 1.4.2_08 on linux is sometimes throwing an NPE in the getTotalIn() implementation return 0; } @@ -743,7 +750,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { public long getTotalCompressed() { try { return def.getTotalOut(); - } catch (Exception e) { + } catch (RuntimeException e) { // j2se 1.4.2_08 on linux is sometimes throwing an NPE in the getTotalOut() implementation return 0; } @@ -817,7 +824,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { * @throws BadRequestException on bad headers * @throws IOException on other errors in the underlying stream */ - private static Map> readHeaders(I2PSocket socket, InputStream in, StringBuilder command, + static Map> readHeaders(I2PSocket socket, InputStream in, StringBuilder command, String[] skipHeaders, I2PAppContext ctx) throws IOException { HashMap> headers = new HashMap>(); StringBuilder buf = new StringBuilder(128); @@ -877,9 +884,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer { String lcName = name.toLowerCase(Locale.US); if ("accept-encoding".equals(lcName)) - name = "Accept-encoding"; + name = "Accept-Encoding"; else if ("x-accept-encoding".equals(lcName)) - name = "X-Accept-encoding"; + name = "X-Accept-Encoding"; else if ("x-forwarded-for".equals(lcName)) name = "X-Forwarded-For"; else if ("x-forwarded-server".equals(lcName)) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java index 7f4c2c22a..f53a72cd1 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Properties; import java.util.StringTokenizer; +import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketAddress; import net.i2p.data.DataHelper; @@ -142,7 +143,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase { // we are called from an unlimited thread pool, so run inline //out.start(); out.run(); - } catch (Exception ex) { + } catch (IOException ex) { // generally NoRouteToHostException if (_log.shouldLog(Log.WARN)) _log.warn("Error connecting", ex); @@ -160,6 +161,23 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase { mySockets.remove(sockLock); } } + } catch (I2PException ex) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Error connecting", ex); + //l.log("Error connecting: " + ex.getMessage()); + try { + // Send a response so the user doesn't just see a disconnect + // and blame his router or the network. + String name = addr != null ? addr.getHostName() : "undefined"; + String msg = ":" + name + " 499 you :" + ex + "\r\n"; + s.getOutputStream().write(DataHelper.getUTF8(msg)); + } catch (IOException ioe) {} + closeSocket(s); + if (i2ps != null) { + synchronized (sockLock) { + mySockets.remove(sockLock); + } + } } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java index 2288c27ec..87dd7e937 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java @@ -13,6 +13,7 @@ import java.util.Properties; import net.i2p.client.streaming.I2PSocket; import net.i2p.crypto.SHA256Generator; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.Base32; @@ -128,7 +129,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { this.cloakKey = new byte[Hash.HASH_LENGTH]; tunnel.getContext().random().nextBytes(this.cloakKey); } else { - this.cloakKey = SHA256Generator.getInstance().calculateHash(passphrase.trim().getBytes()).getData(); + this.cloakKey = SHA256Generator.getInstance().calculateHash(DataHelper.getUTF8(passphrase.trim())).getData(); } // get the fake hostmask to use @@ -158,7 +159,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { modifiedRegistration = buf.toString(); } Socket s = getSocket(socket.getPeerDestination().calculateHash(), socket.getLocalPort()); - Thread t = new I2PTunnelRunner(s, socket, slock, null, modifiedRegistration.getBytes(), + Thread t = new I2PTunnelRunner(s, socket, slock, null, DataHelper.getUTF8(modifiedRegistration), null, (I2PTunnelRunner.FailCallback) null); // run in the unlimited client pool //t.start(); @@ -277,7 +278,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable { //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Got line: " + s); - String field[]=s.split(" ",5); + String field[] = DataHelper.split(s, " ", 5); String command; int idx=0; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelOutproxyRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelOutproxyRunner.java index 2ed668b7a..d8d9369a0 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelOutproxyRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelOutproxyRunner.java @@ -182,7 +182,7 @@ public class I2PTunnelOutproxyRunner extends I2PAppThread { } catch (IllegalStateException ise) { if (_log.shouldLog(Log.WARN)) _log.warn("gnu?", ise); - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.ERROR)) _log.error("Internal error", e); } finally { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java index 2acd7cfc8..b8bfdaebf 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java @@ -326,7 +326,7 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr // at net.i2p.i2ptunnel.I2PTunnelRunner.run(I2PTunnelRunner.java:167) if (_log.shouldLog(Log.WARN)) _log.warn("gnu?", ise); - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.ERROR)) _log.error("Internal error", e); } finally { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java index 76a52c32b..3b9217238 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java @@ -517,7 +517,7 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable { break; } catch(SocketTimeoutException ste) { // ignored, we never set the timeout - } catch (Exception e) { + } catch (RuntimeException e) { // streaming borkage if (_log.shouldLog(Log.ERROR)) _log.error("Uncaught exception accepting", e); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java index 73c1dd74a..da615301e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java @@ -4,8 +4,9 @@ package net.i2p.i2ptunnel; import java.io.BufferedReader; -import java.io.FileReader; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; import java.net.Socket; import java.util.ArrayList; import java.util.List; @@ -18,6 +19,7 @@ import net.i2p.I2PException; import net.i2p.client.I2PSession; import net.i2p.client.I2PSessionException; import net.i2p.client.streaming.I2PSocketManager; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.util.EventDispatcher; import net.i2p.util.I2PAppThread; @@ -92,7 +94,7 @@ public class I2Ping extends I2PTunnelClientBase { int localPort = 0; int remotePort = 0; boolean error = false; - String[] argv = cmd.split(" "); + String[] argv = DataHelper.split(cmd, " "); Getopt g = new Getopt("ping", argv, "t:m:n:chl:f:p:"); int c; while ((c = g.getopt()) != -1) { @@ -157,7 +159,7 @@ public class I2Ping extends I2PTunnelClientBase { } if (hostListFile != null) { - BufferedReader br = new BufferedReader(new FileReader(hostListFile)); + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(hostListFile), "UTF-8")); String line; List pingHandlers = new ArrayList(); int i = 0; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java index 2066911ad..229a4b7d1 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java @@ -24,6 +24,7 @@ import net.i2p.util.I2PAppThread; import net.i2p.util.Log; import net.i2p.util.SecureFile; import net.i2p.util.SecureFileOutputStream; +import net.i2p.util.SystemVersion; /** * Coordinate the runtime operation and configuration of a single I2PTunnel. @@ -103,10 +104,17 @@ public class TunnelController implements Logging { * This is guaranteed to be available. * @since 0.9.17 */ - public static final SigType PREFERRED_SIGTYPE = SigType.ECDSA_SHA256_P256.isAvailable() ? - SigType.ECDSA_SHA256_P256 : - SigType.DSA_SHA1; - + public static final SigType PREFERRED_SIGTYPE; + static { + if (SystemVersion.isARM() || SystemVersion.isGNU() || SystemVersion.isAndroid()) { + if (SigType.ECDSA_SHA256_P256.isAvailable()) + PREFERRED_SIGTYPE = SigType.ECDSA_SHA256_P256; + else + PREFERRED_SIGTYPE = SigType.DSA_SHA1; + } else { + PREFERRED_SIGTYPE = SigType.EdDSA_SHA512_Ed25519; + } + } /** * Create a new controller for a tunnel out of the specific config options. @@ -185,8 +193,10 @@ public class TunnelController implements Logging { if (backupDir.isDirectory() || backupDir.mkdir()) { String name = b32 + '-' + I2PAppContext.getGlobalContext().clock().now() + ".dat"; File backup = new File(backupDir, name); - if (FileUtil.copy(keyFile, backup, false, true)) + if (FileUtil.copy(keyFile, backup, false, true)) { + SecureFileOutputStream.setPerms(backup); log("Private key backup saved to " + backup.getAbsolutePath()); + } } } catch (I2PException ie) { if (_log.shouldLog(Log.ERROR)) @@ -230,7 +240,7 @@ public class TunnelController implements Logging { } try { doStartTunnel(); - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("Error starting the tunnel " + getName(), e); log("Error starting the tunnel " + getName() + ": " + e.getMessage()); // if we don't acquire() then the release() in stopTunnel() won't work @@ -651,9 +661,9 @@ public class TunnelController implements Logging { } // same default logic as in EditBean.getSigType() if (!isClient(type) || - ((type.equals(TYPE_IRC_CLIENT) || type.equals(TYPE_STD_CLIENT) || - type.equals(TYPE_SOCKS_IRC) || type.equals(TYPE_STREAMR_CLIENT)) - && !Boolean.valueOf(getSharedClient()))) { + type.equals(TYPE_IRC_CLIENT) || type.equals(TYPE_STD_CLIENT) || + type.equals(TYPE_SOCKS_IRC) || type.equals(TYPE_STREAMR_CLIENT) || + (type.equals(TYPE_HTTP_CLIENT) && Boolean.valueOf(getSharedClient()))) { if (!_config.containsKey(OPT_SIG_TYPE)) _config.setProperty(OPT_SIG_TYPE, PREFERRED_SIGTYPE.name()); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java index f5b434e3b..24ac12e61 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/I2PTunnelDCCClient.java @@ -6,6 +6,7 @@ package net.i2p.i2ptunnel.irc; import java.net.Socket; import java.io.IOException; +import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketOptions; @@ -80,7 +81,14 @@ public class I2PTunnelDCCClient extends I2PTunnelClientBase { // we are called from an unlimited thread pool, so run inline //t.start(); t.run(); - } catch (Exception ex) { + } catch (IOException ex) { + _log.error("Could not make DCC connection to " + _dest + ':' + _remotePort, ex); + closeSocket(s); + if (i2ps != null) { + try { i2ps.close(); } catch (IOException ioe) {} + } + notifyEvent(CONNECT_STOP_EVENT, Integer.valueOf(getLocalPort())); + } catch (I2PException ex) { _log.error("Could not make DCC connection to " + _dest + ':' + _remotePort, ex); closeSocket(s); if (i2ps != null) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java index 3112c9dda..eef558837 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IRCFilter.java @@ -33,7 +33,7 @@ abstract class IRCFilter { */ public static String inboundFilter(String s, StringBuffer expectedPong, DCCHelper helper) { - String field[]=s.split(" ",4); + String field[] = DataHelper.split(s, " ", 4); String command; int idx=0; final String[] allowedCommands = @@ -274,7 +274,7 @@ abstract class IRCFilter { */ public static String outboundFilter(String s, StringBuffer expectedPong, DCCHelper helper) { - String field[]=s.split(" ",3); + String field[] = DataHelper.split(s, " ",3); if(field[0].length()==0) return null; // W T F? @@ -420,7 +420,7 @@ abstract class IRCFilter { int ctcp = msg.indexOf(0x01); if (ctcp > 0) msg = msg.substring(0, ctcp); - String[] args = msg.split(" ", 5); + String[] args = DataHelper.split(msg, " ", 5); if (args.length <= 0) return null; String type = args[0]; @@ -512,7 +512,7 @@ abstract class IRCFilter { int ctcp = msg.indexOf(0x01); if (ctcp > 0) msg = msg.substring(0, ctcp); - String[] args = msg.split(" ", 5); + String[] args = DataHelper.split(msg, " ", 5); if (args.length <= 0) return null; String type = args[0]; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcInboundFilter.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcInboundFilter.java index 5f0dd8333..2a2edf0db 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcInboundFilter.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcInboundFilter.java @@ -47,8 +47,8 @@ public class IrcInboundFilter implements Runnable { in = new BufferedReader(new InputStreamReader(remote.getInputStream(), "ISO-8859-1")); output=local.getOutputStream(); } catch (IOException e) { - if (_log.shouldLog(Log.ERROR)) - _log.error("IrcInboundFilter: no streams",e); + if (_log.shouldLog(Log.WARN)) + _log.warn("IrcInboundFilter: no streams",e); return; } if (_log.shouldLog(Log.DEBUG)) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcOutboundFilter.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcOutboundFilter.java index 5e142081a..75ce191e7 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcOutboundFilter.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/irc/IrcOutboundFilter.java @@ -47,8 +47,8 @@ public class IrcOutboundFilter implements Runnable { in = new BufferedReader(new InputStreamReader(local.getInputStream(), "ISO-8859-1")); output=remote.getOutputStream(); } catch (IOException e) { - if (_log.shouldLog(Log.ERROR)) - _log.error("IrcOutboundFilter: no streams",e); + if (_log.shouldLog(Log.WARN)) + _log.warn("IrcOutboundFilter: no streams",e); return; } if (_log.shouldLog(Log.DEBUG)) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java index 2d70caed0..bd84ac9ee 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java @@ -14,6 +14,7 @@ import java.util.StringTokenizer; import net.i2p.I2PAppContext; import net.i2p.client.naming.NamingService; import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnelHTTPClient; import net.i2p.util.FileUtil; @@ -165,10 +166,11 @@ public abstract class LocalHTTPServer { Properties nsOptions = new Properties(); nsOptions.setProperty("list", book); if (referer != null && referer.startsWith("http")) { - String from = "" + referer + ""; - nsOptions.setProperty("s", _("Added via address helper from {0}", from)); + String ref = DataHelper.escapeHTML(referer); + String from = "" + ref + ""; + nsOptions.setProperty("s", _t("Added via address helper from {0}", from)); } else { - nsOptions.setProperty("s", _("Added via address helper")); + nsOptions.setProperty("s", _t("Added via address helper")); } boolean success = ns.put(host, dest, nsOptions); writeRedirectPage(out, success, host, book, url); @@ -185,11 +187,11 @@ public abstract class LocalHTTPServer { private static void writeRedirectPage(OutputStream out, boolean success, String host, String book, String url) throws IOException { String tbook; if ("hosts.txt".equals(book)) - tbook = _("router"); + tbook = _t("router"); else if ("userhosts.txt".equals(book)) - tbook = _("master"); + tbook = _t("master"); else if ("privatehosts.txt".equals(book)) - tbook = _("private"); + tbook = _t("private"); else tbook = book; out.write(("HTTP/1.1 200 OK\r\n"+ @@ -198,22 +200,22 @@ public abstract class LocalHTTPServer { "Proxy-Connection: close\r\n"+ "\r\n"+ ""+ - "" + _("Redirecting to {0}", host) + "\n" + + "" + _t("Redirecting to {0}", host) + "\n" + "\n" + "\n" + "\n" + "\n" + "" + "
\n" + "

" + (success ? - _("Saved {0} to the {1} addressbook, redirecting now.", host, tbook) : - _("Failed to save {0} to the {1} addressbook, redirecting now.", host, tbook)) + + _t("Saved {0} to the {1} addressbook, redirecting now.", host, tbook) : + _t("Failed to save {0} to the {1} addressbook, redirecting now.", host, tbook)) + "

\n

" + - _("Click here if you are not redirected automatically.") + + _t("Click here if you are not redirected automatically.") + "

").getBytes("UTF-8")); I2PTunnelHTTPClient.writeFooter(out); out.flush(); @@ -248,17 +250,17 @@ public abstract class LocalHTTPServer { private static final String BUNDLE_NAME = "net.i2p.i2ptunnel.proxy.messages"; /** lang in routerconsole.lang property, else current locale */ - protected static String _(String key) { + protected static String _t(String key) { return Translate.getString(key, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } /** {0} */ - protected static String _(String key, Object o) { + protected static String _t(String key, Object o) { return Translate.getString(key, o, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } /** {0} and {1} */ - protected static String _(String key, Object o, Object o2) { + protected static String _t(String key, Object o, Object o2) { return Translate.getString(key, o, o2, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java index 19ab11a46..916793941 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/I2PSOCKSTunnel.java @@ -27,7 +27,6 @@ import net.i2p.util.Log; public class I2PSOCKSTunnel extends I2PTunnelClientBase { private HashMap> proxies = null; // port# + "" or "default" -> hostname list - protected Destination outProxyDest = null; //public I2PSOCKSTunnel(int localPort, Logging l, boolean ownDest) { // I2PSOCKSTunnel(localPort, l, ownDest, (EventDispatcher)null); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java index 02c5c3b0e..5fff2c1eb 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java @@ -24,6 +24,7 @@ import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketOptions; import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase; import net.i2p.i2ptunnel.I2PTunnel; @@ -226,7 +227,7 @@ public class SOCKS5Server extends SOCKSServer { } byte addr[] = new byte[addrLen]; in.readFully(addr); - connHostName = new String(addr); + connHostName = DataHelper.getUTF8(addr); } _log.debug("DOMAINNAME address type in request: " + connHostName); break; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java index e2e7edc72..6c61e0959 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java @@ -1,6 +1,7 @@ package net.i2p.i2ptunnel.socks; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; /** @@ -54,7 +55,7 @@ public class SOCKSHeader { this.header = new byte[beg.length + 60 + end.length]; System.arraycopy(this.header, 0, beg, 0, beg.length); String b32 = dest.toBase32(); - System.arraycopy(this.header, beg.length, b32.getBytes(), 0, 60); + System.arraycopy(this.header, beg.length, DataHelper.getASCII(b32), 0, 60); System.arraycopy(this.header, beg.length + 60, end, 0, end.length); } @@ -65,7 +66,7 @@ public class SOCKSHeader { int namelen = (this.header[4] & 0xff); byte[] nameBytes = new byte[namelen]; System.arraycopy(nameBytes, 0, this.header, 5, namelen); - return new String(nameBytes); + return DataHelper.getUTF8(nameBytes); } public Destination getDestination() { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java index 1c348e1f4..049d190b6 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSServerFactory.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.net.Socket; import java.util.Properties; +import net.i2p.data.DataHelper; import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase; /** @@ -63,7 +64,7 @@ public class SOCKSServerFactory { case 'H': case 'P': DataOutputStream out = new DataOutputStream(s.getOutputStream()); - out.write(ERR_REQUEST_DENIED.getBytes()); + out.write(DataHelper.getASCII(ERR_REQUEST_DENIED)); throw new SOCKSException("HTTP request to socks"); default: throw new SOCKSException("SOCKS protocol version not supported (" + Integer.toHexString(socksVer) + ")"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java index c9a9ab3f3..2766b1e07 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/UDPSink.java @@ -14,7 +14,6 @@ import net.i2p.data.Destination; public class UDPSink implements Sink { /** - * @param src ignored * @throws IllegalArgumentException on DatagramSocket IOException */ public UDPSink(InetAddress host, int port) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java index a89e34898..75b0d683d 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java @@ -52,8 +52,6 @@ import net.i2p.util.EventDispatcher; private static final AtomicLong __clientId = new AtomicLong(); protected long _clientId; - protected Destination dest; - private final Object startLock = new Object(); private final I2PSession _session; @@ -98,6 +96,7 @@ import net.i2p.util.EventDispatcher; // create a session try { ByteArrayInputStream in = new ByteArrayInputStream(key); + // FIXME this may not pick up non-default I2CP host/port settings from tunnel _session = client.createSession(in, tunnel.getClientOptions()); connected(_session); } catch(Exception exc) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java index b5fc94b2e..ade6e3058 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPServerBase.java @@ -87,19 +87,12 @@ public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sin private void init(boolean verify, InputStream privData, String privkeyname, Logging l) { this.l = l; - int portNum = 7654; - if (getTunnel().port != null) { - try { - portNum = Integer.parseInt(getTunnel().port); - } catch (NumberFormatException nfe) { - _log.log(Log.CRIT, "Invalid port specified [" + getTunnel().port + "], reverting to " + portNum); - } - } // create i2pclient I2PClient client = I2PClientFactory.createClient(); try { + // FIXME this may not pick up non-default I2CP host/port settings from tunnel _session = client.createSession(privData, getTunnel().getClientOptions()); connected(_session); } catch(I2PSessionException exc) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java index 2073efdf2..eb481f6ea 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/GeneralHelper.java @@ -9,6 +9,7 @@ import java.util.Properties; import java.util.TreeMap; import net.i2p.I2PAppContext; +import net.i2p.I2PException; import net.i2p.client.I2PClient; import net.i2p.crypto.SigType; import net.i2p.data.DataHelper; @@ -146,11 +147,11 @@ public class GeneralHelper { List rv = tcg.clearAllMessages(); try { tcg.saveConfig(); - rv.add(0, _("Configuration changes saved", context)); + rv.add(0, _t("Configuration changes saved", context)); } catch (IOException ioe) { Log log = context.logManager().getLog(GeneralHelper.class); log.error("Failed to save config file", ioe); - rv.add(0, _("Failed to save configuration", context) + ": " + ioe.toString()); + rv.add(0, _t("Failed to save configuration", context) + ": " + ioe.toString()); } return rv; } @@ -341,7 +342,8 @@ public class GeneralHelper { rv = pkf.getDestination(); if (rv != null) return rv; - } catch (Exception e) {} + } catch (I2PException e) { + } catch (IOException e) {} } } return null; @@ -439,12 +441,12 @@ public class GeneralHelper { } if (type == null) { // same default logic as in TunnelController.setConfig() - if ((!TunnelController.isClient(ttype) || - ((TunnelController.TYPE_IRC_CLIENT.equals(ttype) || - TunnelController.TYPE_SOCKS_IRC.equals(ttype) || - TunnelController.TYPE_STREAMR_CLIENT.equals(ttype) || - TunnelController.TYPE_STD_CLIENT.equals(ttype)) && - !isShared))) + if (!TunnelController.isClient(ttype) || + TunnelController.TYPE_IRC_CLIENT.equals(ttype) || + TunnelController.TYPE_SOCKS_IRC.equals(ttype) || + TunnelController.TYPE_STREAMR_CLIENT.equals(ttype) || + TunnelController.TYPE_STD_CLIENT.equals(ttype) || + (TunnelController.TYPE_HTTP_CLIENT.equals(ttype) && isShared)) type = TunnelController.PREFERRED_SIGTYPE; else type = SigType.DSA_SHA1; @@ -714,7 +716,7 @@ public class GeneralHelper { return def; } - protected static String _(String key, I2PAppContext context) { - return Messages._(key, context); + protected static String _t(String key, I2PAppContext context) { + return Messages._t(key, context); } } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java index 755fc2719..c0839e503 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java @@ -47,7 +47,8 @@ public class TunnelConfig { private String _i2cpPort; private int _tunnelDepth = -1; private int _tunnelQuantity = -1; - private int _tunnelVariance = -1; + // -2 or higher is valid + private int _tunnelVariance = -3; private int _tunnelBackupQuantity = -1; private boolean _connectDelay; private String _customOptions; @@ -318,7 +319,7 @@ public class TunnelConfig { if (val) _booleanOptions.add(I2PTunnelHTTPClient.PROP_ACCEPT); else - _booleanOptions.add(I2PTunnelHTTPClient.PROP_ACCEPT); + _booleanOptions.remove(I2PTunnelHTTPClient.PROP_ACCEPT); } public void setAllowInternalSSL(boolean val) { if (val) @@ -801,7 +802,7 @@ public class TunnelConfig { config.setProperty("option.inbound.length", Integer.toString(_tunnelDepth)); config.setProperty("option.outbound.length", Integer.toString(_tunnelDepth)); } - if (_tunnelVariance >= 0) { + if (_tunnelVariance >= -2) { config.setProperty("option.inbound.lengthVariance", Integer.toString(_tunnelVariance)); config.setProperty("option.outbound.lengthVariance", Integer.toString(_tunnelVariance)); } diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java index ebc495098..d960dc93a 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -8,8 +8,11 @@ package net.i2p.i2ptunnel.web; * */ +import java.io.IOException; import java.util.List; import java.util.Set; + +import net.i2p.I2PException; import net.i2p.crypto.SigType; import net.i2p.data.Base64; import net.i2p.data.DataHelper; @@ -87,7 +90,8 @@ public class EditBean extends IndexBean { //System.err.println("Signing " + spoof + " with " + Base64.encode(privKey.getData())); Signature sig = _context.dsa().sign(spoof.getBytes("UTF-8"), privKey); return Base64.encode(sig.getData()); - } catch (Exception e) {} + } catch (I2PException e) { + } catch (IOException e) {} } return ""; } @@ -358,7 +362,7 @@ public class EditBean extends IndexBean { public String getI2CPHost(int tunnel) { if (_context.isRouterContext()) - return _("internal"); + return _t("internal"); TunnelController tun = getController(tunnel); if (tun != null) return tun.getI2CPHost(); @@ -368,7 +372,7 @@ public class EditBean extends IndexBean { public String getI2CPPort(int tunnel) { if (_context.isRouterContext()) - return _("internal"); + return _t("internal"); TunnelController tun = getController(tunnel); if (tun != null) return tun.getI2CPPort(); @@ -406,11 +410,11 @@ public class EditBean extends IndexBean { if (i <= 3) { buf.append(" ("); if (i == 1) - buf.append(_("lower bandwidth and reliability")); + buf.append(_t("lower bandwidth and reliability")); else if (i == 2) - buf.append(_("standard bandwidth and reliability")); + buf.append(_t("standard bandwidth and reliability")); else if (i == 3) - buf.append(_("higher bandwidth and reliability")); + buf.append(_t("higher bandwidth and reliability")); buf.append(')'); } buf.append("\n"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index ccb30ca99..2f2509c08 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -9,12 +9,14 @@ package net.i2p.i2ptunnel.web; */ import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.Properties; import net.i2p.I2PAppContext; +import net.i2p.I2PException; import net.i2p.app.ClientAppManager; import net.i2p.app.Outproxy; import net.i2p.data.Certificate; @@ -84,7 +86,7 @@ public class IndexBean { String error; try { tcg = TunnelControllerGroup.getInstance(); - error = tcg == null ? _("Tunnels are not initialized yet, please reload in two minutes.") + error = tcg == null ? _t("Tunnels are not initialized yet, please reload in two minutes.") : null; } catch (IllegalArgumentException iae) { tcg = null; @@ -157,9 +159,9 @@ public class IndexBean { // If passwords are turned on, all is assumed good if (!_context.getBooleanProperty(PROP_PW_ENABLE) && !haveNonce(_curNonce)) - return _("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.") + return _t("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.") + ' ' + - _("If the problem persists, verify that you have cookies enabled in your browser."); + _t("If the problem persists, verify that you have cookies enabled in your browser."); if ("Stop all".equals(_action)) return stopAll(); else if ("Start all".equals(_action)) @@ -205,7 +207,7 @@ public class IndexBean { private String reloadConfig() { _group.reloadControllers(); - return _("Configuration reloaded for all tunnels"); + return _t("Configuration reloaded for all tunnels"); } private String start() { @@ -219,7 +221,7 @@ public class IndexBean { try { Thread.sleep(1000); } catch (InterruptedException ie) {} // and give them something to look at in any case // FIXME name will be HTML escaped twice - return _("Starting tunnel") + ' ' + getTunnelName(_tunnel) + "..."; + return _t("Starting tunnel") + ' ' + getTunnelName(_tunnel) + "..."; } private String stop() { @@ -233,7 +235,7 @@ public class IndexBean { try { Thread.sleep(1000); } catch (InterruptedException ie) {} // and give them something to look at in any case // FIXME name will be HTML escaped twice - return _("Stopping tunnel") + ' ' + getTunnelName(_tunnel) + "..."; + return _t("Stopping tunnel") + ' ' + getTunnelName(_tunnel) + "..."; } private String saveChanges() { @@ -266,7 +268,7 @@ public class IndexBean { if (_action != null) { try { buf.append(processAction()).append('\n'); - } catch (Exception e) { + } catch (RuntimeException e) { _log.log(Log.CRIT, "Error processing " + _action, e); buf.append("Error: ").append(e.toString()).append('\n'); } @@ -322,7 +324,7 @@ public class IndexBean { if (name != null) return DataHelper.escapeHTML(name); else - return _("New Tunnel"); + return _t("New Tunnel"); } /** @@ -342,13 +344,13 @@ public class IndexBean { if (tun != null && tun.getListenPort() != null) { String port = tun.getListenPort(); if (port.length() == 0) - return "" + _("Port not set") + ""; + return "" + _t("Port not set") + ""; int iport = Addresses.getPort(port); if (iport == 0) - return "" + _("Invalid port") + ' ' + port + ""; + return "" + _t("Invalid port") + ' ' + port + ""; if (iport < 1024) return "" + - _("Warning - ports less than 1024 are not recommended") + + _t("Warning - ports less than 1024 are not recommended") + ": " + port + ""; // dup check, O(n**2) List controllers = _group.getControllers(); @@ -357,12 +359,12 @@ public class IndexBean { continue; if (port.equals(controllers.get(i).getListenPort())) return "" + - _("Warning - duplicate port") + + _t("Warning - duplicate port") + ": " + port + ""; } return port; } - return "" + _("Port not set") + ""; + return "" + _t("Port not set") + ""; } public String getTunnelType(int tunnel) { @@ -374,18 +376,18 @@ public class IndexBean { } public String getTypeName(String internalType) { - if (TunnelController.TYPE_STD_CLIENT.equals(internalType)) return _("Standard client"); - else if (TunnelController.TYPE_HTTP_CLIENT.equals(internalType)) return _("HTTP/HTTPS client"); - else if (TunnelController.TYPE_IRC_CLIENT.equals(internalType)) return _("IRC client"); - else if (TunnelController.TYPE_STD_SERVER.equals(internalType)) return _("Standard server"); - else if (TunnelController.TYPE_HTTP_SERVER.equals(internalType)) return _("HTTP server"); - else if (TunnelController.TYPE_SOCKS.equals(internalType)) return _("SOCKS 4/4a/5 proxy"); - else if (TunnelController.TYPE_SOCKS_IRC.equals(internalType)) return _("SOCKS IRC proxy"); - else if (TunnelController.TYPE_CONNECT.equals(internalType)) return _("CONNECT/SSL/HTTPS proxy"); - else if (TunnelController.TYPE_IRC_SERVER.equals(internalType)) return _("IRC server"); - else if (TunnelController.TYPE_STREAMR_CLIENT.equals(internalType)) return _("Streamr client"); - else if (TunnelController.TYPE_STREAMR_SERVER.equals(internalType)) return _("Streamr server"); - else if (TunnelController.TYPE_HTTP_BIDIR_SERVER.equals(internalType)) return _("HTTP bidir"); + if (TunnelController.TYPE_STD_CLIENT.equals(internalType)) return _t("Standard client"); + else if (TunnelController.TYPE_HTTP_CLIENT.equals(internalType)) return _t("HTTP/HTTPS client"); + else if (TunnelController.TYPE_IRC_CLIENT.equals(internalType)) return _t("IRC client"); + else if (TunnelController.TYPE_STD_SERVER.equals(internalType)) return _t("Standard server"); + else if (TunnelController.TYPE_HTTP_SERVER.equals(internalType)) return _t("HTTP server"); + else if (TunnelController.TYPE_SOCKS.equals(internalType)) return _t("SOCKS 4/4a/5 proxy"); + else if (TunnelController.TYPE_SOCKS_IRC.equals(internalType)) return _t("SOCKS IRC proxy"); + else if (TunnelController.TYPE_CONNECT.equals(internalType)) return _t("CONNECT/SSL/HTTPS proxy"); + else if (TunnelController.TYPE_IRC_SERVER.equals(internalType)) return _t("IRC server"); + else if (TunnelController.TYPE_STREAMR_CLIENT.equals(internalType)) return _t("Streamr client"); + else if (TunnelController.TYPE_STREAMR_SERVER.equals(internalType)) return _t("Streamr server"); + else if (TunnelController.TYPE_HTTP_BIDIR_SERVER.equals(internalType)) return _t("HTTP bidir"); else return internalType; } @@ -442,15 +444,15 @@ public class IndexBean { host = tun.getTargetHost(); String port = tun.getTargetPort(); if (host == null || host.length() == 0) - host = "" + _("Host not set") + ""; + host = "" + _t("Host not set") + ""; else if (Addresses.getIP(host) == null) - host = "" + _("Invalid address") + ' ' + host + ""; + host = "" + _t("Invalid address") + ' ' + host + ""; else if (host.indexOf(':') >= 0) host = '[' + host + ']'; if (port == null || port.length() == 0) - port = "" + _("Port not set") + ""; + port = "" + _t("Port not set") + ""; else if (Addresses.getPort(port) == 0) - port = "" + _("Invalid port") + ' ' + port + ""; + port = "" + _t("Invalid port") + ' ' + port + ""; return host + ':' + port; } else return ""; @@ -972,7 +974,9 @@ public class IndexBean { PrivateKeyFile pkf = new PrivateKeyFile(keyFile); try { pkf.createIfAbsent(); - } catch (Exception e) { + } catch (I2PException e) { + return "Create private key file failed: " + e; + } catch (IOException e) { return "Create private key file failed: " + e; } switch (_certType) { @@ -1011,7 +1015,9 @@ public class IndexBean { try { pkf.write(); newdest = pkf.getDestination(); - } catch (Exception e) { + } catch (I2PException e) { + return "Modification failed: " + e; + } catch (IOException e) { return "Modification failed: " + e; } return "Destination modified - " + @@ -1074,8 +1080,8 @@ public class IndexBean { } } - protected String _(String key) { - return Messages._(key, _context); + protected String _t(String key) { + return Messages._t(key, _context); } /** translate (ngettext) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java index d4a2fb4bd..88911b041 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/Messages.java @@ -16,11 +16,11 @@ public class Messages { } /** lang in routerconsole.lang property, else current locale */ - public String _(String key) { + public String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } - public static String _(String key, I2PAppContext ctx) { + public static String _t(String key, I2PAppContext ctx) { return Translate.getString(key, ctx, BUNDLE_NAME); } @@ -32,11 +32,11 @@ public class Messages { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } diff --git a/apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java b/apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java index 19302a624..7132a7da2 100644 --- a/apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java +++ b/apps/i2ptunnel/java/test/junit/net/i2p/i2ptunnel/I2PTunnelHTTPServerTest.java @@ -28,7 +28,7 @@ public class I2PTunnelHTTPServerTest extends TestCase { headerString += "BLAH: something\r\n"; headerString += "\r\n"; InputStream in = fillInputStream(headerString); - Map> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], I2PAppContext.getGlobalContext()); + Map> headers = I2PTunnelHTTPServer.readHeaders(null, in, new StringBuilder(128), new String[0], I2PAppContext.getGlobalContext()); assertEquals(headers.size(), 1); //One header } @@ -38,7 +38,7 @@ public class I2PTunnelHTTPServerTest extends TestCase { headerString += "someHeader: oh my, duplication!\r\n"; headerString += "\r\n"; InputStream in = fillInputStream(headerString); - Map> headers = I2PTunnelHTTPServer.readHeaders(in, new StringBuilder(128), new String[0], I2PAppContext.getGlobalContext()); + Map> headers = I2PTunnelHTTPServer.readHeaders(null, in, new StringBuilder(128), new String[0], I2PAppContext.getGlobalContext()); assertEquals(headers.size(), 1); assertEquals(headers.get("someHeader").size(), 2); } @@ -51,7 +51,7 @@ public class I2PTunnelHTTPServerTest extends TestCase { headerString += "\r\n"; InputStream in = fillInputStream(headerString); StringBuilder builder = new StringBuilder(128); - Map> headers = I2PTunnelHTTPServer.readHeaders(in, builder, new String[0], I2PAppContext.getGlobalContext()); + Map> headers = I2PTunnelHTTPServer.readHeaders(null, in, builder, new String[0], I2PAppContext.getGlobalContext()); String result = I2PTunnelHTTPServer.formatHeaders(headers, builder); int first = result.indexOf("abc"); assertTrue(first >= 0); diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index c0dd04cf4..b09b2ed54 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -16,7 +16,7 @@ %> - <%=intl._("Hidden Services Manager")%> - <%=intl._("Edit Client Tunnel")%> + <%=intl._t("Hidden Services Manager")%> - <%=intl._t("Edit Client Tunnel")%> @@ -49,14 +49,14 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (curTunnel >= 0) { tunnelTypeName = editBean.getTunnelType(curTunnel); tunnelType = editBean.getInternalType(curTunnel); - %>

<%=intl._("Edit proxy settings")%>

<% + %>

<%=intl._t("Edit proxy settings")%>

<% } else { tunnelTypeName = editBean.getTypeName(request.getParameter("type")); tunnelType = net.i2p.data.DataHelper.stripHTML(request.getParameter("type")); - %>

<%=intl._("New proxy settings")%>

<% + %>

<%=intl._t("New proxy settings")%>

<% } %> - + <% // these are four keys that are generated automatically on first save, @@ -87,17 +87,17 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- + <%=tunnelTypeName%>
@@ -108,9 +108,9 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
<% if ("streamrclient".equals(tunnelType)) { %> - + <% } else { %> - + <% } /* streamrclient */ %>
@@ -119,7 +119,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% String value = editBean.getClientPort(curTunnel); if (value == null || "".equals(value.trim())) { out.write(" ("); - out.write(intl._("required")); + out.write(intl._t("required")); out.write(")"); } %> @@ -134,14 +134,14 @@ input.default { width: 1px; height: 1px; visibility: hidden; } String targetHost = editBean.getTargetHost(curTunnel); if (targetHost == null || "".equals(targetHost.trim())) { out.write(" ("); - out.write(intl._("required")); + out.write(intl._t("required")); out.write(")"); } %> <% } else { %> - <%=intl._("Reachable by")%>(R): + <%=intl._t("Reachable by")%>(R): class="tickbox" />
@@ -176,41 +176,41 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
<% if ("httpclient".equals(tunnelType)) { %>
<% } // httpclient %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% } else if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "streamrclient".equals(tunnelType)) { %>
- (<%=intl._("name, name:port, or destination")%> + (<%=intl._t("name, name:port, or destination")%> <% if ("streamrclient".equals(tunnelType)) { /* deferred resolution unimplemented in streamr client */ %> - - <%=intl._("b32 not recommended")%> + - <%=intl._t("b32 not recommended")%> <% } %> )
@@ -218,26 +218,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if (!"streamrclient".equals(tunnelType)) { %>
class="tickbox" /> - <%=intl._("(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)")%> + <%=intl._t("(Share tunnels with other clients and irc/httpclients? Change requires restart of client proxy)")%>
<% } // !streamrclient %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% if ("ircclient".equals(tunnelType)) { %>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
<% } // ircclient %> @@ -247,8 +247,8 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
-

<%=intl._("Advanced networking options")%>


- <%=intl._("(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)")%> +

<%=intl._t("Advanced networking options")%>


+ <%=intl._t("(NOTE: when this client proxy is configured to share tunnels, then these options are for all the shared proxy clients!)")%>
@@ -256,42 +256,47 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- +
<% int tunnelBackupQuantity = editBean.getTunnelBackupQuantity(curTunnel, 0); - %> - - - + %> + + + <% if (tunnelBackupQuantity > 3) { - %> + %> <% } %>
@@ -320,20 +325,20 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if (!"streamrclient".equals(tunnelType)) { %>
class="tickbox" /> - (<%=intl._("for request/response connections")%>) + (<%=intl._t("for request/response connections")%>)
@@ -342,17 +347,17 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% } // !streamrclient %>
- +
readonly="readonly" <% } %> />
readonly="readonly" <% } %> />
@@ -364,12 +369,12 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
@@ -381,24 +386,24 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
@@ -409,31 +414,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
class="tickbox" />
- + - +
class="tickbox" /><%=intl._("Enable")%><%=intl._t("Enable")%> class="tickbox" /><%=intl._("Disable")%>
<%=intl._t("Disable")%>
@@ -445,16 +450,16 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("client".equals(tunnelType) || "ircclient".equals(tunnelType) || "socksirctunnel".equals(tunnelType) || "sockstunnel".equals(tunnelType)) { %>
- + class="tickbox" />
- +
<% @@ -462,12 +467,12 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (destb64.length() > 0) { %>
- + <%=editBean.getDestHashBase32(curTunnel)%>
<% } // if destb64 %> @@ -479,31 +484,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType)) { %>
- +
- + class="tickbox" />

- +
- + class="tickbox" />

- +
- + class="tickbox" />

- +
- + class="tickbox" />
@@ -516,8 +521,8 @@ input.default { width: 1px; height: 1px; visibility: hidden; } %>
@@ -558,23 +563,23 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType) || "connectclient".equals(tunnelType) || "sockstunnel".equals(tunnelType) || "socksirctunnel".equals(tunnelType)) { %>
- +
class="tickbox" />
@@ -582,23 +587,23 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- +
class="tickbox" />
@@ -609,7 +614,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <% if ("httpclient".equals(tunnelType)) { %>
- +
@@ -621,7 +626,7 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
@@ -634,9 +639,9 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 0d7c05093..22810a2ee 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -16,7 +16,7 @@ %> - <%=intl._("Hidden Services Manager")%> - <%=intl._("Edit Hidden Service")%> + <%=intl._t("Hidden Services Manager")%> - <%=intl._t("Edit Hidden Service")%> @@ -49,14 +49,14 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (curTunnel >= 0) { tunnelTypeName = editBean.getTunnelType(curTunnel); tunnelType = editBean.getInternalType(curTunnel); - %>

<%=intl._("Edit server settings")%>

<% + %>

<%=intl._t("Edit server settings")%>

<% } else { tunnelTypeName = editBean.getTypeName(request.getParameter("type")); tunnelType = net.i2p.data.DataHelper.stripHTML(request.getParameter("type")); - %>

<%=intl._("New server settings")%>

<% + %>

<%=intl._t("New server settings")%>

<% } %> - + <% // these are four keys that are generated automatically on first save, @@ -87,26 +87,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
- + <%=tunnelTypeName%>
class="tickbox" /> - <%=intl._("(Check the Box for 'YES')")%> + <%=intl._t("(Check the Box for 'YES')")%>
@@ -115,26 +115,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; }
<% if ("streamrserver".equals(tunnelType)) { %> - + <% } else { %> - + <% } %>
<% if (!"streamrserver".equals(tunnelType)) { %>
<% } /* !streamrserver */ %>
- +
"); if (urlify && enabled) { String link = "/"; if (! RouterConsoleRunner.ROUTERCONSOLE.equals(name)) - link += name + "/"; - buf.append("").append(_(name)).append(""); + link += escapedName + "/"; + buf.append("").append(_t(escapedName)).append(""); } else if (edit && !ro) { - buf.append(" 0) - buf.append(_(name)); + buf.append(_t(escapedName)); buf.append("\" >"); } else { if (name.length() > 0) - buf.append(_(name)); + buf.append(_t(escapedName)); } - buf.append("") - .append(_("Start")).append(" ").append(index).append(""); + .append(_t("Start")).append(" ").append(index).append(""); } if (showStopButton && (!edit)) buf.append(""); + .append(_t("Stop")).append(" ").append(index).append(""); if (isClientChangeEnabled() && showEditButton && (!edit) && !ro) buf.append(""); + .append(_t("Edit")).append(" ").append(index).append(""); if (showUpdateButton && (!edit) && !ro) { buf.append(""); + .append(_t("Check for updates")).append(" ").append(index).append(""); buf.append(""); + .append(_t("Update")).append(" ").append(index).append(""); } if (showDeleteButton && (!edit) && !ro) { buf.append(""); + .append(_t("Delete")).append(" ").append(index).append(""); } buf.append(""); if (edit && !ro) { - buf.append(""); } else { - buf.append(desc); + buf.append(escapedDesc); } buf.append("
" + _("ANONYMITY WARNING - Settings include 0-hop tunnels.") + "
" + _t("ANONYMITY WARNING - Settings include 0-hop tunnels.") + "
" + _("ANONYMITY WARNING - Settings include 1-hop tunnels.") + "
" + _t("ANONYMITY WARNING - Settings include 1-hop tunnels.") + "
" + _("PERFORMANCE WARNING - Settings include very long tunnels.") + "
" + _t("PERFORMANCE WARNING - Settings include very long tunnels.") + "
" + _("PERFORMANCE WARNING - Settings include high tunnel quantities.") + "
" + _t("PERFORMANCE WARNING - Settings include high tunnel quantities.") + "
\"Inbound\"  " + _("Inbound") + "\"Outbound  " + _("Outbound") + "
\"Inbound\"  " + _t("Inbound") + "\"Outbound  " + _t("Outbound") + "
InboundOutbound
" + _("Length") + ":
" + _t("Length") + ":
" + _("Randomization") + ":
" + _t("Randomization") + ":
" + _("Quantity") + ":
" + _t("Quantity") + ":
" + _("Backup quantity") + ":
" + _t("Backup quantity") + ":
" + _("Inbound options") + ":
" + _t("Inbound options") + ":" + _("Outbound options") + ":
" + _t("Outbound options") + ":" + - _("Refresh the page to view.") + + _t("Refresh the page to view.") + ""); if (oldForceMobileConsole != _forceMobileConsole) - addFormNoticeNoEscape(_("Mobile console option saved.") + + addFormNoticeNoEscape(_t("Mobile console option saved.") + " " + - _("Refresh the page to view.") + + _t("Refresh the page to view.") + ""); } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } private void addUser() { String name = getJettyString("name"); if (name == null || name.length() <= 0) { - addFormError(_("No user name entered")); + addFormError(_t("No user name entered")); return; } String pw = getJettyString("nofilter_pw"); if (pw == null || pw.length() <= 0) { - addFormError(_("No password entered")); + addFormError(_t("No password entered")); return; } ConsolePasswordManager mgr = new ConsolePasswordManager(_context); @@ -90,10 +90,10 @@ public class ConfigUIHandler extends FormHandler { if (mgr.saveMD5(RouterConsoleRunner.PROP_CONSOLE_PW, RouterConsoleRunner.JETTY_REALM, name, pw)) { if (!_context.getBooleanProperty(RouterConsoleRunner.PROP_PW_ENABLE)) _context.router().saveConfig(RouterConsoleRunner.PROP_PW_ENABLE, "true"); - addFormNotice(_("Added user {0}", name)); - addFormError(_("Restart required to take effect")); + addFormNotice(_t("Added user {0}", name)); + addFormError(_t("Restart required to take effect")); } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } @@ -108,13 +108,13 @@ public class ConfigUIHandler extends FormHandler { continue; k = k.substring(7); if (mgr.remove(RouterConsoleRunner.PROP_CONSOLE_PW, k)) { - addFormNotice(_("Removed user {0}", k)); + addFormNotice(_t("Removed user {0}", k)); success = true; } else { - addFormError(_("Error saving the configuration (applied but not saved) - please see the error logs.")); + addFormError(_t("Error saving the configuration (applied but not saved) - please see the error logs.")); } } if (success) - addFormError(_("Restart required to take effect")); + addFormError(_t("Restart required to take effect")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index 294cc6dc0..750f4d8c0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -14,15 +14,15 @@ public class ConfigUIHelper extends HelperBase { for (String theme : themes) { buf.append("").append(_(theme)).append("
\n"); + buf.append(CHECKED); + buf.append("value=\"").append(theme).append("\">").append(_t(theme)).append("
\n"); } boolean universalTheming = _context.getBooleanProperty(CSSHelper.PROP_UNIVERSAL_THEMING); buf.append("") - .append(_("Set theme universally across all apps")) + .append(_t("Set theme universally across all apps")) .append("
\n"); return buf.toString(); } @@ -32,9 +32,9 @@ public class ConfigUIHelper extends HelperBase { boolean forceMobileConsole = _context.getBooleanProperty(CSSHelper.PROP_FORCE_MOBILE_CONSOLE); buf.append("") - .append(_("Force the mobile console to be used")) + .append(_t("Force the mobile console to be used")) .append("
\n"); return buf.toString(); } @@ -138,7 +138,7 @@ public class ConfigUIHelper extends HelperBase { buf.append("") .append("\"\" "); int under = lang.indexOf('_'); @@ -163,13 +163,13 @@ public class ConfigUIHelper extends HelperBase { buf.append(""); if (userpw.isEmpty()) { buf.append(""); } else { buf.append("\n"); for (String name : userpw.keySet()) { buf.append("" + "
"); - buf.append(_("Add a user and password to enable.")); + buf.append(_t("Add a user and password to enable.")); buf.append("
") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("User Name")) + .append(_t("User Name")) .append(" 
") - .append(_("Add")).append(":" + + .append(_t("Add")).append(":" + "" + ""); - buf.append(_("Password")).append(": " + + buf.append(_t("Password")).append(": " + "
\n"); return buf.toString(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java index ef3fb4eb1..f1253889b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java @@ -34,10 +34,12 @@ public class ConfigUpdateHandler extends FormHandler { // public static final String DEFAULT_NEWS_URL = "http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/news.xml?rev=HEAD"; /** very old default */ public static final String OLD_DEFAULT_NEWS_URL = "http://complication.i2p/news.xml"; - /** old default */ + /** older default */ public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml"; - /** current default */ - public static final String DEFAULT_NEWS_URL_SU3 = "http://echelon.i2p/news/news.su3"; + /** old default */ + public static final String OLD_DEFAULT_NEWS_URL_SU3 = "http://echelon.i2p/news/news.su3"; + /** current default, i2pnews.i2p, run by echelon */ + public static final String DEFAULT_NEWS_URL_SU3 = "http://tc73n4kivdroccekirco7rhgxdg5f3cjvbaapabupeyzrqwv5guq.b32.i2p/news.su3"; public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency"; public static final long DEFAULT_REFRESH_FREQ = 36*60*60*1000l; public static final String DEFAULT_REFRESH_FREQUENCY = Long.toString(DEFAULT_REFRESH_FREQ); @@ -86,8 +88,8 @@ public class ConfigUpdateHandler extends FormHandler { "http://stats.i2p/i2p/i2pupdate.su2\r\n" + // "http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" + "http://update.dg.i2p/files/i2pupdate.su2\r\n" + - "http://update.killyourtv.i2p/i2pupdate.su2\r\n" + - "http://update.postman.i2p/i2pupdate.su2" ; + "http://update.killyourtv.i2p/i2pupdate.su2\r\n" ; + // "http://update.postman.i2p/i2pupdate.su2" ; private static final String NO_PACK200_URLS = "http://echelon.i2p/i2p/i2pupdate.sud\r\n" + @@ -96,8 +98,8 @@ public class ConfigUpdateHandler extends FormHandler { "http://stats.i2p/i2p/i2pupdate.sud\r\n" + // "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + "http://update.dg.i2p/files/i2pupdate.sud\r\n" + - "http://update.killyourtv.i2p/i2pupdate.sud\r\n" + - "http://update.postman.i2p/i2pupdate.sud" ; + "http://update.killyourtv.i2p/i2pupdate.sud\r\n" ; + // "http://update.postman.i2p/i2pupdate.sud" ; /** * These are only for .sud and .su2. @@ -130,8 +132,8 @@ public class ConfigUpdateHandler extends FormHandler { "http://stats.i2p/i2p/i2pupdate.su3\r\n" + // "http://www.i2p2.i2p/_static/i2pupdate.su3\r\n" + "http://update.dg.i2p/files/i2pupdate.su3\r\n" + - "http://update.killyourtv.i2p/i2pupdate.su3\r\n" + - "http://update.postman.i2p/i2pupdate.su3" ; + "http://update.killyourtv.i2p/i2pupdate.su3\r\n" ; + // "http://update.postman.i2p/i2pupdate.su3" ; /** * Empty string if disabled. Cannot be overridden by config. @@ -155,14 +157,14 @@ public class ConfigUpdateHandler extends FormHandler { protected void processForm() { if (_action == null) return; - if (_action.equals(_("Check for updates"))) { + if (_action.equals(_t("Check for updates"))) { ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context); if (mgr == null) { addFormError("Update manager not registered, cannot check"); return; } if (mgr.isUpdateInProgress() || mgr.isCheckInProgress()) { - addFormError(_("Update or check already in progress")); + addFormError(_t("Update or check already in progress")); return; } @@ -172,7 +174,7 @@ public class ConfigUpdateHandler extends FormHandler { if (shouldProxy && proxyPort == ConfigUpdateHandler.DEFAULT_PROXY_PORT_INT && proxyHost.equals(ConfigUpdateHandler.DEFAULT_PROXY_HOST) && _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) < 0) { - addFormError(_("HTTP client proxy tunnel must be running")); + addFormError(_t("HTTP client proxy tunnel must be running")); return; } @@ -185,19 +187,19 @@ public class ConfigUpdateHandler extends FormHandler { a3 = mgr.checkAvailable(ROUTER_UNSIGNED, 40*1000) != null; if (a1 || a2 || a3) { if ( (_updatePolicy == null) || (!_updatePolicy.equals("notify")) ) - addFormNotice(_("Update available, attempting to download now")); + addFormNotice(_t("Update available, attempting to download now")); else - addFormNotice(_("Update available, click button on left to download")); + addFormNotice(_t("Update available, click button on left to download")); // So that update() will post a status to the summary bar before we reload try { Thread.sleep(1000); } catch (InterruptedException ie) {} } else - addFormNotice(_("No update available")); + addFormNotice(_t("No update available")); return; } - if (!_action.equals(_("Save"))) + if (!_action.equals(_t("Save"))) return; Map changes = new HashMap(); @@ -211,26 +213,26 @@ public class ConfigUpdateHandler extends FormHandler { changes.put(PROP_NEWS_URL, _newsURL); // this invalidates the news changes.put(NewsHelper.PROP_LAST_CHECKED, "0"); - addFormNotice(_("Updating news URL to {0}", _newsURL)); + addFormNotice(_t("Updating news URL to {0}", _newsURL)); } else { addFormError("Changing news URL disabled"); } } } - if (_proxyHost != null && _proxyHost.length() > 0 && !_proxyHost.equals(_("internal"))) { + if (_proxyHost != null && _proxyHost.length() > 0 && !_proxyHost.equals(_t("internal"))) { String oldHost = _context.router().getConfigSetting(PROP_PROXY_HOST); if ( (oldHost == null) || (!_proxyHost.equals(oldHost)) ) { changes.put(PROP_PROXY_HOST, _proxyHost); - addFormNotice(_("Updating proxy host to {0}", _proxyHost)); + addFormNotice(_t("Updating proxy host to {0}", _proxyHost)); } } - if (_proxyPort != null && _proxyPort.length() > 0 && !_proxyPort.equals(_("internal"))) { + if (_proxyPort != null && _proxyPort.length() > 0 && !_proxyPort.equals(_t("internal"))) { String oldPort = _context.router().getConfigSetting(PROP_PROXY_PORT); if ( (oldPort == null) || (!_proxyPort.equals(oldPort)) ) { changes.put(PROP_PROXY_PORT, _proxyPort); - addFormNotice(_("Updating proxy port to {0}", _proxyPort)); + addFormNotice(_t("Updating proxy port to {0}", _proxyPort)); } } @@ -246,15 +248,15 @@ public class ConfigUpdateHandler extends FormHandler { try { oldFreq = Long.parseLong(oldFreqStr); } catch (NumberFormatException nfe) {} if (_refreshFrequency != oldFreq) { changes.put(PROP_REFRESH_FREQUENCY, ""+_refreshFrequency); - addFormNoticeNoEscape(_("Updating refresh frequency to {0}", - _refreshFrequency <= 0 ? _("Never") : DataHelper.formatDuration2(_refreshFrequency))); + addFormNoticeNoEscape(_t("Updating refresh frequency to {0}", + _refreshFrequency <= 0 ? _t("Never") : DataHelper.formatDuration2(_refreshFrequency))); } if ( (_updatePolicy != null) && (_updatePolicy.length() > 0) ) { String oldPolicy = _context.router().getConfigSetting(PROP_UPDATE_POLICY); if ( (oldPolicy == null) || (!_updatePolicy.equals(oldPolicy)) ) { changes.put(PROP_UPDATE_POLICY, _updatePolicy); - addFormNotice(_("Updating update policy to {0}", _updatePolicy)); + addFormNotice(_t("Updating update policy to {0}", _updatePolicy)); } } @@ -263,7 +265,7 @@ public class ConfigUpdateHandler extends FormHandler { String oldURL = _context.router().getConfigSetting(PROP_UPDATE_URL); if ( (oldURL == null) || (!_updateURL.equals(oldURL)) ) { changes.put(PROP_UPDATE_URL, _updateURL); - addFormNotice(_("Updating update URLs.")); + addFormNotice(_t("Updating update URLs.")); } } @@ -275,7 +277,7 @@ public class ConfigUpdateHandler extends FormHandler { // note that keys are not validated here and no console error message will be generated if (isAdvanced()) { changes.put(PROP_TRUSTED_KEYS, _trustedKeys); - addFormNotice(_("Updating trusted keys.")); + addFormNotice(_t("Updating trusted keys.")); } else { addFormError("Changing trusted keys disabled"); } @@ -287,7 +289,7 @@ public class ConfigUpdateHandler extends FormHandler { if ( (oldURL == null) || (!_zipURL.equals(oldURL)) ) { if (isAdvanced()) { changes.put(PROP_ZIP_URL, _zipURL); - addFormNotice(_("Updating unsigned update URL to {0}", _zipURL)); + addFormNotice(_t("Updating unsigned update URL to {0}", _zipURL)); } else { addFormError("Changing unsigned update URL disabled"); } @@ -299,7 +301,7 @@ public class ConfigUpdateHandler extends FormHandler { if ( (oldURL == null) || (!_devSU3URL.equals(oldURL)) ) { if (isAdvanced()) { changes.put(PROP_DEV_SU3_URL, _devSU3URL); - addFormNotice(_("Updating signed development build URL to {0}", _devSU3URL)); + addFormNotice(_t("Updating signed development build URL to {0}", _devSU3URL)); } else { addFormError("Changing signed update URL disabled"); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index c5c13c0aa..3b3869025 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -34,7 +34,8 @@ public class ConfigUpdateHelper extends HelperBase { public static String getNewsURL(I2PAppContext ctx) { String url = ctx.getProperty(ConfigUpdateHandler.PROP_NEWS_URL); if (url != null && !url.equals(ConfigUpdateHandler.OLD_DEFAULT_NEWS_URL) && - !url.equals(ConfigUpdateHandler.DEFAULT_NEWS_URL)) + !url.equals(ConfigUpdateHandler.DEFAULT_NEWS_URL) && + !url.equals(ConfigUpdateHandler.OLD_DEFAULT_NEWS_URL_SU3)) return url; else return ConfigUpdateHandler.DEFAULT_NEWS_URL_SU3; @@ -50,13 +51,13 @@ public class ConfigUpdateHelper extends HelperBase { public String getProxyHost() { if (isInternal()) - return _("internal") + "\" readonly=\"readonly"; + return _t("internal") + "\" readonly=\"readonly"; return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); } public String getProxyPort() { if (isInternal()) - return _("internal") + "\" readonly=\"readonly"; + return _t("internal") + "\" readonly=\"readonly"; return Integer.toString(ConfigUpdateHandler.proxyPort(_context)); } @@ -89,18 +90,14 @@ public class ConfigUpdateHelper extends HelperBase { } public String getUpdateUnsigned() { - if (_context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_UNSIGNED)) - return ""; - else - return ""; + return "'; } /** @since 0.9.20 */ public String getUpdateDevSU3() { - if (_context.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_DEV_SU3)) - return ""; - else - return ""; + return "'; } private static final long PERIODS[] = new long[] { 12*60*60*1000l, 24*60*60*1000l, @@ -126,9 +123,9 @@ public class ConfigUpdateHelper extends HelperBase { buf.append("\" selected=\"selected"); if (PERIODS[i] == -1) - buf.append("\">").append(_("Never")).append("\n"); + buf.append("\">").append(_t("Never")).append("\n"); else - buf.append("\">").append(_("Every")).append(' ').append(DataHelper.formatDuration2(PERIODS[i])).append("\n"); + buf.append("\">").append(_t("Every")).append(' ').append(DataHelper.formatDuration2(PERIODS[i])).append("\n"); } buf.append("\n"); return buf.toString(); @@ -146,14 +143,14 @@ public class ConfigUpdateHelper extends HelperBase { buf.append(""); + buf.append('>').append(_t("Notify only")).append(""); buf.append(""); + buf.append('>').append(_t("Download and verify only")).append(""); if (_context.hasWrapper()) { buf.append(""); + buf.append('>').append(_t("Download, verify, and restart")).append(""); } buf.append("\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java index 492c006e2..9dd7892f2 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java @@ -12,11 +12,11 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import java.util.TreeMap; import net.i2p.data.DataHelper; import net.i2p.router.util.EventLog; +import net.i2p.util.SystemVersion; /** * /events.jsp @@ -66,7 +66,7 @@ public class EventLogHelper extends FormHandler { public void setContextId(String contextId) { super.setContextId(contextId); for (int i = 0; i < _events.length; i += 2) { - _xevents.put(_events[i], _(_events[i + 1])); + _xevents.put(_events[i], _t(_events[i + 1])); } } @@ -99,27 +99,27 @@ public class EventLogHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

" + _("Display Events") + "

"); + _out.write("

" + _t("Display Events") + "

"); _out.write("
\n" + "\n" + "\n"); - _out.write(_("Events since") + ": "); for (int i = 0; i < _times.length; i++) { writeOption(_times[i]); } _out.write("
"); - _out.write(_("Event type") + ": "); // sorted by translated display string Map events = new TreeMap(Collator.getInstance()); for (int i = 0; i < _events.length; i += 2) { events.put(_xevents.get(_events[i]), _events[i]); } - writeOption(_("All events"), ALL); + writeOption(_t("All events"), ALL); for (Map.Entry e : events.entrySet()) { writeOption(e.getKey(), e.getValue()); } _out.write("" + - "
"); + "
"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -145,7 +145,7 @@ public class EventLogHelper extends FormHandler { _out.write(" selected=\"selected\""); _out.write(">"); if (age == 0) - _out.write(_("All events")); + _out.write(_t("All events")); else _out.write(DataHelper.formatDuration2(age)); _out.write("\n"); @@ -167,21 +167,21 @@ public class EventLogHelper extends FormHandler { if (events.isEmpty()) { if (isAll) { if (_age == 0) - return _("No events found"); - return _("No events found in previous {0}", DataHelper.formatDuration2(_age)); + return _t("No events found"); + return _t("No events found in previous {0}", DataHelper.formatDuration2(_age)); } if (_age == 0) - return _("No \"{0}\" events found", xev); - return _("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)); + return _t("No \"{0}\" events found", xev); + return _t("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)); } StringBuilder buf = new StringBuilder(2048); buf.append("
"); - buf.append(_("Time")); + buf.append(_t("Time")); buf.append(""); if (isAll) { - buf.append(_("Event")); + buf.append(_t("Event")); buf.append(""); - buf.append(_("Details")); + buf.append(_t("Details")); } else { buf.append(xev); } @@ -189,9 +189,7 @@ public class EventLogHelper extends FormHandler { SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); // the router sets the JVM time zone to UTC but saves the original here so we can get it - String systemTimeZone = _context.getProperty("i2p.systemTimeZone"); - if (systemTimeZone != null) - fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); List> entries = new ArrayList>(events.entrySet()); Collections.reverse(entries); @@ -202,7 +200,7 @@ public class EventLogHelper extends FormHandler { buf.append(fmt.format(new Date(time))); buf.append(""); if (isAll) { - String[] s = event.split(" ", 2); + String[] s = DataHelper.split(event, " ", 2); String xs = _xevents.get(s[0]); if (xs == null) xs = s[0]; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java index a56f8f7ad..dfec5d9cb 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java @@ -23,6 +23,7 @@ public abstract class FormHandler { protected RouterContext _context; protected Log _log; /** Not for multipart/form-data, will be null */ + @SuppressWarnings("rawtypes") protected Map _settings; /** Only for multipart/form-data. Warning, parameters are NOT XSS filtered */ protected RequestWrapper _requestWrapper; @@ -63,6 +64,7 @@ public abstract class FormHandler { * * @since 0.9.4 consolidated from numerous FormHandlers */ + @SuppressWarnings({"rawtypes", "unchecked"}) public void setSettings(Map settings) { _settings = new HashMap(settings); } /** @@ -248,9 +250,9 @@ public abstract class FormHandler { } if (!_nonce.equals(_nonce1) && !_nonce.equals(_nonce2)) { - addFormError(_("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.") + addFormError(_t("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.") + ' ' + - _("If the problem persists, verify that you have cookies enabled in your browser.")); + _t("If the problem persists, verify that you have cookies enabled in your browser.")); _valid = false; } } @@ -291,28 +293,28 @@ public abstract class FormHandler { } /** translate a string */ - public String _(String s) { + public String _t(String s) { return Messages.getString(s, _context); } /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } /** two params @since 0.8.2 */ - public String _(String s, Object o, Object o2) { + public String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index eff8dc3e3..5beb2ba23 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -159,7 +159,7 @@ public class GraphHelper extends FormHandler { + "&w=" + (3 * _width) + "&h=" + (3 * _height) + "\">"); - String title = _("Combined bandwidth graph"); + String title = _t("Combined bandwidth graph"); _out.write("" + _("All times are UTC.") + "

\n"); + //_out.write("

" + _t("All times are UTC.") + "

\n"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -220,7 +220,7 @@ public class GraphHelper extends FormHandler { if (_stat.equals("bw.combined")) { period = 60000; name = _stat; - displayName = _("Bandwidth usage"); + displayName = _t("Bandwidth usage"); } else { Set rates = StatSummarizer.instance().parseSpecs(_stat); if (rates.size() != 1) { @@ -233,9 +233,9 @@ public class GraphHelper extends FormHandler { displayName = name; } _out.write("

"); - _out.write(_("{0} for {1}", displayName, DataHelper.formatDuration2(_periodCount * period))); + _out.write(_t("{0} for {1}", displayName, DataHelper.formatDuration2(_periodCount * period))); if (_end > 0) - _out.write(' ' + _("ending {0} ago", DataHelper.formatDuration2(_end * period))); + _out.write(' ' + _t("ending {0} ago", DataHelper.formatDuration2(_end * period))); _out.write("

- "); } if (_width > MIN_X && _height > MIN_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 2 / 3, _height * 2 / 3)); - _out.write(_("Smaller")); + _out.write(_t("Smaller")); _out.write(" - "); } if (_height < MAX_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width, _height * 3 / 2)); - _out.write(_("Taller")); + _out.write(_t("Taller")); _out.write(" - "); } if (_height > MIN_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width, _height * 2 / 3)); - _out.write(_("Shorter")); + _out.write(_t("Shorter")); _out.write(" - "); } if (_width < MAX_X) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 3 / 2, _height)); - _out.write(_("Wider")); + _out.write(_t("Wider")); _out.write(" - "); } if (_width > MIN_X) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 2 / 3, _height)); - _out.write(_("Narrower")); + _out.write(_t("Narrower")); _out.write(""); } _out.write("
"); if (_periodCount < MAX_C) { _out.write(link(_stat, _showEvents, _periodCount * 2, _end, _width, _height)); - _out.write(_("Larger interval")); + _out.write(_t("Larger interval")); _out.write(" - "); } if (_periodCount > MIN_C) { _out.write(link(_stat, _showEvents, _periodCount / 2, _end, _width, _height)); - _out.write(_("Smaller interval")); + _out.write(_t("Smaller interval")); _out.write(""); } _out.write("
"); if (_periodCount < MAX_C) { _out.write(link(_stat, _showEvents, _periodCount, _end + _periodCount, _width, _height)); - _out.write(_("Previous interval")); + _out.write(_t("Previous interval")); _out.write(""); } @@ -311,17 +311,17 @@ public class GraphHelper extends FormHandler { if (_periodCount < MAX_C) _out.write(" - "); _out.write(link(_stat, _showEvents, _periodCount, end, _width, _height)); - _out.write(_("Next interval")); + _out.write(_t("Next interval")); _out.write(" "); } _out.write("
"); _out.write(link(_stat, !_showEvents, _periodCount, _end, _width, _height)); if (!_stat.equals("bw.combined")) - _out.write(_showEvents ? _("Plot averages") : _("plot events")); + _out.write(_showEvents ? _t("Plot averages") : _t("plot events")); _out.write(""); - _out.write("

" + _("All times are UTC.") + "

\n"); + _out.write("

" + _t("All times are UTC.") + "

\n"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -353,17 +353,17 @@ public class GraphHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

" + _("Configure Graph Display") + " [" + _("Select Stats") + "]

"); + _out.write("

" + _t("Configure Graph Display") + " [" + _t("Select Stats") + "]

"); _out.write("
\n" + "\n" + "\n"); - _out.write(_("Periods") + ":
\n"); - _out.write(_("Plot averages") + ": "); - _out.write(_("or")+ " " +_("plot events") + ":
\n"); - _out.write(_("Image sizes") + ": " + _("width") + ": " + _("pixels") + ", " + _("height") + ": " + _("pixels") + "
\n"); - _out.write(_("Refresh delay") + ":
\n"); + _out.write(_t("Plot averages") + ": "); + _out.write(_t("or")+ " " +_t("plot events") + ":
\n"); + _out.write(_t("Image sizes") + ": " + _t("width") + ": " + _t("pixels") + ", " + _t("height") + ": " + _t("pixels") + "
\n"); + _out.write(_t("Refresh delay") + ":
\n" + - _("Store graph data on disk?") + + _t("Store graph data on disk?") + " " + - "
"); + "
"); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -440,7 +440,7 @@ public class GraphHelper extends FormHandler { changes.put(PROP_EVENTS, "" + _showEvents); changes.put(SummaryListener.PROP_PERSISTENT, "" + _persistent); _context.router().saveConfig(changes, null); - addFormNotice(_("Graph settings saved")); + addFormNotice(_t("Graph settings saved")); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java index ff0dc8059..12e2a173b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HelperBase.java @@ -12,6 +12,7 @@ public abstract class HelperBase { protected Writer _out; static final String PROP_ADVANCED = "routerconsole.advanced"; + static final String CHECKED = " checked=\"checked\" "; /** * Configure this bean to query a particular router context @@ -43,29 +44,42 @@ public abstract class HelperBase { */ public void storeWriter(Writer out) { _out = out; } + /** + * Is a boolean property set to true? + * + * @param prop must default to false + * @return non-null, either "" or " checked=\"checked\" " + * @since 0.9.24 consolidated from various helpers + */ + protected String getChecked(String prop) { + if (_context.getBooleanProperty(prop)) + return CHECKED; + return ""; + } + /** translate a string */ - public String _(String s) { + public String _t(String s) { return Messages.getString(s, _context); } /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } /** two params @since 0.7.14 */ - public String _(String s, Object o, Object o2) { + public String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java index 1569ebc9b..cc6f017a5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; import net.i2p.util.PortMapper; @@ -24,6 +25,7 @@ public class HomeHelper extends HelperBase { static final String PROP_OLDHOME = "routerconsole.oldHomePage"; private static final String PROP_SEARCH = "routerconsole.showSearch"; + // No commas allowed in text strings! static final String DEFAULT_SERVICES = _x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/dns" + S + I + "book_addresses.png" + S + _x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "action_log.png" + S + @@ -36,6 +38,7 @@ public class HomeHelper extends HelperBase { _x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server_32x32.png" + S + ""; + // No commas allowed in text strings! static final String DEFAULT_FAVORITES = "anoncoin.i2p" + S + _x("The Anoncoin project") + S + "http://anoncoin.i2p/" + S + I + "anoncoin_32.png" + S + _x("Bug Reports") + S + _x("Bug tracker") + S + "http://trac.i2p2.i2p/report/1" + S + I + "bug.png" + S + @@ -43,10 +46,12 @@ public class HomeHelper extends HelperBase { _x("Dev Forum") + S + _x("Development forum") + S + "http://zzz.i2p/" + S + I + "group_gear.png" + S + _x("diftracker") + S + _x("Bittorrent tracker") + S + "http://diftracker.i2p/" + S + I + "magnet.png" + S + "echelon.i2p" + S + _x("I2P Applications") + S + "http://echelon.i2p/" + S + I + "box_open.png" + S + + "exchanged.i2p" + S + _x("Anonymous cryptocurrency exchange") + S + "http://exchanged.i2p/" + S + I + "exchanged.png" + S + _x("FAQ") + S + _x("Frequently Asked Questions") + S + "http://i2p-projekt.i2p/faq" + S + I + "question.png" + S + _x("Forum") + S + _x("Community forum") + S + "http://forum.i2p/" + S + I + "group.png" + S + _x("Anonymous Git Hosting") + S + _x("A public anonymous Git hosting site - supports pulling via Git and HTTP and pushing via SSH") + S + "http://git.repo.i2p/" + S + I + "git-logo.png" + S + "hiddengate.i2p" + S + _x("HiddenGate") + S + "http://hiddengate.i2p/" + S + I + "hglogo32.png" + S + + _x("I2P Wiki") + S + _x("Anonymous wiki - share the knowledge") + S + "http://i2pwiki.i2p/" + S + I + "i2pwiki_logo.png" + S + "Ident " + _x("Microblog") + S + _x("Your premier microblogging service on I2P") + S + "http://id3nt.i2p/" + S + I + "ident_icon_blue.png" + S + _x("Javadocs") + S + _x("Technical documentation") + S + "http://i2p-javadocs.i2p/" + S + I + "education.png" + S + //"jisko.i2p" + S + _x("Simple and fast microblogging website") + S + "http://jisko.i2p/" + S + I + "jisko_console_icon.png" + S + @@ -54,15 +59,16 @@ public class HomeHelper extends HelperBase { "killyourtv.i2p" + S + _x("Debian and Tahoe-LAFS repositories") + S + "http://killyourtv.i2p/" + S + I + "television_delete.png" + S + _x("Free Web Hosting") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S + _x("Pastebin") + S + _x("I2P Pastebin") + S + "http://pastethis.i2p/" + S + I + "paste_plain.png" + S + - "Planet I2P" + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S + + _x("Planet I2P") + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S + _x("Plugins") + S + _x("Add-on directory") + S + "http://plugins.i2p/" + S + I + "plugin.png" + S + _x("Postman's Tracker") + S + _x("Bittorrent tracker") + S + "http://tracker2.postman.i2p/" + S + I + "magnet.png" + S + _x("Project Website") + S + _x("I2P home page") + S + "http://i2p-projekt.i2p/" + S + I + "info_rhombus.png" + S + + _x("Russian News Feed") + S + "lenta.i2p" + S + "http://lenta.i2p/" + S + I + "lenta_main_logo.png" + S + //"Salt" + S + "salt.i2p" + S + "http://salt.i2p/" + S + I + "salt_console.png" + S + "stats.i2p" + S + _x("I2P Network Statistics") + S + "http://stats.i2p/cgi-bin/dashboard.cgi" + S + I + "chart_line.png" + S + _x("Technical Docs") + S + _x("Technical documentation") + S + "http://i2p-projekt.i2p/how" + S + I + "education.png" + S + _x("Trac Wiki") + S + S + "http://trac.i2p2.i2p/" + S + I + "billiard_marker.png" + S + - _x("Ugha's Wiki") + S + S + "http://ugha.i2p/" + S + I + "billiard_marker.png" + S + + //_x("Ugha's Wiki") + S + S + "http://ugha.i2p/" + S + I + "billiard_marker.png" + S + _x("Sponge's main site") + S + _x("Seedless and the Robert BitTorrent applications") + S + "http://sponge.i2p/" + S + I + "user_astronaut.png" + S + ""; @@ -97,16 +103,15 @@ public class HomeHelper extends HelperBase { } public String getConfigHome() { - boolean oldHome = _context.getBooleanProperty(PROP_OLDHOME); - return oldHome ? "checked=\"true\"" : ""; + return getChecked(PROP_OLDHOME); } public String getProxyStatus() { int port = _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY); if (port <= 0) - return _("The HTTP proxy is not up"); + return _t("The HTTP proxy is not up"); return "\"""; } @@ -129,8 +134,10 @@ public class HomeHelper extends HelperBase { return renderConfig(apps); } + private static final String SS = Character.toString(S); + static Collection buildApps(RouterContext ctx, String config) { - String[] args = config.split("" + S); + String[] args = DataHelper.split(config, SS); Set apps = new TreeSet(new AppComparator()); for (int i = 0; i < args.length - 3; i += 4) { String name = Messages.getString(args[i], ctx); @@ -143,7 +150,7 @@ public class HomeHelper extends HelperBase { } static Collection buildSearchApps(String config) { - String[] args = config.split("" + S); + String[] args = DataHelper.split(config, SS); Set apps = new TreeSet(new AppComparator()); for (int i = 0; i < args.length - 1; i += 2) { String name = args[i]; @@ -166,13 +173,22 @@ public class HomeHelper extends HelperBase { ctx.router().saveConfig(prop, buf.toString()); } - private static String renderApps(Collection apps) { + private String renderApps(Collection apps) { + String website = _t("Website"); StringBuilder buf = new StringBuilder(1024); buf.append("
"); for (App app : apps) { + String url; + if (app.name.equals(website) && app.url.equals("http://127.0.0.1:7658/")) { + // fixup eepsite link + url = "http://" + _context.portMapper().getHost(PortMapper.SVC_EEPSITE, "127.0.0.1") + + ':' + _context.portMapper().getPort(PortMapper.SVC_EEPSITE, 7658) + '/'; + } else { + url = app.url; + } buf.append("
" + "\n"); @@ -195,11 +211,11 @@ public class HomeHelper extends HelperBase { private String renderConfig(Collection apps) { StringBuilder buf = new StringBuilder(1024); buf.append("\n"); for (App app : apps) { buf.append("\n"); + .append(DataHelper.escapeHTML(app.name)) + .append("\n"); } buf.append("" + - ""); + .append(_t("Add")).append(":" + + "" + + ""); buf.append("
") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("Name")) + .append(_t("Name")) .append("") - .append(_("URL")) + .append(_t("URL")) .append("
"); } buf.append("") - .append(app.name) - .append("") - .append(app.url.replace("&", "&")) - .append("
"); + // truncate before escaping + if (app.url.length() > 50) + buf.append(DataHelper.escapeHTML(app.url.substring(0, 48))).append("…"); + else + buf.append(url); + buf.append("
") - .append(_("Add")).append(":" + - "
\n"); return buf.toString(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java index e270bf7ff..7bc28287f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java @@ -1,8 +1,7 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; import java.io.Serializable; import java.io.Writer; import java.util.ArrayList; @@ -25,9 +24,9 @@ public class JobQueueHelper extends HelperBase { renderStatusHTML(_out); return ""; } else { - ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); - renderStatusHTML(new OutputStreamWriter(baos)); - return new String(baos.toByteArray()); + StringWriter sw = new StringWriter(32*1024); + renderStatusHTML(sw); + return sw.toString(); } } catch (IOException ioe) { ioe.printStackTrace(); @@ -48,29 +47,29 @@ public class JobQueueHelper extends HelperBase { int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs); StringBuilder buf = new StringBuilder(32*1024); - buf.append("

").append(_("I2P Job Queue")).append("


") - .append(_("Job runners")).append(": ").append(numRunners) + buf.append("

").append(_t("I2P Job Queue")).append("


") + .append(_t("Job runners")).append(": ").append(numRunners) .append("
\n"); long now = _context.clock().now(); - buf.append("
").append(_("Active jobs")).append(": ").append(activeJobs.size()).append("
    \n"); + buf.append("
    ").append(_t("Active jobs")).append(": ").append(activeJobs.size()).append("
      \n"); for (int i = 0; i < activeJobs.size(); i++) { Job j = activeJobs.get(i); - buf.append("
    1. (").append(_("started {0} ago", DataHelper.formatDuration2(now-j.getTiming().getStartAfter()))).append("): "); + buf.append("
    2. (").append(_t("started {0} ago", DataHelper.formatDuration2(now-j.getTiming().getStartAfter()))).append("): "); buf.append(j.toString()).append("
    3. \n"); } buf.append("
    \n"); - buf.append("
    ").append(_("Just finished jobs")).append(": ").append(justFinishedJobs.size()).append("
      \n"); + buf.append("
      ").append(_t("Just finished jobs")).append(": ").append(justFinishedJobs.size()).append("
        \n"); for (int i = 0; i < justFinishedJobs.size(); i++) { Job j = justFinishedJobs.get(i); - buf.append("
      1. (").append(_("finished {0} ago", DataHelper.formatDuration2(now-j.getTiming().getActualEnd()))).append("): "); + buf.append("
      2. (").append(_t("finished {0} ago", DataHelper.formatDuration2(now-j.getTiming().getActualEnd()))).append("): "); buf.append(j.toString()).append("
      3. \n"); } buf.append("
      \n"); - buf.append("
      ").append(_("Ready/waiting jobs")).append(": ").append(readyJobs.size()).append("
        \n"); + buf.append("
        ").append(_t("Ready/waiting jobs")).append(": ").append(readyJobs.size()).append("
          \n"); ObjectCounter counter = new ObjectCounter(); for (int i = 0; i < readyJobs.size(); i++) { Job j = readyJobs.get(i); @@ -87,7 +86,7 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
          ").append(_("Scheduled jobs")).append(": ").append(timedJobs.size()).append("
            \n"); + buf.append("
            ").append(_t("Scheduled jobs")).append(": ").append(timedJobs.size()).append("
              \n"); long prev = Long.MIN_VALUE; counter.clear(); for (int i = 0; i < timedJobs.size(); i++) { @@ -97,7 +96,7 @@ public class JobQueueHelper extends HelperBase { continue; long time = j.getTiming().getStartAfter() - now; // translators: {0} is a job name, {1} is a time, e.g. 6 min - buf.append("
            1. ").append(_("{0} will start in {1}", j.getName(), DataHelper.formatDuration2(time))); + buf.append("
            2. ").append(_t("{0} will start in {1}", j.getName(), DataHelper.formatDuration2(time))); // debug, don't bother translating if (time < 0) buf.append(" DELAYED"); @@ -111,7 +110,7 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
              ").append(_("Total Job Statistics")).append("\n"); + buf.append("
              ").append(_t("Total Job Statistics")).append("\n"); getJobStats(buf); out.write(buf.toString()); } @@ -122,7 +121,7 @@ public class JobQueueHelper extends HelperBase { if (names.size() < 4) return; buf.append("\n" + - "
              ").append(_("Job")).append("").append(_("Queued")).append(""); + "
              ").append(_t("Job")).append("").append(_t("Queued")).append(""); Collections.sort(names, new JobCountComparator(counter)); for (String name : names) { buf.append("
              ").append(name) @@ -139,12 +138,12 @@ public class JobQueueHelper extends HelperBase { */ private void getJobStats(StringBuilder buf) { buf.append("\n" + - "" + - "" + - "" + - "\n"); + "" + + "" + + "" + + "\n"); long totRuns = 0; long totDropped = 0; long totExecTime = 0; @@ -195,7 +194,7 @@ public class JobQueueHelper extends HelperBase { } buf.append(""); - buf.append(""); + buf.append(""); buf.append(""); buf.append(""); buf.append(""); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java index 74ce11a19..1343a88cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LocaleWebAppHandler.java @@ -83,6 +83,7 @@ public class LocaleWebAppHandler extends HandlerWrapper if (lang != null && lang.length() > 0 && !lang.equals("en")) { String testPath = pathInContext.substring(0, len - 4) + '_' + lang + ".jsp"; // Do we have a servlet for the new path that isn't the catchall *.jsp? + @SuppressWarnings("rawtypes") Map.Entry servlet = _wac.getServletHandler().getHolderEntry(testPath); if (servlet != null) { String servletPath = (String) servlet.getKey(); @@ -130,7 +131,7 @@ public class LocaleWebAppHandler extends HandlerWrapper /** * Mysteriously removed from Jetty 7 */ - private void setInitParams(Map params) { + private void setInitParams(Map params) { setInitParams(_wac, params); } @@ -138,7 +139,7 @@ public class LocaleWebAppHandler extends HandlerWrapper * @since Jetty 7 */ public static void setInitParams(WebAppContext context, Map params) { - for (Map.Entry e : params.entrySet()) { + for (Map.Entry e : params.entrySet()) { context.setInitParameter((String)e.getKey(), (String)e.getValue()); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index e3845df9d..dbed0c82e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -46,7 +46,7 @@ public class LogsHelper extends HelperBase { */ public String getLogs() { String str = formatMessages(_context.logManager().getBuffer().getMostRecentMessages()); - return "

              " + _("File location") + ": " + _context.logManager().currentFile() + "

              " + str; + return "

              " + _t("File location") + ": " + _context.logManager().currentFile() + "

              " + str; } /** @@ -97,10 +97,10 @@ public class LogsHelper extends HelperBase { str = FileUtil.readTextFile(f.getAbsolutePath(), 250, false); } if (str == null) { - return "

              " + _("File not found") + ": " + f.getAbsolutePath() + "

              "; + return "

              " + _t("File not found") + ": " + f.getAbsolutePath() + "

              "; } else { str = str.replace("&", "&").replace("<", "<").replace(">", ">"); - return "

              " + _("File location") + ": " + f.getAbsolutePath() + "

              " + str + "
              "; + return "

              " + _t("File location") + ": " + f.getAbsolutePath() + "

              " + str + "
              "; } } @@ -115,7 +115,7 @@ public class LogsHelper extends HelperBase { /** formats in reverse order */ private String formatMessages(List msgs) { if (msgs.isEmpty()) - return "

              " + _("No log messages") + "

              "; + return "

              " + _t("No log messages") + "

              "; boolean colorize = _context.getBooleanPropertyDefaultTrue("routerconsole.logs.color"); StringBuilder buf = new StringBuilder(16*1024); buf.append("
                "); @@ -138,13 +138,13 @@ public class LogsHelper extends HelperBase { // Homeland Security Advisory System // http://www.dhs.gov/xinfoshare/programs/Copy_of_press_release_0046.shtm // but pink instead of yellow for WARN - if (msg.contains(_("CRIT"))) + if (msg.contains(_t("CRIT"))) color = "#cc0000"; - else if (msg.contains(_("ERROR"))) + else if (msg.contains(_t("ERROR"))) color = "#ff3300"; - else if (msg.contains(_("WARN"))) + else if (msg.contains(_t("WARN"))) color = "#ff00cc"; - else if (msg.contains(_("INFO"))) + else if (msg.contains(_t("INFO"))) color = "#000099"; else color = "#006600"; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/Messages.java b/apps/routerconsole/java/src/net/i2p/router/web/Messages.java index c76f260e8..ad3543085 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/Messages.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/Messages.java @@ -24,7 +24,7 @@ public class Messages extends Translate { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java index a72e2cd65..ba977a6e8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java @@ -5,6 +5,8 @@ import net.i2p.data.DataHelper; public class NetDbHelper extends HelperBase { private String _routerPrefix; + private String _version; + private String _country; private int _full; private boolean _lease; private boolean _debug; @@ -17,7 +19,8 @@ public class NetDbHelper extends HelperBase { _x("All Routers"), // 3 _x("All Routers with Full Stats"), // 4 "LeaseSet Debug", // 5 - _x("LeaseSets") }; // 6 + _x("LeaseSets"), // 6 + "Sybil" }; // 7 private static final String links[] = {"", // 0 @@ -26,13 +29,26 @@ public class NetDbHelper extends HelperBase { "?f=2", // 3 "?f=1", // 4 "?l=2", // 5 - "?l=1" }; // 6 + "?l=1", // 6 + "?f=3" }; // 7 public void setRouter(String r) { if (r != null) _routerPrefix = DataHelper.stripHTML(r); // XSS } + /** @since 0.9.21 */ + public void setVersion(String v) { + if (v != null) + _version = DataHelper.stripHTML(v); // XSS + } + + /** @since 0.9.21 */ + public void setCountry(String c) { + if (c != null) + _country = DataHelper.stripHTML(c); // XSS + } + public void setFull(String f) { try { _full = Integer.parseInt(f); @@ -59,10 +75,12 @@ public class NetDbHelper extends HelperBase { NetDbRenderer renderer = new NetDbRenderer(_context); try { renderNavBar(); - if (_routerPrefix != null) - renderer.renderRouterInfoHTML(_out, _routerPrefix); + if (_routerPrefix != null || _version != null || _country != null) + renderer.renderRouterInfoHTML(_out, _routerPrefix, _version, _country); else if (_lease) renderer.renderLeaseSetHTML(_out, _debug); + else if (_full == 3) + (new SybilRenderer(_context)).getNetDbSummary(_out); else renderer.renderStatusHTML(_out, _full); } catch (IOException ioe) { @@ -87,6 +105,8 @@ public class NetDbHelper extends HelperBase { return 3; if (_full == 1) return 4; + if (_full == 3) + return 7; return 0; } @@ -105,18 +125,18 @@ public class NetDbHelper extends HelperBase { for (int i = 0; i < titles.length; i++) { if (i == 2 && tab != 2) continue; // can't nav to lookup - if (i == 5 && !_context.getBooleanProperty(PROP_ADVANCED)) + if ((i == 5 || i == 7) && !_context.getBooleanProperty(PROP_ADVANCED)) continue; if (i == tab) { // we are there if (span) buf.append(""); - buf.append(_(titles[i])); + buf.append(_t(titles[i])); } else { // we are not there, make a link if (span) buf.append(""); - buf.append("").append(_(titles[i])).append(""); + buf.append("").append(_t(titles[i])).append(""); } if (span) buf.append(" \n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index 01e465987..c9a34ece0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -35,11 +35,12 @@ import net.i2p.router.RouterContext; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.util.HashDistance; // debug import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; +import net.i2p.util.Log; import net.i2p.util.ObjectCounter; import net.i2p.util.Translate; import net.i2p.util.VersionComparator; -public class NetDbRenderer { +class NetDbRenderer { private final RouterContext _context; public NetDbRenderer (RouterContext ctx) { @@ -68,7 +69,7 @@ public class NetDbRenderer { _us = us; } public int compare(LeaseSet l, LeaseSet r) { - return HashDistance.getDistance(_us, l.getRoutingKey()).subtract(HashDistance.getDistance(_us, r.getRoutingKey())).signum(); + return HashDistance.getDistance(_us, l.getRoutingKey()).compareTo(HashDistance.getDistance(_us, r.getRoutingKey())); } } @@ -78,7 +79,14 @@ public class NetDbRenderer { } } - public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException { + /** + * One String must be non-null + * + * @param routerPrefix may be null. "." for our router only + * @param version may be null + * @param country may be null + */ + public void renderRouterInfoHTML(Writer out, String routerPrefix, String version, String country) throws IOException { StringBuilder buf = new StringBuilder(4*1024); if (".".equals(routerPrefix)) { renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); @@ -87,13 +95,23 @@ public class NetDbRenderer { Set routers = _context.netDb().getRouters(); for (RouterInfo ri : routers) { Hash key = ri.getIdentity().getHash(); - if (key.toBase64().startsWith(routerPrefix)) { + if ((routerPrefix != null && key.toBase64().startsWith(routerPrefix)) || + (version != null && version.equals(ri.getVersion())) || + (country != null && country.equals(_context.commSystem().getCountry(key)))) { renderRouterInfo(buf, ri, false, true); notFound = false; } } - if (notFound) - buf.append(_("Router") + ' ').append(routerPrefix).append(' ' + _("not found in network database") ); + if (notFound) { + buf.append(_t("Router")).append(' '); + if (routerPrefix != null) + buf.append(routerPrefix); + else if (version != null) + buf.append(version); + else if (country != null) + buf.append(country); + buf.append(' ').append(_t("not found in network database")); + } } out.write(buf.toString()); out.flush(); @@ -124,24 +142,28 @@ public class NetDbRenderer { int rapCount = 0; BigInteger median = null; int c = 0; - if (debug) { + if (leases.isEmpty()) { + if (!debug) + buf.append("").append(_t("none")).append(""); + } else { + if (debug) { // Find the center of the RAP leasesets for (LeaseSet ls : leases) { if (ls.getReceivedAsPublished()) rapCount++; } medianCount = rapCount / 2; - } - long now = _context.clock().now(); - for (LeaseSet ls : leases) { + } + long now = _context.clock().now(); + for (LeaseSet ls : leases) { Destination dest = ls.getDestination(); Hash key = dest.calculateHash(); - buf.append("").append(_("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); + buf.append("").append(_t("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); if (_context.clientManager().isLocal(dest)) { - buf.append(" (" + _("Local") + " "); + buf.append(" (" + _t("Local") + " "); if (! _context.clientManager().shouldPublishLeaseSet(key)) - buf.append(_("Unpublished") + ' '); - buf.append(_("Destination") + ' '); + buf.append(_t("Unpublished") + ' '); + buf.append(_t("Destination") + ' '); TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key); if (in != null && in.getDestinationNickname() != null) buf.append(in.getDestinationNickname()); @@ -153,10 +175,10 @@ public class NetDbRenderer { String host = _context.namingService().reverseLookup(dest); if (host == null) { buf.append("").append(_("Add to local addressbook")).append("
                \n"); + .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("
                \n"); } } else { - buf.append(" (").append(_("Destination")).append(' '); + buf.append(" (").append(_t("Destination")).append(' '); String host = _context.namingService().reverseLookup(dest); if (host != null) { buf.append("").append(host).append(")
                \n"); @@ -165,14 +187,14 @@ public class NetDbRenderer { buf.append(dest.toBase64().substring(0, 6)).append(")
                \n" + "").append(b32).append("
                \n" + "").append(_("Add to local addressbook")).append("
                \n"); + .append(dest.toBase64()).append("#add\">").append(_t("Add to local addressbook")).append("
                \n"); } } long exp = ls.getLatestLeaseDate()-now; if (exp > 0) - buf.append(_("Expires in {0}", DataHelper.formatDuration2(exp))); + buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exp))); else - buf.append(_("Expired {0} ago", DataHelper.formatDuration2(0-exp))); + buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exp))); buf.append("
                \n"); if (debug) { buf.append("RAP? " + ls.getReceivedAsPublished()); @@ -191,22 +213,23 @@ public class NetDbRenderer { } for (int i = 0; i < ls.getLeaseCount(); i++) { Lease lease = ls.getLease(i); - buf.append(_("Lease")).append(' ').append(i + 1).append(": ").append(_("Gateway")).append(' '); + buf.append(_t("Lease")).append(' ').append(i + 1).append(": ").append(_t("Gateway")).append(' '); buf.append(_context.commSystem().renderPeerHTML(lease.getGateway())); - buf.append(' ').append(_("Tunnel")).append(' ').append(lease.getTunnelId().getTunnelId()).append(' '); + buf.append(' ').append(_t("Tunnel")).append(' ').append(lease.getTunnelId().getTunnelId()).append(' '); if (debug) { long exl = lease.getEndDate().getTime() - now; if (exl > 0) - buf.append(_("Expires in {0}", DataHelper.formatDuration2(exl))); + buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exl))); else - buf.append(_("Expired {0} ago", DataHelper.formatDuration2(0-exl))); + buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))); } buf.append("
                \n"); } buf.append("
                \n"); out.write(buf.toString()); buf.setLength(0); - } + } // for each + } // !empty if (debug) { FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb(); buf.append("

                Total Leasesets: ").append(leases.size()); @@ -243,7 +266,7 @@ public class NetDbRenderer { * http://forums.sun.com/thread.jspa?threadID=597652 * @since 0.7.14 */ - private static double biLog2(BigInteger a) { + public static double biLog2(BigInteger a) { int b = a.bitLength() - 1; double c = 0; double d = 0.5; @@ -260,10 +283,12 @@ public class NetDbRenderer { */ public void renderStatusHTML(Writer out, int mode) throws IOException { if (!_context.netDb().isInitialized()) { - out.write(_("Not initialized")); + out.write(_t("Not initialized")); out.flush(); return; } + Log log = _context.logManager().getLog(NetDbRenderer.class); + long start = System.currentTimeMillis(); boolean full = mode == 1; boolean shortStats = mode == 2; @@ -302,6 +327,10 @@ public class NetDbRenderer { transportCount[classifyTransports(ri)]++; } } + long end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 1 took " + (end - start)); + start = end; // // don't bother to reindent @@ -310,32 +339,37 @@ public class NetDbRenderer { // the summary table buf.append("

              ").append(_("Job")).append("").append(_("Runs")).append("").append(_("Dropped")).append("").append(_("Time")).append("").append(_("Avg")).append("") - .append(_("Max")).append("").append(_("Min")).append("").append(_("Pending")).append("").append(_("Avg")).append("") - .append(_("Max")).append("").append(_("Min")).append("
              ").append(_t("Job")).append("").append(_t("Runs")).append("").append(_t("Dropped")).append("").append(_t("Time")).append("").append(_t("Avg")).append("") + .append(_t("Max")).append("").append(_t("Min")).append("").append(_t("Pending")).append("").append(_t("Avg")).append("") + .append(_t("Max")).append("").append(_t("Min")).append("
              ").append(_("Summary")).append("").append(_t("Summary")).append("").append(totRuns).append("").append(totDropped).append("").append(DataHelper.formatDuration2(totExecTime)).append("
              ") - .append(_("Network Database Router Statistics")) + .append(_t("Network Database Router Statistics")) .append("
              "); // versions table List versionList = new ArrayList(versions.objects()); if (!versionList.isEmpty()) { Collections.sort(versionList, Collections.reverseOrder(new VersionComparator())); buf.append("\n"); - buf.append("\n"); + buf.append("\n"); for (String routerVersion : versionList) { int num = versions.count(routerVersion); - buf.append("\n"); + String ver = DataHelper.stripHTML(routerVersion); + buf.append("\n"); } buf.append("
              " + _("Version") + "" + _("Count") + "
              " + _t("Version") + "" + _t("Count") + "
              ").append(DataHelper.stripHTML(routerVersion)); - buf.append("").append(num).append("
              ").append(ver); + buf.append("").append(num).append("
              \n"); } buf.append("
              "); out.write(buf.toString()); buf.setLength(0); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 2 took " + (end - start)); + start = end; // transports table buf.append("\n"); - buf.append("\n"); + buf.append("\n"); for (int i = 0; i < TNAMES.length; i++) { int num = transportCount[i]; if (num > 0) { - buf.append("\n"); } } @@ -343,24 +377,32 @@ public class NetDbRenderer { buf.append("
              " + _("Transports") + "" + _("Count") + "
              " + _t("Transports") + "" + _t("Count") + "
              ").append(_(TNAMES[i])); + buf.append("
              ").append(_t(TNAMES[i])); buf.append("").append(num).append("
              "); out.write(buf.toString()); buf.setLength(0); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 3 took " + (end - start)); + start = end; // country table List countryList = new ArrayList(countries.objects()); if (!countryList.isEmpty()) { Collections.sort(countryList, new CountryComparator()); buf.append("\n"); - buf.append("\n"); + buf.append("\n"); for (String country : countryList) { int num = countries.count(country); buf.append("\n"); + buf.append("\n"); } buf.append("
              " + _("Country") + "" + _("Count") + "
              " + _t("Country") + "" + _t("Count") + "
              \"").append(country.toUpperCase(Locale.US)).append("\""); "); + buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> "); buf.append(getTranslatedCountry(country)); - buf.append("").append(num).append("
              ").append(num).append("
              \n"); } buf.append("
              "); + end = System.currentTimeMillis(); + if (log.shouldWarn()) + log.warn("part 4 took " + (end - start)); + start = end; // // don't bother to reindent @@ -408,29 +450,29 @@ public class NetDbRenderer { String hash = info.getIdentity().getHash().toBase64(); buf.append("\n"); if (full) { - buf.append("
              "); if (isUs) { - buf.append("" + _("Our info") + ": ").append(hash).append("
              \n"); + buf.append("" + _t("Our info") + ": ").append(hash).append("
              \n"); } else { - buf.append("" + _("Peer info for") + ": ").append(hash).append("\n"); + buf.append("" + _t("Peer info for") + ": ").append(hash).append("\n"); if (!full) { - buf.append("[").append(_("Full entry")).append("]"); + buf.append("[").append(_t("Full entry")).append("]"); } buf.append("
              \n"); } long age = _context.clock().now() - info.getPublished(); if (isUs && _context.router().isHidden()) { - buf.append("").append(_("Hidden")).append(", ").append(_("Updated")).append(": ") - .append(_("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("").append(_t("Hidden")).append(", ").append(_t("Updated")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); } else if (age > 0) { - buf.append("").append(_("Published")).append(": ") - .append(_("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("").append(_t("Published")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); } else { // shouldnt happen - buf.append("" + _("Published") + ": in ").append(DataHelper.formatDuration2(0-age)).append("???
              \n"); + buf.append("" + _t("Published") + ": in ").append(DataHelper.formatDuration2(0-age)).append("???
              \n"); } - buf.append("").append(_("Signing Key")).append(": ") + buf.append("").append(_t("Signing Key")).append(": ") .append(info.getIdentity().getSigningPublicKey().getType().toString()); - buf.append("
              \n" + _("Address(es)") + ": "); + buf.append("
              \n" + _t("Address(es)") + ": "); String country = _context.commSystem().getCountry(info.getIdentity().getHash()); if(country != null) { buf.append("\"").append(country.toUpperCase(Locale.US)).append('\"');").append(DataHelper.stripHTML(style)).append(": "); int cost = addr.getCost(); if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10))) - buf.append('[').append(_("cost")).append('=').append("" + cost).append("] "); + buf.append('[').append(_t("cost")).append('=').append("" + cost).append("] "); Map p = addr.getOptionsMap(); for (Map.Entry e : p.entrySet()) { String name = (String) e.getKey(); String val = (String) e.getValue(); - buf.append('[').append(_(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] "); + buf.append('[').append(_t(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] "); } } buf.append("
              " + _("Stats") + ":
              "); + buf.append("
              " + _t("Stats") + ":
              "); Map p = info.getOptionsMap(); for (Map.Entry e : p.entrySet()) { String key = (String) e.getKey(); @@ -496,7 +538,7 @@ public class NetDbRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } @@ -507,17 +549,17 @@ public class NetDbRenderer { /** * translate a string with a parameter - * This is a lot more expensive than _(s), so use sparingly. + * This is a lot more expensive than _t(s), so use sparingly. * * @param s string to be translated containing {0} * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Messages.getString(s, o, _context); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java new file mode 100644 index 000000000..5eaa3e362 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -0,0 +1,90 @@ +package net.i2p.router.web; + +import java.text.DateFormat; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +import net.i2p.I2PAppContext; +import net.i2p.app.ClientAppManager; +import net.i2p.data.DataHelper; +import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; +import net.i2p.util.SystemVersion; + + +/** + * HTML-formatted full news entries + * + * @since 0.9.23 + */ +public class NewsFeedHelper extends HelperBase { + + private int _start = 0; + private int _limit = 2; + + /** + * @param limit less than or equal to zero means all + */ + public void setLimit(int limit) { + _limit = limit; + } + + public void setStart(int start) { + _start = start; + } + + public String getEntries() { + return getEntries(_context, _start, _limit); + } + + /** + * @param max less than or equal to zero means all + * @return non-null, "" if none + */ + static String getEntries(I2PAppContext ctx, int start, int max) { + if (max <= 0) + max = Integer.MAX_VALUE; + StringBuilder buf = new StringBuilder(512); + List entries = Collections.emptyList(); + ClientAppManager cmgr = ctx.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) + entries = nmgr.getEntries(); + } + if (!entries.isEmpty()) { + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + fmt.setTimeZone(SystemVersion.getSystemTimeZone(ctx)); + int i = 0; + for (NewsEntry entry : entries) { + if (i++ < start) + continue; + buf.append("

              "); + if (entry.updated > 0) { + Date date = new Date(entry.updated); + buf.append("") + .append(fmt.format(date)) + .append(": "); + } + if (entry.link != null) + buf.append(""); + buf.append(entry.title); + if (entry.link != null) + buf.append(""); + if (entry.authorName != null) { + buf.append(" (") + .append(Messages.getString("by {0}", DataHelper.escapeHTML(entry.authorName), ctx)) + .append(")\n"); + } + buf.append("

              \n
              \n") + .append(entry.content) + .append("\n
              \n"); + if (i >= start + max) + break; + } + } + return buf.toString(); + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index f7a30c6dd..ee353925a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -28,6 +28,11 @@ public class NewsHelper extends ContentHelper { public static final String PROP_LAST_CHECKED = "routerconsole.newsLastChecked"; /** @since 0.9.4 */ public static final String PROP_LAST_UPDATED = "routerconsole.newsLastUpdated"; + /** + * Default true + * @since 0.9.21 + */ + public static final String PROP_TRANSLATE = "routerconsole.newsTranslate"; public static final String NEWS_FILE = "docs/news.xml"; /** @@ -94,6 +99,28 @@ public class NewsHelper extends ContentHelper { return mgr.getUpdateConstraint(ROUTER_SIGNED, ""); } + /** + * Translated message about new version available but constrained + * @return null if none + * @since 0.9.23 + */ + public static String unsignedUpdateConstraint() { + ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance(); + if (mgr == null) return null; + return mgr.getUpdateConstraint(ROUTER_UNSIGNED, ""); + } + + /** + * Translated message about new version available but constrained + * @return null if none + * @since 0.9.23 + */ + public static String devSU3UpdateConstraint() { + ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance(); + if (mgr == null) return null; + return mgr.getUpdateConstraint(ROUTER_DEV_SU3, ""); + } + /** * Release update only. * Already downloaded but not installed version. @@ -199,37 +226,12 @@ public class NewsHelper extends ContentHelper { return mgr.getStatus(); } - private static final String BUNDLE_NAME = "net.i2p.router.news.messages"; - /** * If we haven't downloaded news yet, use the translated initial news file */ @Override public String getContent() { - File news = new File(_page); - if (!news.exists()) { - _page = (new File(_context.getBaseDir(), "docs/initialNews/initialNews.xml")).getAbsolutePath(); - // don't use super, translate on-the-fly - Reader reader = null; - try { - char[] buf = new char[512]; - StringBuilder out = new StringBuilder(2048); - reader = new TranslateReader(_context, BUNDLE_NAME, new FileInputStream(_page)); - int len; - while((len = reader.read(buf)) > 0) { - out.append(buf, 0, len); - } - return out.toString(); - } catch (IOException ioe) { - return ""; - } finally { - try { - if (reader != null) - reader.close(); - } catch (IOException foo) {} - } - } - return super.getContent(); + return NewsFeedHelper.getEntries(_context, 0, 2); } /** @@ -307,7 +309,10 @@ public class NewsHelper extends ContentHelper { buf.append(" ") .append(Messages.getString("Show news", ctx)); } - buf.append(""); + buf.append("" + + " - ") + .append(Messages.getString("Show all news", ctx)) + .append(""); } return buf.toString(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index e6bb87b70..2af0d5df4 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -157,6 +157,12 @@ public class PluginStarter implements Runnable { Messages.getString("HTTP client proxy tunnel must be running", ctx)); return; } + if (ctx.commSystem().isDummy()) { + mgr.notifyComplete(null, Messages.getString("Plugin update check failed", ctx) + + " - " + + "VM Comm System"); + return; + } Log log = ctx.logManager().getLog(PluginStarter.class); int updated = 0; @@ -258,6 +264,7 @@ public class PluginStarter implements Runnable { * @return true on success * @throws just about anything, caller would be wise to catch Throwable */ + @SuppressWarnings("deprecation") public static boolean startPlugin(RouterContext ctx, String appName) throws Exception { Log log = ctx.logManager().getLog(PluginStarter.class); File pluginDir = new File(ctx.getConfigDir(), PLUGIN_DIR + '/' + appName); @@ -338,9 +345,11 @@ public class PluginStarter implements Runnable { if (tfiles != null) { for (int i = 0; i < tfiles.length; i++) { String name = tfiles[i].getName(); - if (tfiles[i].isDirectory() && (!Arrays.asList(STANDARD_THEMES).contains(tfiles[i]))) + if (tfiles[i].isDirectory() && (!Arrays.asList(STANDARD_THEMES).contains(tfiles[i]))) { + // deprecated ctx.router().setConfigSetting(ConfigUIHelper.PROP_THEME_PFX + name, tfiles[i].getAbsolutePath()); // we don't need to save + } } } @@ -414,7 +423,7 @@ public class PluginStarter implements Runnable { addPath(f.toURI().toURL()); log.error("INFO: Adding translation plugin to classpath: " + f); added = true; - } catch (Exception e) { + } catch (RuntimeException e) { log.error("Plugin " + appName + " bad classpath element: " + f, e); } } @@ -537,7 +546,7 @@ public class PluginStarter implements Runnable { boolean deleted = FileUtil.rmdir(pluginDir, false); Properties props = pluginProperties(); - for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { + for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) { String name = (String)iter.next(); if (name.startsWith(PREFIX + appName + '.')) iter.remove(); @@ -867,11 +876,11 @@ public class PluginStarter implements Runnable { boolean isClientThreadRunning = isClientThreadRunning(pluginName, ctx); if (log.shouldLog(Log.DEBUG)) - log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning + "; webapp runing? " + isWarRunning + "; jobs running? " + isJobRunning); + log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning + "; webapp running? " + isWarRunning + "; jobs running? " + isJobRunning); return isClientThreadRunning || isWarRunning || isJobRunning; // //if (log.shouldLog(Log.DEBUG)) - // log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning); + // log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp running? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning); //return isClientThreadRunning(pluginName) || WebAppStarter.isWebAppRunning(pluginName) || isJobRunning; // } @@ -952,7 +961,7 @@ public class PluginStarter implements Runnable { urls.add(f.toURI().toURL()); if (log.shouldLog(Log.WARN)) log.warn("INFO: Adding plugin to classpath: " + f); - } catch (Exception e) { + } catch (IOException e) { log.error("Plugin client " + clientName + " bad classpath element: " + f, e); } } @@ -967,7 +976,7 @@ public class PluginStarter implements Runnable { private static void addPath(URL u) throws Exception { URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class urlClass = URLClassLoader.class; - Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class}); + Method method = urlClass.getDeclaredMethod("addURL", URL.class); method.setAccessible(true); method.invoke(urlClassLoader, new Object[]{u}); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java index 1a5461246..b43fd2518 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -47,7 +47,9 @@ class ProfileOrganizerRenderer { int standard = 0; for (Hash peer : peers) { if (_organizer.getUs().equals(peer)) continue; - PeerProfile prof = _organizer.getProfile(peer); + PeerProfile prof = _organizer.getProfileNonblocking(peer); + if (prof == null) + continue; if (mode == 2) { RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null && info.getCapabilities().indexOf("f") >= 0) @@ -75,7 +77,7 @@ class ProfileOrganizerRenderer { //// if (mode < 2) { - //buf.append("

              ").append(_("Peer Profiles")).append("

              \n

              "); + //buf.append("

              ").append(_t("Peer Profiles")).append("

              \n

              "); buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n'); if (older > 0) buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n'); @@ -84,12 +86,12 @@ class ProfileOrganizerRenderer { buf.append("

              "); buf.append(""); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); buf.append(""); int prevTier = 1; @@ -127,12 +129,12 @@ class ProfileOrganizerRenderer { buf.append(""); //buf.append("\n"); buf.append(""); // let's not build the whole page in memory (~500 bytes per peer) @@ -193,26 +195,26 @@ class ProfileOrganizerRenderer { //// } else { - //buf.append("

              ").append(_("Floodfill and Integrated Peers")) + //buf.append("

              ").append(_t("Floodfill and Integrated Peers")) // .append(" (").append(integratedPeers.size()).append(")

              \n"); buf.append("
              ").append(_("Peer")).append("").append(_("Groups (Caps)")).append("").append(_("Speed")).append("").append(_("Capacity")).append("").append(_("Integration")).append("").append(_("Status")).append("").append(_t("Peer")).append("").append(_t("Groups (Caps)")).append("").append(_t("Speed")).append("").append(_t("Capacity")).append("").append(_t("Integration")).append("").append(_t("Status")).append(" 
              "); switch (tier) { - case 1: buf.append(_("Fast, High Capacity")); break; - case 2: buf.append(_("High Capacity")); break; - case 3: buf.append(_("Standard")); break; - default: buf.append(_("Failing")); break; + case 1: buf.append(_t("Fast, High Capacity")); break; + case 2: buf.append(_t("High Capacity")); break; + case 3: buf.append(_t("Standard")); break; + default: buf.append(_t("Failing")); break; } - if (isIntegrated) buf.append(", ").append(_("Integrated")); + if (isIntegrated) buf.append(", ").append(_t("Integrated")); RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null) { // prevent HTML injection in the caps and version @@ -163,9 +165,9 @@ class ProfileOrganizerRenderer { } buf.append("").append(num(prof.getIntegrationValue())); buf.append(""); - if (_context.banlist().isBanlisted(peer)) buf.append(_("Banned")); - if (prof.getIsFailing()) buf.append(' ').append(_("Failing")); - if (_context.commSystem().wasUnreachable(peer)) buf.append(' ').append(_("Unreachable")); + if (_context.banlist().isBanlisted(peer)) buf.append(_t("Banned")); + if (prof.getIsFailing()) buf.append(' ').append(_t("Failing")); + if (_context.commSystem().wasUnreachable(peer)) buf.append(' ').append(_t("Unreachable")); RateAverages ra = RateAverages.getTemp(); Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30*60*1000); long fails = failed.computeAverages(ra, false).getTotalEventCount(); @@ -173,13 +175,13 @@ class ProfileOrganizerRenderer { Rate accepted = prof.getTunnelCreateResponseTime().getRate(30*60*1000); long total = fails + accepted.computeAverages(ra, false).getTotalEventCount(); if (total / fails <= 10) // hide if < 10% - buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails")); + buf.append(' ').append(fails).append('/').append(total).append(' ').append(_t("Test Fails")); } buf.append(" ").append(_("profile")).append(""); + // .append(peer.toBase64().substring(0,6)).append("\">").append(_t("profile")).append(""); buf.append("").append(_("profile")).append(""); + .append(peer.toBase64()).append("\">").append(_t("profile")).append(""); buf.append(" +-
              "); buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); RateAverages ra = RateAverages.getTemp(); for (PeerProfile prof : order) { @@ -227,33 +229,24 @@ class ProfileOrganizerRenderer { else buf.append(""); buf.append(""); - long time; - time = now - prof.getLastHeardAbout(); - buf.append(""); - time = now - prof.getLastHeardFrom(); - buf.append(""); - time = now - prof.getLastSendSuccessful(); - buf.append(""); - time = now - prof.getLastSendFailed(); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); buf.append(""); buf.append(""); DBHistory dbh = prof.getDBHistory(); if (dbh != null) { - time = now - dbh.getLastLookupSuccessful(); - buf.append(""); - time = now - dbh.getLastLookupFailed(); - buf.append(""); - time = now - dbh.getLastStoreSuccessful(); - buf.append(""); - time = now - dbh.getLastStoreFailed(); - buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); + buf.append(""); buf.append(""); buf.append(""); } else { for (int i = 0; i < 6; i++) - buf.append("\n"); } @@ -265,20 +258,20 @@ class ProfileOrganizerRenderer { } if (mode < 2) { - buf.append("

              ").append(_("Thresholds")).append("

              "); - buf.append("

              ").append(_("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) - .append(" (").append(fast).append(' ').append(_("fast peers")).append(")
              "); - buf.append("").append(_("Capacity")).append(": ").append(num(_organizer.getCapacityThreshold())) - .append(" (").append(reliable).append(' ').append(_("high capacity peers")).append(")
              "); - buf.append("").append(_("Integration")).append(": ").append(num(_organizer.getIntegrationThreshold())) - .append(" (").append(integrated).append(' ').append(_(" well integrated peers")).append(")

              "); - buf.append("

              ").append(_("Definitions")).append("

                "); - buf.append("
              • ").append(_("groups")).append(": ").append(_("as determined by the profile organizer")).append("
              • "); - buf.append("
              • ").append(_("caps")).append(": ").append(_("capabilities in the netDb, not used to determine profiles")).append("
              • "); - buf.append("
              • ").append(_("speed")).append(": ").append(_("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("
              • "); - buf.append("
              • ").append(_("capacity")).append(": ").append(_("how many tunnels can we ask them to join in an hour?")).append("
              • "); - buf.append("
              • ").append(_("integration")).append(": ").append(_("how many new peers have they told us about lately?")).append("
              • "); - buf.append("
              • ").append(_("status")).append(": ").append(_("is the peer banned, or unreachable, or failing tunnel tests?")).append("
              • "); + buf.append("

                ").append(_t("Thresholds")).append("

                "); + buf.append("

                ").append(_t("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) + .append(" (").append(fast).append(' ').append(_t("fast peers")).append(")
                "); + buf.append("").append(_t("Capacity")).append(": ").append(num(_organizer.getCapacityThreshold())) + .append(" (").append(reliable).append(' ').append(_t("high capacity peers")).append(")
                "); + buf.append("").append(_t("Integration")).append(": ").append(num(_organizer.getIntegrationThreshold())) + .append(" (").append(integrated).append(' ').append(_t(" well integrated peers")).append(")

                "); + buf.append("

                ").append(_t("Definitions")).append("

                  "); + buf.append("
                • ").append(_t("groups")).append(": ").append(_t("as determined by the profile organizer")).append("
                • "); + buf.append("
                • ").append(_t("caps")).append(": ").append(_t("capabilities in the netDb, not used to determine profiles")).append("
                • "); + buf.append("
                • ").append(_t("speed")).append(": ").append(_t("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("
                • "); + buf.append("
                • ").append(_t("capacity")).append(": ").append(_t("how many tunnels can we ask them to join in an hour?")).append("
                • "); + buf.append("
                • ").append(_t("integration")).append(": ").append(_t("how many new peers have they told us about lately?")).append("
                • "); + buf.append("
                • ").append(_t("status")).append(": ").append(_t("is the peer banned, or unreachable, or failing tunnel tests?")).append("
                • "); buf.append("
                "); //// @@ -345,13 +338,13 @@ class ProfileOrganizerRenderer { private String avg (PeerProfile prof, long rate, RateAverages ra) { RateStat rs = prof.getDbResponseTime(); if (rs == null) - return _(NA); + return _t(NA); Rate r = rs.getRate(rate); if (r == null) - return _(NA); + return _t(NA); r.computeAverages(ra, false); if (ra.getTotalEventCount() == 0) - return _(NA); + return _t(NA); return DataHelper.formatDuration2(Math.round(ra.getAverage())); } @@ -369,8 +362,18 @@ class ProfileOrganizerRenderer { return ((int) avg) + "%"; } + /** @since 0.9.21 */ + private String formatInterval(long now, long then) { + if (then <= 0) + return _t(NA); + // avoid 0 or negative + if (now <= then) + return DataHelper.formatDuration2(1); + return DataHelper.formatDuration2(now - then); + } + /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java index 6645558d5..3236d1f12 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java @@ -104,12 +104,12 @@ public class ProfilesHelper extends HelperBase { // we are there if (span) buf.append(""); - buf.append(_(titles[i])); + buf.append(_t(titles[i])); } else { // we are not there, make a link if (span) buf.append(""); - buf.append("").append(_(titles[i])).append(""); + buf.append("").append(_t(titles[i])).append(""); } if (span) buf.append(" \n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java index 213f82db1..8841073f5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java @@ -26,8 +26,9 @@ import net.i2p.crypto.KeyStoreUtil; import net.i2p.data.DataHelper; import net.i2p.jetty.I2PLogger; import net.i2p.router.RouterContext; -import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.router.app.RouterApp; +import net.i2p.router.news.NewsManager; +import net.i2p.router.update.ConsoleUpdateManager; import net.i2p.util.Addresses; import net.i2p.util.FileUtil; import net.i2p.util.I2PAppThread; @@ -298,12 +299,12 @@ public class RouterConsoleRunner implements RouterApp { log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); if (noJava7) { - s = "Java 7 will be required by mid-2015, please upgrade soon"; + s = "Java 7 will be required by late 2015, please upgrade soon"; log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); } if (noPack200) { - s = "Pack200 will be required by mid-2015, please upgrade Java soon"; + s = "Pack200 will be required by late 2015, please upgrade Java soon"; log.logAlways(net.i2p.util.Log.WARN, s); System.out.println("Warning: " + s); } @@ -517,7 +518,7 @@ public class RouterConsoleRunner implements RouterApp { sslFactory.setKeyManagerPassword(_context.getProperty(PROP_KEY_PASSWORD, "thisWontWork")); sslFactory.addExcludeProtocols(I2PSSLSocketFactory.EXCLUDE_PROTOCOLS.toArray( new String[I2PSSLSocketFactory.EXCLUDE_PROTOCOLS.size()])); - sslFactory.addExcludeCipherSuites(I2PSSLSocketFactory.INCLUDE_CIPHERS.toArray( + sslFactory.addExcludeCipherSuites(I2PSSLSocketFactory.EXCLUDE_CIPHERS.toArray( new String[I2PSSLSocketFactory.EXCLUDE_CIPHERS.size()])); StringTokenizer tok = new StringTokenizer(_sslListenHost, " ,"); while (tok.hasMoreTokens()) { @@ -629,8 +630,9 @@ public class RouterConsoleRunner implements RouterApp { } } if (error) { + String port = (_listenPort != null) ? _listenPort : ((_sslListenPort != null) ? _sslListenPort : "7657"); System.err.println("WARNING: Error starting one or more listeners of the Router Console server.\n" + - "If your console is still accessible at http://127.0.0.1:" + _listenPort + "/,\n" + + "If your console is still accessible at http://127.0.0.1:" + port + "/,\n" + "this may be a problem only with binding to the IPV6 address ::1.\n" + "If so, you may ignore this error, or remove the\n" + "\"::1,\" in the \"clientApp.0.args\" line of the clients.config file."); @@ -706,6 +708,8 @@ public class RouterConsoleRunner implements RouterApp { ConsoleUpdateManager um = new ConsoleUpdateManager(_context, _mgr, null); um.start(); + NewsManager nm = new NewsManager(_context, _mgr, null); + nm.startup(); if (PluginStarter.pluginsEnabled(_context)) { t = new I2PAppThread(new PluginStarter(_context), "PluginStarter", true); @@ -757,6 +761,13 @@ public class RouterConsoleRunner implements RouterApp { changes.put(PROP_KEY_PASSWORD, keyPassword); _context.router().saveConfig(changes, null); } catch (Exception e) {} // class cast exception + // export cert, fails silently + File dir = new SecureDirectory(_context.getConfigDir(), "certificates"); + dir.mkdir(); + dir = new SecureDirectory(dir, "console"); + dir.mkdir(); + File certFile = new File(dir, "console.local.crt"); + KeyStoreUtil.exportCert(ks, DEFAULT_KEYSTORE_PASSWORD, "console", certFile); } } if (success) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java index 3ee03289b..b9e40f959 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SearchHelper.java @@ -43,9 +43,11 @@ public class SearchHelper extends HelperBase { _query = s; } + private static final String SS = Character.toString(S); + private void buildEngineMap() { String config = _context.getProperty(PROP_ENGINES, ENGINES_DEFAULT); - String[] args = config.split("" + S); + String[] args = DataHelper.split(config, SS); for (int i = 0; i < args.length - 1; i += 2) { String name = args[i]; String url = args[i+1]; @@ -71,7 +73,7 @@ public class SearchHelper extends HelperBase { } } StringBuilder buf = new StringBuilder(1024); - buf.append(""); for (String name : _engines.keySet()) { buf.append("\n"); + buf.append(_t(group)).append("\n"); // let's just do the groups //Set stats = (Set)entry.getValue(); //for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) { @@ -54,14 +54,14 @@ public class StatsGenerator { //out.write(buf.toString()); //buf.setLength(0); } - buf.append(" "); + buf.append(" "); buf.append(""); - buf.append(_("Statistics gathered during this router's uptime")).append(" ("); + buf.append(_t("Statistics gathered during this router's uptime")).append(" ("); long uptime = _context.router().getUptime(); buf.append(DataHelper.formatDuration2(uptime)); - buf.append("). ").append( _("The data gathered is quantized over a 1 minute period, so should just be used as an estimate.")); - buf.append(' ').append( _("These statistics are primarily used for development and debugging.")); + buf.append("). ").append( _t("The data gathered is quantized over a 1 minute period, so should just be used as an estimate.")); + buf.append(' ').append( _t("These statistics are primarily used for development and debugging.")); out.write(buf.toString()); buf.setLength(0); @@ -72,7 +72,7 @@ public class StatsGenerator { buf.append("

                "); - buf.append(_(group)); + buf.append(_t(group)); buf.append("

                "); buf.append("
                  "); out.write(buf.toString()); @@ -102,7 +102,7 @@ public class StatsGenerator { buf.append(freq.getDescription()); buf.append("
                  "); if (freq.getEventCount() <= 0) { - buf.append(_("No lifetime events")).append("
                  \n"); + buf.append(_t("No lifetime events")).append("
                  \n"); return; } long uptime = _context.router().getUptime(); @@ -113,15 +113,15 @@ public class StatsGenerator { if (periods[i] > uptime) break; buf.append("
                • "); - renderPeriod(buf, periods[i], _("frequency")); + renderPeriod(buf, periods[i], _t("frequency")); Frequency curFreq = freq.getFrequency(periods[i]); buf.append(DataHelper.formatDuration2(Math.round(curFreq.getAverageInterval()))); buf.append("; "); - buf.append(_("Rolling average events per period")); + buf.append(_t("Rolling average events per period")); buf.append(": "); buf.append(num(curFreq.getAverageEventsPerPeriod())); buf.append("; "); - buf.append(_("Highest events per period")); + buf.append(_t("Highest events per period")); buf.append(": "); buf.append(num(curFreq.getMaxAverageEventsPerPeriod())); buf.append("; "); @@ -132,12 +132,12 @@ public class StatsGenerator { //} //buf.append(" avg interval between updates: (").append(num(curFreq.getAverageInterval())).append("ms, min "); //buf.append(num(curFreq.getMinAverageInterval())).append("ms)"); - buf.append(_("Lifetime average events per period")).append(": "); + buf.append(_t("Lifetime average events per period")).append(": "); buf.append(num(curFreq.getStrictAverageEventsPerPeriod())); buf.append("
                • \n"); } // Display the strict average - buf.append("
                • ").append(_("Lifetime average frequency")).append(": "); + buf.append("
                • ").append(_t("Lifetime average frequency")).append(": "); buf.append(DataHelper.formatDuration2(freq.getFrequency())); buf.append(" ("); buf.append(ngettext("1 event", "{0} events", (int) freq.getEventCount())); @@ -153,7 +153,7 @@ public class StatsGenerator { buf.append("
                  "); } if (rate.getLifetimeEventCount() <= 0) { - buf.append(_("No lifetime events")).append("
                  \n"); + buf.append(_t("No lifetime events")).append("
                  \n"); return; } long now = _context.clock().now(); @@ -165,12 +165,12 @@ public class StatsGenerator { if (curRate.getLastCoalesceDate() <= curRate.getCreationDate()) break; buf.append("
                • "); - renderPeriod(buf, periods[i], _("rate")); + renderPeriod(buf, periods[i], _t("rate")); if (curRate.getLastEventCount() > 0) { - buf.append(_("Average")).append(": "); + buf.append(_t("Average")).append(": "); buf.append(num(curRate.getAverageValue())); buf.append("; "); - buf.append(_("Highest average")); + buf.append(_t("Highest average")); buf.append(": "); buf.append(num(curRate.getExtremeAverageValue())); buf.append("; "); @@ -199,16 +199,16 @@ public class StatsGenerator { buf.append(ngettext("There was 1 event in this period.", "There were {0} events in this period.", (int)curRate.getLastEventCount())); buf.append(' '); - buf.append(_("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); + buf.append(_t("The period ended {0} ago.", DataHelper.formatDuration2(now - curRate.getLastCoalesceDate()))); } else { - buf.append(" ").append(_("No events")).append(" "); + buf.append(" ").append(_t("No events")).append(" "); } long numPeriods = curRate.getLifetimePeriods(); if (numPeriods > 0) { double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods; - buf.append(" (").append(_("Average event count")).append(": "); + buf.append(" (").append(_t("Average event count")).append(": "); buf.append(num(avgFrequency)); - buf.append("; ").append(_("Events in peak period")).append(": "); + buf.append("; ").append(_t("Events in peak period")).append(": "); // This isn't really the highest event count, but the event count during the period with the highest total value. buf.append(curRate.getExtremeEventCount()); buf.append(")"); @@ -216,19 +216,19 @@ public class StatsGenerator { if (curRate.getSummaryListener() != null) { buf.append(" ").append(_("Graph Data")).append(" - "); + buf.append("\">").append(_t("Graph Data")).append(" - "); buf.append(" ").append(_("Graph Event Count")).append(""); + buf.append("&showEvents=true\">").append(_t("Graph Event Count")).append(""); // This can really blow up your browser if you click on it //buf.append(" - ").append(_("Export Data as XML")).append(""); + //buf.append("&format=xml\">").append(_t("Export Data as XML")).append(""); } buf.append("
                • \n"); } // Display the strict average - buf.append("
                • ").append(_("Lifetime average value")).append(": "); + buf.append("
                • ").append(_t("Lifetime average value")).append(": "); buf.append(num(rate.getLifetimeAverageValue())); buf.append(" ("); buf.append(ngettext("1 event", "{0} events", (int) rate.getLifetimeEventCount())); @@ -258,19 +258,19 @@ public class StatsGenerator { */ private class AlphaComparator implements Comparator { public int compare(String lhs, String rhs) { - String lname = _(lhs); - String rname = _(rhs); + String lname = _t(lhs); + String rname = _t(rhs); return Collator.getInstance().compare(lname, rname); } } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } /** translate a string */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Messages.getString(s, o, _context); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index f3edb4072..07664b2ee 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -3,14 +3,21 @@ package net.i2p.router.web; import java.io.File; import java.io.IOException; import java.io.Writer; +import java.text.DateFormat; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import net.i2p.app.ClientAppManager; import net.i2p.crypto.SigType; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; +import net.i2p.router.news.NewsEntry; +import net.i2p.router.news.NewsManager; +import net.i2p.util.PortMapper; +import net.i2p.util.SystemVersion; /** * Refactored from summarynoframe.jsp to save ~100KB @@ -117,9 +124,9 @@ public class SummaryBarRenderer { public String renderHelpAndFAQHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

                  ") - .append(_("Help & FAQ")) + .append(_t("Help & FAQ")) .append("

                  "); return buf.toString(); } @@ -127,29 +134,33 @@ public class SummaryBarRenderer { public String renderI2PServicesHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

                  ") - .append(_("I2P Services")) + .append(_t("I2P Services")) .append("

                  \n" + "
              ").append(_("Peer")).append("").append(_("Caps")).append("").append(_("Integ. Value")).append("").append(_("Last Heard About")).append("").append(_("Last Heard From")).append("").append(_("Last Good Send")).append("").append(_("Last Bad Send")).append("").append(_("10m Resp. Time")).append("").append(_("1h Resp. Time")).append("").append(_("1d Resp. Time")).append("").append(_("Last Good Lookup")).append("").append(_("Last Bad Lookup")).append("").append(_("Last Good Store")).append("").append(_("Last Bad Store")).append("").append(_("1h Fail Rate")).append("").append(_("1d Fail Rate")).append("").append(_t("Peer")).append("").append(_t("Caps")).append("").append(_t("Integ. Value")).append("").append(_t("Last Heard About")).append("").append(_t("Last Heard From")).append("").append(_t("Last Good Send")).append("").append(_t("Last Bad Send")).append("").append(_t("10m Resp. Time")).append("").append(_t("1h Resp. Time")).append("").append(_t("1d Resp. Time")).append("").append(_t("Last Good Lookup")).append("").append(_t("Last Bad Lookup")).append("").append(_t("Last Good Store")).append("").append(_t("Last Bad Store")).append("").append(_t("1h Fail Rate")).append("").append(_t("1d Fail Rate")).append("
               ").append(num(prof.getIntegrationValue())).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(formatInterval(now, prof.getLastHeardAbout())).append("").append(formatInterval(now, prof.getLastHeardFrom())).append("").append(formatInterval(now, prof.getLastSendSuccessful())).append("").append(formatInterval(now, prof.getLastSendFailed())).append("").append(avg(prof, 10*60*1000l, ra)).append("").append(avg(prof, 60*60*1000l, ra)).append("").append(avg(prof, 24*60*60*1000l, ra)).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(DataHelper.formatDuration2(time)).append("").append(formatInterval(now, dbh.getLastLookupSuccessful())).append("").append(formatInterval(now, dbh.getLastLookupFailed())).append("").append(formatInterval(now, dbh.getLastStoreSuccessful())).append("").append(formatInterval(now, dbh.getLastStoreFailed())).append("").append(davg(dbh, 60*60*1000l, ra)).append("").append(davg(dbh, 24*60*60*1000l, ra)).append("").append(_(NA)); + buf.append("").append(_t(NA)); } buf.append("
              " + "") - .append(nbsp(_("Email"))) + .append(nbsp(_t("Email"))) .append("\n" + "") - .append(nbsp(_("Torrents"))) + .append(nbsp(_t("Torrents"))) .append("\n" + - "") - .append(nbsp(_("Website"))) + .append(nbsp(_t("Website"))) .append("\n") .append(NavHelper.getClientAppLinks(_context)) @@ -161,73 +172,73 @@ public class SummaryBarRenderer { public String renderI2PInternalsHTML() { StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("I2P Internals")) + .append(_t("I2P Internals")) .append("


              \n" + "
              \n" + "") - .append(nbsp(_("Tunnels"))) + .append(nbsp(_t("Tunnels"))) .append("\n" + "") - .append(nbsp(_("Peers"))) + .append(nbsp(_t("Peers"))) .append("\n" + "") - .append(nbsp(_("Profiles"))) + .append(nbsp(_t("Profiles"))) .append("\n" + "") - .append(nbsp(_("NetDB"))) + .append(nbsp(_t("NetDB"))) .append("\n" + "") - .append(nbsp(_("Logs"))) + .append(nbsp(_t("Logs"))) .append("\n"); // "") - // .append(_("Jobs")) + // .append(_t("Jobs")) // .append("\n" + if (!StatSummarizer.isDisabled()) { buf.append("") - .append(nbsp(_("Graphs"))) + .append(nbsp(_t("Graphs"))) .append("\n"); } buf.append("") - .append(nbsp(_("Stats"))) + .append(nbsp(_t("Stats"))) .append("\n" + "") - .append(nbsp(_("Addressbook"))) + .append(nbsp(_t("Addressbook"))) .append("\n" + "") - .append(nbsp(_("Hidden Services Manager"))) + .append(nbsp(_t("Hidden Services Manager"))) .append("\n"); if (_context.getBooleanProperty(HelperBase.PROP_ADVANCED)) @@ -243,44 +254,44 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("General")) + .append(_t("General")) .append("


              \n" + "" + "" + "\n" + "" + "" + "\n" + "" + "" + ""); if (sessionObject.folder.getPages() > 1 && i > 30) { @@ -2270,27 +2270,27 @@ public class WebMail extends HttpServlet out.println("\n"); } out.println( "
              ") - .append(_("Local Identity")) + .append(_t("Local Identity")) .append(":" + "") - .append(_("show")) + .append(_t("show")) .append("
              ") - .append(_("Version")) + .append(_t("Version")) .append(":") .append(_helper.getVersion()) .append("
              ") - .append(_("Uptime")) + .append(_t("Uptime")) .append(":") .append(_helper.getUptime()) @@ -293,20 +304,20 @@ public class SummaryBarRenderer { StringBuilder buf = new StringBuilder(512); buf.append("" + "" + "" + "\n" + "" + "" + "\n
              ") - .append(_("Version")) + .append(_t("Version")) .append(":") .append(_helper.getVersion()) .append("
              ") - .append(_("Uptime")) + .append(_t("Uptime")) .append(":") .append(_helper.getUptime()) @@ -318,9 +329,9 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Network")) + .append(_t("Network")) .append(": ") .append(_helper.getReachability()) .append("

              \n"); @@ -329,11 +340,18 @@ public class SummaryBarRenderer { if ("ru".equals(Messages.getLanguage(_context))) buf.append("-ru"); buf.append("\" target=\"_top\" title=\"") - .append(_("See more information on the wiki")) + .append(_t("See more information on the wiki")) .append("\">") - .append(_("Warning: ECDSA is not available. Update your Java or OS")) + .append(_t("Warning: ECDSA is not available. Update your Java or OS")) .append("\n"); } + if (!SystemVersion.isJava7()) { + buf.append("

              ") + .append(_t("Warning: Java version {0} is no longer supported by I2P.", System.getProperty("java.version"))) + .append(' ') + .append(_t("Update Java to version {0} or higher to receive I2P updates.", "7")) + .append("

              \n"); + } return buf.toString(); } @@ -343,9 +361,9 @@ public class SummaryBarRenderer { if ("".equals(updateStatus)) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("I2P Update")) + .append(_t("I2P Update")) .append("


              \n"); buf.append(updateStatus); return buf.toString(); @@ -362,18 +380,18 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Peers")) + .append(_t("Peers")) .append("


              \n" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + @@ -432,9 +450,9 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Bandwidth in/out")) + .append(_t("Bandwidth in/out")) .append("


              " + "
              ") - .append(_("Active")) + .append(_t("Active")) .append(":"); int active = _helper.getActivePeers(); buf.append(active) @@ -382,37 +400,37 @@ public class SummaryBarRenderer { .append("
              ") - .append(_("Fast")) + .append(_t("Fast")) .append(":") .append(_helper.getFastPeers()) .append("
              ") - .append(_("High capacity")) + .append(_t("High capacity")) .append(":") .append(_helper.getHighCapacityPeers()) .append("
              ") - .append(_("Integrated")) + .append(_t("Integrated")) .append(":") .append(_helper.getWellIntegratedPeers()) .append("
              ") - .append(_("Known")) + .append(_t("Known")) .append(":") .append(_helper.getAllPeers()) .append("
              \n" + @@ -454,14 +472,14 @@ public class SummaryBarRenderer { if (_context.router().getUptime() > 2*60*1000) { buf.append("\n"); } buf.append("
              ") - .append(_("Total")) + .append(_t("Total")) .append(":") .append(_helper.getLifetimeKBps()) .append("Bps
              ") - .append(_("Used")) + .append(_t("Used")) .append(":") .append(_helper.getInboundTransferred()) .append(SummaryHelper.THINSP) @@ -476,44 +494,44 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Tunnels")) + .append(_t("Tunnels")) .append("


              " + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + "" + "\n" + @@ -526,46 +544,46 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); buf.append("

              ") - .append(_("Congestion")) + .append(_t("Congestion")) .append("


              " + "
              ") - .append(_("Exploratory")) + .append(_t("Exploratory")) .append(":") .append(_helper.getInboundTunnels() + _helper.getOutboundTunnels()) .append("
              ") - .append(_("Client")) + .append(_t("Client")) .append(":") .append(_helper.getInboundClientTunnels() + _helper.getOutboundClientTunnels()) .append("
              ") - .append(_("Participating")) + .append(_t("Participating")) .append(":") .append(_helper.getParticipatingTunnels()) .append("
              ") - .append(_("Share ratio")) + .append(_t("Share ratio")) .append(":") .append(_helper.getShareRatio()) .append("
              \n" + "" + "\n" + "" + "\n"); if (!_context.getBooleanPropertyDefaultTrue("router.disableTunnelTesting")) { buf.append("" + "\n"); } buf.append("" + "\n" + @@ -578,7 +596,7 @@ public class SummaryBarRenderer { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(50); buf.append("

              ") - .append(_(_helper.getTunnelStatus())) + .append(_t(_helper.getTunnelStatus())) .append("

              \n"); return buf.toString(); } @@ -599,52 +617,46 @@ public class SummaryBarRenderer { String consoleNonce = CSSHelper.getNonce(); if (consoleNonce != null) { // Set up title and pre-headings stuff. - buf.append("

              ") - .append(_("News & Updates")) + //buf.append("

              ") + buf.append("

              ") + .append(_t("News & Updates")) .append("


              \n"); // Get news content. - String newsContent = newshelper.getContent(); - if (newsContent != "") { + List entries = Collections.emptyList(); + ClientAppManager cmgr = _context.clientAppManager(); + if (cmgr != null) { + NewsManager nmgr = (NewsManager) cmgr.getRegisteredApp(NewsManager.APP_NAME); + if (nmgr != null) + entries = nmgr.getEntries(); + } + if (!entries.isEmpty()) { buf.append("
                \n"); - // Parse news content for headings. - boolean foundEntry = false; - int start = newsContent.indexOf("

                "); - while (start >= 0) { - // Add offset to start: - // 4 - gets rid of

                - // 16 - gets rid of the date as well (assuming form "

                yyyy-mm-dd: Foobarbaz...") - // Don't truncate the "congratulations" in initial news - if (newsContent.length() > start + 16 && - newsContent.substring(start + 4, start + 6).equals("20") && - newsContent.substring(start + 14, start + 16).equals(": ")) - newsContent = newsContent.substring(start+16, newsContent.length()); - else - newsContent = newsContent.substring(start+4, newsContent.length()); - int end = newsContent.indexOf("

                "); - if (end >= 0) { - String heading = newsContent.substring(0, end); - buf.append("
              • ") - .append(heading) - .append("
              • \n"); - foundEntry = true; + DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + // the router sets the JVM time zone to UTC but saves the original here so we can get it + fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); + int i = 0; + final int max = 2; + for (NewsEntry entry : entries) { + buf.append("
              • "); + if (entry.updated > 0) { + Date date = new Date(entry.updated); + buf.append(fmt.format(date)) + .append(": "); } - start = newsContent.indexOf("

                "); + buf.append(entry.title) + .append("

              • \n"); + if (++i >= max) + break; } buf.append("
              \n"); - // Set up string containing to show news. - String requestURI = _helper.getRequestURI(); - if (requestURI.contains("/home") && !foundEntry) { - buf.append("") - .append(_("Show news")) - .append("\n"); - } + //buf.append("") + // .append(_t("Show all news")) + // .append("\n"); } else { buf.append("
              ") - .append(_("none")) + .append(_t("none")) .append("
              "); } // Add post-headings stuff. @@ -654,10 +666,15 @@ public class SummaryBarRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } + /** @since 0.9.23 */ + private String _t(String s, Object o) { + return Messages.getString(s, o, _context); + } + /** * Where the translation is to two words or more, * prevent splitting across lines @@ -665,6 +682,10 @@ public class SummaryBarRenderer { * @since 0.9.18 */ private static String nbsp(String s) { - return s.replace(" ", " "); + // if it's too long, this makes it worse + if (s.length() <= 30) + return s.replace(" ", " "); + else + return s; } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 0509d6f37..75a55709f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -114,7 +114,7 @@ public class SummaryHelper extends HelperBase { long diff = Math.abs(ms); if (diff < 3000) return ""; - return " (" + DataHelper.formatDuration2(diff) + " " + _("skew") + ")"; + return " (" + DataHelper.formatDuration2(diff) + " " + _t("skew") + ")"; } **/ @@ -140,19 +140,19 @@ public class SummaryHelper extends HelperBase { return "VM Comm System"; if (_context.router().getUptime() > 60*1000 && (!_context.router().gracefulShutdownInProgress()) && !_context.clientManager().isAlive()) - return _("ERR-Client Manager I2CP Error - check logs"); // not a router problem but the user should know + return _t("ERR-Client Manager I2CP Error - check logs"); // not a router problem but the user should know // Warn based on actual skew from peers, not update status, so if we successfully offset // the clock, we don't complain. //if (!_context.clock().getUpdatedSuccessfully()) long skew = _context.commSystem().getFramedAveragePeerClockSkew(33); // Display the actual skew, not the offset if (Math.abs(skew) > 30*1000) - return _("ERR-Clock Skew of {0}", DataHelper.formatDuration2(Math.abs(skew))); + return _t("ERR-Clock Skew of {0}", DataHelper.formatDuration2(Math.abs(skew))); if (_context.router().isHidden()) - return _("Hidden"); + return _t("Hidden"); RouterInfo routerInfo = _context.router().getRouterInfo(); if (routerInfo == null) - return _("Testing"); + return _t("Testing"); Status status = _context.commSystem().getStatus(); switch (status) { @@ -164,37 +164,37 @@ public class SummaryHelper extends HelperBase { case IPV4_SNAT_IPV6_OK: RouterAddress ra = routerInfo.getTargetAddress("NTCP"); if (ra == null) - return _(status.toStatusString()); + return _t(status.toStatusString()); byte[] ip = ra.getIP(); if (ip == null) - return _("ERR-Unresolved TCP Address"); + return _t("ERR-Unresolved TCP Address"); // TODO set IPv6 arg based on configuration? if (TransportUtil.isPubliclyRoutable(ip, true)) - return _(status.toStatusString()); - return _("ERR-Private TCP Address"); + return _t(status.toStatusString()); + return _t("ERR-Private TCP Address"); case IPV4_SNAT_IPV6_UNKNOWN: case DIFFERENT: - return _("ERR-SymmetricNAT"); + return _t("ERR-SymmetricNAT"); case REJECT_UNSOLICITED: case IPV4_DISABLED_IPV6_FIREWALLED: if (routerInfo.getTargetAddress("NTCP") != null) - return _("WARN-Firewalled with Inbound TCP Enabled"); + return _t("WARN-Firewalled with Inbound TCP Enabled"); // fall through... case IPV4_FIREWALLED_IPV6_OK: case IPV4_FIREWALLED_IPV6_UNKNOWN: if (((FloodfillNetworkDatabaseFacade)_context.netDb()).floodfillEnabled()) - return _("WARN-Firewalled and Floodfill"); + return _t("WARN-Firewalled and Floodfill"); //if (_context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0) - // return _("WARN-Firewalled and Fast"); - return _(status.toStatusString()); + // return _t("WARN-Firewalled and Fast"); + return _t(status.toStatusString()); case DISCONNECTED: - return _("Disconnected - check network cable"); + return _t("Disconnected - check network cable"); case HOSED: - return _("ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"); + return _t("ERR-UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart"); case UNKNOWN: case IPV4_UNKNOWN_IPV6_FIREWALLED: @@ -203,14 +203,14 @@ public class SummaryHelper extends HelperBase { ra = routerInfo.getTargetAddress("SSU"); if (ra == null && _context.router().getUptime() > 5*60*1000) { if (getActivePeers() <= 0) - return _("ERR-No Active Peers, Check Network Connection and Firewall"); + return _t("ERR-No Active Peers, Check Network Connection and Firewall"); else if (_context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_HOSTNAME) == null || _context.getProperty(ConfigNetHelper.PROP_I2NP_NTCP_PORT) == null) - return _("ERR-UDP Disabled and Inbound TCP host/port not set"); + return _t("ERR-UDP Disabled and Inbound TCP host/port not set"); else - return _("WARN-Firewalled with UDP Disabled"); + return _t("WARN-Firewalled with UDP Disabled"); } - return _(status.toStatusString()); + return _t(status.toStatusString()); } } @@ -434,8 +434,8 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(512); buf.append("

              ").append(_("Local Tunnels")) + .append(_t("Add/remove/edit & control your client and server tunnels")) + .append("\">").append(_t("Local Tunnels")) .append("


              "); if (!clients.isEmpty()) { Collections.sort(clients, new AlphaComparator()); @@ -447,35 +447,35 @@ public class SummaryHelper extends HelperBase { buf.append("

              \n"); LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h); if (ls != null && _context.tunnelManager().getOutboundClientTunnelCount(h) > 0) { long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now(); if (timeToExpire < 0) { // red or yellow light - buf.append("\n"); + buf.append("\n"); } else { // green light - buf.append("\n"); + buf.append("\n"); } } else { // yellow light - buf.append("\n"); + buf.append("\n"); } } buf.append("
              ") - .append(_("Job lag")) + .append(_t("Job lag")) .append(":") .append(_helper.getJobLag()) .append("
              ") - .append(_("Message delay")) + .append(_t("Message delay")) .append(":") .append(_helper.getMessageDelay()) .append("
              ") - .append(_("Tunnel lag")) + .append(_t("Tunnel lag")) .append(":") .append(_helper.getTunnelLag()) .append("
              ") - .append(_("Backlog")) + .append(_t("Backlog")) .append(":") .append(_helper.getInboundBacklog()) .append("
              \"Server\""); + buf.append("server.png\" alt=\"Server\" title=\"").append(_t("Hidden Service")).append("\">"); else - buf.append("client.png\" alt=\"Client\" title=\"").append(_("Client")).append("\">"); + buf.append("client.png\" alt=\"Client\" title=\"").append(_t("Client")).append("\">"); buf.append(""); - if (name.length() < 18) + buf.append("\" target=\"_top\" title=\"").append(_t("Show tunnels")).append("\">"); + if (name.length() <= 20) buf.append(DataHelper.escapeHTML(name)); else - buf.append(DataHelper.escapeHTML(name.substring(0,15))).append("…"); + buf.append(DataHelper.escapeHTML(name.substring(0,18))).append("…"); buf.append("\"").append(_("Rebuilding")).append("…\"
              \"").append(_t("Rebuilding")).append("…\"
              \"Ready\"
              \"Ready\"
              \"").append(_("Building")).append("…\"
              \"").append(_t("Building")).append("…\"
              "); } else { - buf.append("
              ").append(_("none")).append("
              "); + buf.append("
              ").append(_t("none")).append("
              "); } buf.append("\n"); return buf.toString(); @@ -486,14 +486,16 @@ public class SummaryHelper extends HelperBase { * Inner class, can't be Serializable */ private class AlphaComparator implements Comparator { - private final String xsc = _("shared clients"); + private final String xsc = _t("shared clients"); public int compare(Destination lhs, Destination rhs) { String lname = getName(lhs); String rname = getName(rhs); - if (lname.equals(xsc)) + boolean lshared = lname.startsWith("shared clients") || lname.startsWith(xsc); + boolean rshared = rname.startsWith("shared clients") || rname.startsWith(xsc); + if (lshared && !rshared) return -1; - if (rname.equals(xsc)) + if (rshared && !lshared) return 1; return Collator.getInstance().compare(lname, rname); } @@ -509,9 +511,9 @@ public class SummaryHelper extends HelperBase { if (name == null) name = d.calculateHash().toBase64().substring(0,6); else - name = _(name); + name = _t(name); } else { - name = _(name); + name = _t(name); } return name; } @@ -710,18 +712,20 @@ public class SummaryHelper extends HelperBase { buf.append("
              "); else needSpace = true; - buf.append("

              ").append(_("Update downloaded")).append("
              "); + buf.append("

              ").append(_t("Update downloaded")).append("
              "); if (_context.hasWrapper()) - buf.append(_("Click Restart to install")); + buf.append(_t("Click Restart to install")); else - buf.append(_("Click Shutdown and restart to install")); - buf.append(' ').append(_("Version {0}", DataHelper.escapeHTML(dver))); + buf.append(_t("Click Shutdown and restart to install")); + buf.append(' ').append(_t("Version {0}", DataHelper.escapeHTML(dver))); buf.append("

              "); } boolean avail = updateAvailable(); boolean unsignedAvail = unsignedUpdateAvailable(); boolean devSU3Avail = devSU3UpdateAvailable(); String constraint = avail ? NewsHelper.updateConstraint() : null; + String unsignedConstraint = unsignedAvail ? NewsHelper.unsignedUpdateConstraint() : null; + String devSU3Constraint = devSU3Avail ? NewsHelper.devSU3UpdateConstraint() : null; if (avail && constraint != null && !NewsHelper.isUpdateInProgress() && !_context.router().gracefulShutdownInProgress()) { @@ -729,11 +733,35 @@ public class SummaryHelper extends HelperBase { buf.append("
              "); else needSpace = true; - buf.append("

              ").append(_("Update available")).append(":
              "); - buf.append(_("Version {0}", getUpdateVersion())).append("
              "); + buf.append("

              ").append(_t("Update available")).append(":
              "); + buf.append(_t("Version {0}", getUpdateVersion())).append("
              "); buf.append(constraint).append("

              "); avail = false; } + if (unsignedAvail && unsignedConstraint != null && + !NewsHelper.isUpdateInProgress() && + !_context.router().gracefulShutdownInProgress()) { + if (needSpace) + buf.append("
              "); + else + needSpace = true; + buf.append("

              ").append(_t("Update available")).append(":
              "); + buf.append(_t("Version {0}", getUnsignedUpdateVersion())).append("
              "); + buf.append(unsignedConstraint).append("

              "); + unsignedAvail = false; + } + if (devSU3Avail && devSU3Constraint != null && + !NewsHelper.isUpdateInProgress() && + !_context.router().gracefulShutdownInProgress()) { + if (needSpace) + buf.append("
              "); + else + needSpace = true; + buf.append("

              ").append(_t("Update available")).append(":
              "); + buf.append(_t("Version {0}", getDevSU3UpdateVersion())).append("
              "); + buf.append(devSU3Constraint).append("

              "); + devSU3Avail = false; + } if ((avail || unsignedAvail || devSU3Avail) && !NewsHelper.isUpdateInProgress() && !_context.router().gracefulShutdownInProgress() && @@ -753,7 +781,7 @@ public class SummaryHelper extends HelperBase { if (avail) { buf.append("
              \n"); } if (devSU3Avail) { @@ -761,7 +789,7 @@ public class SummaryHelper extends HelperBase { // Note to translators: parameter is a router version, e.g. "0.9.19-16" //
              is optional, to help the browser make the lines even in the button // If the translation is shorter than the English, you should probably not include
              - .append(_("Download Signed
              Development Update
              {0}", getDevSU3UpdateVersion())) + .append(_t("Download Signed
              Development Update
              {0}", getDevSU3UpdateVersion())) .append("
              \n"); } if (unsignedAvail) { @@ -769,7 +797,7 @@ public class SummaryHelper extends HelperBase { // Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" //
              is optional, to help the browser make the lines even in the button // If the translation is shorter than the English, you should probably not include
              - .append(_("Download Unsigned
              Update {0}", getUnsignedUpdateVersion())) + .append(_t("Download Unsigned
              Update {0}", getUnsignedUpdateVersion())) .append("
              \n"); } buf.append("\n"); @@ -793,9 +821,9 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(256); if (showFirewallWarning()) { buf.append("

              ") - .append(_("Check network connection and NAT/firewall")) + .append(_t("Check network connection and NAT/firewall")) .append("

              "); } @@ -814,7 +842,7 @@ public class SummaryHelper extends HelperBase { String uri = getRequestURI(); buf.append("

              \n"); buf.append("\n"); - buf.append("

              \n"); + buf.append("

              \n"); } } // If a new reseed ain't running, and the last reseed had errors, show error message @@ -833,6 +861,8 @@ public class SummaryHelper extends HelperBase { public void storeNewsHelper(NewsHelper n) { _newshelper = n; } public NewsHelper getNewsHelper() { return _newshelper; } + private static final String SS = Character.toString(S); + public List getSummaryBarSections(String page) { String config = ""; if ("home".equals(page)) { @@ -842,7 +872,7 @@ public class SummaryHelper extends HelperBase { if (config == null) config = _context.getProperty(PROP_SUMMARYBAR + "default", DEFAULT_FULL); } - return Arrays.asList(config.split("" + S)); + return Arrays.asList(DataHelper.split(config, SS)); } static void saveSummaryBarSections(RouterContext ctx, String page, Map sections) { @@ -899,18 +929,18 @@ public class SummaryHelper extends HelperBase { StringBuilder buf = new StringBuilder(2048); buf.append("\n"); for (String section : sections) { int i = sections.indexOf(section); buf.append("\n"); } buf.append("" + "") .append("
              ") - .append(_("Remove")) + .append(_t("Remove")) .append("") - .append(_("Name")) + .append(_t("Name")) .append("") - .append(_("Order")) + .append(_t("Order")) .append("
              ") - .append(_(sectionNames.get(section))) + .append(_t(sectionNames.get(section))) .append("\"")"); + .append(_t("Top")) + .append("\" src=\"") + .append(imgPath) + .append("move_top.png") + .append("\" title=\"") + .append(_t("Move to top")) + .append("\"/>"); buf.append(""); + .append(_t("Up")) + .append("\" src=\"") + .append(imgPath) + .append("move_up.png") + .append("\" title=\"") + .append(_t("Move up")) + .append("\"/>"); } buf.append(""); if (i < sections.size() - 1) { buf.append(""); + .append(_t("Down")) + .append("\" src=\"") + .append(imgPath) + .append("move_down.png") + .append("\" title=\"") + .append(_t("Move down")) + .append("\"/>"); buf.append(""); + .append(_t("Bottom")) + .append("\" src=\"") + .append(imgPath) + .append("move_bottom.png") + .append("\" title=\"") + .append(_t("Move to bottom")) + .append("\"/>"); } buf.append("
              " + "") - .append(_("Add")).append(": " + + .append(_t("Add")).append(": " + "" + "
              \n"); return buf.toString(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java index 9644b8e3f..d97d185a8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java @@ -109,7 +109,8 @@ class SummaryRenderer { public void render(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, int endp, boolean showCredit, SummaryListener lsnr2, String titleOverride) throws IOException { - long end = _listener.now() - 75*1000; + // prevent NaNs if we are skewed ahead of system time + long end = Math.min(_listener.now(), System.currentTimeMillis()) - 75*1000; long period = _listener.getRate().getPeriod(); if (endp > 0) end -= period * endp; @@ -138,9 +139,9 @@ class SummaryRenderer { else p = DataHelper.formatDuration2(period).replace(" ", " "); if (showEvents) - title = name + ' ' + _("events in {0}", p); + title = name + ' ' + _t("events in {0}", p); else - title = name + ' ' + _("averaged for {0}", p); + title = name + ' ' + _t("averaged for {0}", p); def.setTitle(title); } String path = _listener.getData().getPath(); @@ -150,7 +151,7 @@ class SummaryRenderer { if (showEvents) { // include the average event count on the plot plotName = dsNames[1]; - descr = _("Events per period"); + descr = _t("Events per period"); } else { // include the average value plotName = dsNames[0]; @@ -158,12 +159,12 @@ class SummaryRenderer { // (there are over 500 of them) // but the descriptions for the default graphs are tagged in // Strings.java - descr = _(_listener.getRate().getRateStat().getDescription()); + descr = _t(_listener.getRate().getRateStat().getDescription()); } //long started = ((RouterContext)_context).router().getWhenStarted(); //if (started > start && started < end) - // def.vrule(started / 1000, RESTART_BAR_COLOR, _("Restart"), 4.0f); + // def.vrule(started / 1000, RESTART_BAR_COLOR, _t("Restart"), 4.0f); def.datasource(plotName, path, plotName, SummaryListener.CF, _listener.getBackendName()); if (descr.length() > 0) { @@ -172,22 +173,22 @@ class SummaryRenderer { def.area(plotName, Color.BLUE); } if (!hideLegend) { - def.gprint(plotName, SummaryListener.CF, _("avg") + ": %.2f %s"); - def.gprint(plotName, "MAX", ' ' + _("max") + ": %.2f %S"); - def.gprint(plotName, "LAST", ' ' + _("now") + ": %.2f %S\\r"); + def.gprint(plotName, SummaryListener.CF, _t("avg") + ": %.2f %s"); + def.gprint(plotName, "MAX", ' ' + _t("max") + ": %.2f %S"); + def.gprint(plotName, "LAST", ' ' + _t("now") + ": %.2f %S\\r"); } String plotName2 = null; if (lsnr2 != null) { String dsNames2[] = lsnr2.getData().getDsNames(); plotName2 = dsNames2[0]; String path2 = lsnr2.getData().getPath(); - String descr2 = _(lsnr2.getRate().getRateStat().getDescription()); + String descr2 = _t(lsnr2.getRate().getRateStat().getDescription()); def.datasource(plotName2, path2, plotName2, SummaryListener.CF, lsnr2.getBackendName()); def.line(plotName2, Color.RED, descr2 + "\\r", 3); if (!hideLegend) { - def.gprint(plotName2, SummaryListener.CF, _("avg") + ": %.2f %s"); - def.gprint(plotName2, "MAX", ' ' + _("max") + ": %.2f %S"); - def.gprint(plotName2, "LAST", ' ' + _("now") + ": %.2f %S\\r"); + def.gprint(plotName2, SummaryListener.CF, _t("avg") + ": %.2f %s"); + def.gprint(plotName2, "MAX", ' ' + _t("max") + ": %.2f %S"); + def.gprint(plotName2, "LAST", ' ' + _t("now") + ": %.2f %S\\r"); } } if (!hideLegend) { @@ -197,7 +198,7 @@ class SummaryRenderer { for (Map.Entry event : events.entrySet()) { long started = event.getKey().longValue(); if (started > start && started < end) { - String legend = _("Restart") + ' ' + sdf.format(new Date(started)) + " UTC " + event.getValue() + "\\r"; + String legend = _t("Restart") + ' ' + sdf.format(new Date(started)) + " UTC " + event.getValue() + "\\r"; def.vrule(started / 1000, RESTART_BAR_COLOR, legend, 4.0f); } } @@ -270,7 +271,7 @@ class SummaryRenderer { private static final boolean IS_WIN = SystemVersion.isWindows(); /** translate a string */ - private String _(String s) { + private String _t(String s) { // the RRD font doesn't have zh chars, at least on my system // Works on 1.5.9 except on windows if (IS_WIN && "zh".equals(Messages.getLanguage(_context))) @@ -281,7 +282,7 @@ class SummaryRenderer { /** * translate a string with a parameter */ - private String _(String s, String o) { + private String _t(String s, String o) { // the RRD font doesn't have zh chars, at least on my system // Works on 1.5.9 except on windows if (IS_WIN && "zh".equals(Messages.getLanguage(_context))) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java new file mode 100644 index 000000000..cf5bb47f8 --- /dev/null +++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java @@ -0,0 +1,909 @@ +package net.i2p.router.web; + +import java.io.IOException; +import java.io.Serializable; +import java.io.Writer; +import java.math.BigInteger; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; + +import net.i2p.data.DataHelper; +import net.i2p.data.Destination; +import net.i2p.data.Hash; +import net.i2p.data.LeaseSet; +import net.i2p.data.router.RouterAddress; +import net.i2p.data.router.RouterInfo; +import net.i2p.data.router.RouterKeyGenerator; +import net.i2p.router.RouterContext; +import net.i2p.router.TunnelPoolSettings; +import net.i2p.router.peermanager.DBHistory; +import net.i2p.router.peermanager.PeerProfile; +import net.i2p.router.tunnel.pool.TunnelPool; +import net.i2p.router.util.HashDistance; +import net.i2p.stat.Rate; +import net.i2p.stat.RateAverages; +import net.i2p.stat.RateStat; +import net.i2p.util.Log; +import net.i2p.util.ObjectCounter; +import net.i2p.util.Translate; +import net.i2p.util.VersionComparator; + +/** + * For debugging only. + * Parts may later move to router as a periodic monitor. + * Adapted from NetDbRenderer. + * + * @since 0.9.24 + * + */ +class SybilRenderer { + + private final RouterContext _context; + private final DecimalFormat fmt = new DecimalFormat("#0.00"); + + private static final int PAIRMAX = 20; + private static final int MAX = 10; + // multiplied by size - 1, will also get POINTS24 added + private static final double POINTS32 = 5.0; + // multiplied by size - 1, will also get POINTS16 added + private static final double POINTS24 = 5.0; + // multiplied by size - 1 + private static final double POINTS16 = 0.25; + private static final double POINTS_US32 = 25.0; + private static final double POINTS_US24 = 25.0; + private static final double POINTS_US16 = 10.0; + private static final double POINTS_FAMILY = -2.0; + private static final double MIN_CLOSE = 242.0; + private static final double PAIR_DISTANCE_FACTOR = 2.0; + private static final double OUR_KEY_FACTOR = 4.0; + private static final double MIN_DISPLAY_POINTS = 5.0; + private static final double VERSION_FACTOR = 1.0; + private static final double POINTS_BAD_VERSION = 50.0; + private static final double POINTS_UNREACHABLE = 4.0; + private static final double POINTS_NEW = 4.0; + + public SybilRenderer(RouterContext ctx) { + _context = ctx; + } + + /** + * Entry point + */ + public String getNetDbSummary(Writer out) throws IOException { + renderRouterInfoHTML(out, (String)null); + return ""; + } + + private static class RouterInfoRoutingKeyComparator implements Comparator, Serializable { + private final Hash _us; + /** @param us ROUTING KEY */ + public RouterInfoRoutingKeyComparator(Hash us) { + _us = us; + } + public int compare(RouterInfo l, RouterInfo r) { + return HashDistance.getDistance(_us, l.getHash()).compareTo(HashDistance.getDistance(_us, r.getHash())); + } + } + + /** + * A total score and a List of reason Strings + */ + private static class Points implements Comparable { + private double points; + private final List reasons; + /** @param us ROUTING KEY */ + public Points(double points, String reason) { + this.points = points; + reasons = new ArrayList(4); + reasons.add(reason); + } + public int compareTo(Points r) { + if (points > r.points) + return 1; + if (points < r.points) + return -1; + return 0; + } + } + + private static class PointsComparator implements Comparator, Serializable { + private final Map _points; + /** @param us ROUTING KEY */ + public PointsComparator(Map points) { + _points = points; + } + public int compare(Hash l, Hash r) { + // reverse + return _points.get(r).compareTo(_points.get(l)); + } + } + + private void addPoints(Map points, Hash h, double d, String reason) { + Points dd = points.get(h); + if (dd != null) { + dd.points += d; + dd.reasons.add("" + fmt.format(d) + ": " + reason); + } else { + points.put(h, new Points(d, "" + fmt.format(d) + ": " + reason)); + } + } + + /** + * The whole thing + * + * @param routerPrefix ignored + */ + private void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException { + Set ffs = _context.peerManager().getPeersByCapability('f'); + List ris = new ArrayList(ffs.size()); + Hash us = _context.routerHash(); + Hash ourRKey = _context.router().getRouterInfo().getRoutingKey(); + for (Hash ff : ffs) { + if (ff.equals(us)) + continue; + RouterInfo ri = _context.netDb().lookupRouterInfoLocally(ff); + if (ri != null) + ris.add(ri); + } + if (ris.isEmpty()) { + out.write("

              No known floodfills

              "); + return; + } + + StringBuilder buf = new StringBuilder(4*1024); + buf.append("

              This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " + + "Possible \"threats\" are summarized at the bottom, however these are unlikely to be real threats. " + + "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.

              " + + ""); + + renderRouterInfo(buf, _context.router().getRouterInfo(), null, true, false); + buf.append("

              Known Floodfills: ").append(ris.size()).append("

              "); + + double tot = 0; + int count = 200; + byte[] b = new byte[32]; + for (int i = 0; i < count; i++) { + _context.random().nextBytes(b); + Hash h = new Hash(b); + double d = closestDistance(h, ris); + tot += d; + } + double avgMinDist = tot / count; + buf.append("

              Average closest floodfill distance: " + fmt.format(avgMinDist) + "

              "); + buf.append("

              Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) + .append("\" Last Changed: ").append(new Date(_context.routerKeyGenerator().getLastChanged())); + buf.append("

              Next Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) + .append("\" Rotates in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())); + buf.append("

              "); + + Map points = new HashMap(64); + + // IP analysis + renderIPGroupsFamily(out, buf, ris, points); + renderIPGroupsUs(out, buf, ris, points); + renderIPGroups32(out, buf, ris, points); + renderIPGroups24(out, buf, ris, points); + renderIPGroups16(out, buf, ris, points); + + // Pairwise distance analysis + renderPairDistance(out, buf, ris, points); + + // Distance to our router analysis + buf.append("

              Closest Floodfills to Our Routing Key (Where we Store our RI)

              "); + renderRouterInfoHTML(out, buf, ourRKey, avgMinDist, ris, points); + RouterKeyGenerator rkgen = _context.routerKeyGenerator(); + Hash nkey = rkgen.getNextRoutingKey(us); + buf.append("

              Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)

              "); + renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points); + + buf.append("

              Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)

              "); + renderRouterInfoHTML(out, buf, us, avgMinDist, ris, points); + + // Distance to our published destinations analysis + buf.append("

              Floodfills Close to Our Destinations

              "); + Map clientInboundPools = _context.tunnelManager().getInboundClientPools(); + List destinations = new ArrayList(clientInboundPools.keySet()); + boolean debug = _context.getBooleanProperty(HelperBase.PROP_ADVANCED); + for (Hash client : destinations) { + boolean isLocal = _context.clientManager().isLocal(client); + if (!isLocal) + continue; + if (! _context.clientManager().shouldPublishLeaseSet(client)) + continue; + LeaseSet ls = _context.netDb().lookupLeaseSetLocally(client); + if (ls == null) + continue; + Hash rkey = ls.getRoutingKey(); + TunnelPool in = clientInboundPools.get(client); + String name = (in != null) ? in.getSettings().getDestinationNickname() : client.toBase64().substring(0,4); + buf.append("

              Closest floodfills to the Routing Key for " + DataHelper.escapeHTML(name) + " (where we store our LS)

              "); + renderRouterInfoHTML(out, buf, rkey, avgMinDist, ris, points); + nkey = rkgen.getNextRoutingKey(ls.getHash()); + buf.append("

              Closest floodfills to Tomorrow's Routing Key for " + DataHelper.escapeHTML(name) + " (where we will store our LS)

              "); + renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points); + } + + // Profile analysis + addProfilePoints(ris, points); + addVersionPoints(ris, points); + + if (!points.isEmpty()) { + List warns = new ArrayList(points.keySet()); + Collections.sort(warns, new PointsComparator(points)); + buf.append("

              Routers with Most Threat Points

              "); + for (Hash h : warns) { + RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h); + if (ri == null) + continue; + Points pp = points.get(h); + double p = pp.points; + if (p < MIN_DISPLAY_POINTS) + break; // sorted + buf.append("

              Threat Points: " + fmt.format(p) + "

                "); + for (String s : pp.reasons) { + buf.append("
              • ").append(s).append("
              • "); + } + buf.append("

              "); + renderRouterInfo(buf, ri, null, false, false); + } + } + + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private static class Pair implements Comparable { + public final RouterInfo r1, r2; + public final BigInteger dist; + public Pair(RouterInfo ri1, RouterInfo ri2, BigInteger distance) { + r1 = ri1; r2 = ri2; dist = distance; + } + public int compareTo(Pair p) { + return this.dist.compareTo(p.dist); + } + } + + private void renderPairDistance(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + int sz = ris.size(); + List pairs = new ArrayList(PAIRMAX); + double total = 0; + for (int i = 0; i < sz; i++) { + RouterInfo info1 = ris.get(i); + for (int j = i + 1; j < sz; j++) { + RouterInfo info2 = ris.get(j); + BigInteger dist = HashDistance.getDistance(info1.getHash(), info2.getHash()); + if (pairs.isEmpty()) { + pairs.add(new Pair(info1, info2, dist)); + } else if (pairs.size() < PAIRMAX) { + pairs.add(new Pair(info1, info2, dist)); + Collections.sort(pairs); + } else if (dist.compareTo(pairs.get(PAIRMAX - 1).dist) < 0) { + pairs.set(PAIRMAX - 1, new Pair(info1, info2, dist)); + Collections.sort(pairs); + } + total += biLog2(dist); + } + } + + double avg = total / (sz * sz / 2); + buf.append("

              Average Floodfill Distance is ").append(fmt.format(avg)).append("

              "); + + buf.append("

              Closest Floodfill Pairs by Hash

              "); + for (Pair p : pairs) { + double distance = biLog2(p.dist); + double point = MIN_CLOSE - distance; + if (point < 0) + break; // sorted; + if (point >= 2) { + // limit display + buf.append("

              Hash Distance: ").append(fmt.format(distance)).append(": "); + buf.append("

              "); + renderRouterInfo(buf, p.r1, null, false, false); + renderRouterInfo(buf, p.r2, null, false, false); + } + point *= PAIR_DISTANCE_FACTOR; + String b2 = p.r2.getHash().toBase64(); + addPoints(points, p.r1.getHash(), point, "Very close (" + fmt.format(distance) + + ") to other floodfill " + b2 + ""); + String b1 = p.r1.getHash().toBase64(); + addPoints(points, p.r2.getHash(), point, "Very close (" + fmt.format(distance) + + ") to other floodfill " + b1 + ""); + } + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private double closestDistance(Hash h, List ris) throws IOException { + BigInteger min = (new BigInteger("2")).pow(256); + for (RouterInfo info : ris) { + BigInteger dist = HashDistance.getDistance(h, info.getHash()); + if (dist.compareTo(min) < 0) + min = dist; + } + return biLog2(min); + } + + /** v4 only */ + private static byte[] getIP(RouterInfo ri) { + for (RouterAddress ra : ri.getAddresses()) { + byte[] rv = ra.getIP(); + if (rv != null && rv.length == 4) + return rv; + } + return null; + } + + private static class FooComparator implements Comparator, Serializable { + private final ObjectCounter _o; + public FooComparator(ObjectCounter o) { _o = o;} + public int compare(Integer l, Integer r) { + // reverse by count + int rv = _o.count(r) - _o.count(l); + if (rv != 0) + return rv; + // foward by IP + return l.intValue() - r.intValue(); + } + } + + private static class FoofComparator implements Comparator, Serializable { + private final ObjectCounter _o; + public FoofComparator(ObjectCounter o) { _o = o;} + public int compare(String l, String r) { + // reverse by count + int rv = _o.count(r) - _o.count(l); + if (rv != 0) + return rv; + // foward by name + return l.compareTo(r); + } + } + + private void renderIPGroupsUs(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + RouterInfo us = _context.router().getRouterInfo(); + byte[] ourIP = getIP(us); + if (ourIP == null) + return; + buf.append("

              Floodfills close to Our IP

              "); + boolean found = false; + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + if (ip[0] == ourIP[0] && ip[1] == ourIP[1]) { + buf.append("

              "); + if (ip[2] == ourIP[2]) { + if (ip[3] == ourIP[3]) { + buf.append("Same IP as us"); + addPoints(points, info.getHash(), POINTS_US32, "Same IP as us"); + } else { + buf.append("Same /24 as us"); + addPoints(points, info.getHash(), POINTS_US24, "Same /24 as us"); + } + } else { + buf.append("Same /16 as us"); + addPoints(points, info.getHash(), POINTS_US16, "Same /16 as us"); + } + buf.append(":

              "); + renderRouterInfo(buf, info, null, false, false); + found = true; + } + } + if (!found) + buf.append("

              None

              "); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private void renderIPGroups32(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + buf.append("

              Floodfills with the Same IP

              "); + ObjectCounter oc = new ObjectCounter(); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 4)); + oc.increment(x); + } + List foo = new ArrayList(); + for (Integer ii : oc.objects()) { + int count = oc.count(ii); + if (count >= 2) + foo.add(ii); + } + Collections.sort(foo, new FooComparator(oc)); + boolean found = false; + for (Integer ii : foo) { + int count = oc.count(ii); + int i = ii.intValue(); + int i0 = (i >> 24) & 0xff; + int i1 = (i >> 16) & 0xff; + int i2 = (i >> 8) & 0xff; + int i3 = i & 0xff; + buf.append("

              ").append(count).append(" floodfills with IP ").append(i0).append('.') + .append(i1).append('.').append(i2).append('.').append(i3) + .append(":

              "); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + if ((ip[0] & 0xff) != i0) + continue; + if ((ip[1] & 0xff) != i1) + continue; + if ((ip[2] & 0xff) != i2) + continue; + if ((ip[3] & 0xff) != i3) + continue; + found = true; + renderRouterInfo(buf, info, null, false, false); + double point = POINTS32 * (count - 1); + addPoints(points, info.getHash(), point, "Same IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "")); + } + } + if (!found) + buf.append("

              None

              "); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private void renderIPGroups24(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + buf.append("

              Floodfills in the Same /24 (2 minimum)

              "); + ObjectCounter oc = new ObjectCounter(); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 3)); + oc.increment(x); + } + List foo = new ArrayList(); + for (Integer ii : oc.objects()) { + int count = oc.count(ii); + if (count >= 2) + foo.add(ii); + } + Collections.sort(foo, new FooComparator(oc)); + boolean found = false; + for (Integer ii : foo) { + int count = oc.count(ii); + int i = ii.intValue(); + int i0 = i >> 16; + int i1 = (i >> 8) & 0xff; + int i2 = i & 0xff; + buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') + .append(i1).append('.').append(i2).append(".0/24:

              "); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + if ((ip[0] & 0xff) != i0) + continue; + if ((ip[1] & 0xff) != i1) + continue; + if ((ip[2] & 0xff) != i2) + continue; + found = true; + renderRouterInfo(buf, info, null, false, false); + double point = POINTS24 * (count - 1); + addPoints(points, info.getHash(), point, "Same /24 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "")); + } + } + if (!found) + buf.append("

              None

              "); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private void renderIPGroups16(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + buf.append("

              Floodfills in the Same /16 (4 minimum)

              "); + ObjectCounter oc = new ObjectCounter(); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 2)); + oc.increment(x); + } + List foo = new ArrayList(); + for (Integer ii : oc.objects()) { + int count = oc.count(ii); + if (count >= 4) + foo.add(ii); + } + Collections.sort(foo, new FooComparator(oc)); + boolean found = false; + for (Integer ii : foo) { + int count = oc.count(ii); + int i = ii.intValue(); + int i0 = i >> 8; + int i1 = i & 0xff; + buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') + .append(i1).append(".0.0/16

              "); + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + if ((ip[0] & 0xff) != i0) + continue; + if ((ip[1] & 0xff) != i1) + continue; + found = true; + // limit display + //renderRouterInfo(buf, info, null, false, false); + double point = POINTS16 * (count - 1); + addPoints(points, info.getHash(), point, "Same /16 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : "")); + } + } + if (!found) + buf.append("

              None

              "); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private void renderIPGroupsFamily(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + buf.append("

              Floodfills in the Same Declared Family

              "); + ObjectCounter oc = new ObjectCounter(); + for (RouterInfo info : ris) { + String fam = info.getOption("family"); + if (fam == null) + continue; + oc.increment(fam); + } + List foo = new ArrayList(oc.objects()); + Collections.sort(foo, new FoofComparator(oc)); + boolean found = false; + for (String s : foo) { + int count = oc.count(s); + buf.append("

              ").append(count).append(" floodfills in declared family \"").append(DataHelper.escapeHTML(s) + '"') + .append("

              "); + for (RouterInfo info : ris) { + String fam = info.getOption("family"); + if (fam == null) + continue; + if (!fam.equals(s)) + continue; + found = true; + // limit display + //renderRouterInfo(buf, info, null, false, false); + double point = POINTS_FAMILY; + if (count > 1) + addPoints(points, info.getHash(), point, "Same declared family \"" + DataHelper.escapeHTML(s) + "\" with " + (count - 1) + " other" + (( count > 2) ? "s" : "")); + else + addPoints(points, info.getHash(), point, "Declared family \"" + DataHelper.escapeHTML(s) + '"'); + } + } + if (!found) + buf.append("

              None

              "); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + private static final long DAY = 24*60*60*1000L; + + private void addProfilePoints(List ris, Map points) { + long now = _context.clock().now(); + RateAverages ra = RateAverages.getTemp(); + for (RouterInfo info : ris) { + Hash h = info.getHash(); + PeerProfile prof = _context.profileOrganizer().getProfileNonblocking(h); + if (prof != null) { + long heard = prof.getFirstHeardAbout(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + if (age < 2 * DAY) { + // (POINTS_NEW / 48) for every hour under 48, max POINTS_NEW + double point = Math.min(POINTS_NEW, (2 * DAY - age) / (2 * DAY / POINTS_NEW)); + addPoints(points, h, point, + "First heard about: " + _t("{0} ago", DataHelper.formatDuration2(age))); + } + } + DBHistory dbh = prof.getDBHistory(); + if (dbh != null) { + RateStat rs = dbh.getFailedLookupRate(); + if (rs != null) { + Rate r = rs.getRate(24*60*60*1000); + if (r != null) { + r.computeAverages(ra, false); + if (ra.getTotalEventCount() > 0) { + double avg = 100 * ra.getAverage(); + if (avg > 40) + addPoints(points, h, (avg - 40) / 6.0, "Lookup fail rate " + ((int) avg) + '%'); + } + } + } + } + } + } + } + + private void addVersionPoints(List ris, Map points) { + RouterInfo us = _context.router().getRouterInfo(); + if (us == null) return; + String ourVer = us.getVersion(); + if (!ourVer.startsWith("0.9.")) return; + ourVer = ourVer.substring(4); + int dot = ourVer.indexOf('.'); + if (dot > 0) + ourVer = ourVer.substring(0, dot); + int minor; + try { + minor = Integer.parseInt(ourVer); + } catch (NumberFormatException nfe) { return; } + for (RouterInfo info : ris) { + Hash h = info.getHash(); + String caps = info.getCapabilities(); + if (!caps.contains("R")) + addPoints(points, h, POINTS_UNREACHABLE, "Unreachable: " + DataHelper.escapeHTML(caps)); + String hisFullVer = info.getVersion(); + if (!hisFullVer.startsWith("0.9.")) { + addPoints(points, h, POINTS_BAD_VERSION, "Strange version " + DataHelper.escapeHTML(hisFullVer)); + continue; + } + String hisVer = hisFullVer.substring(4); + dot = hisVer.indexOf('.'); + if (dot > 0) + hisVer = hisVer.substring(0, dot); + int hisMinor; + try { + hisMinor = Integer.parseInt(hisVer); + } catch (NumberFormatException nfe) { continue; } + int howOld = minor - hisMinor; + if (howOld < 3) + continue; + addPoints(points, h, howOld * VERSION_FACTOR, howOld + " versions behind: " + DataHelper.escapeHTML(hisFullVer)); + } + } + + private void renderRouterInfoHTML(Writer out, StringBuilder buf, Hash us, double avgMinDist, + List ris, Map points) throws IOException { + Collections.sort(ris, new RouterInfoRoutingKeyComparator(us)); + double min = 256; + double max = 0; + double tot = 0; + double median = 0; + int count = Math.min(MAX, ris.size()); + boolean isEven = (count % 2) == 0; + int medIdx = isEven ? (count / 2) - 1 : (count / 2); + for (int i = 0; i < count; i++) { + RouterInfo ri = ris.get(i); + double dist = renderRouterInfo(buf, ri, us, false, false); + if (dist < avgMinDist) { + if (i == 0) { + //buf.append("

              Not to worry, but above router is closer than average minimum distance " + fmt.format(avgMinDist) + "

              "); + } else if (i == 1) { + buf.append("

              Not to worry, but above routers are closer than average minimum distance " + fmt.format(avgMinDist) + "

              "); + } else if (i == 2) { + buf.append("

              Possible Sybil Warning - above routers are closer than average minimum distance " + fmt.format(avgMinDist) + "

              "); + } else { + buf.append("

              Major Sybil Warning - above router is closer than average minimum distance " + fmt.format(avgMinDist) + "

              "); + } + } + // this is dumb because they are already sorted + if (dist < min) + min = dist; + if (dist > max) + max = dist; + tot += dist; + if (i == medIdx) + median = dist; + else if (i == medIdx + 1 && isEven) + median = (median + dist) / 2; + double point = MIN_CLOSE - dist; + if (point > 0) { + point *= OUR_KEY_FACTOR; + addPoints(points, ri.getHash(), point, "Very close (" + fmt.format(dist) + ") to our key " + us.toBase64()); + } + if (i >= MAX - 1) + break; + } + double avg = tot / count; + buf.append("

              Totals for " + count + " floodfills: MIN=" + fmt.format(min) + " AVG=" + fmt.format(avg) + " MEDIAN=" + fmt.format(median) + " MAX=" + fmt.format(max) + "

              \n"); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + + /** + * For debugging + * http://forums.sun.com/thread.jspa?threadID=597652 + * @since 0.7.14 + */ + private static double biLog2(BigInteger a) { + return NetDbRenderer.biLog2(a); + } + + /** + * Countries now in a separate bundle + * @param code two-letter country code + * @since 0.9.9 + */ + private String getTranslatedCountry(String code) { + String name = _context.commSystem().getCountryName(code); + return Translate.getString(name, _context, Messages.COUNTRY_BUNDLE_NAME); + } + + /** + * Be careful to use stripHTML for any displayed routerInfo data + * to prevent vulnerabilities + * + * @param us ROUTING KEY or null + * @param full ignored + * @return distance to us if non-null, else 0 + */ + private double renderRouterInfo(StringBuilder buf, RouterInfo info, Hash us, boolean isUs, boolean full) { + String hash = info.getIdentity().getHash().toBase64(); + buf.append("\n"); + buf.append("
              "); + double distance = 0; + if (isUs) { + buf.append("" + _t("Our info") + ": ").append(hash).append("
              \n"); + } else { + buf.append("" + _t("Router") + ": ").append(hash).append("\n"); + if (!full) { + buf.append("[").append(_t("Full entry")).append("]"); + } + buf.append("
              \n"); + if (us != null) { + BigInteger dist = HashDistance.getDistance(us, info.getHash()); + distance = biLog2(dist); + buf.append("Hash Distance: ").append(fmt.format(distance)).append("
              "); + } + } + buf.append("Routing Key: ").append(info.getRoutingKey().toBase64()).append("
              \n"); + buf.append("Version: ").append(DataHelper.stripHTML(info.getVersion())).append("
              \n"); + buf.append("Caps: ").append(DataHelper.stripHTML(info.getCapabilities())).append("
              \n"); + String fam = info.getOption("family"); + if (fam != null) + buf.append("Family: ").append(DataHelper.escapeHTML(fam)).append("
              \n"); + String kls = info.getOption("netdb.knownLeaseSets"); + if (kls != null) + buf.append("Lease Sets: ").append(DataHelper.stripHTML(kls)).append("
              \n"); + String kr = info.getOption("netdb.knownRouters"); + if (kr != null) + buf.append("Routers: ").append(DataHelper.stripHTML(kr)).append("
              \n"); + + long now = _context.clock().now(); + if (!isUs) { + PeerProfile prof = _context.profileOrganizer().getProfileNonblocking(info.getHash()); + if (prof != null) { + long heard = prof.getFirstHeardAbout(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("First heard about: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + heard = prof.getLastHeardAbout(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last heard about: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + heard = prof.getLastHeardFrom(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last heard from: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + DBHistory dbh = prof.getDBHistory(); + if (dbh != null) { + heard = dbh.getLastLookupSuccessful(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last lookup successful: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + heard = dbh.getLastLookupFailed(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last lookup failed: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + heard = dbh.getLastStoreSuccessful(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last store successful: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + heard = dbh.getLastStoreFailed(); + if (heard > 0) { + long age = Math.max(now - heard, 1); + buf.append("Last store failed: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + } + // any other profile stuff? + } + } + long age = Math.max(now - info.getPublished(), 1); + if (isUs && _context.router().isHidden()) { + buf.append("").append(_t("Hidden")).append(", ").append(_t("Updated")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } else { + buf.append("").append(_t("Published")).append(": ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + } + buf.append("").append(_t("Signing Key")).append(": ") + .append(info.getIdentity().getSigningPublicKey().getType().toString()); + buf.append("
              \n" + _t("Addresses") + ": "); + String country = _context.commSystem().getCountry(info.getIdentity().getHash()); + if(country != null) { + buf.append("\"").append(country.toUpperCase(Locale.US)).append('\"'); "); + } + for (RouterAddress addr : info.getAddresses()) { + String style = addr.getTransportStyle(); + buf.append("").append(DataHelper.stripHTML(style)).append(": "); + Map p = addr.getOptionsMap(); + for (Map.Entry e : p.entrySet()) { + String name = (String) e.getKey(); + if (name.equals("key") || name.startsWith("ikey") || name.startsWith("itag") || + name.startsWith("iport") || name.equals("mtu")) + continue; + String val = (String) e.getValue(); + buf.append('[').append(_t(DataHelper.stripHTML(name))).append('='); + if (name.equals("host")) + buf.append(""); + buf.append(DataHelper.stripHTML(val)).append("] "); + if (name.equals("host")) + buf.append(""); + } + } + buf.append("
              \n"); + return distance; + } + + /** translate a string */ + private String _t(String s) { + return Messages.getString(s, _context); + } + + /** tag only */ + private static final String _x(String s) { + return s; + } + + /** + * translate a string with a parameter + * This is a lot more expensive than _t(s), so use sparingly. + * + * @param s string to be translated containing {0} + * The {0} will be replaced by the parameter. + * Single quotes must be doubled, i.e. ' -> '' in the string. + * @param o parameter, not translated. + * To translate parameter also, use _t("foo {0} bar", _t("baz")) + * Do not double the single quotes in the parameter. + * Use autoboxing to call with ints, longs, floats, etc. + */ + private String _t(String s, Object o) { + return Messages.getString(s, o, _context); + } +} diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java index db64f77c2..c462c75d3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java @@ -1,8 +1,7 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; public class TunnelHelper extends HelperBase { @@ -15,9 +14,9 @@ public class TunnelHelper extends HelperBase { renderer.renderStatusHTML(_out); return ""; } else { - ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); - renderer.renderStatusHTML(new OutputStreamWriter(baos)); - return new String(baos.toByteArray()); + StringWriter sw = new StringWriter(32*1024); + renderer.renderStatusHTML(sw); + return sw.toString(); } } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java index 9fff49d1e..871723062 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java @@ -33,7 +33,7 @@ public class TunnelRenderer { } public void renderStatusHTML(Writer out) throws IOException { - out.write("

              " + _("Exploratory tunnels") + " (" + _("configure") + ")

              \n"); + out.write("

              " + _t("Exploratory tunnels") + " (" + _t("configure") + ")

              \n"); renderPool(out, _context.tunnelManager().getInboundExploratoryPool(), _context.tunnelManager().getOutboundExploratoryPool()); List destinations = null; @@ -46,31 +46,31 @@ public class TunnelRenderer { boolean isLocal = _context.clientManager().isLocal(client); if ((!isLocal) && (!debug)) continue; - TunnelPool in = null; - TunnelPool outPool = null; - in = clientInboundPools.get(client); - outPool = clientOutboundPools.get(client); + TunnelPool in = clientInboundPools.get(client); + TunnelPool outPool = clientOutboundPools.get(client); // TODO the following code is duplicated in SummaryHelper - String name = (in != null ? in.getSettings().getDestinationNickname() : null); + String name = (in != null) ? in.getSettings().getDestinationNickname() : null; if ( (name == null) && (outPool != null) ) name = outPool.getSettings().getDestinationNickname(); if (name == null) name = client.toBase64().substring(0,4); out.write("

              " + _("Client tunnels for") + ' ' + DataHelper.escapeHTML(_(name))); + + "\" >" + _t("Client tunnels for") + ' ' + DataHelper.escapeHTML(_t(name))); if (isLocal) - out.write(" (" + _("configure") + ")

              \n"); + out.write(" (" + _t("configure") + ")

              \n"); else - out.write(" (" + _("dead") + ")

              \n"); + out.write(" (" + _t("dead") + ")\n"); renderPool(out, in, outPool); } List participating = _context.tunnelDispatcher().listParticipatingTunnels(); - Collections.sort(participating, new TunnelComparator()); - out.write("

              " + _("Participating tunnels") + "

              \n"); - out.write("" - + "\n"); + out.write("

              " + _t("Participating tunnels") + "

              \n"); + if (!participating.isEmpty()) { + Collections.sort(participating, new TunnelComparator()); + out.write("
              " + _("Receive on") + "" + _("From") + "" - + _("Send on") + "" + _("To") + "" + _("Expiration") + "" + _("Usage") + "" + _("Rate") + "" + _("Role") + "
              " + + "\n"); + } long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); if (rs != null) @@ -79,12 +79,13 @@ public class TunnelRenderer { int displayed = 0; for (int i = 0; i < participating.size(); i++) { HopConfig cfg = participating.get(i); - long count = cfg.getProcessedMessagesCount(); + int count = cfg.getProcessedMessagesCount(); if (count <= 0) { inactive++; continue; } - processed += count; + // everything that isn't 'recent' is already in the tunnel.participatingMessageCount stat + processed += cfg.getRecentMessagesCount(); if (++displayed > DISPLAY_LIMIT) continue; out.write(""); @@ -108,28 +109,32 @@ public class TunnelRenderer { if (timeLeft > 0) out.write(""); else - out.write(""); - out.write(""); + out.write(""); + out.write(""); int lifetime = (int) ((_context.clock().now() - cfg.getCreation()) / 1000); if (lifetime <= 0) lifetime = 1; if (lifetime > 10*60) lifetime = 10*60; - int bps = 1024 * cfg.getProcessedMessagesCount() / lifetime; + int bps = 1024 * count / lifetime; out.write(""); if (cfg.getSendTo() == null) - out.write(""); + out.write(""); else if (cfg.getReceiveFrom() == null) - out.write(""); + out.write(""); else - out.write(""); + out.write(""); out.write("\n"); } - out.write("
              " + _t("Receive on") + "" + _t("From") + "" + + _t("Send on") + "" + _t("To") + "" + _t("Expiration") + "" + _t("Usage") + "" + _t("Rate") + "" + _t("Role") + "
              " + DataHelper.formatDuration2(timeLeft) + "(" + _("grace period") + ")" + cfg.getProcessedMessagesCount() + " KB(" + _t("grace period") + ")" + count + " KB" + bps + " Bps" + _("Outbound Endpoint") + "" + _t("Outbound Endpoint") + "" + _("Inbound Gateway") + "" + _t("Inbound Gateway") + "" + _("Participant") + "" + _t("Participant") + "
              \n"); + if (!participating.isEmpty()) + out.write("
              \n"); if (displayed > DISPLAY_LIMIT) - out.write("
              " + _("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "
              \n"); - out.write("
              " + _("Inactive participating tunnels") + ": " + inactive + "
              \n"); - out.write("
              " + _("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
              \n"); + out.write("
              " + _t("Limited display to the {0} tunnels with the highest usage", DISPLAY_LIMIT) + "
              \n"); + if (inactive > 0) + out.write("
              " + _t("Inactive participating tunnels") + ": " + inactive + "
              \n"); + else if (displayed <= 0) + out.write("
              " + _t("none") + "
              \n"); + out.write("
              " + _t("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
              \n"); //renderPeers(out); out.write(""); } @@ -159,16 +164,16 @@ public class TunnelRenderer { if (info.getLength() > maxLength) maxLength = info.getLength(); } - out.write(""); + out.write("
              " + _("In/Out") + "" + _("Expiry") + "" + _("Usage") + "" + _("Gateway") + "
              "); if (maxLength > 3) { out.write(""); + out.write("\">" + _t("Participants") + ""); } else if (maxLength == 3) { - out.write(""); + out.write(""); } if (maxLength > 1) { - out.write(""); + out.write(""); } out.write("\n"); for (int i = 0; i < tunnels.size(); i++) { @@ -182,7 +187,8 @@ public class TunnelRenderer { else out.write(""); out.write(" \n"); - out.write(" \n"); + int count = info.getProcessedMessagesCount(); + out.write(" \n"); for (int j = 0; j < info.getLength(); j++) { Hash peer = info.getPeer(j); TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j)); @@ -200,30 +206,32 @@ public class TunnelRenderer { out.write("\n"); if (info.isInbound()) - processedIn += info.getProcessedMessagesCount(); + processedIn += count; else - processedOut += info.getProcessedMessagesCount(); + processedOut += count; } out.write("
              " + _t("In/Out") + "" + _t("Expiry") + "" + _t("Usage") + "" + _t("Gateway") + "" + _("Participants") + "" + _("Participant") + "" + _t("Participant") + "" + _("Endpoint") + "" + _t("Endpoint") + "
              \"Outbound\"" + DataHelper.formatDuration2(timeLeft) + "" + info.getProcessedMessagesCount() + " KB" + count + " KB
              \n"); if (in != null) { - List pending = in.listPending(); + // PooledTunnelCreatorConfig + List pending = in.listPending(); if (!pending.isEmpty()) { - out.write("
              " + _("Build in progress") + ": " + pending.size() + " " + _("inbound") + "
              \n"); + out.write("
              " + _t("Build in progress") + ": " + pending.size() + " " + _t("inbound") + "
              \n"); live += pending.size(); } } if (outPool != null) { - List pending = outPool.listPending(); + // PooledTunnelCreatorConfig + List pending = outPool.listPending(); if (!pending.isEmpty()) { - out.write("
              " + _("Build in progress") + ": " + pending.size() + " " + _("outbound") + "
              \n"); + out.write("
              " + _t("Build in progress") + ": " + pending.size() + " " + _t("outbound") + "
              \n"); live += pending.size(); } } if (live <= 0) - out.write("
              " + _("No tunnels; waiting for the grace period to end.") + "
              \n"); - out.write("
              " + _("Lifetime bandwidth usage") + ": " + - DataHelper.formatSize2(processedIn*1024) + "B " + _("in") + ", " + - DataHelper.formatSize2(processedOut*1024) + "B " + _("out") + "
              "); + out.write("
              " + _t("No tunnels; waiting for the grace period to end.") + "
              \n"); + out.write("
              " + _t("Lifetime bandwidth usage") + ": " + + DataHelper.formatSize2(processedIn*1024) + "B " + _t("in") + ", " + + DataHelper.formatSize2(processedOut*1024) + "B " + _t("out") + "
              "); } /**** @@ -241,8 +249,8 @@ public class TunnelRenderer { List peerList = new ArrayList(peers); Collections.sort(peerList, new CountryComparator(this._context.commSystem())); - out.write("

              " + _("Tunnel Counts By Peer") + "

              \n"); - out.write("\n"); + out.write("

              " + _t("Tunnel Counts By Peer") + "

              \n"); + out.write("
              " + _("Peer") + "" + _("Our Tunnels") + "" + _("% of total") + "" + _("Participating Tunnels") + "" + _("% of total") + "
              \n"); for (Hash h : peerList) { out.write("
              " + _t("Peer") + "" + _t("Our Tunnels") + "" + _t("% of total") + "" + _t("Participating Tunnels") + "" + _t("% of total") + "
              "); out.write(netDbLink(h)); @@ -260,7 +268,7 @@ public class TunnelRenderer { out.write('0'); out.write('\n'); } - out.write("
              " + _("Totals") + " " + tunnelCount); + out.write("
              " + _t("Totals") + " " + tunnelCount); out.write("   " + partCount); out.write("  
              \n"); } @@ -343,12 +351,12 @@ public class TunnelRenderer { } /** translate a string */ - private String _(String s) { + private String _t(String s) { return Messages.getString(s, _context); } /** translate a string */ - public String _(String s, Object o) { + public String _t(String s, Object o) { return Messages.getString(s, o, _context); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index e1e2edc53..de13a6112 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -84,7 +84,8 @@ public class UpdateHandler { } else if (ConfigUpdateHandler.USE_SU3_UPDATE) { update(ROUTER_SIGNED_SU3); } else { - update(ROUTER_SIGNED); + // disabled, shouldn't get here + //update(ROUTER_SIGNED); } } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java index d03795be0..440c61c03 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/WebAppConfiguration.java @@ -1,6 +1,8 @@ package net.i2p.router.web; import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; @@ -108,7 +110,7 @@ public class WebAppConfiguration implements Configuration { return; StringTokenizer tok = new StringTokenizer(cp, " ,"); StringBuilder buf = new StringBuilder(); - Set systemCP = getSystemClassPath(); + Set systemCP = getSystemClassPath(); while (tok.hasMoreTokens()) { if (buf.length() > 0) buf.append(','); @@ -127,8 +129,8 @@ public class WebAppConfiguration implements Configuration { // TODO: Add a classpath to the command line in i2pstandalone.xml? File jfile = new File(path); File jdir = jfile.getParentFile(); - if (systemCP.contains(jfile.toURI().toURL()) || - (jdir != null && systemCP.contains(jdir.toURI().toURL()))) { + if (systemCP.contains(jfile.toURI()) || + (jdir != null && systemCP.contains(jdir.toURI()))) { //System.err.println("Not adding " + path + " to classpath for " + appName + ", already in system classpath"); // Ticket #957... don't know why... if (!ctxPath.equals("/susimail")) @@ -151,13 +153,20 @@ public class WebAppConfiguration implements Configuration { } } - /** @since 0.9 */ - private static Set getSystemClassPath() { + /** + * Convert URL to URI so there's no blocking equals(), + * not that there's really any hostnames in here, + * but keep findbugs happy. + * @since 0.9 + */ + private static Set getSystemClassPath() { URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); URL urls[] = urlClassLoader.getURLs(); - Set rv = new HashSet(32); + Set rv = new HashSet(32); for (int i = 0; i < urls.length; i++) { - rv.add(urls[i]); + try { + rv.add(urls[i].toURI()); + } catch (URISyntaxException use) {} } return rv; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java b/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java index 8562398a7..e2945da8a 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/WrapperListener.java @@ -3,9 +3,11 @@ package net.i2p.router.web; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.util.Log; +import net.i2p.util.SystemVersion; import org.tanukisoftware.wrapper.WrapperManager; import org.tanukisoftware.wrapper.event.WrapperControlEvent; +import org.tanukisoftware.wrapper.event.WrapperServiceControlEvent; import org.tanukisoftware.wrapper.event.WrapperEvent; import org.tanukisoftware.wrapper.event.WrapperEventListener; @@ -28,7 +30,9 @@ class WrapperListener { */ public WrapperListener(RouterContext ctx) { _listener = new SignalHandler(ctx); - long mask = WrapperEventListener.EVENT_FLAG_CONTROL; + long mask = SystemVersion.isWindows() ? WrapperEventListener.EVENT_FLAG_SERVICE : + WrapperEventListener.EVENT_FLAG_CONTROL; + WrapperManager.addWrapperEventListener(_listener, mask); } @@ -55,10 +59,37 @@ class WrapperListener { } public void fired(WrapperEvent event) { - if (!(event instanceof WrapperControlEvent)) - return; - WrapperControlEvent wce = (WrapperControlEvent) event; Log log = _ctxt.logManager().getLog(ConfigServiceHandler.class); + if (SystemVersion.isWindows() && (event instanceof WrapperServiceControlEvent)) { + WrapperServiceControlEvent wcse = (WrapperServiceControlEvent) event; + int code = wcse.getServiceControlCode(); + switch (code) { + case WrapperManager.SERVICE_CONTROL_CODE_STOP: // 1 + case WrapperManager.SERVICE_CONTROL_CODE_SHUTDOWN: // 5 + log.log(Log.CRIT, "Hard shutdown initiated by Windows service control: " + code); + // JVM will call ShutdownHook if we don't do it ourselves + ConfigServiceHandler.registerWrapperNotifier(_ctxt, Router.EXIT_HARD, false); + _ctxt.router().shutdown(Router.EXIT_HARD); + break; + + // TODO Power suspend/resume? + // Warning, definitions not available in 3.2.0, use integers + // Tanuki doesn't usually mark things with @since, sadly + // case 35xx // WrapperManager.SERVICE_CONTROL_POWEREVENT_ ... + // break; + + default: + if (log.shouldWarn()) + log.warn("Unhandled control event code: " + code); + break; + } + return; + } else if (!(event instanceof WrapperControlEvent)) { + if (log.shouldWarn()) + log.warn("Got unhandled event: " + event); + return; + } + WrapperControlEvent wce = (WrapperControlEvent) event; if (log.shouldLog(Log.WARN)) log.warn("Got signal: " + wce.getControlEventName()); int sig = wce.getControlEvent(); diff --git a/apps/routerconsole/java/strings/Strings.java b/apps/routerconsole/java/strings/Strings.java index 5a45fd770..8254d657b 100644 --- a/apps/routerconsole/java/strings/Strings.java +++ b/apps/routerconsole/java/strings/Strings.java @@ -9,91 +9,76 @@ package dummy; class Dummy { void dummy { // wars for ConfigClientsHelper - _("addressbook"); - _("i2psnark"); - _("i2ptunnel"); - _("susimail"); - _("susidns"); - _("routerconsole"); + _t("addressbook"); + _t("i2psnark"); + _t("i2ptunnel"); + _t("susimail"); + _t("susidns"); + _t("routerconsole"); // clients, taken from clients.config, for ConfigClientsHelper // note that if the wording changes in clients.config, we have to // keep the old string here as well for existing installs - _("Web console"); - _("SAM application bridge"); - _("Application tunnels"); - _("My eepsite web server"); - _("I2P webserver (eepsite)"); - _("Browser launch at startup"); - _("BOB application bridge"); - _("I2P Router Console"); - _("Open Router Console in web browser at startup"); + _t("Web console"); + _t("SAM application bridge"); + _t("Application tunnels"); + _t("My eepsite web server"); + _t("I2P webserver (eepsite)"); + _t("Browser launch at startup"); + _t("BOB application bridge"); + _t("I2P Router Console"); + _t("Open Router Console in web browser at startup"); // tunnel nicknames, taken from i2ptunnel.config so they will display // nicely under 'local destinations' in the summary bar // note that if the wording changes in i2ptunnel.config, we have to // keep the old string here as well for existing installs - _("shared clients"); - _("IRC proxy"); - _("eepsite"); - _("I2P webserver"); - _("HTTP Proxy"); + _t("shared clients"); + _t("shared clients (DSA)"); + _t("IRC proxy"); + _t("eepsite"); + _t("I2P webserver"); + _t("HTTP Proxy"); // older names for pre-0.7.4 installs - _("eepProxy"); - _("ircProxy"); + _t("eepProxy"); + _t("ircProxy"); // hardcoded in i2psnark - _("I2PSnark"); + _t("I2PSnark"); // hardcoded in iMule? - _("iMule"); + _t("iMule"); // standard themes for ConfigUIHelper - _("classic"); - _("dark"); - _("light"); - _("midnight"); + _t("classic"); + _t("dark"); + _t("light"); + _t("midnight"); // stat groups for stats.jsp - _("Bandwidth"); - _("BandwidthLimiter"); - _("ClientMessages"); - _("Encryption"); - _("i2cp"); - _("I2PTunnel"); - _("InNetPool"); - _("JobQueue"); - _("NetworkDatabase"); - _("ntcp"); - _("Peers"); - _("Router"); - _("Stream"); - _("Throttle"); - _("Transport"); - _("Tunnels"); - _("udp"); + _t("Bandwidth"); + _t("BandwidthLimiter"); + _t("ClientMessages"); + _t("Encryption"); + _t("i2cp"); + _t("I2PTunnel"); + _t("InNetPool"); + _t("JobQueue"); + _t("NetworkDatabase"); + _t("ntcp"); + _t("Peers"); + _t("Router"); + _t("Stream"); + _t("Throttle"); + _t("Transport"); + _t("Tunnels"); + _t("udp"); // parameters in transport addresses (netdb.jsp) // may or may not be worth translating - _("host"); - _("key"); - _("port"); + _t("host"); + _t("key"); + _t("port"); // capabilities - _("caps"); - // introducer host - _("ihost0"); - _("ihost1"); - _("ihost2"); - // introducer port - _("iport0"); - _("iport1"); - _("iport2"); - // introducer key - _("ikey0"); - _("ikey1"); - _("ikey2"); - // introducer tag - _("itag0"); - _("itag1"); - _("itag2"); + _t("caps"); } } diff --git a/apps/routerconsole/jsp/certs.jsp b/apps/routerconsole/jsp/certs.jsp new file mode 100644 index 000000000..3c4e59cf6 --- /dev/null +++ b/apps/routerconsole/jsp/certs.jsp @@ -0,0 +1,17 @@ +<%@page contentType="text/html"%> +<%@page trimDirectiveWhitespaces="true"%> +<%@page pageEncoding="UTF-8"%> + + +<%@include file="css.jsi" %> +<%=intl.title("Certificates")%> + +<%@include file="summaryajax.jsi" %> + +<%@include file="summary.jsi" %>

              <%=intl._t("Certificates")%>

              +
              + +" /> +<% certhelper.storeWriter(out); %> + +
              diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 538fb8a5f..5e9c0de92 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -14,7 +14,7 @@ " /> -

              <%=intl._("I2P Bandwidth Configuration")%>

              +

              <%=intl._t("I2P Bandwidth Configuration")%>

              <%@include file="confignav.jsi" %> @@ -25,12 +25,12 @@ -

              <%=intl._("Bandwidth limiter")%>

              +

              <%=intl._t("Bandwidth limiter")%>

              - <%=intl._("I2P will work best if you configure your rates to match the speed of your internet connection.")%> + <%=intl._t("I2P will work best if you configure your rates to match the speed of your internet connection.")%>

              <% /******** *********/ %> - +
              " > - <%=intl._("KBps In")%> + <%=intl._t("KBps In")%> ()
              <%=intl._("Share")%> <%=intl._t("Share")%> ()

              <% int share = nethelper.getShareBandwidth(); if (share < 12) { out.print(""); - out.print(intl._("NOTE")); + out.print(intl._t("NOTE")); out.print(": "); - out.print(intl._("You have configured I2P to share only {0} KBps.", share)); + out.print(intl._t("You have configured I2P to share only {0} KBps.", share)); out.print("\n"); - out.print(intl._("I2P requires at least 12KBps to enable sharing. ")); - out.print(intl._("Please enable sharing (participating in tunnels) by configuring more bandwidth. ")); - out.print(intl._("It improves your anonymity by creating cover traffic, and helps the network.")); + out.print(intl._t("I2P requires at least 12KBps to enable sharing. ")); + out.print(intl._t("Please enable sharing (participating in tunnels) by configuring more bandwidth. ")); + out.print(intl._t("It improves your anonymity by creating cover traffic, and helps the network.")); } else { - out.print(intl._("You have configured I2P to share {0} KBps.", share)); + out.print(intl._t("You have configured I2P to share {0} KBps.", share)); out.print("\n"); - out.print(intl._("The higher the share bandwidth the more you improve your anonymity and help the network.")); + out.print(intl._t("The higher the share bandwidth the more you improve your anonymity and help the network.")); } %>

              -

              <%=intl._("Advanced network configuration page")%>


              +

              <%=intl._t("Advanced network configuration page")%>


              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index 637020405..3ba2deed1 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -15,7 +15,7 @@ " /> -

              <%=intl._("I2P Advanced Configuration")%>

              +

              <%=intl._t("I2P Advanced Configuration")%>

              <%@include file="confignav.jsi" %> @@ -24,21 +24,30 @@ <%@include file="formhandler.jsi" %>
              -

              <%=intl._("Floodfill Configuration")%>

              -

              <%=intl._("Floodill participation helps the network, but may use more of your computer's resources.")%>

              +

              <%=intl._t("Floodfill Configuration")%>

              +

              <%=intl._t("Floodill participation helps the network, but may use more of your computer's resources.")%> +

              +<% + if (advancedhelper.isFloodfill()) { +%><%=intl._t("This router is currently a floodfill participant.")%><% + } else { +%><%=intl._t("This router is not currently a floodfill participant.")%><% + } +%> +

              > -<%=intl._("Automatic")%>
              +<%=intl._t("Automatic")%>
              > -<%=intl._("Force On")%>
              +<%=intl._t("Force On")%>
              > -<%=intl._("Disable")%>
              +<%=intl._t("Disable")%>
              -" > +" >
              -

              <%=intl._("Advanced I2P Configuration")%>

              +

              <%=intl._t("Advanced I2P Configuration")%>

              <% if (advancedhelper.isAdvanced()) { %>
              @@ -47,11 +56,11 @@

              <% if (advancedhelper.isAdvanced()) { %>
              - " > - " > -
              <%=intl._("NOTE")%>: <%=intl._("Some changes may require a restart to take effect.")%> + " > + " > +
              <%=intl._t("NOTE")%>: <%=intl._t("Some changes may require a restart to take effect.")%>
              <% } else { %> -<%=intl._("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> +<%=intl._t("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> <% } // isAdvanced %>
              diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index 65f67daf5..cbb9710d4 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -20,43 +20,43 @@ input.default { width: 1px; height: 1px; visibility: hidden; } " /> " /> -

              <%=intl._("I2P Client Configuration")%>

              +

              <%=intl._t("I2P Client Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %>
              -

              <%=intl._("Client Configuration")%>

              - <%=intl._("The Java clients listed below are started by the router and run in the same JVM.")%>
              - <%=intl._("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%> +

              <%=intl._t("Client Configuration")%>

              + <%=intl._t("The Java clients listed below are started by the router and run in the same JVM.")%>
              + <%=intl._t("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%>

              -

              <%=intl._("To change other client options, edit the file")%> +

              <%=intl._t("To change other client options, edit the file")%> <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>. - <%=intl._("All changes require restart to take effect.")%> + <%=intl._t("All changes require restart to take effect.")%>


              - " /> + " /> <% if (clientshelper.isClientChangeEnabled() && request.getParameter("edit") == null) { %> - " /> + " /> <% } %> - " /> + " />
              -

              <%=intl._("Advanced Client Interface Configuration")%>

              +

              <%=intl._t("Advanced Client Interface Configuration")%>

              -<%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%>
              +<%=intl._t("External I2CP (I2P Client Protocol) Interface Configuration")%>
              > -<%=intl._("Enabled without SSL")%>
              +<%=intl._t("Enabled without SSL")%>
              > -<%=intl._("Enabled with SSL required")%>
              +<%=intl._t("Enabled with SSL required")%>
              > -<%=intl._("Disabled - Clients outside this Java process may not connect")%>
              -<%=intl._("I2CP Interface")%>: +<%=intl._t("Disabled - Clients outside this Java process may not connect")%>
              +<%=intl._t("I2CP Interface")%>:
              -<%=intl._("I2CP Port")%>: +<%=intl._t("I2CP Port")%>: " >
              -<%=intl._("Authorization")%>
              +<%=intl._t("Authorization")%>
              > -<%=intl._("Require username and password")%>
              -<%=intl._("Username")%>: +<%=intl._t("Require username and password")%>
              +<%=intl._t("Username")%>:
              -<%=intl._("Password")%>: +<%=intl._t("Password")%>:
              -

              <%=intl._("The default settings will work for most people.")%> -<%=intl._("Any changes made here must also be configured in the external client.")%> -<%=intl._("Many clients do not support SSL or authorization.")%> -<%=intl._("All changes require restart to take effect.")%> +

              <%=intl._t("The default settings will work for most people.")%> +<%=intl._t("Any changes made here must also be configured in the external client.")%> +<%=intl._t("Many clients do not support SSL or authorization.")%> +<%=intl._t("All changes require restart to take effect.")%>


              -" /> -" /> -" /> +" /> +" /> +" />
              -

              <%=intl._("WebApp Configuration")%>

              - <%=intl._("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%> +

              <%=intl._t("WebApp Configuration")%>

              + <%=intl._t("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%>

              - <%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%> + <%=intl._t("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%>

              -

              <%=intl._("All changes require restart to take effect.")%> +

              <%=intl._t("All changes require restart to take effect.")%>


              - " /> - " /> + " /> + " />
              <% if (clientshelper.showPlugins()) { if (clientshelper.isPluginUpdateEnabled()) { %> -

              <%=intl._("Plugin Configuration")%>

              - <%=intl._("The plugins listed below are started by the webConsole client.")%> +

              <%=intl._t("Plugin Configuration")%>

              + <%=intl._t("The plugins listed below are started by the webConsole client.")%>

              - " /> - " /> + " /> + " />
              <% } // pluginUpdateEnabled if (clientshelper.isPluginInstallEnabled()) { %> -

              <%=intl._("Plugin Installation from URL")%>

              - <%=intl._("Look for available plugins on {0}.", "plugins.i2p")%> - <%=intl._("To install a plugin, enter the download URL:")%> +

              <%=intl._t("Plugin Installation from URL")%>

              + <%=intl._t("Look for available plugins on {0}.", "plugins.i2p")%> + <%=intl._t("To install a plugin, enter the download URL:")%>

              @@ -133,31 +133,31 @@ input.default { width: 1px; height: 1px; visibility: hidden; }


              - " /> - " /> - " /> + " /> + " /> + " />
              -

              <%=intl._("Plugin Installation from File")%>

              +

              <%=intl._t("Plugin Installation from File")%>

              -

              <%=intl._("Install plugin from file.")%> -
              <%=intl._("Select xpi2p or su3 file")%> : +

              <%=intl._t("Install plugin from file.")%> +
              <%=intl._t("Select xpi2p or su3 file")%> :


              -" /> +" />
              <% } // pluginInstallEnabled if (clientshelper.isPluginUpdateEnabled()) { %> -

              <%=intl._("Update All Plugins")%>

              +

              <%=intl._t("Update All Plugins")%>

              - " /> + " />
              <% } // pluginUpdateEnabled diff --git a/apps/routerconsole/jsp/confighome.jsp b/apps/routerconsole/jsp/confighome.jsp index bf1f59d45..56be7b8bd 100644 --- a/apps/routerconsole/jsp/confighome.jsp +++ b/apps/routerconsole/jsp/confighome.jsp @@ -17,7 +17,7 @@ input.default { <%@include file="summary.jsi" %> -

              <%=intl._("I2P Home Page Configuration")%>

              +

              <%=intl._t("I2P Home Page Configuration")%>

              <%@include file="confignav.jsi" %> @@ -26,60 +26,60 @@ input.default { " /> -

              <%=intl._("Default Home Page")%>

              +

              <%=intl._t("Default Home Page")%>

              > - <%=intl._("Use old home page")%> - " > + <%=intl._t("Use old home page")%> + " >
              <% if (homehelper.shouldShowSearch()) { %> -

              <%=intl._("Search Engines")%>

              +

              <%=intl._t("Search Engines")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              <% } // shouldShowSearch() %> -

              <%=intl._("Hidden Services of Interest")%>

              +

              <%=intl._t("Hidden Services of Interest")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              -

              <%=intl._("Applications and Configuration")%>

              +

              <%=intl._t("Applications and Configuration")%>

              - " > - " > - " > - " > - " > + " > + " > + " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index b2f5ef657..3653a9479 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -10,7 +10,7 @@ <%@include file="summary.jsi" %> -

              <%=intl._("I2P Keyring Configuration")%>

              +

              <%=intl._t("I2P Keyring Configuration")%>

              <%@include file="confignav.jsi" %> @@ -18,29 +18,29 @@ <%@include file="formhandler.jsi" %> " /> -

              <%=intl._("Keyring")%>

              - <%=intl._("The router keyring is used to decrypt encrypted leaseSets.")%> - <%=intl._("The keyring may contain keys for local or remote encrypted destinations.")%>

              +

              <%=intl._t("Keyring")%>

              + <%=intl._t("The router keyring is used to decrypt encrypted leaseSets.")%> + <%=intl._t("The keyring may contain keys for local or remote encrypted destinations.")%>

              -

              <%=intl._("Manual Keyring Addition")%>

              - <%=intl._("Enter keys for encrypted remote destinations here.")%> - <%=intl._("Keys for local destinations must be entered on the")%> <%=intl._("I2PTunnel page")%>. +

              <%=intl._t("Manual Keyring Addition")%>

              + <%=intl._t("Enter keys for encrypted remote destinations here.")%> + <%=intl._t("Keys for local destinations must be entered on the")%> <%=intl._t("I2PTunnel page")%>.

              - + - +
              <%=intl._("Dest. name, hash, or full key")%>:<%=intl._t("Dest. name, hash, or full key")%>:
              <%=intl._("Encryption Key")%>:<%=intl._t("Encryption Key")%>:
              -" > -" > -" > +" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 9e3be5cc7..84f10ac80 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -13,7 +13,7 @@ " /> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Logging Configuration")%>

              +

              <%=intl._t("I2P Logging Configuration")%>

              <%@include file="confignav.jsi" %> @@ -23,31 +23,31 @@
              -

              <%=intl._("Configure I2P Logging Options")%>

              +

              <%=intl._t("Configure I2P Logging Options")%>

              - - - + + + - + - + - - + - + - +
              <%=intl._("Log file")%>:" value="" > -
              <%=intl._("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._("Log record format")%>:
              <%=intl._t("Log file")%>:" value="" > +
              <%=intl._t("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._t("Log record format")%>: " > -
              <%=intl._("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%> +
              <%=intl._t("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%>
              <%=intl._("Log date format")%>:
              <%=intl._t("Log date format")%>: " > -
              <%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%> +
              <%=intl._t("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%>
              <%=intl._("Max log file size")%>:
              <%=intl._t("Max log file size")%>: " >
              <%=intl._("Default log level")%>:
              <%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%> +
              <%=intl._t("Default log level")%>:
              <%=intl._t("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%>
              <%=intl._("Log level overrides")%>:
              <%=intl._t("Log level overrides")%>:
              <%=intl._("New override")%>:
              <%=intl._t("New override")%>:

              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index 27fdfef7e..7b81518e3 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -13,7 +13,7 @@ " /> -

              <%=intl._("I2P Network Configuration")%>

              +

              <%=intl._t("I2P Network Configuration")%>

              <%@include file="confignav.jsi" %> @@ -23,55 +23,55 @@
              -

              <%=intl._("IP and Transport Configuration")%>

              +

              <%=intl._t("IP and Transport Configuration")%>

              - <%=intl._("The default settings will work for most people.")%> - <%=intl._("There is help below.")%> -

              <%=intl._("UPnP Configuration")%>:
              + <%=intl._t("The default settings will work for most people.")%> + <%=intl._t("There is help below.")%> +

              <%=intl._t("UPnP Configuration")%>:
              > - <%=intl._("Enable UPnP to open firewall ports")%> - <%=intl._("UPnP status")%> -

              <%=intl._("IP Configuration")%>:
              - <%=intl._("Externally reachable hostname or IP address")%>:
              + <%=intl._t("Enable UPnP to open firewall ports")%> - <%=intl._t("UPnP status")%> +

              <%=intl._t("IP Configuration")%>:
              + <%=intl._t("Externally reachable hostname or IP address")%>:
              > - <%=intl._("Use all auto-detect methods")%>
              + <%=intl._t("Use all auto-detect methods")%>
              > - <%=intl._("Disable UPnP IP address detection")%>
              + <%=intl._t("Disable UPnP IP address detection")%>
              > - <%=intl._("Ignore local interface IP address")%>
              + <%=intl._t("Ignore local interface IP address")%>
              > - <%=intl._("Use SSU IP address detection only")%>
              + <%=intl._t("Use SSU IP address detection only")%>
              > - <%=intl._("Hidden mode - do not publish IP")%> <%=intl._("(prevents participating traffic)")%>
              + <%=intl._t("Hidden mode - do not publish IP")%> <%=intl._t("(prevents participating traffic)")%>
              > - <%=intl._("Specify hostname or IP")%>:
              + <%=intl._t("Specify hostname or IP")%>:
              <%=nethelper.getAddressSelector() %>

              - <%=intl._("Action when IP changes")%>:
              + <%=intl._t("Action when IP changes")%>:
              > - <%=intl._("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%> - (<%=intl._("Experimental")%>) + <%=intl._t("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%> + (<%=intl._t("Experimental")%>)

              - <%=intl._("IPv4 Configuration")%>:
              + <%=intl._t("IPv4 Configuration")%>:
              > - <%=intl._("Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)")%> + <%=intl._t("Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)")%>

              - <%=intl._("IPv6 Configuration")%>:
              + <%=intl._t("IPv6 Configuration")%>:
              > - <%=intl._("Disable IPv6")%>
              + <%=intl._t("Disable IPv6")%>
              > - <%=intl._("Enable IPv6")%>
              + <%=intl._t("Enable IPv6")%>
              > - <%=intl._("Prefer IPv4 over IPv6")%>
              + <%=intl._t("Prefer IPv4 over IPv6")%>
              > - <%=intl._("Prefer IPv6 over IPv4")%>
              + <%=intl._t("Prefer IPv6 over IPv4")%>
              > - <%=intl._("Use IPv6 only (disable IPv4)")%> - (<%=intl._("Experimental")%>)
              -

              <%=intl._("UDP Configuration:")%>
              - <%=intl._("UDP port:")%> + <%=intl._t("Use IPv6 only (disable IPv4)")%> + (<%=intl._t("Experimental")%>)
              +

              <%=intl._t("UDP Configuration:")%>
              + <%=intl._t("UDP port:")%> " >
              > - <%=intl._("Completely disable")%> <%=intl._("(select only if behind a firewall that blocks outbound UDP)")%>
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that blocks outbound UDP)")%>
              <% /******** *********/ %>

              - <%=intl._("TCP Configuration")%>:
              - <%=intl._("Externally reachable hostname or IP address")%>:
              + <%=intl._t("TCP Configuration")%>:
              + <%=intl._t("Externally reachable hostname or IP address")%>:
              > - <%=intl._("Use auto-detected IP address")%> - (<%=intl._("currently")%> ) - <%=intl._("if we are not firewalled")%>
              + <%=intl._t("Use auto-detected IP address")%> + (<%=intl._t("currently")%> ) + <%=intl._t("if we are not firewalled")%>
              > - <%=intl._("Always use auto-detected IP address (Not firewalled)")%>
              + <%=intl._t("Always use auto-detected IP address (Not firewalled)")%>
              > - <%=intl._("Specify hostname or IP")%>: + <%=intl._t("Specify hostname or IP")%>: " >
              > - <%=intl._("Disable inbound (Firewalled)")%>
              + <%=intl._t("Disable inbound (Firewalled)")%>
              > - <%=intl._("Completely disable")%> <%=intl._("(select only if behind a firewall that throttles or blocks outbound TCP)")%>
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that throttles or blocks outbound TCP)")%>

              - <%=intl._("Externally reachable TCP port")%>:
              + <%=intl._t("Externally reachable TCP port")%>:
              > - <%=intl._("Use the same port configured for UDP")%> - (<%=intl._("currently")%> )
              + <%=intl._t("Use the same port configured for UDP")%> + (<%=intl._t("currently")%> )
              > - <%=intl._("Specify Port")%>: + <%=intl._t("Specify Port")%>: " >
              -

              <%=intl._("Notes")%>: <%=intl._("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%>

              +

              <%=intl._t("Notes")%>: <%=intl._t("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%>


              -" > -" > -

              <%=intl._("Configuration Help")%>:

              - <%=intl._("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> +" > +" > +

              <%=intl._t("Configuration Help")%>:

              + <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%>

              - <%=intl._("If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you.")%> - <%=intl._("If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic.")%> - <%=intl._("Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm.")%> - <%=intl._("Certain firewalls such as symmetric NATs may not work well with I2P.")%> + <%=intl._t("If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you.")%> + <%=intl._t("If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic.")%> + <%=intl._t("Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm.")%> + <%=intl._t("Certain firewalls such as symmetric NATs may not work well with I2P.")%>

              <% /******** *********/ %>

              - <%=intl._("UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports.")%> - <%=intl._("UPnP support is beta, and may not work for any number of reasons")%>: + <%=intl._t("UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports.")%> + <%=intl._t("UPnP support is beta, and may not work for any number of reasons")%>:

                -
              • <%=intl._("No UPnP-compatible device present")%> -
              • <%=intl._("UPnP disabled on the device")%> -
              • <%=intl._("Software firewall interference with UPnP")%> -
              • <%=intl._("Bugs in the device's UPnP implementation")%> -
              • <%=intl._("Multiple firewall/routers in the internet connection path")%> -
              • <%=intl._("UPnP device change, reset, or address change")%> +
              • <%=intl._t("No UPnP-compatible device present")%> +
              • <%=intl._t("UPnP disabled on the device")%> +
              • <%=intl._t("Software firewall interference with UPnP")%> +
              • <%=intl._t("Bugs in the device's UPnP implementation")%> +
              • <%=intl._t("Multiple firewall/routers in the internet connection path")%> +
              • <%=intl._t("UPnP device change, reset, or address change")%>
              -

              <%=intl._("Review the UPnP status here.")%> -<%=intl._("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%>

              -

              <%=intl._("Hostnames entered above will be published in the network database.")%> - <%=intl._("They are not private.")%> - <%=intl._("Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1.")%> - <%=intl._("If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially.")%> - <%=intl._("When in doubt, leave the settings at the defaults.")%> +

              <%=intl._t("Review the UPnP status here.")%> +<%=intl._t("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%>

              +

              <%=intl._t("Hostnames entered above will be published in the network database.")%> + <%=intl._t("They are not private.")%> + <%=intl._t("Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1.")%> + <%=intl._t("If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially.")%> + <%=intl._t("When in doubt, leave the settings at the defaults.")%>

              -

              <%=intl._("Reachability Help")%>:

              - <%=intl._("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> - <%=intl._("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%> - <%=intl._("If there is an error, the logs may also help diagnose the problem.")%> +

              <%=intl._t("Reachability Help")%>:

              + <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> + <%=intl._t("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%> + <%=intl._t("If there is an error, the logs may also help diagnose the problem.")%>

                -
              • <%=intl._("OK")%> - - <%=intl._("Your UDP port does not appear to be firewalled.")%> -
              • <%=intl._("Firewalled")%> - - <%=intl._("Your UDP port appears to be firewalled.")%> - <%=intl._("As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error.")%> - <%=intl._("However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port.")%> - <%=intl._("I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections.")%> - <%=intl._("However, you will get more participating traffic and help the network more if you can open your firewall(s).")%> - <%=intl._("If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control.")%> - <%=intl._("Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P.")%> -
              • <%=intl._("Testing")%> - - <%=intl._("The router is currently testing whether your UDP port is firewalled.")%> -
              • <%=intl._("Hidden")%> - - <%=intl._("The router is not configured to publish its address, therefore it does not expect incoming connections.")%> - <%=intl._("Hidden mode is automatically enabled for added protection in certain countries.")%> -
              • <%=intl._("WARN - Firewalled and Fast")%> - - <%=intl._("You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled.")%> - <%=intl._("While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall.")%> -
              • <%=intl._("WARN - Firewalled and Floodfill")%> - - <%=intl._("You have configured I2P to be a floodfill router, but you are firewalled.")%> - <%=intl._("For best participation as a floodfill router, you should open your firewall.")%> -
              • <%=intl._("WARN - Firewalled with Inbound TCP Enabled")%> - - <%=intl._("You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.")%> - <%=intl._("If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network.")%> - <%=intl._("Please open your firewall or disable inbound TCP above.")%> -
              • <%=intl._("WARN - Firewalled with UDP Disabled")%> - - <%=intl._("You have configured inbound TCP, however you have disabled UDP.")%> - <%=intl._("You appear to be firewalled on TCP, therefore your router cannot accept inbound connections.")%> - <%=intl._("Please open your firewall or enable UDP.")%> -
              • <%=intl._("ERR - Clock Skew")%> - - <%=intl._("Your system's clock is skewed, which will make it difficult to participate in the network.")%> - <%=intl._("Correct your clock setting if this error persists.")%> -
              • <%=intl._("ERR - Private TCP Address")%> - - <%=intl._("You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address.")%> - <%=intl._("Correct the address or disable inbound TCP above.")%> -
              • <%=intl._("ERR - SymmetricNAT")%> - - <%=intl._("I2P detected that you are firewalled by a Symmetric NAT.")%> - <%=intl._("I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network.")%> -
              • <%=intl._("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%> - - <%=intl._("I2P was unable to bind to the configured port noted on the advanced network configuration page .")%> - <%=intl._("Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port.")%> - <%=intl._("This may be a transient error, if the other program is no longer using the port.")%> - <%=intl._("However, a restart is always required after this error.")%> -
              • <%=intl._("ERR - UDP Disabled and Inbound TCP host/port not set")%> - - <%=intl._("You have not configured inbound TCP with a hostname and port above, however you have disabled UDP.")%> - <%=intl._("Therefore your router cannot accept inbound connections.")%> - <%=intl._("Please configure a TCP host and port above or enable UDP.")%> -
              • <%=intl._("ERR - Client Manager I2CP Error - check logs")%> - - <%=intl._("This is usually due to a port 7654 conflict. Check the logs to verify.")%> - <%=intl._("Do you have another I2P instance running? Stop the conflicting program and restart I2P.")%> +
              • <%=intl._t("OK")%> - + <%=intl._t("Your UDP port does not appear to be firewalled.")%> +
              • <%=intl._t("Firewalled")%> - + <%=intl._t("Your UDP port appears to be firewalled.")%> + <%=intl._t("As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error.")%> + <%=intl._t("However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port.")%> + <%=intl._t("I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections.")%> + <%=intl._t("However, you will get more participating traffic and help the network more if you can open your firewall(s).")%> + <%=intl._t("If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control.")%> + <%=intl._t("Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P.")%> +
              • <%=intl._t("Testing")%> - + <%=intl._t("The router is currently testing whether your UDP port is firewalled.")%> +
              • <%=intl._t("Hidden")%> - + <%=intl._t("The router is not configured to publish its address, therefore it does not expect incoming connections.")%> + <%=intl._t("Hidden mode is automatically enabled for added protection in certain countries.")%> +
              • <%=intl._t("WARN - Firewalled and Fast")%> - + <%=intl._t("You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled.")%> + <%=intl._t("While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall.")%> +
              • <%=intl._t("WARN - Firewalled and Floodfill")%> - + <%=intl._t("You have configured I2P to be a floodfill router, but you are firewalled.")%> + <%=intl._t("For best participation as a floodfill router, you should open your firewall.")%> +
              • <%=intl._t("WARN - Firewalled with Inbound TCP Enabled")%> - + <%=intl._t("You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.")%> + <%=intl._t("If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network.")%> + <%=intl._t("Please open your firewall or disable inbound TCP above.")%> +
              • <%=intl._t("WARN - Firewalled with UDP Disabled")%> - + <%=intl._t("You have configured inbound TCP, however you have disabled UDP.")%> + <%=intl._t("You appear to be firewalled on TCP, therefore your router cannot accept inbound connections.")%> + <%=intl._t("Please open your firewall or enable UDP.")%> +
              • <%=intl._t("ERR - Clock Skew")%> - + <%=intl._t("Your system's clock is skewed, which will make it difficult to participate in the network.")%> + <%=intl._t("Correct your clock setting if this error persists.")%> +
              • <%=intl._t("ERR - Private TCP Address")%> - + <%=intl._t("You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address.")%> + <%=intl._t("Correct the address or disable inbound TCP above.")%> +
              • <%=intl._t("ERR - SymmetricNAT")%> - + <%=intl._t("I2P detected that you are firewalled by a Symmetric NAT.")%> + <%=intl._t("I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network.")%> +
              • <%=intl._t("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%> - + <%=intl._t("I2P was unable to bind to the configured port noted on the advanced network configuration page .")%> + <%=intl._t("Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port.")%> + <%=intl._t("This may be a transient error, if the other program is no longer using the port.")%> + <%=intl._t("However, a restart is always required after this error.")%> +
              • <%=intl._t("ERR - UDP Disabled and Inbound TCP host/port not set")%> - + <%=intl._t("You have not configured inbound TCP with a hostname and port above, however you have disabled UDP.")%> + <%=intl._t("Therefore your router cannot accept inbound connections.")%> + <%=intl._t("Please configure a TCP host and port above or enable UDP.")%> +
              • <%=intl._t("ERR - Client Manager I2CP Error - check logs")%> - + <%=intl._t("This is usually due to a port 7654 conflict. Check the logs to verify.")%> + <%=intl._t("Do you have another I2P instance running? Stop the conflicting program and restart I2P.")%>

              <% /******** <% } %>
              -

              <%=intl._("Adjust Profile Bonuses")%>

              -

              <%=intl._("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._("profiles page")%>.

              +

              <%=intl._t("Adjust Profile Bonuses")%>

              +

              <%=intl._t("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._t("profiles page")%>.

              <% long speed = 0; long capacity = 0; if (! "".equals(peer)) { // get existing bonus values? } %> -

              <%=intl._("Speed")%>: +

              <%=intl._t("Speed")%>: - <%=intl._("Capacity")%>: + <%=intl._t("Capacity")%>: - " />

              + " />

              -

              <%=intl._("Banned Peers")%>

              +

              <%=intl._t("Banned Peers")%>

              " /> <% profilesHelper.storeWriter(out); %> -

              <%=intl._("Banned IPs")%>

              +

              <%=intl._t("Banned IPs")%>


              diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index b78b4cb14..ebc94b9c9 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -13,105 +13,107 @@ " /> -

              <%=intl._("I2P Reseeding Configuration")%>

              +

              <%=intl._t("I2P Reseeding Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

              <%=intl._("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> -<%=intl._("If reseeding has failed, you should first check your network connection.")%> -<%=intl._("See {0} for instructions on reseeding manually.", "" + intl._("the FAQ") + "")%> +

              <%=intl._t("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> +<%=intl._t("If reseeding has failed, you should first check your network connection.")%> +<%=intl._t("See {0} for instructions on reseeding manually.", "" + intl._t("the FAQ") + "")%>

              -

              <%=intl._("Manual Reseed from URL")%>

              -

              <%=intl._("Enter zip or su3 URL")%> : +

              <%=intl._t("Manual Reseed from URL")%>

              +

              <%=intl._t("Enter zip or su3 URL")%> : -
              <%=intl._("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> -<%=intl._("The zip format is unsigned; use a zip file only from a source that you trust.")%> +
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> +<%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%>

              -" /> +" />
              -

              <%=intl._("Manual Reseed from File")%>

              -

              <%=intl._("Select zip or su3 file")%> : +

              <%=intl._t("Manual Reseed from File")%>

              +

              <%=intl._t("Select zip or su3 file")%> : -
              <%=intl._("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> -<%=intl._("The zip format is unsigned; use a zip file only from a source that you trust.")%> +
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> +<%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%>

              -" /> +" />
              -

              <%=intl._("Create Reseed File")%>

              -

              <%=intl._("Create a new reseed zip file you may share for others to reseed manually.")%> -<%=intl._("This file will never contain your own router's identity or IP.")%> +

              <%=intl._t("Create Reseed File")%>

              +

              <%=intl._t("Create a new reseed zip file you may share for others to reseed manually.")%> +<%=intl._t("This file will never contain your own router's identity or IP.")%>

              -" /> +" />
              -

              <%=intl._("Reseeding Configuration")%>

              -

              <%=intl._("The default settings will work for most people.")%> -<%=intl._("Change these only if HTTPS is blocked by a restrictive firewall and reseed has failed.")%> +

              <%=intl._t("Reseeding Configuration")%>

              +

              <%=intl._t("The default settings will work for most people.")%> +<%=intl._t("Change these only if HTTPS is blocked by a restrictive firewall and reseed has failed.")%>

              - + - - +<%=intl._t("Use non-SSL only")%> + + - + - + - + - + - + - +
              <%=intl._("Reseed URL Selection")%>:
              <%=intl._t("Reseed URL Selection")%>: > -<%=intl._("Try SSL first then non-SSL")%>
              +<%=intl._t("Try SSL first then non-SSL")%>
              > -<%=intl._("Use SSL only")%>
              +<%=intl._t("Use SSL only")%>
              > -<%=intl._("Use non-SSL only")%>
              <%=intl._("Reseed URLs")%>:
              <%=intl._t("Reseed URLs")%>: +
              " />
              +
              <%=intl._("Enable HTTP Proxy?")%>
              <%=intl._t("Enable HTTP Proxy?")%> >
              <%=intl._("HTTP Proxy Host")%>:
              <%=intl._t("HTTP Proxy Host")%>: " >
              <%=intl._("HTTP Proxy Port")%>:
              <%=intl._t("HTTP Proxy Port")%>: " >
              <%=intl._("Use HTTP Proxy Authorization?")%>
              <%=intl._t("Use HTTP Proxy Authorization?")%> >
              <%=intl._("HTTP Proxy Username")%>:
              <%=intl._t("HTTP Proxy Username")%>: " >
              <%=intl._("HTTP Proxy Password")%>:
              <%=intl._t("HTTP Proxy Password")%>: " >
              -" /> -" /> -" /> +" /> +" /> +" />
              diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index f12c9b95c..987aefdeb 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -10,7 +10,7 @@ <%@include file="summary.jsi" %> -

              <%=intl._("I2P Service Configuration")%>

              +

              <%=intl._t("I2P Service Configuration")%>

              <%@include file="confignav.jsi" %> @@ -19,63 +19,63 @@
              -

              <%=intl._("Shutdown the router")%>

              -

              <%=intl._("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> - <%=intl._("If you need to kill the router immediately, that option is available as well.")%>

              +

              <%=intl._t("Shutdown the router")%>

              +

              <%=intl._t("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> + <%=intl._t("If you need to kill the router immediately, that option is available as well.")%>


              - " > - " > + " > + " > <% if (formhandler.shouldShowCancelGraceful()) { %> - " > + " > <% } %>
              <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._("If you want the router to restart itself after shutting down, you can choose one of the following.")%> - <%=intl._("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%> - <%=intl._("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%> - <%=intl._("After tearing down the router, it will wait 1 minute before starting back up again.")%>

              +

              <%=intl._t("If you want the router to restart itself after shutting down, you can choose one of the following.")%> + <%=intl._t("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%> + <%=intl._t("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%> + <%=intl._t("After tearing down the router, it will wait 1 minute before starting back up again.")%>


              - " > - " > + " > + " > <% } %>
              <% if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %> -

              <%=intl._("Systray integration")%>

              -

              <%=intl._("On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status")%> - <%=intl._("(later on, I2P client applications will be able to integrate their own functionality into the system tray as well).")%> - <%=intl._("If you are on windows, you can either enable or disable that icon here.")%>

              +

              <%=intl._t("Systray integration")%>

              +

              <%=intl._t("On the windows platform, there is a small application to sit in the system tray, allowing you to view the router's status")%> + <%=intl._t("(later on, I2P client applications will be able to integrate their own functionality into the system tray as well).")%> + <%=intl._t("If you are on windows, you can either enable or disable that icon here.")%>


              - " > - " > + " > + " >
              -

              <%=intl._("Run on startup")%>

              -

              <%=intl._("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> - <%=intl._("If you prefer the command line, you can also run the ")%> install_i2p_service_winnt.bat (<%=intl._("or")%> +

              <%=intl._t("Run on startup")%>

              +

              <%=intl._t("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> + <%=intl._t("If you prefer the command line, you can also run the ")%> install_i2p_service_winnt.bat (<%=intl._t("or")%> uninstall_i2p_service_winnt.bat).


              - " > -" >
              -

              <%=intl._("Note")%>: <%=intl._("If you are running I2P as service right now, removing it will shut down your router immediately.")%> - <%=intl._("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%>

              + " > +" >
              +

              <%=intl._t("Note")%>: <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%> + <%=intl._t("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%>

              <% } %> -

              <%=intl._("Debugging")%>

              -

              <%=intl._("View the job queue")%> +

              <%=intl._t("Debugging")%>

              +

              <%=intl._t("View the job queue")%> <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>

              +

              <%=intl._t("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>


              <% } %>
              - " > + " > <% if (System.getProperty("wrapper.version") != null) { %> - " > + " > <% } %>
              -

              <%=intl._("Launch browser on router startup?")%>

              -

              <%=intl._("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> +

              <%=intl._t("Launch browser on router startup?")%>

              +

              <%=intl._t("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> http://127.0.0.1:7657/ .


              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp index 129feaa10..63c3ed18c 100644 --- a/apps/routerconsole/jsp/configsidebar.jsp +++ b/apps/routerconsole/jsp/configsidebar.jsp @@ -17,7 +17,7 @@ input.default { <%@include file="summary.jsi" %> -

              <%=intl._("I2P Summary Bar Configuration")%>

              +

              <%=intl._t("I2P Summary Bar Configuration")%>

              <%@include file="confignav.jsi" %> @@ -29,23 +29,23 @@ input.default { " /> -

              <%=intl._("Refresh Interval")%>

              +

              <%=intl._t("Refresh Interval")%>

              " > - <%=intl._("seconds")%> - " > + <%=intl._t("seconds")%> + " >
              -

              <%=intl._("Customize Summary Bar")%>

              +

              <%=intl._t("Customize Summary Bar")%>

              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index 4100a4b1e..802d615e5 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -61,7 +61,7 @@ function toggleAll(category) <%@include file="summary.jsi" %> -

              <%=intl._("I2P Stats Configuration")%>

              +

              <%=intl._t("I2P Stats Configuration")%>

              <%@include file="confignav.jsi" %> @@ -73,44 +73,44 @@ function toggleAll(category)
              -

              <%=intl._("Configure I2P Stat Collection")%>

              -

              <%=intl._("Enable full stats?")%> +

              <%=intl._t("Configure I2P Stat Collection")%>

              +

              <%=intl._t("Enable full stats?")%> checked="checked" <% } %> > - (<%=intl._("change requires restart to take effect")%>)
              + (<%=intl._t("change requires restart to take effect")%>)
              <% // stats.log for devs only and grows without bounds, not recommended boolean shouldShowLog = statshelper.shouldShowLog(); if (shouldShowLog) { -%><%=intl._("Stat file")%>:
              +%><%=intl._t("Stat file")%>:
              Warning - Log with care, stat file grows without limit.
              <% } // shouldShowLog -%><%=intl._("Filter")%>: (<%=intl._("toggle all")%>)

              +%><%=intl._t("Filter")%>: (<%=intl._t("toggle all")%>)

              <% while (statshelper.hasMoreStats()) { while (statshelper.groupRequired()) { %> <% if (shouldShowLog) { -%> +%> <% } // shouldShowLog -%> +%> <% } // end iterating over required groups for the current stat %> @@ -139,14 +139,14 @@ Warning - Log with care, stat file grows without limit.
              %> - <% } // shouldShowLog %>
              > - <%=intl._(statshelper.getCurrentGroupName())%> - (<%=intl._("toggle all")%>) + <%=intl._t(statshelper.getCurrentGroupName())%> + (<%=intl._t("toggle all")%>)
              <%=intl._("Log")%><%=intl._t("Log")%><%=intl._("Graph")%><%=intl._t("Graph")%>
              <%=intl._("Advanced filter")%>: + <%=intl._t("Advanced filter")%>:
              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configtunnels.jsp b/apps/routerconsole/jsp/configtunnels.jsp index de82f0027..09a2ceee9 100644 --- a/apps/routerconsole/jsp/configtunnels.jsp +++ b/apps/routerconsole/jsp/configtunnels.jsp @@ -13,28 +13,28 @@ " /> -

              <%=intl._("I2P Tunnel Configuration")%>

              +

              <%=intl._t("I2P Tunnel Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %>

              - <%=intl._("NOTE")%>: - <%=intl._("The default settings work for most people.")%> - <%=intl._("There is a fundamental tradeoff between anonymity and performance.")%> - <%=intl._("Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability.")%> - <%=intl._("High CPU and/or high outbound bandwidth usage may result.")%> - <%=intl._("Change these settings with care, and adjust them if you have problems.")%> + <%=intl._t("NOTE")%>: + <%=intl._t("The default settings work for most people.")%> + <%=intl._t("There is a fundamental tradeoff between anonymity and performance.")%> + <%=intl._t("Tunnels longer than 3 hops (for example 2 hops + 0-2 hops, 3 hops + 0-1 hops, 3 hops + 0-2 hops), or a high quantity + backup quantity, may severely reduce performance or reliability.")%> + <%=intl._t("High CPU and/or high outbound bandwidth usage may result.")%> + <%=intl._t("Change these settings with care, and adjust them if you have problems.")%>

              - <%=intl._("Note")%>: <%=intl._("Exploratory tunnel setting changes are stored in the router.config file.")%> - <%=intl._("Client tunnel changes are temporary and are not saved.")%> -<%=intl._("To make permanent client tunnel changes see the")%> <%=intl._("i2ptunnel page")%>. + <%=intl._t("Note")%>: <%=intl._t("Exploratory tunnel setting changes are stored in the router.config file.")%> + <%=intl._t("Client tunnel changes are temporary and are not saved.")%> +<%=intl._t("To make permanent client tunnel changes see the")%> <%=intl._t("i2ptunnel page")%>.
              -" > -" > +" > +" >
              diff --git a/apps/routerconsole/jsp/configui.jsp b/apps/routerconsole/jsp/configui.jsp index 7635ab1e3..96f7bf84c 100644 --- a/apps/routerconsole/jsp/configui.jsp +++ b/apps/routerconsole/jsp/configui.jsp @@ -22,16 +22,16 @@ input.default { " /> -

              <%=uihelper._("I2P UI Configuration")%>

              +

              <%=uihelper._t("I2P UI Configuration")%>

              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

              <%=uihelper._("Router Console Theme")%>

              +

              <%=uihelper._t("Router Console Theme")%>

              - + <% @@ -40,28 +40,28 @@ input.default { %> <% } else { %> -<%=uihelper._("Theme selection disabled for Internet Explorer, sorry.")%> +<%=uihelper._t("Theme selection disabled for Internet Explorer, sorry.")%>
              -<%=uihelper._("If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes.")%> +<%=uihelper._t("If you're not using IE, it's likely that your browser is pretending to be IE; please configure your browser (or proxy) to use a different User Agent string if you'd like to access the console themes.")%> <% } %> -

              <%=uihelper._("Router Console Language")%>

              +

              <%=uihelper._t("Router Console Language")%>

              -

              <%=uihelper._("Please contribute to the router console translation project! Contact the developers in #i2p-dev on IRC to help.")%> +

              <%=uihelper._t("Please contribute to the router console translation project! Contact the developers in #i2p-dev on IRC to help.")%>


              -" > -" > +" > +" >
              -

              <%=uihelper._("Router Console Password")%>

              +

              <%=uihelper._t("Router Console Password")%>

              - " > - " > - " > - " > + " > + " > + " > + " >
              diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 1171fbcab..e1e073404 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -11,7 +11,7 @@ <%@include file="summary.jsi" %> -

              <%=intl._("I2P Update Configuration")%>

              +

              <%=intl._t("I2P Update Configuration")%>

              <%@include file="confignav.jsi" %> @@ -27,57 +27,57 @@ <% /* set hidden default */ %> <% if (updatehelper.canInstall()) { %> -

              <%=intl._("Check for I2P and news updates")%>

              +

              <%=intl._t("Check for I2P and news updates")%>

              - + <% } else { %> -

              <%=intl._("Check for news updates")%>

              +

              <%=intl._t("Check for news updates")%>

              <%=intl._("News & I2P Updates")%>:
              <%=intl._t("News & I2P Updates")%>:
              - + <% } // if canInstall %> - - + - <% if (updatehelper.canInstall()) { %> - + <% } // if canInstall %> - + - + <% if (updatehelper.isAdvanced()) { %> - + - + <% } // if isAdvanced %> <% if (updatehelper.canInstall()) { %> <% if (updatehelper.isAdvanced()) { %> - + - + - + - + - + - + <% } // if isAdvanced %> <% } else { %> - + <% } // if canInstall %>
              <%=intl._("News Updates")%>:
              <%=intl._t("News Updates")%>: <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <%=intl._("Update In Progress")%>
              <% } else { %> " /> +
              <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <%=intl._t("Update In Progress")%>
              <% } else { %> " /> <% } %>

              <%=intl._("News URL")%>:
              <%=intl._t("News URL")%>: readonly="readonly"<% } %> value="">
              <%=intl._("Refresh frequency")%>: +
              <%=intl._t("Refresh frequency")%>:
              <%=formhandler._("Update policy")%>:
              <%=formhandler._t("Update policy")%>:
              <%=intl._("Fetch news through the eepProxy?")%>
              <%=intl._t("Fetch news through the eepProxy?")%>
              <%=intl._("Update through the eepProxy?")%>
              <%=intl._t("Update through the eepProxy?")%>
              <%=intl._("eepProxy host")%>:
              <%=intl._t("eepProxy host")%>: " />
              <%=intl._("eepProxy port")%>:
              <%=intl._t("eepProxy port")%>: " />
              <%=intl._("Update URLs")%>:
              <%=intl._t("Update URLs")%>:
              <%=intl._("Trusted keys")%>:
              <%=intl._t("Trusted keys")%>:
              <%=intl._("Update with signed development builds?")%>
              <%=intl._t("Update with signed development builds?")%>
              <%=intl._("Signed Build URL")%>:
              <%=intl._t("Signed Build URL")%>: ">
              <%=intl._("Update with unsigned development builds?")%>
              <%=intl._t("Update with unsigned development builds?")%>
              <%=intl._("Unsigned Build URL")%>:
              <%=intl._t("Unsigned Build URL")%>: ">
              <%=intl._("Updates will be dispatched via your package manager.")%>
              <%=intl._t("Updates will be dispatched via your package manager.")%>
              - " > - " > + " > + " >
              diff --git a/apps/routerconsole/jsp/console.jsp b/apps/routerconsole/jsp/console.jsp index ffed509dd..c61025795 100644 --- a/apps/routerconsole/jsp/console.jsp +++ b/apps/routerconsole/jsp/console.jsp @@ -10,12 +10,12 @@ <%@include file="summaryajax.jsi" %> <% - String consoleNonce = intl.getNonce(); + String consoleNonce = net.i2p.router.web.CSSHelper.getNonce(); %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Router Console")%>

              +

              <%=intl._t("I2P Router Console")%>

              <% if (newshelper.shouldShowNews()) { @@ -61,7 +61,7 @@ Tiếng Việt
              -

              <%=intl._("Welcome to I2P")%>

              +

              <%=intl._t("Welcome to I2P")%>

              <% java.io.File fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index 50c70d875..edae86240 100644 --- a/apps/routerconsole/jsp/css.jsi +++ b/apps/routerconsole/jsp/css.jsi @@ -37,7 +37,7 @@ } String conNonceParam = request.getParameter("consoleNonce"); - if (intl.getNonce().equals(conNonceParam)) { + if (net.i2p.router.web.CSSHelper.getNonce().equals(conNonceParam)) { intl.setLang(request.getParameter("lang")); intl.setNews(request.getParameter("news")); } diff --git a/apps/routerconsole/jsp/dns.jsp b/apps/routerconsole/jsp/dns.jsp index 8080c115b..23a353416 100644 --- a/apps/routerconsole/jsp/dns.jsp +++ b/apps/routerconsole/jsp/dns.jsp @@ -30,11 +30,11 @@ <%@include file="summary.jsi" %> -

              <%=intl._("I2P Addressbook")%> ">images/newtab.png" />

              +

              <%=intl._t("I2P Addressbook")%> ">images/newtab.png" />

              <% diff --git a/apps/routerconsole/jsp/error.jsp b/apps/routerconsole/jsp/error.jsp index 5dfba993e..663b61431 100644 --- a/apps/routerconsole/jsp/error.jsp +++ b/apps/routerconsole/jsp/error.jsp @@ -25,6 +25,6 @@ <%@include file="summary.jsi" %>

              <%=ERROR_CODE%> <%=ERROR_MESSAGE%>

              -<%=intl._("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%>
              -<%=intl._("Error 404")%>: <%=ERROR_URI%> <%=intl._("not found")%>. +<%=intl._t("Sorry! You appear to be requesting a non-existent Router Console page or resource.")%>
              +<%=intl._t("Error 404")%>: <%=ERROR_URI%> <%=intl._t("not found")%>.
              diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp index 70e82e9d2..c56b1f7ea 100644 --- a/apps/routerconsole/jsp/error500.jsp +++ b/apps/routerconsole/jsp/error500.jsp @@ -22,41 +22,41 @@

              <%=ERROR_CODE%> <%=ERROR_MESSAGE%>

              -<%=intl._("Sorry! There has been an internal error.")%> +<%=intl._t("Sorry! There has been an internal error.")%>

              <% /* note to translators - both parameters are URLs */ -%><%=intl._("Please report bugs on {0} or {1}.", +%><%=intl._t("Please report bugs on {0} or {1}.", "trac.i2p2.i2p", "trac.i2p2.de")%> -

              <%=intl._("Please include this information in bug reports")%>: +

              <%=intl._t("Please include this information in bug reports")%>:

              -

              <%=intl._("Error Details")%>

              +

              <%=intl._t("Error Details")%>

              -<%=intl._("Error {0}", ERROR_CODE)%>: <%=ERROR_URI%> <%=ERROR_MESSAGE%> +<%=intl._t("Error {0}", ERROR_CODE)%>: <%=ERROR_URI%> <%=ERROR_MESSAGE%>

              <% if (ERROR_THROWABLE != null) { - java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(2048); - java.io.PrintStream ps = new java.io.PrintStream(baos); - ERROR_THROWABLE.printStackTrace(ps); - ps.close(); - String trace = baos.toString(); + java.io.StringWriter sw = new java.io.StringWriter(2048); + java.io.PrintWriter pw = new java.io.PrintWriter(sw); + ERROR_THROWABLE.printStackTrace(pw); + pw.flush(); + String trace = sw.toString(); trace = trace.replace("&", "&").replace("<", "<").replace(">", ">"); trace = trace.replace("\n", "
                  \n"); out.print(trace); } %>

              -

              <%=intl._("I2P Version and Running Environment")%>

              +

              <%=intl._t("I2P Version and Running Environment")%>

              I2P version: <%=net.i2p.router.RouterVersion.FULL_VERSION%>
              Java version: <%=System.getProperty("java.vendor")%> <%=System.getProperty("java.version")%> (<%=System.getProperty("java.runtime.name")%> <%=System.getProperty("java.runtime.version")%>)
              @@ -71,5 +71,5 @@ Jbigi: <%=net.i2p.util.NativeBigInteger.loadStatus()%>
              Encoding: <%=System.getProperty("file.encoding")%>
              Charset: <%=java.nio.charset.Charset.defaultCharset().name()%>

              -

              <%=intl._("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

              +

              <%=intl._t("Note that system information, log timestamps, and log messages may provide clues to your location; please review everything you include in a bug report.")%>

              diff --git a/apps/routerconsole/jsp/events.jsp b/apps/routerconsole/jsp/events.jsp index b67aa5dd5..29838e7a7 100644 --- a/apps/routerconsole/jsp/events.jsp +++ b/apps/routerconsole/jsp/events.jsp @@ -18,7 +18,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Event Log")%>

              +

              <%=intl._t("I2P Event Log")%>

              diff --git a/apps/routerconsole/jsp/graph.jsp b/apps/routerconsole/jsp/graph.jsp index 92c6f508f..1d5c5bf1f 100644 --- a/apps/routerconsole/jsp/graph.jsp +++ b/apps/routerconsole/jsp/graph.jsp @@ -16,7 +16,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Performance Graphs")%>

              +

              <%=intl._t("I2P Performance Graphs")%>

              diff --git a/apps/routerconsole/jsp/graphs.jsp b/apps/routerconsole/jsp/graphs.jsp index 8d4aff752..6cde50131 100644 --- a/apps/routerconsole/jsp/graphs.jsp +++ b/apps/routerconsole/jsp/graphs.jsp @@ -23,7 +23,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %> -

              <%=intl._("I2P Performance Graphs")%>

              +

              <%=intl._t("I2P Performance Graphs")%>

              diff --git a/apps/routerconsole/jsp/home.jsp b/apps/routerconsole/jsp/home.jsp index 8553e56e6..eb9887e97 100644 --- a/apps/routerconsole/jsp/home.jsp +++ b/apps/routerconsole/jsp/home.jsp @@ -8,7 +8,7 @@ <%@include file="summaryajax.jsi" %> <% - String consoleNonce = intl.getNonce(); + String consoleNonce = net.i2p.router.web.CSSHelper.getNonce(); %> " /> @@ -23,12 +23,12 @@ -

              <%=intl._("I2P Router Console")%>

              +

              <%=intl._t("I2P Router Console")%>

              <% if (newshelper.shouldShowNews()) { @@ -57,7 +57,7 @@ " /> <% if (homehelper.shouldShowWelcome()) { %> -
              "> +
              ">
              English عربية @@ -87,7 +87,7 @@ Українська Tiếng Việt
              -

              <%=intl._("Welcome to I2P")%>

              +

              <%=intl._t("Welcome to I2P")%>

              <% } // shouldShowWelcome %> @@ -100,7 +100,7 @@ - - - +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %> + + + - + +<% } /* book..getEntries().length() > 0 */ %>
              +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %>

              -" > -" > +" > +" >

              -
              +
              +<% } /* book..getEntries().length() > 0 */ %> + +<% if (book.getEntries().length > 0) { /* Don't show if no results. Can't figure out how to do this with c:if */ %>

              @@ -188,14 +194,15 @@ ${book.loadBookMessages} -" /> +" />

              +<% } /* book..getEntries().length() > 0 */ %> <% /* book.notEmpty */ %>
              -

              <%=intl._("This address book is empty.")%>

              +

              <%=intl._t("This address book is empty.")%>

              @@ -204,16 +211,16 @@ ${book.loadBookMessages}
              -

              <%=intl._("Add new destination")%>:

              +

              <%=intl._t("Add new destination")%>:

              -<%=intl._("Host Name")%> +<%=intl._t("Host Name")%>
              -<%=intl._("Destination")%> +<%=intl._t("Destination")%>

              -" > -" > -" > +" > +" > +" >

              diff --git a/apps/susidns/src/jsp/config.jsp b/apps/susidns/src/jsp/config.jsp index 6a650d3f5..27e57a6e9 100644 --- a/apps/susidns/src/jsp/config.jsp +++ b/apps/susidns/src/jsp/config.jsp @@ -44,24 +44,24 @@ -<%=intl._("configuration")%> - susidns +<%=intl._t("configuration")%> - susidns


              @@ -74,65 +74,65 @@
              -" > -" > +" > +" >
              -

              <%=intl._("Hints")%>

              +

              <%=intl._t("Hints")%>

              1. -<%=intl._("File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows).")%> +<%=intl._t("File and directory paths here are relative to the addressbook's working directory, which is normally ~/.i2p/addressbook/ (Linux) or %APPDATA%\\I2P\\addressbook\\ (Windows).")%>
              2. -<%=intl._("If you want to manually add lines to an addressbook, add them to the private or master addressbooks.")%> -<%=intl._("The router addressbook and the published addressbook are updated by the addressbook application.")%> +<%=intl._t("If you want to manually add lines to an addressbook, add them to the private or master addressbooks.")%> +<%=intl._t("The router addressbook and the published addressbook are updated by the addressbook application.")%>
              3. -<%=intl._("When you publish your addressbook, ALL destinations from the master and router addressbooks appear there.")%> -<%=intl._("Use the private addressbook for private destinations, these are not published.")%> +<%=intl._t("When you publish your addressbook, ALL destinations from the master and router addressbooks appear there.")%> +<%=intl._t("Use the private addressbook for private destinations, these are not published.")%>
              -

              <%=intl._("Options")%>

              +

              <%=intl._t("Options")%>

              • subscriptions - -<%=intl._("File containing the list of subscriptions URLs (no need to change)")%> +<%=intl._t("File containing the list of subscriptions URLs (no need to change)")%>
              • update_delay - -<%=intl._("Update interval in hours")%> +<%=intl._t("Update interval in hours")%>
              • published_addressbook - -<%=intl._("Your public hosts.txt file (choose a path within your webserver document root)")%> +<%=intl._t("Your public hosts.txt file (choose a path within your webserver document root)")%>
              • router_addressbook - -<%=intl._("Your hosts.txt (don't change)")%> +<%=intl._t("Your hosts.txt (don't change)")%>
              • master_addressbook - -<%=intl._("Your personal addressbook, these hosts will be published")%> +<%=intl._t("Your personal addressbook, these hosts will be published")%>
              • private_addressbook - -<%=intl._("Your private addressbook, it is never published")%> +<%=intl._t("Your private addressbook, it is never published")%>
              • proxy_port - -<%=intl._("Port for your eepProxy (no need to change)")%> +<%=intl._t("Port for your eepProxy (no need to change)")%>
              • proxy_host - -<%=intl._("Hostname for your eepProxy (no need to change)")%> +<%=intl._t("Hostname for your eepProxy (no need to change)")%>
              • should_publish - -<%=intl._("Whether to update the published addressbook")%> +<%=intl._t("Whether to update the published addressbook")%>
              • etags - -<%=intl._("File containing the etags header from the fetched subscription URLs (no need to change)")%> +<%=intl._t("File containing the etags header from the fetched subscription URLs (no need to change)")%>
              • last_modified - -<%=intl._("File containing the modification timestamp for each fetched subscription URL (no need to change)")%> +<%=intl._t("File containing the modification timestamp for each fetched subscription URL (no need to change)")%>
              • log - -<%=intl._("File to log activity to (change to /dev/null if you like)")%> +<%=intl._t("File to log activity to (change to /dev/null if you like)")%>
              • theme - -<%=intl._("Name of the theme to use (defaults to 'light')")%> +<%=intl._t("Name of the theme to use (defaults to 'light')")%>
              diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp index 9334e43ca..a5660b677 100644 --- a/apps/susidns/src/jsp/details.jsp +++ b/apps/susidns/src/jsp/details.jsp @@ -42,31 +42,31 @@ -${book.book} <%=intl._("addressbook")%> - susidns +${book.book} <%=intl._t("addressbook")%> - susidns


              -

              <%=intl._("Address book")%>: <%=intl._(book.getBook())%>

              -

              <%=intl._("Storage")%>: ${book.displayName}

              +

              <%=intl._t("Address book")%>: <%=intl._t(book.getBook())%>

              +

              <%=intl._t("Storage")%>: ${book.displayName}

              @@ -85,49 +85,49 @@ - + <% if (addr.isIDN()) { %> - + <% } %> - + - + - - + + - - + + - + - + - + - + - + - + - +
              <%=intl._("Host Name")%><%=intl._t("Host Name")%> <%=addr.getDisplayName()%>
              <%=intl._("Encoded Name")%><%=intl._t("Encoded Name")%> <%=addr.getName()%>
              <%=intl._("Base 32 Address")%><%=intl._t("Base 32 Address")%> <%=b32%>
              <%=intl._("Base 64 Hash")%><%=intl._t("Base 64 Hash")%> <%=addr.getB64()%>
              <%=intl._("Address Helper")%><%=intl._("link")%><%=intl._t("Address Helper")%><%=intl._t("link")%>
              <%=intl._("Public Key")%><%=intl._("ElGamal 2048 bit")%><%=intl._t("Public Key")%><%=intl._t("ElGamal 2048 bit")%>
              <%=intl._("Signing Key")%><%=intl._t("Signing Key")%> <%=addr.getSigType()%>
              <%=intl._("Certificate")%><%=intl._t("Certificate")%> <%=addr.getCert()%>
              <%=intl._("Added Date")%><%=intl._t("Added Date")%> <%=addr.getAdded()%>
              <%=intl._("Source")%><%=intl._t("Source")%> <%=addr.getSource()%>
              <%=intl._("Last Modified")%><%=intl._t("Last Modified")%> <%=addr.getModded()%>
              <%=intl._("Notes")%><%=intl._t("Notes")%> <%=addr.getNotes()%>
              <%=intl._("Destination")%><%=intl._t("Destination")%>
              @@ -138,7 +138,7 @@ -" > +" >

              diff --git a/apps/susidns/src/jsp/index.jsp b/apps/susidns/src/jsp/index.jsp index 505beeec7..67c96c680 100644 --- a/apps/susidns/src/jsp/index.jsp +++ b/apps/susidns/src/jsp/index.jsp @@ -42,7 +42,7 @@ -<%=intl._("Introduction")%> - SusiDNS +<%=intl._t("Introduction")%> - SusiDNS @@ -53,39 +53,39 @@

              -

              <%=intl._("What is the addressbook?")%>

              +

              <%=intl._t("What is the addressbook?")%>

              -<%=intl._("The addressbook application is part of your I2P installation.")%> -<%=intl._("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%> +<%=intl._t("The addressbook application is part of your I2P installation.")%> +<%=intl._t("It regularly updates your hosts.txt file from distributed sources or \"subscriptions\".")%>

              -<%=intl._("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%> -<%=intl._("Subscribing to additional sites is easy, just add them to your subscriptions file.")%> +<%=intl._t("In the default configuration, the address book is only subscribed to {0}.", "i2p-projekt.i2p")%> +<%=intl._t("Subscribing to additional sites is easy, just add them to your subscriptions file.")%>

              -<%=intl._("For more information on naming in I2P, see the overview.")%> +<%=intl._t("For more information on naming in I2P, see the overview.")%>

              -

              <%=intl._("How does the addressbook application work?")%>

              +

              <%=intl._t("How does the addressbook application work?")%>

              -<%=intl._("The addressbook application regularly polls your subscriptions and merges their content into your \"router\" address book.")%> -<%=intl._("Then it merges your \"master\" address book into the router address book as well.")%> -<%=intl._("If configured, the router address book is now written to the \"published\" address book, which will be publicly available if you are running an eepsite.")%> +<%=intl._t("The addressbook application regularly polls your subscriptions and merges their content into your \"router\" address book.")%> +<%=intl._t("Then it merges your \"master\" address book into the router address book as well.")%> +<%=intl._t("If configured, the router address book is now written to the \"published\" address book, which will be publicly available if you are running an eepsite.")%>

              -<%=intl._("The router also uses a private address book (not shown in the picture), which is not merged or published.")%> -<%=intl._("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%> -<%=intl._("The private address book can also be used for aliases of hosts in your other address books.")%> +<%=intl._t("The router also uses a private address book (not shown in the picture), which is not merged or published.")%> +<%=intl._t("Hosts in the private address book can be accessed by you but their addresses are never distributed to others.")%> +<%=intl._t("The private address book can also be used for aliases of hosts in your other address books.")%>

              address book working scheme
              diff --git a/apps/susidns/src/jsp/subscriptions.jsp b/apps/susidns/src/jsp/subscriptions.jsp index db588c6a8..25ec21261 100644 --- a/apps/susidns/src/jsp/subscriptions.jsp +++ b/apps/susidns/src/jsp/subscriptions.jsp @@ -43,24 +43,24 @@ -<%=intl._("subscriptions")%> - susidns +<%=intl._t("subscriptions")%> - susidns


              @@ -73,18 +73,18 @@
              -" > -" > +" > +" >

              -<%=intl._("The subscription file contains a list of i2p URLs.")%> -<%=intl._("The addressbook application regularly checks this list for new eepsites.")%> -<%=intl._("Those URLs refer to published hosts.txt files.")%> -<%=intl._("The default subscription is the hosts.txt from {0}, which is updated infrequently.", "i2p-projekt.i2p")%> -<%=intl._("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%> -<%=intl._("See the FAQ for a list of subscription URLs.")%> +<%=intl._t("The subscription file contains a list of i2p URLs.")%> +<%=intl._t("The addressbook application regularly checks this list for new eepsites.")%> +<%=intl._t("Those URLs refer to published hosts.txt files.")%> +<%=intl._t("The default subscription is the hosts.txt from {0}, which is updated infrequently.", "i2p-projekt.i2p")%> +<%=intl._t("So it is a good idea to add additional subscriptions to sites that have the latest addresses.")%> +<%=intl._t("See the FAQ for a list of subscription URLs.")%>

              " + _t("No messages") + "
              "); if (i > 0) { out.println( "

              "); if( sessionObject.reallyDelete ) { // TODO ngettext - out.println("

              " + _("Really delete the marked messages?") + - "

              " + button( REALLYDELETE, _("Yes, really delete them!") ) + - "
              " + button( CLEAR, _("Cancel"))); + out.println("

              " + _t("Really delete the marked messages?") + + "

              " + button( REALLYDELETE, _t("Yes, really delete them!") ) + + "
              " + button( CLEAR, _t("Cancel"))); } else { - out.println(button( DELETE, _("Delete Selected") ) + "
              "); + out.println(button( DELETE, _t("Delete Selected") ) + "
              "); out.print( - button( MARKALL, _("Mark All") ) + + button( MARKALL, _t("Mark All") ) + " " + - button( CLEAR, _("Clear All") )); + button( CLEAR, _t("Clear All") )); //"
              " + - //button( INVERT, _("Invert Selection") ) + + //button( INVERT, _t("Invert Selection") ) + //"
              "); } out.print("
              "); // moved to config page //out.print( - // _("Page Size") + ": " + + // _t("Page Size") + ": " + // " " + - // button( SETPAGESIZE, _("Set") ) ); + // button( SETPAGESIZE, _t("Set") ) ); out.print("
              "); - out.print(button(CONFIGURE, _("Settings"))); + out.print(button(CONFIGURE, _t("Settings"))); out.println("
              "); @@ -2299,18 +2299,18 @@ public class WebMail extends HttpServlet /** * first prev next last */ - private static void showPageButtons(PrintWriter out, Folder folder) { + private static void showPageButtons(PrintWriter out, Folder folder) { out.println( "
              " + ( folder.isFirstPage() ? - button2( FIRSTPAGE, _("First") ) + " " + button2( PREVPAGE, _("Previous") ) : - button( FIRSTPAGE, _("First") ) + " " + button( PREVPAGE, _("Previous") ) ) + + button2( FIRSTPAGE, _t("First") ) + " " + button2( PREVPAGE, _t("Previous") ) : + button( FIRSTPAGE, _t("First") ) + " " + button( PREVPAGE, _t("Previous") ) ) + "      " + - _("Page {0} of {1}", folder.getCurrentPage(), folder.getPages()) + + _t("Page {0} of {1}", folder.getCurrentPage(), folder.getPages()) + "      " + ( folder.isLastPage() ? - button2( NEXTPAGE, _("Next") ) + " " + button2( LASTPAGE, _("Last") ) : - button( NEXTPAGE, _("Next") ) + " " + button( LASTPAGE, _("Last") ) ) + button2( NEXTPAGE, _t("Next") ) + " " + button2( LASTPAGE, _t("Last") ) : + button( NEXTPAGE, _t("Next") ) + " " + button( LASTPAGE, _t("Last") ) ) ); } @@ -2322,7 +2322,7 @@ public class WebMail extends HttpServlet private static void showMessage( PrintWriter out, SessionObject sessionObject ) { if( sessionObject.reallyDelete ) { - out.println( "

              " + _("Really delete this message?") + " " + button( REALLYDELETE, _("Yes, really delete it!") ) + "

              " ); + out.println( "

              " + _t("Really delete this message?") + " " + button( REALLYDELETE, _t("Yes, really delete it!") ) + "

              " ); } Mail mail = sessionObject.mailCache.getMail( sessionObject.showUIDL, MailCache.FetchMode.ALL ); if(!RELEASE && mail != null && mail.hasBody()) { @@ -2334,31 +2334,31 @@ public class WebMail extends HttpServlet out.println( "-->" ); } out.println("
              "); - out.println( button( NEW, _("New") ) + spacer + - button( REPLY, _("Reply") ) + - button( REPLYALL, _("Reply All") ) + - button( FORWARD, _("Forward") ) + spacer + - button( SAVE_AS, _("Save As") ) + spacer); + out.println( button( NEW, _t("New") ) + spacer + + button( REPLY, _t("Reply") ) + + button( REPLYALL, _t("Reply All") ) + + button( FORWARD, _t("Forward") ) + spacer + + button( SAVE_AS, _t("Save As") ) + spacer); if (sessionObject.reallyDelete) - out.println(button2(DELETE, _("Delete"))); + out.println(button2(DELETE, _t("Delete"))); else - out.println(button(DELETE, _("Delete"))); + out.println(button(DELETE, _t("Delete"))); out.println("
              " + - ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _("Previous") ) : button( PREV, _("Previous") ) ) + spacer + - button( LIST, _("Back to Folder") ) + spacer + - ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _("Next") ) : button( NEXT, _("Next") ) )); + ( sessionObject.folder.isFirstElement( sessionObject.showUIDL ) ? button2( PREV, _t("Previous") ) : button( PREV, _t("Previous") ) ) + spacer + + button( LIST, _t("Back to Folder") ) + spacer + + ( sessionObject.folder.isLastElement( sessionObject.showUIDL ) ? button2( NEXT, _t("Next") ) : button( NEXT, _t("Next") ) )); out.println("
              "); //if (Config.hasConfigFile()) - // out.println(button( RELOAD, _("Reload Config") ) + spacer); - //out.println(button( LOGOUT, _("Logout") ) ); + // out.println(button( RELOAD, _t("Reload Config") ) + spacer); + //out.println(button( LOGOUT, _t("Logout") ) ); if( mail != null ) { out.println( "\n" + "\n" + - "\n" + - "\n" + - "\n" + "" ); if( mail.hasPart()) { @@ -2366,11 +2366,11 @@ public class WebMail extends HttpServlet showPart( out, mail.getPart(), 0, SHOW_HTML ); } else { - out.println( "" ); + out.println( "" ); } } else { - out.println( "" ); + out.println( "" ); } out.println( "\n

              " + _("From") + + "
              " + _t("From") + ":" + quoteHTML( mail.sender ) + "
              " + _("Subject") + + "
              " + _t("Subject") + ":" + quoteHTML( mail.formattedSubject ) + "
              " + _("Date") + + "
              " + _t("Date") + ":" + mail.quotedDate + "

              " + _("Could not fetch mail body.") + "

              " + _t("Could not fetch mail body.") + "

              " + _("Could not fetch mail.") + "

              " + _t("Could not fetch mail.") + "


              " ); } @@ -2388,13 +2388,13 @@ public class WebMail extends HttpServlet sz = Config.getProperty(Folder.PAGESIZE, Folder.DEFAULT_PAGESIZE); out.println("
              "); out.println( - _("Folder Page Size") + ": " + " " + - button( SETPAGESIZE, _("Set") ) ); + button( SETPAGESIZE, _t("Set") ) ); out.println("

              "); out.println("

              "); - out.print(_("Advanced Configuration")); + out.print(_t("Advanced Configuration")); Properties config = Config.getProperties(); out.print(":

              "); out.println("
              "); out.println("
              "); - out.println(button(SAVE, _("Save Configuration"))); - out.println(button(CANCEL, _("Cancel"))); + out.println(button(SAVE, _t("Save Configuration"))); + out.println(button(CANCEL, _t("Cancel"))); out.println("
              "); } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } /** translate */ - private static String _(String s, Object o) { + private static String _t(String s, Object o) { return Messages.getString(s, o); } /** translate */ - private static String _(String s, Object o, Object o2) { + private static String _t(String s, Object o, Object o2) { return Messages.getString(s, o, o2); } diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/DecodingException.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/DecodingException.java index d0d89dd00..46277d7e5 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/encoding/DecodingException.java +++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/DecodingException.java @@ -23,10 +23,12 @@ */ package i2p.susi.webmail.encoding; +import java.io.IOException; + /** * @author susi */ -public class DecodingException extends Exception { +public class DecodingException extends IOException { private static final long serialVersionUID = 1L; public DecodingException( String msg ) { diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java index c18b9eac8..e7db3672d 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java +++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java @@ -66,7 +66,7 @@ public class HeaderLine implements Encoding { boolean quoting = false; boolean quote = false; boolean linebreak = false; - String quotedSequence = null; + StringBuilder quotedSequence = null; int rest = in.length; int index = 0; while( true ) { @@ -102,14 +102,15 @@ public class HeaderLine implements Encoding { } if( quote ) { if( ! quoting ) { - quotedSequence = "=?utf-8?Q?"; + quotedSequence = new StringBuilder(64); + quotedSequence.append("=?utf-8?Q?"); quoting = true; } - quotedSequence += HexTable.table[ c < 0 ? 256 + c : c ]; + quotedSequence.append(HexTable.table[ c < 0 ? 256 + c : c ]); } else { if( quoting ) { - quotedSequence += "?="; + quotedSequence.append("?="); int sl = quotedSequence.length(); if( l + sl > 76 ) { /* @@ -138,7 +139,7 @@ public class HeaderLine implements Encoding { } } if( quoting ) { - quotedSequence += "?="; + quotedSequence.append("?="); int sl = quotedSequence.length(); if( l + sl > 76 ) { /* @@ -232,7 +233,9 @@ public class HeaderLine implements Encoding { length -= distance; lastCharWasQuoted = true; continue; - } catch (Exception e1) { + } catch (IOException e1) { + Debug.debug(Debug.ERROR, e1.toString()); + } catch (RuntimeException e1) { Debug.debug(Debug.ERROR, e1.toString()); } } diff --git a/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java b/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java index f688ddc16..5ed201827 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java +++ b/apps/susimail/src/src/i2p/susi/webmail/pop3/POP3MailBox.java @@ -99,7 +99,7 @@ public class POP3MailBox implements NewMailListener { sizes = new HashMap(); synchronizer = new Object(); // this appears in the UI so translate - lastLine = _("No response from server"); + lastLine = _t("No response from server"); lastActive = new AtomicLong(System.currentTimeMillis()); lastChecked = new AtomicLong(); delayedDeleter = new DelayedDeleter(this); @@ -665,15 +665,15 @@ public class POP3MailBox implements NewMailListener { idleCloser = new IdleCloser(this); } else { if (lastError.equals("")) - lastError = _("Error connecting to server"); + lastError = _t("Error connecting to server"); close(); } } catch (NumberFormatException e1) { - lastError = _("Error opening mailbox") + ": " + e1; + lastError = _t("Error opening mailbox") + ": " + e1; } catch (IOException e1) { - lastError = _("Error opening mailbox") + ": " + e1.getLocalizedMessage(); + lastError = _t("Error opening mailbox") + ": " + e1.getLocalizedMessage(); } } } @@ -748,7 +748,7 @@ public class POP3MailBox implements NewMailListener { } } else { Debug.debug(Debug.DEBUG, "sendCmd1a: (" + cmd + ") NO RESPONSE"); - lastError = _("No response from server"); + lastError = _t("No response from server"); throw new IOException(lastError); } return result; @@ -790,7 +790,7 @@ public class POP3MailBox implements NewMailListener { String foo = DataHelper.readLine(in); updateActivity(); if (foo == null) { - lastError = _("No response from server"); + lastError = _t("No response from server"); throw new IOException(lastError); } sr.response = foo.trim(); @@ -1022,7 +1022,7 @@ public class POP3MailBox implements NewMailListener { e = e.substring(5); // translate this common error if (e.trim().equals("Login failed.")) - e = _("Login failed"); + e = _t("Login failed"); return e; } @@ -1257,7 +1257,7 @@ public class POP3MailBox implements NewMailListener { } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } } diff --git a/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java b/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java index f3f755698..fc4757735 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java +++ b/apps/susimail/src/src/i2p/susi/webmail/smtp/SMTPClient.java @@ -210,8 +210,8 @@ public class SMTPClient { try { socket = new Socket( host, port ); - } catch (Exception e) { - error += _("Cannot connect") + ": " + e.getMessage() + '\n'; + } catch (IOException e) { + error += _t("Cannot connect") + ": " + e.getMessage() + '\n'; ok = false; } try { @@ -222,7 +222,7 @@ public class SMTPClient { socket.setSoTimeout(120*1000); int result = sendCmd(null); if (result != 220) { - error += _("Server refused connection") + " (" + result + ")\n"; + error += _t("Server refused connection") + " (" + result + ")\n"; ok = false; } } @@ -234,7 +234,7 @@ public class SMTPClient { if (r.result == 250) { supportsPipelining = r.recv.contains("PIPELINING"); } else { - error += _("Server refused connection") + " (" + r.result + ")\n"; + error += _t("Server refused connection") + " (" + r.result + ")\n"; ok = false; } } @@ -246,7 +246,7 @@ public class SMTPClient { cmds.add(new SendExpect(base64.encode(user), 334)); cmds.add(new SendExpect(base64.encode(pass), 235)); if (sendCmds(cmds) != 3) { - error += _("Login failed") + '\n'; + error += _t("Login failed") + '\n'; ok = false; } } @@ -259,7 +259,7 @@ public class SMTPClient { cmds.add(new SendExpect("DATA", 354)); if (sendCmds(cmds) != cmds.size()) { // TODO which recipient? - error += _("Mail rejected") + '\n'; + error += _t("Mail rejected") + '\n'; ok = false; } } @@ -273,16 +273,16 @@ public class SMTPClient { if (result == 250) mailSent = true; else - error += _("Error sending mail") + " (" + result + ")\n"; + error += _t("Error sending mail") + " (" + result + ")\n"; } } catch (IOException e) { - error += _("Error sending mail") + ": " + e.getMessage() + '\n'; + error += _t("Error sending mail") + ": " + e.getMessage() + '\n'; } catch (EncodingException e) { error += e.getMessage(); } if( !mailSent && lastResponse.length() > 0 ) { - String[] lines = lastResponse.split( "\r" ); + String[] lines = DataHelper.split(lastResponse, "\r"); for( int i = 0; i < lines.length; i++ ) error += lines[i] + '\n'; } @@ -324,7 +324,7 @@ public class SMTPClient { } /** translate */ - private static String _(String s) { + private static String _t(String s) { return Messages.getString(s); } } diff --git a/apps/systray/java/build.xml b/apps/systray/java/build.xml index 9fccf66fc..c5eb70731 100644 --- a/apps/systray/java/build.xml +++ b/apps/systray/java/build.xml @@ -5,11 +5,26 @@ + + + + + + + + + + + + - + done) break; try { @@ -172,9 +171,9 @@ public class UrlLauncher implements ClientApp { * @return true if the operation was successful, otherwise * false. * - * @throws Exception + * @throws IOException */ - public boolean openUrl(String url) throws Exception { + public boolean openUrl(String url) throws IOException { waitForServer(url); if (validateUrlFormat(url)) { String cbrowser = _context.getProperty(PROP_BROWSER); @@ -218,7 +217,7 @@ public class UrlLauncher implements ClientApp { // No worries. } foo.delete(); - } catch (Exception e) { + } catch (IOException e) { // Defaults to IE. } finally { if (bufferedReader != null) @@ -247,9 +246,9 @@ public class UrlLauncher implements ClientApp { * @return true if the operation was successful, * otherwise false. * - * @throws Exception + * @throws IOException */ - public boolean openUrl(String url, String browser) throws Exception { + public boolean openUrl(String url, String browser) throws IOException { waitForServer(url); if (validateUrlFormat(url)) { if (_shellCommand.executeSilentAndWaitTimed(browser + " " + url, 5)) @@ -261,8 +260,8 @@ public class UrlLauncher implements ClientApp { private static boolean validateUrlFormat(String urlString) { try { // just to check validity - new URL(urlString); - } catch (MalformedURLException e) { + new URI(urlString); + } catch (URISyntaxException e) { return false; } return true; @@ -290,7 +289,7 @@ public class UrlLauncher implements ClientApp { String url = _args[0]; openUrl(url); changeState(STOPPED); - } catch (Exception e) { + } catch (IOException e) { changeState(CRASHED, e); } } @@ -355,6 +354,6 @@ public class UrlLauncher implements ClientApp { launcher.openUrl(args[0]); else launcher.openUrl("http://127.0.0.1:7657/index.jsp"); - } catch (Exception e) {} + } catch (IOException e) {} } } diff --git a/build.properties b/build.properties index 897e3c24e..2cb15c4ca 100644 --- a/build.properties +++ b/build.properties @@ -11,7 +11,10 @@ # Note: Include the trailing slash! Don't surround the URL in quotes! javasedocs.url=http://docs.oracle.com/javase/6/docs/api/ javaeedocs.url=http://docs.oracle.com/javaee/6/api/ -jettydocs.url=http://download.eclipse.org/jetty/stable-8/apidocs/ +# The following link is dead, perhaps temporarily, +# perhaps not, as they move 7 and 8 to unsupported status. +#jettydocs.url=http://download.eclipse.org/jetty/stable-8/apidocs/ +jettydocs.url=http://download.eclipse.org/jetty/8.1.17.v20150415/apidocs/ jrobindocs.url=http://docs.i2p-projekt.de/jrobin/javadoc/ wrapperdocs.url=http://wrapper.tanukisoftware.com/jdoc/ # these are only for unit test javadocs @@ -71,6 +74,10 @@ javac.version=1.6 ### UnitTests ## +# Uncomment the next line to enable integration tests. +# These require a running router with I2CP available on 127.0.0.1:7654. +#runIntegrationTests=true + # Location of the libraries required for the ScalaTest tests. # Define this in override.properties or pass in on the command line. # The directory must contain the following library names: @@ -91,6 +98,12 @@ javac.version=1.6 # hamcrest-core.jar, hamcrest-library.jar, and hamcrest-integration.jar #hamcrest.home= +# Location of the mockito libraries +# Defaults to the ant library path if not set +# If set, this must point to a directory containing the files +# mockito-core.jar, byte-buddy.jar, objenesis.jar +#mockito.home= + # Optional properties used in tests to enable additional tools. #with.cobertura=/PATH/TO/cobertura.jar #with.clover=/PATH/TO/clover.jar diff --git a/build.xml b/build.xml index c6dba9e08..1561fdd9d 100644 --- a/build.xml +++ b/build.xml @@ -100,8 +100,11 @@ - + + + + @@ -450,7 +453,7 @@ if (newBuildNumber != 'unknown' && newBuildNumber != null) { echo = project.createTask("echo"); project.setProperty("new.i2p.build.number", newBuildNumber); - echo.setMessage("Build number is now: " + newBuildNumber); + echo.setMessage("Build number is now: " + newBuildNumber + project.getProperty("build.extra")); echo.perform(); } ]]> @@ -865,6 +868,21 @@ + + + + + + + + + + + + + + + @@ -1261,8 +1279,9 @@ - - + + @@ -1398,6 +1417,9 @@ ---------------- EARLIER HISTORY IS AVAILABLE IN THE SOURCE PACKAGE" + + + @@ -1443,9 +1465,7 @@ @@ -1606,6 +1626,7 @@ + @@ -1617,6 +1638,7 @@ + @@ -1626,22 +1648,26 @@ + + + + @@ -1658,6 +1684,11 @@ + + + + @@ -1761,22 +1793,20 @@ since preppkg puts too much stuff in pkg-temp --> + + + - + - - - - - @@ -1814,9 +1844,7 @@ - - @@ -1826,9 +1854,7 @@ - - @@ -1839,14 +1865,8 @@ - - - - - - diff --git a/core/java/src/com/nettgryppa/security/HashCash.java b/core/java/src/com/nettgryppa/security/HashCash.java index 3f3a85f7a..fccf86ded 100644 --- a/core/java/src/com/nettgryppa/security/HashCash.java +++ b/core/java/src/com/nettgryppa/security/HashCash.java @@ -9,6 +9,8 @@ import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.security.NoSuchAlgorithmException; +import net.i2p.data.DataHelper; + /** * Class for generation and parsing of HashCash
              * Copyright 2006 Gregory Rubin grrubin@gmail.com
              @@ -61,7 +63,7 @@ public class HashCash implements Comparable { myExtensions = deserializeExtensions(parts[index++]); MessageDigest md = MessageDigest.getInstance("SHA1"); - md.update(cash.getBytes()); + md.update(DataHelper.getUTF8(cash)); byte[] tempBytes = md.digest(); int tempValue = numberOfLeadingZeros(tempBytes); @@ -190,7 +192,7 @@ public class HashCash implements Comparable { serializeExtensions(extensions) + ":"; result.myToken = generateCash(prefix, value, md); md.reset(); - md.update(result.myToken.getBytes()); + md.update(DataHelper.getUTF8(result.myToken)); result.myValue = numberOfLeadingZeros(md.digest()); break; @@ -294,7 +296,7 @@ public class HashCash implements Comparable { counter++; temp = prefix + Long.toHexString(counter); md.reset(); - md.update(temp.getBytes()); + md.update(DataHelper.getUTF8(temp)); bArray = md.digest(); tempValue = numberOfLeadingZeros(bArray); } while ( tempValue < value); diff --git a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java index 12d6c6bee..0d138e87d 100644 --- a/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java +++ b/core/java/src/gnu/crypto/prng/AsyncFortunaStandalone.java @@ -56,7 +56,7 @@ public class AsyncFortunaStandalone extends FortunaStandalone implements Runnabl _isRunning = true; _refillThread = new I2PThread(this, "PRNG"); _refillThread.setDaemon(true); - _refillThread.setPriority(Thread.MIN_PRIORITY+1); + _refillThread.setPriority(Thread.NORM_PRIORITY - 2); _refillThread.start(); } diff --git a/core/java/src/gnu/getopt/MessagesBundle_fi.properties b/core/java/src/gnu/getopt/MessagesBundle_fi.properties new file mode 100644 index 000000000..1b253d1cd --- /dev/null +++ b/core/java/src/gnu/getopt/MessagesBundle_fi.properties @@ -0,0 +1,31 @@ +#************************************************************************** +#* MessagesBundle.properties -- English language error messages +#* +#* Copyright (c) 1998 by William King (wrking@eng.sun.com) and +#* Aaron M. Renn (arenn@urbanophile.com) +#* +#* This program is free software; you can redistribute it and/or modify +#* it under the terms of the GNU Library General Public License as published +#* by the Free Software Foundation; either version 2 of the License or +#* (at your option) any later version. +#* +#* This program 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 Library General Public License for more details. +#* +#* You should have received a copy of the GNU Library General Public License +#* along with this program; see the file COPYING.LIB. If not, write to +#* the Free Software Foundation Inc., 59 Temple Place - Suite 330, +#* Boston, MA 02111-1307 USA +#**************************************************************************/ +getopt.ambigious={0}\: valitsin \u201d{1}\u201d ei ole yksiselitteinen +getopt.arguments1={0}\: valitsin ''--{1}'' ei salli argumenttia +getopt.arguments2={0}\: valitsin ''{1}{2}'' ei salli argumenttia +getopt.requires={0}\: valitsin ''{1}'' vaatii argumentin +getopt.unrecognized={0}\: tunnistamaton valitsin ''--{1}'' +getopt.unrecognized2={0}\: tunnistamaton valitsin ''{1}{2}'' +getopt.illegal={0}\: virheellinen valitsin -- {1} +getopt.invalid={0}\: virheellinen valitsin -- {1} +getopt.requires2={0}\: valitsin vaatii argumentin -- {1} +getopt.invalidValue=Virheellinen arvo {0} parametrille 'has_arg' diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index d189588ec..8d34f10e0 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -18,7 +18,7 @@ public class CoreVersion { /** deprecated */ public final static String ID = "Monotone"; - public final static String VERSION = "0.9.19"; + public final static String VERSION = "0.9.23"; /** * For Vuze. diff --git a/core/java/src/net/i2p/I2PAppContext.java b/core/java/src/net/i2p/I2PAppContext.java index f7e2d7699..bae357260 100644 --- a/core/java/src/net/i2p/I2PAppContext.java +++ b/core/java/src/net/i2p/I2PAppContext.java @@ -23,7 +23,6 @@ import net.i2p.data.Base64; import net.i2p.data.RoutingKeyGenerator; import net.i2p.internal.InternalClientManager; import net.i2p.stat.StatManager; -import net.i2p.update.UpdateManager; import net.i2p.util.Clock; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.FileUtil; @@ -85,6 +84,7 @@ public class I2PAppContext { private RandomSource _random; private KeyGenerator _keyGenerator; protected KeyRing _keyRing; // overridden in RouterContext + @SuppressWarnings("deprecation") private SimpleScheduler _simpleScheduler; private SimpleTimer _simpleTimer; private SimpleTimer2 _simpleTimer2; @@ -533,7 +533,7 @@ public class I2PAppContext { * @return set of Strings containing the names of defined system properties */ @SuppressWarnings({ "unchecked", "rawtypes" }) - public Set getPropertyNames() { + public Set getPropertyNames() { // clone to avoid ConcurrentModificationException Set names = new HashSet((Set) (Set) ((Properties) System.getProperties().clone()).keySet()); // TODO-Java6: s/keySet()/stringPropertyNames()/ if (_overrideProps != null) @@ -941,6 +941,7 @@ public class I2PAppContext { * @since 0.9 to replace static instance in the class * @deprecated in 0.9.20, use simpleTimer2() */ + @SuppressWarnings("deprecation") public SimpleScheduler simpleScheduler() { if (!_simpleSchedulerInitialized) initializeSimpleScheduler(); diff --git a/core/java/src/net/i2p/client/I2PClientFactory.java b/core/java/src/net/i2p/client/I2PClientFactory.java index 86fbdaa8c..01a37b599 100644 --- a/core/java/src/net/i2p/client/I2PClientFactory.java +++ b/core/java/src/net/i2p/client/I2PClientFactory.java @@ -9,6 +9,8 @@ package net.i2p.client; * */ +import net.i2p.client.impl.I2PClientImpl; + /** * Provide a means of hooking into an appropriate I2PClient implementation * @@ -21,4 +23,4 @@ public class I2PClientFactory { public static I2PClient createClient() { return new I2PClientImpl(); } -} \ No newline at end of file +} diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java index da67e2c02..818cb5983 100644 --- a/core/java/src/net/i2p/client/I2PSession.java +++ b/core/java/src/net/i2p/client/I2PSession.java @@ -9,6 +9,8 @@ package net.i2p.client; * */ +import java.io.InputStream; +import java.util.List; import java.util.Properties; import java.util.Set; @@ -16,12 +18,13 @@ import net.i2p.data.Destination; import net.i2p.data.Hash; import net.i2p.data.PrivateKey; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.SigningPrivateKey; /** *

              Define the standard means of sending and receiving messages on the * I2P network by using the I2CP (the client protocol). This is done over a - * bidirectional TCP socket and never sends any private keys. + * bidirectional TCP socket. * * End to end encryption in I2PSession was disabled in release 0.6. * @@ -96,7 +99,7 @@ public interface I2PSession { * objects that were sent along side the given keyUsed. * @return success */ - public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; /** * End-to-End Crypto is disabled, tags and keys are ignored. @@ -104,7 +107,7 @@ public interface I2PSession { * @param tagsSent UNUSED, IGNORED. * @return success */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException; /** * End-to-End Crypto is disabled, tags and keys are ignored. @@ -114,7 +117,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire) throws I2PSessionException; /** * See I2PSessionMuxedImpl for proto/port details. @@ -131,7 +134,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromPort, int toPort) throws I2PSessionException; /** @@ -150,7 +153,7 @@ public interface I2PSession { * @return success * @since 0.7.1 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromPort, int toPort) throws I2PSessionException; /** @@ -169,7 +172,7 @@ public interface I2PSession { * @return success * @since 0.8.4 */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromPort, int toPort, int flags) throws I2PSessionException; /** @@ -247,6 +250,26 @@ public interface I2PSession { * */ public void destroySession() throws I2PSessionException; + + /** + * @return a new subsession, non-null + * @param privateKeyStream null for transient, if non-null must have same encryption keys as primary session + * and different signing keys + * @param opts subsession options if any, may be null + * @since 0.9.21 + */ + public I2PSession addSubsession(InputStream privateKeyStream, Properties opts) throws I2PSessionException; + + /** + * @since 0.9.21 + */ + public void removeSubsession(I2PSession session); + + /** + * @return a list of subsessions, non-null, does not include the primary session + * @since 0.9.21 + */ + public List getSubsessions(); /** * Actually connect the session and start receiving/sending messages @@ -257,7 +280,7 @@ public interface I2PSession { /** * Have we closed the session? * - * @return true if the session is closed + * @return true if the session is closed, OR connect() has not been called yet */ public boolean isClosed(); diff --git a/core/java/src/net/i2p/client/I2PSimpleClient.java b/core/java/src/net/i2p/client/I2PSimpleClient.java index 38286f2b1..c8b1fdcf4 100644 --- a/core/java/src/net/i2p/client/I2PSimpleClient.java +++ b/core/java/src/net/i2p/client/I2PSimpleClient.java @@ -12,6 +12,7 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.I2PException; +import net.i2p.client.impl.I2PSimpleSession; import net.i2p.crypto.SigType; import net.i2p.data.Certificate; import net.i2p.data.Destination; diff --git a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java b/core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java similarity index 96% rename from core/java/src/net/i2p/client/BWLimitsMessageHandler.java rename to core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java index 34fa81ec8..6e199af46 100644 --- a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * Released into the public domain diff --git a/core/java/src/net/i2p/client/ClientWriterRunner.java b/core/java/src/net/i2p/client/impl/ClientWriterRunner.java similarity index 98% rename from core/java/src/net/i2p/client/ClientWriterRunner.java rename to core/java/src/net/i2p/client/impl/ClientWriterRunner.java index 35ecce19d..dfe20bc1d 100644 --- a/core/java/src/net/i2p/client/ClientWriterRunner.java +++ b/core/java/src/net/i2p/client/impl/ClientWriterRunner.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; import java.io.BufferedOutputStream; import java.io.IOException; @@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.I2CPMessageException; import net.i2p.internal.PoisonI2CPMessage; diff --git a/core/java/src/net/i2p/client/DestReplyMessageHandler.java b/core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java similarity index 97% rename from core/java/src/net/i2p/client/DestReplyMessageHandler.java rename to core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java index 2207a56c5..e15a55779 100644 --- a/core/java/src/net/i2p/client/DestReplyMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * Released into the public domain diff --git a/core/java/src/net/i2p/client/DisconnectMessageHandler.java b/core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java similarity index 95% rename from core/java/src/net/i2p/client/DisconnectMessageHandler.java rename to core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java index 8dd47f10b..20582ddcb 100644 --- a/core/java/src/net/i2p/client/DisconnectMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -10,6 +10,7 @@ package net.i2p.client; */ import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.i2cp.DisconnectMessage; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.util.I2PAppThread; diff --git a/core/java/src/net/i2p/client/HandlerImpl.java b/core/java/src/net/i2p/client/impl/HandlerImpl.java similarity index 96% rename from core/java/src/net/i2p/client/HandlerImpl.java rename to core/java/src/net/i2p/client/impl/HandlerImpl.java index d1b5100e2..081d8e0c4 100644 --- a/core/java/src/net/i2p/client/HandlerImpl.java +++ b/core/java/src/net/i2p/client/impl/HandlerImpl.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others diff --git a/core/java/src/net/i2p/client/HostReplyMessageHandler.java b/core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java similarity index 97% rename from core/java/src/net/i2p/client/HostReplyMessageHandler.java rename to core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java index 94cce4758..4cce11ab9 100644 --- a/core/java/src/net/i2p/client/HostReplyMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * Released into the public domain diff --git a/core/java/src/net/i2p/client/I2CPMessageHandler.java b/core/java/src/net/i2p/client/impl/I2CPMessageHandler.java similarity index 95% rename from core/java/src/net/i2p/client/I2CPMessageHandler.java rename to core/java/src/net/i2p/client/impl/I2CPMessageHandler.java index a0f14f837..a0a60d69d 100644 --- a/core/java/src/net/i2p/client/I2CPMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/I2CPMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others diff --git a/core/java/src/net/i2p/client/I2CPMessageProducer.java b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java similarity index 92% rename from core/java/src/net/i2p/client/I2CPMessageProducer.java rename to core/java/src/net/i2p/client/impl/I2CPMessageProducer.java index c625e7841..dd6783f43 100644 --- a/core/java/src/net/i2p/client/I2CPMessageProducer.java +++ b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -15,6 +15,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; +import net.i2p.client.SendMessageOptions; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; import net.i2p.data.LeaseSet; @@ -34,6 +36,7 @@ import net.i2p.data.i2cp.ReportAbuseMessage; import net.i2p.data.i2cp.SendMessageMessage; import net.i2p.data.i2cp.SendMessageExpiresMessage; import net.i2p.data.i2cp.SessionConfig; +import net.i2p.data.i2cp.SessionId; import net.i2p.util.Log; /** @@ -99,7 +102,7 @@ class I2CPMessageProducer { if (_log.shouldLog(Log.DEBUG)) _log.debug("config signed"); msg.setSessionConfig(cfg); if (_log.shouldLog(Log.DEBUG)) _log.debug("config loaded into message"); - session.sendMessage(msg); + session.sendMessage_unchecked(msg); if (_log.shouldLog(Log.DEBUG)) _log.debug("config message sent"); } @@ -111,7 +114,7 @@ class I2CPMessageProducer { if (session.isClosed()) return; DestroySessionMessage dmsg = new DestroySessionMessage(); dmsg.setSessionId(session.getSessionId()); - session.sendMessage(dmsg); + session.sendMessage_unchecked(dmsg); // use DisconnectMessage only if we fail and drop connection... // todo: update the code to fire off DisconnectMessage on socket error //DisconnectMessage msg = new DisconnectMessage(); @@ -129,7 +132,7 @@ class I2CPMessageProducer { * @param newKey unused - no end-to-end crypto */ public void sendMessage(I2PSessionImpl session, Destination dest, long nonce, byte[] payload, SessionTag tag, - SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException { + SessionKey key, Set tags, SessionKey newKey, long expires) throws I2PSessionException { sendMessage(session, dest, nonce, payload, expires, 0); } @@ -154,7 +157,12 @@ class I2CPMessageProducer { } else msg = new SendMessageMessage(); msg.setDestination(dest); - msg.setSessionId(session.getSessionId()); + SessionId sid = session.getSessionId(); + if (sid == null) { + _log.error(session.toString() + " send message w/o session", new Exception()); + return; + } + msg.setSessionId(sid); msg.setNonce(nonce); Payload data = createPayload(dest, payload, null, null, null, null); msg.setPayload(data); @@ -176,7 +184,12 @@ class I2CPMessageProducer { return; SendMessageMessage msg = new SendMessageExpiresMessage(options); msg.setDestination(dest); - msg.setSessionId(session.getSessionId()); + SessionId sid = session.getSessionId(); + if (sid == null) { + _log.error(session.toString() + " send message w/o session", new Exception()); + return; + } + msg.setSessionId(sid); msg.setNonce(nonce); Payload data = createPayload(dest, payload, null, null, null, null); msg.setPayload(data); @@ -352,8 +365,13 @@ class I2CPMessageProducer { msg.setLeaseSet(leaseSet); msg.setPrivateKey(priv); msg.setSigningPrivateKey(signingPriv); - msg.setSessionId(session.getSessionId()); - session.sendMessage(msg); + SessionId sid = session.getSessionId(); + if (sid == null) { + _log.error(session.toString() + " create LS w/o session", new Exception()); + return; + } + msg.setSessionId(sid); + session.sendMessage_unchecked(msg); } /** @@ -381,7 +399,12 @@ class I2CPMessageProducer { throw new I2PSessionException("Unable to sign the session config", dfe); } msg.setSessionConfig(cfg); - msg.setSessionId(session.getSessionId()); + SessionId sid = session.getSessionId(); + if (sid == null) { + _log.error(session.toString() + " update config w/o session", new Exception()); + return; + } + msg.setSessionId(sid); session.sendMessage(msg); } } diff --git a/core/java/src/net/i2p/client/I2PClientImpl.java b/core/java/src/net/i2p/client/impl/I2PClientImpl.java similarity index 97% rename from core/java/src/net/i2p/client/I2PClientImpl.java rename to core/java/src/net/i2p/client/impl/I2PClientImpl.java index e0c7feea9..0bda34daa 100644 --- a/core/java/src/net/i2p/client/I2PClientImpl.java +++ b/core/java/src/net/i2p/client/impl/I2PClientImpl.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -17,6 +17,9 @@ import java.util.Properties; import net.i2p.I2PAppContext; import net.i2p.I2PException; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; import net.i2p.crypto.KeyGenerator; import net.i2p.crypto.SigType; import net.i2p.data.Certificate; @@ -36,7 +39,7 @@ import net.i2p.util.RandomSource; * * @author jrandom */ -class I2PClientImpl implements I2PClient { +public class I2PClientImpl implements I2PClient { /** * Create a destination with a DSA 1024/160 signature type and a null certificate. diff --git a/core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java b/core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java similarity index 99% rename from core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java rename to core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java index bd2de83d6..4cea850b7 100644 --- a/core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java +++ b/core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others diff --git a/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java similarity index 88% rename from core/java/src/net/i2p/client/I2PSessionDemultiplexer.java rename to core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java index 1f07a32fc..5b29e8018 100644 --- a/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java @@ -1,9 +1,13 @@ -package net.i2p.client; +package net.i2p.client.impl; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PSessionListener; +import net.i2p.client.I2PSessionMuxedListener; import net.i2p.util.Log; /* @@ -74,7 +78,9 @@ public class I2PSessionDemultiplexer implements I2PSessionMuxedListener { * (Streaming lib) */ public void addListener(I2PSessionListener l, int proto, int port) { - _listeners.put(key(proto, port), new NoPortsListener(l)); + I2PSessionListener old = _listeners.put(key(proto, port), new NoPortsListener(l)); + if (old != null && _log.shouldLog(Log.WARN)) + _log.warn("Listener " + l + " replaces " + old + " for proto: " + proto + " port: " + port); } /** @@ -82,7 +88,9 @@ public class I2PSessionDemultiplexer implements I2PSessionMuxedListener { * UDP perhaps */ public void addMuxedListener(I2PSessionMuxedListener l, int proto, int port) { - _listeners.put(key(proto, port), l); + I2PSessionListener old = _listeners.put(key(proto, port), l); + if (old != null && _log.shouldLog(Log.WARN)) + _log.warn("Listener " + l + " replaces " + old + " for proto: " + proto + " port: " + port); } public void removeListener(int proto, int port) { diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/impl/I2PSessionImpl.java similarity index 78% rename from core/java/src/net/i2p/client/I2PSessionImpl.java rename to core/java/src/net/i2p/client/impl/I2PSessionImpl.java index 542e08809..7aaa2b421 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionImpl.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -23,11 +23,17 @@ import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; import net.i2p.CoreVersion; import net.i2p.I2PAppContext; +import net.i2p.client.DomainSocketFactory; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PSessionListener; import net.i2p.data.Base32; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; @@ -36,13 +42,16 @@ import net.i2p.data.LeaseSet; import net.i2p.data.PrivateKey; import net.i2p.data.SigningPrivateKey; import net.i2p.data.i2cp.DestLookupMessage; +import net.i2p.data.i2cp.DestReplyMessage; import net.i2p.data.i2cp.GetBandwidthLimitsMessage; import net.i2p.data.i2cp.GetDateMessage; import net.i2p.data.i2cp.HostLookupMessage; +import net.i2p.data.i2cp.HostReplyMessage; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.I2CPMessageReader; import net.i2p.data.i2cp.MessagePayloadMessage; import net.i2p.data.i2cp.SessionId; +import net.i2p.data.i2cp.SessionStatusMessage; import net.i2p.internal.I2CPMessageQueue; import net.i2p.internal.InternalClientManager; import net.i2p.internal.QueuedI2CPMessageReader; @@ -60,7 +69,7 @@ import net.i2p.util.VersionComparator; * only one thread should send messages at any given time * * Public only for clearCache(). - * Except for methods definied in I2PSession and I2CPMessageEventListener, + * Except for methods defined in I2PSession and I2CPMessageEventListener, * not maintained as a public API, not for external use. * Use I2PClientFactory to get an I2PClient and then createSession(). * @@ -79,7 +88,16 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 /** this session's Id */ private SessionId _sessionId; /** currently granted lease set, or null */ - private volatile LeaseSet _leaseSet; + protected volatile LeaseSet _leaseSet; + + // subsession stuff + // registered subsessions + private final List _subsessions; + // established subsessions + private final ConcurrentHashMap _subsessionMap; + private final Object _subsessionLock = new Object(); + private static final String MIN_SUBSESSION_VERSION = "0.9.21"; + private volatile boolean _routerSupportsSubsessions; /** hostname of router - will be null if in RouterContext */ protected final String _hostname; @@ -119,12 +137,14 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 protected final I2PAppContext _context; /** monitor for waiting until a lease set has been granted */ - private final Object _leaseSetWait = new Object(); + protected final Object _leaseSetWait = new Object(); /** * @since 0.9.8 */ protected enum State { + /** @since 0.9.20 */ + INIT, OPENING, /** @since 0.9.11 */ GOTDATE, @@ -133,7 +153,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 CLOSED } - private State _state = State.CLOSED; + protected State _state = State.INIT; protected final Object _stateLock = new Object(); /** @@ -150,11 +170,12 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 private volatile boolean _routerSupportsFastReceive; private volatile boolean _routerSupportsHostLookup; + protected static final int CACHE_MAX_SIZE = SystemVersion.isAndroid() ? 32 : 128; /** * Since 0.9.11, key is either a Hash or a String * @since 0.8.9 */ - private static final Map _lookupCache = new LHMCache(64); + private static final Map _lookupCache = new LHMCache(CACHE_MAX_SIZE); private static final String MIN_HOST_LOOKUP_VERSION = "0.9.11"; private static final boolean TEST_LOOKUP = false; @@ -184,10 +205,12 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 TEST_LOOKUP || (routerVersion != null && routerVersion.length() > 0 && VersionComparator.comp(routerVersion, MIN_HOST_LOOKUP_VERSION) >= 0); + _routerSupportsSubsessions = _context.isRouterContext() || + (routerVersion != null && routerVersion.length() > 0 && + VersionComparator.comp(routerVersion, MIN_SUBSESSION_VERSION) >= 0); synchronized (_stateLock) { if (_state == State.OPENING) { - _state = State.GOTDATE; - _stateLock.notifyAll(); + changeState(State.GOTDATE); } } } @@ -201,18 +224,42 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 */ protected I2PSessionImpl(I2PAppContext context, Properties options, I2PClientMessageHandlerMap handlerMap) { - this(context, options, handlerMap, false); + this(context, options, handlerMap, null, false); } - + + /* + * For extension by SubSession via I2PSessionMuxedImpl and I2PSessionImpl2 + * + * @param destKeyStream stream containing the private key data, + * format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile} + * @param options set of options to configure the router with, if null will use System properties + * @since 0.9.21 + */ + protected I2PSessionImpl(I2PSessionImpl primary, InputStream destKeyStream, Properties options) throws I2PSessionException { + this(primary.getContext(), options, primary.getHandlerMap(), primary.getProducer(), true); + _availabilityNotifier = new AvailabilityNotifier(); + try { + readDestination(destKeyStream); + } catch (DataFormatException dfe) { + throw new I2PSessionException("Error reading the destination key stream", dfe); + } catch (IOException ioe) { + throw new I2PSessionException("Error reading the destination key stream", ioe); + } + } + /** * Basic setup of finals * @since 0.9.7 */ private I2PSessionImpl(I2PAppContext context, Properties options, - I2PClientMessageHandlerMap handlerMap, boolean hasDest) { + I2PClientMessageHandlerMap handlerMap, + I2CPMessageProducer producer, + boolean hasDest) { _context = context; _handlerMap = handlerMap; _log = context.logManager().getLog(getClass()); + _subsessions = new CopyOnWriteArrayList(); + _subsessionMap = new ConcurrentHashMap(4); if (options == null) options = (Properties) System.getProperties().clone(); _options = loadConfig(options); @@ -220,7 +267,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 _portNum = getPort(); _fastReceive = Boolean.parseBoolean(_options.getProperty(I2PClient.PROP_FAST_RECEIVE)); if (hasDest) { - _producer = new I2CPMessageProducer(context); + _producer = producer; _availableMessages = new ConcurrentHashMap(); _myDestination = new Destination(); _privateKey = new PrivateKey(); @@ -234,6 +281,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 } _routerSupportsFastReceive = _context.isRouterContext(); _routerSupportsHostLookup = _context.isRouterContext(); + _routerSupportsSubsessions = _context.isRouterContext(); } /** @@ -245,10 +293,10 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 * @param destKeyStream stream containing the private key data, * format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile} * @param options set of options to configure the router with, if null will use System properties - * @throws I2PSessionException if there is a problem loading the private keys or + * @throws I2PSessionException if there is a problem loading the private keys */ public I2PSessionImpl(I2PAppContext context, InputStream destKeyStream, Properties options) throws I2PSessionException { - this(context, options, new I2PClientMessageHandlerMap(context), true); + this(context, options, new I2PClientMessageHandlerMap(context), new I2CPMessageProducer(context), true); _availabilityNotifier = new AvailabilityNotifier(); try { readDestination(destKeyStream); @@ -258,6 +306,69 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 throw new I2PSessionException("Error reading the destination key stream", ioe); } } + + /** + * Router must be connected or was connected... for now. + * + * @return a new subsession, non-null + * @param privateKeyStream null for transient, if non-null must have same encryption keys as primary session + * and different signing keys + * @param opts subsession options if any, may be null + * @since 0.9.21 + */ + public I2PSession addSubsession(InputStream privateKeyStream, Properties opts) throws I2PSessionException { + if (!_routerSupportsSubsessions) + throw new I2PSessionException("Router does not support subsessions"); + SubSession sub; + synchronized(_subsessionLock) { + if (_subsessions.size() > _subsessionMap.size()) + throw new I2PSessionException("Subsession request already pending"); + sub = new SubSession(this, privateKeyStream, opts); + for (SubSession ss : _subsessions) { + if (ss.getDecryptionKey().equals(sub.getDecryptionKey()) && + ss.getPrivateKey().equals(sub.getPrivateKey())) { + throw new I2PSessionException("Dup subsession"); + } + } + _subsessions.add(sub); + } + + synchronized (_stateLock) { + if (_state == State.OPEN) { + _producer.connect(sub); + } // else will be called in connect() + } + return sub; + } + + /** + * @since 0.9.21 + */ + public void removeSubsession(I2PSession session) { + if (!(session instanceof SubSession)) + return; + synchronized(_subsessionLock) { + _subsessions.remove(session); + SessionId id = ((SubSession) session).getSessionId(); + if (id != null) + _subsessionMap.remove(id); + /// tell the subsession + try { + // doesn't really throw + session.destroySession(); + } catch (I2PSessionException ise) {} + } + } + + /** + * @return a list of subsessions, non-null, does not include the primary session + * @since 0.9.21 + */ + public List getSubsessions() { + synchronized(_subsessionLock) { + return new ArrayList(_subsessions); + } + } /** * Parse the config for anything we know about. @@ -398,6 +509,8 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 } protected void changeState(State state) { + if (_log.shouldInfo()) + _log.info(getPrefix() + "Change state to " + state); synchronized (_stateLock) { _state = state; _stateLock.notifyAll(); @@ -434,6 +547,9 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 boolean loop = true; while (loop) { switch (_state) { + case INIT: + loop = false; + break; case CLOSED: if (wasOpening) throw new I2PSessionException("connect by other thread failed"); @@ -519,7 +635,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 auth.setProperty(PROP_USER, _options.getProperty(PROP_USER)); auth.setProperty(PROP_PW, _options.getProperty(PROP_PW)); } - sendMessage(new GetDateMessage(CoreVersion.VERSION, auth)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION, auth)); waitForDate(); if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "Before producer.connect()"); @@ -548,6 +664,16 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 startIdleMonitor(); startVerifyUsage(); success = true; + + // now send CreateSessionMessages for all subsessions, one at a time, must wait for each response + synchronized(_subsessionLock) { + for (SubSession ss : _subsessions) { + if (_log.shouldLog(Log.INFO)) + _log.info(getPrefix() + "Connecting subsession " + ss); + _producer.connect(ss); + } + } + } catch (InterruptedException ie) { throw new I2PSessionException("Interrupted", ie); } catch (UnknownHostException uhe) { @@ -583,8 +709,8 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 synchronized(_stateLock) { if (_state == State.GOTDATE) break; - if (_state != State.OPENING) - throw new IOException("Socket closed"); + if (_state != State.OPENING && _state != State.INIT) + throw new IOException("Socket closed, state=" + _state); // InterruptedException caught by caller _stateLock.wait(1000); } @@ -611,7 +737,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 * Report abuse with regards to the given messageId */ public void reportAbuse(int msgId, int severity) throws I2PSessionException { - if (isClosed()) throw new I2PSessionException(getPrefix() + "Already closed"); + verifyOpen(); _producer.reportAbuse(this, msgId, severity); } @@ -737,7 +863,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 if ((duration > 100) && _log.shouldLog(Log.INFO)) _log.info("Message availability notification for " + msgId.intValue() + " took " + duration + " to " + _sessionListener); - } catch (Exception e) { + } catch (RuntimeException e) { _log.log(Log.CRIT, "Error notifying app of message availability", e); } } else { @@ -751,19 +877,83 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 /** * The I2CPMessageEventListener callback. * Recieve notification of some I2CP message and handle it if possible. + * + * We route the message based on message type AND session ID. + * + * The following types never contain a session ID and are not routable to + * a subsession: + * BandwidthLimitsMessage, DestReplyMessage + * + * The following types may not contain a valid session ID + * even when intended for a subsession, so we must take special care: + * SessionStatusMessage + * * @param reader unused */ public void messageReceived(I2CPMessageReader reader, I2CPMessage message) { - I2CPMessageHandler handler = _handlerMap.getHandler(message.getType()); - if (handler == null) { - if (_log.shouldLog(Log.WARN)) - _log.warn(getPrefix() + "Unknown message or unhandleable message received: type = " - + message.getType()); + int type = message.getType(); + SessionId id = message.sessionId(); + SessionId currId = _sessionId; + if (id == null || id.equals(currId) || + (currId == null && id != null && type == SessionStatusMessage.MESSAGE_TYPE) || + ((id == null || id.getSessionId() == 65535) && + (type == HostReplyMessage.MESSAGE_TYPE || type == DestReplyMessage.MESSAGE_TYPE))) { + // it's for us + I2CPMessageHandler handler = _handlerMap.getHandler(type); + if (handler != null) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug(getPrefix() + "Message received of type " + type + + " to be handled by " + handler.getClass().getSimpleName()); + handler.handleMessage(message, this); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn(getPrefix() + "Unknown message or unhandleable message received: type = " + + type); + } } else { - if (_log.shouldLog(Log.DEBUG)) - _log.debug(getPrefix() + "Message received of type " + message.getType() - + " to be handled by " + handler.getClass().getSimpleName()); - handler.handleMessage(message, this); + SubSession sub = _subsessionMap.get(id); + if (sub != null) { + // it's for a subsession + if (_log.shouldLog(Log.DEBUG)) + _log.debug(getPrefix() + "Message received of type " + type + + " to be handled by " + sub); + sub.messageReceived(reader, message); + } else if (id != null && type == SessionStatusMessage.MESSAGE_TYPE) { + // look for a subsession without a session + synchronized (_subsessionLock) { + for (SubSession sess : _subsessions) { + if (sess.getSessionId() == null) { + sess.messageReceived(reader, message); + id = sess.getSessionId(); + if (id != null) { + if (id.equals(_sessionId)) { + // shouldnt happen + sess.setSessionId(null); + if (_log.shouldLog(Log.WARN)) + _log.warn("Dup or our session id " + id); + } else { + SubSession old = _subsessionMap.putIfAbsent(id, sess); + if (old != null) { + // shouldnt happen + sess.setSessionId(null); + if (_log.shouldLog(Log.WARN)) + _log.warn("Dup session id " + id); + } + } + } + return; + } + if (_log.shouldLog(Log.WARN)) + _log.warn(getPrefix() + "No session " + id + " to handle message: type = " + + type); + } + } + } else { + // it's for nobody + if (_log.shouldLog(Log.WARN)) + _log.warn(getPrefix() + "No session " + id + " to handle message: type = " + + type); + } } } @@ -798,6 +988,18 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 */ I2CPMessageProducer getProducer() { return _producer; } + /** + * For Subsessions + * @since 0.9.21 + */ + I2PClientMessageHandlerMap getHandlerMap() { return _handlerMap; } + + /** + * For Subsessions + * @since 0.9.21 + */ + I2PAppContext getContext() { return _context; } + /** * Retrieve the configuration options, filtered. * All defaults passed in via constructor have been promoted to the primary map. @@ -817,11 +1019,44 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 /** * Has the session been closed (or not yet connected)? - * False when open and during transitions. Unsynchronized. + * False when open and during transitions. Synchronized. */ public boolean isClosed() { synchronized (_stateLock) { - return _state == State.CLOSED; + return _state == State.CLOSED || _state == State.INIT; + } + } + + /** + * Throws I2PSessionException if uninitialized, closed or closing. + * Blocks if opening. + * + * @since 0.9.23 + */ + protected void verifyOpen() throws I2PSessionException { + synchronized (_stateLock) { + while (true) { + switch (_state) { + case INIT: + throw new I2PSessionException("Not open, must call connect() first"); + + case OPENING: // fall thru + case GOTDATE: + try { + _stateLock.wait(5*1000); + continue; + } catch (InterruptedException ie) { + throw new I2PSessionException("Interrupted", ie); + } + + case OPEN: + return; + + case CLOSING: // fall thru + case CLOSED: + throw new I2PSessionException("Already closed"); + } + } } } @@ -832,9 +1067,20 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 * @throws I2PSessionException if the message is malformed or there is an error writing it out */ void sendMessage(I2CPMessage message) throws I2PSessionException { - if (isClosed()) { - throw new I2PSessionException("Already closed"); - } else if (_queue != null) { + verifyOpen(); + sendMessage_unchecked(message); + } + + /** + * Deliver an I2CP message to the router. + * Does NOT check state. Call only from connect() or other methods that need to + * send messages when not in OPEN state. + * + * @throws I2PSessionException if the message is malformed or there is an error writing it out + * @since 0.9.23 + */ + void sendMessage_unchecked(I2CPMessage message) throws I2PSessionException { + if (_queue != null) { // internal try { if (!_queue.offer(message, MAX_SEND_WAIT)) @@ -842,10 +1088,13 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 } catch (InterruptedException ie) { throw new I2PSessionException("Interrupted", ie); } - } else if (_writer == null) { - throw new I2PSessionException("Already closed"); } else { - _writer.addMessage(message); + ClientWriterRunner writer = _writer; + if (writer == null) { + throw new I2PSessionException("Already closed or not open"); + } else { + writer.addMessage(message); + } } } @@ -887,7 +1136,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 */ public void destroySession(boolean sendDisconnect) { synchronized(_stateLock) { - if (_state == State.CLOSING || _state == State.CLOSED) + if (_state == State.CLOSING || _state == State.CLOSED || _state == State.INIT) return; changeState(State.CLOSING); } @@ -906,6 +1155,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 if (_availabilityNotifier != null) _availabilityNotifier.stopNotifying(); closeSocket(); + _subsessionMap.clear(); if (_sessionListener != null) _sessionListener.disconnected(this); } @@ -920,6 +1170,13 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 locked_closeSocket(); changeState(State.CLOSED); } + synchronized (_subsessionLock) { + for (SubSession sess : _subsessions) { + sess.changeState(State.CLOSED); + sess.setSessionId(null); + sess.setLeaseSet(null); + } + } } /** @@ -949,6 +1206,8 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 _socket = null; // so when propogateError calls closeSocket, it doesnt loop } } + setSessionId(null); + setLeaseSet(null); } /** @@ -967,7 +1226,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 protected void disconnect() { State oldState; synchronized(_stateLock) { - if (_state == State.CLOSING || _state == State.CLOSED) + if (_state == State.CLOSING || _state == State.CLOSED || _state == State.INIT) return; oldState = _state; changeState(State.CLOSING); @@ -1030,13 +1289,15 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 protected String getPrefix() { StringBuilder buf = new StringBuilder(); buf.append('['); + buf.append(_state.toString()).append(' '); String s = _options.getProperty("inbound.nickname"); if (s != null) buf.append(s); else buf.append(getClass().getSimpleName()); - if (_sessionId != null) - buf.append(" #").append(_sessionId.getSessionId()); + SessionId id = _sessionId; + if (id != null) + buf.append(" #").append(id.getSessionId()); buf.append("]: "); return buf.toString(); } @@ -1187,10 +1448,15 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 if (rv != null) return rv; } - if (isClosed()) { - if (_log.shouldLog(Log.INFO)) - _log.info("Session closed, cannot lookup " + h); - return null; + synchronized (_stateLock) { + // not before GOTDATE + if (_state == State.CLOSED || + _state == State.INIT || + _state == State.OPENING) { + if (_log.shouldLog(Log.INFO)) + _log.info("Session closed, cannot lookup " + h); + return null; + } } LookupWaiter waiter; long nonce; @@ -1210,11 +1476,11 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 SessionId id = _sessionId; if (id == null) id = new SessionId(65535); - sendMessage(new HostLookupMessage(id, h, nonce, maxWait)); + sendMessage_unchecked(new HostLookupMessage(id, h, nonce, maxWait)); } else { if (_log.shouldLog(Log.INFO)) _log.info("Sending DestLookup for " + h); - sendMessage(new DestLookupMessage(h)); + sendMessage_unchecked(new DestLookupMessage(h)); } try { synchronized (waiter) { @@ -1302,7 +1568,7 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 SessionId id = _sessionId; if (id == null) id = new SessionId(65535); - sendMessage(new HostLookupMessage(id, name, nonce, maxWait)); + sendMessage_unchecked(new HostLookupMessage(id, name, nonce, maxWait)); try { synchronized (waiter) { waiter.wait(maxWait); @@ -1326,9 +1592,17 @@ public abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2 * @return null on failure */ public int[] bandwidthLimits() throws I2PSessionException { - if (isClosed()) - return null; - sendMessage(new GetBandwidthLimitsMessage()); + synchronized (_stateLock) { + // not before GOTDATE + if (_state == State.CLOSED || + _state == State.INIT || + _state == State.OPENING) { + if (_log.shouldLog(Log.INFO)) + _log.info("Session closed, cannot get bw limits"); + return null; + } + } + sendMessage_unchecked(new GetBandwidthLimitsMessage()); try { synchronized (_bwReceivedLock) { _bwReceivedLock.wait(5*1000); diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java similarity index 88% rename from core/java/src/net/i2p/client/I2PSessionImpl2.java rename to core/java/src/net/i2p/client/impl/I2PSessionImpl2.java index 9f8a5465d..0cf397d79 100644 --- a/core/java/src/net/i2p/client/I2PSessionImpl2.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -20,9 +20,16 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import net.i2p.I2PAppContext; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PSessionListener; +import net.i2p.client.I2PSessionMuxedListener; +import net.i2p.client.SendMessageOptions; +import net.i2p.client.SendMessageStatusListener; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.MessageStatusMessage; import net.i2p.util.Log; @@ -50,9 +57,9 @@ class I2PSessionImpl2 extends I2PSessionImpl { private static final long REMOVE_EXPIRED_TIME = 63*1000; - /** - * for extension by SimpleSession (no dest) - */ + /** + * for extension by SimpleSession (no dest) + */ protected I2PSessionImpl2(I2PAppContext context, Properties options, I2PClientMessageHandlerMap handlerMap) { super(context, options, handlerMap); @@ -61,15 +68,17 @@ class I2PSessionImpl2 extends I2PSessionImpl { } /** + * for extension by I2PSessionMuxedImpl + * * Create a new session, reading the Destination, PrivateKey, and SigningPrivateKey * from the destKeyStream, and using the specified options to connect to the router * * @param destKeyStream stream containing the private key data, * format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile} * @param options set of options to configure the router with, if null will use System properties - * @throws I2PSessionException if there is a problem loading the private keys or + * @throws I2PSessionException if there is a problem loading the private keys */ - public I2PSessionImpl2(I2PAppContext ctx, InputStream destKeyStream, Properties options) throws I2PSessionException { + protected I2PSessionImpl2(I2PAppContext ctx, InputStream destKeyStream, Properties options) throws I2PSessionException { super(ctx, destKeyStream, options); _sendingStates = new ConcurrentHashMap(32); _sendMessageNonce = new AtomicLong(); @@ -94,6 +103,26 @@ class I2PSessionImpl2 extends I2PSessionImpl { _context.statManager().createRateStat("i2cp.tx.msgExpanded", "size before compression", "i2cp", new long[] { 30*60*1000 }); } + /* + * For extension by SubSession via I2PSessionMuxedImpl + * + * @param destKeyStream stream containing the private key data, + * format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile} + * @param options set of options to configure the router with, if null will use System properties + * @since 0.9.21 + */ + protected I2PSessionImpl2(I2PSessionImpl primary, InputStream destKeyStream, Properties options) throws I2PSessionException { + super(primary, destKeyStream, options); + _sendingStates = new ConcurrentHashMap(32); + _sendMessageNonce = new AtomicLong(); + _noEffort = "none".equals(getOptions().getProperty(I2PClient.PROP_RELIABILITY, "").toLowerCase(Locale.US)); + _context.statManager().createRateStat("i2cp.receiveStatusTime.1", "How long it took to get status=1 back", "i2cp", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("i2cp.receiveStatusTime.4", "How long it took to get status=4 back", "i2cp", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("i2cp.receiveStatusTime.5", "How long it took to get status=5 back", "i2cp", new long[] { 10*60*1000 }); + _context.statManager().createRateStat("i2cp.tx.msgCompressed", "compressed size transferred", "i2cp", new long[] { 30*60*1000 }); + _context.statManager().createRateStat("i2cp.tx.msgExpanded", "size before compression", "i2cp", new long[] { 30*60*1000 }); + } + /** * Fire up a periodic task to check for unclaimed messages * @since 0.9.14 @@ -182,17 +211,17 @@ class I2PSessionImpl2 extends I2PSessionImpl { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromport, int toport) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromport, int toport) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } /** @throws UnsupportedOperationException always, use MuxedImpl */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expire, int proto, int fromport, int toport, int flags) throws I2PSessionException { throw new UnsupportedOperationException("Use MuxedImpl"); } @@ -225,7 +254,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param tagsSent unused - no end-to-end crypto */ @Override - public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { + public boolean sendMessage(Destination dest, byte[] payload, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { return sendMessage(dest, payload, 0, payload.length, keyUsed, tagsSent, 0); } @@ -233,7 +262,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0); } @@ -244,10 +273,10 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expires) + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { if (_log.shouldLog(Log.DEBUG)) _log.debug("sending message"); - if (isClosed()) throw new I2PSessionException("Already closed"); + verifyOpen(); updateActivity(); // Sadly there is no way to send something completely uncompressed in a backward-compatible way, @@ -304,7 +333,7 @@ class I2PSessionImpl2 extends I2PSessionImpl { * @param keyUsed unused - no end-to-end crypto * @param tagsSent unused - no end-to-end crypto */ - protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) + protected boolean sendBestEffort(Destination dest, byte payload[], SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { return sendBestEffort(dest, payload, expires, 0); } diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java similarity index 87% rename from core/java/src/net/i2p/client/I2PSessionMuxedImpl.java rename to core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java index 48ca6016e..9b6f1ff0c 100644 --- a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java +++ b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * public domain @@ -8,12 +8,18 @@ import java.io.InputStream; import java.util.concurrent.LinkedBlockingQueue; import java.util.Properties; import java.util.Set; - import java.util.concurrent.atomic.AtomicBoolean; + import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PSessionListener; +import net.i2p.client.I2PSessionMuxedListener; +import net.i2p.client.SendMessageOptions; +import net.i2p.client.SendMessageStatusListener; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.SessionKey; +import net.i2p.data.SessionTag; import net.i2p.data.i2cp.MessagePayloadMessage; import net.i2p.util.Log; @@ -82,6 +88,24 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { // discards the one in super(), sorry about that... (no it wasn't started yet) _availabilityNotifier = new MuxedAvailabilityNotifier(); } + + /* + * For extension by SubSession + * + * @param destKeyStream stream containing the private key data, + * format is specified in {@link net.i2p.data.PrivateKeyFile PrivateKeyFile} + * @param options set of options to configure the router with, if null will use System properties + * @since 0.9.21 + */ + protected I2PSessionMuxedImpl(I2PSessionImpl primary, InputStream destKeyStream, Properties options) throws I2PSessionException { + super(primary, destKeyStream, options); + // also stored in _sessionListener but we keep it in _demultipexer + // as well so we don't have to keep casting + _demultiplexer = new I2PSessionDemultiplexer(primary.getContext()); + super.setSessionListener(_demultiplexer); + // discards the one in super(), sorry about that... (no it wasn't started yet) + _availabilityNotifier = new MuxedAvailabilityNotifier(); + } /** listen on all protocols and ports */ @Override @@ -140,7 +164,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires) + SessionKey keyUsed, Set tagsSent, long expires) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, PROTO_UNSPECIFIED, PORT_UNSPECIFIED, PORT_UNSPECIFIED); } @@ -150,7 +174,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { * @param tagsSent unused - no end-to-end crypto */ @Override - public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, + public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, SessionKey keyUsed, Set tagsSent, int proto, int fromport, int toport) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromport, toport); } @@ -169,7 +193,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires, + SessionKey keyUsed, Set tagsSent, long expires, int proto, int fromPort, int toPort) throws I2PSessionException { return sendMessage(dest, payload, offset, size, keyUsed, tagsSent, 0, proto, fromPort, toPort, 0); @@ -190,7 +214,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { */ @Override public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, - SessionKey keyUsed, Set tagsSent, long expires, + SessionKey keyUsed, Set tagsSent, long expires, int proto, int fromPort, int toPort, int flags) throws I2PSessionException { payload = prepPayload(payload, offset, size, proto, fromPort, toPort); @@ -256,7 +280,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { * @since 0.9.14 */ private byte[] prepPayload(byte[] payload, int offset, int size, int proto, int fromPort, int toPort) throws I2PSessionException { - if (isClosed()) throw new I2PSessionException("Already closed"); + verifyOpen(); updateActivity(); if (shouldCompress(size)) @@ -308,9 +332,9 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { protected class MuxedAvailabilityNotifier extends AvailabilityNotifier { private final LinkedBlockingQueue _msgs; - private volatile boolean _alive = false; + private volatile boolean _alive; private static final int POISON_SIZE = -99999; - private final AtomicBoolean stopping = new AtomicBoolean(false); + private final AtomicBoolean stopping = new AtomicBoolean(); public MuxedAvailabilityNotifier() { _msgs = new LinkedBlockingQueue(); @@ -318,12 +342,12 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { @Override public void stopNotifying() { - boolean again = true; synchronized (stopping) { if( !stopping.getAndSet(true)) { - if (_alive == true) { + _msgs.clear(); + if (_alive) { // System.out.println("I2PSessionMuxedImpl.stopNotifying()"); - _msgs.clear(); + boolean again = true; while(again) { try { _msgs.put(new MsgData(0, POISON_SIZE, 0, 0, 0)); @@ -333,8 +357,8 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { continue; } } + _alive = false; } - _alive = false; stopping.set(false); } // stopping.notifyAll(); @@ -348,17 +372,24 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { try { _msgs.put(new MsgData((int)(msgId & 0xffffffff), size, proto, fromPort, toPort)); } catch (InterruptedException ie) {} + if (!_alive && _log.shouldLog(Log.WARN)) + _log.warn(getPrefix() + "message available but notifier not running"); } @Override public void run() { - MsgData msg; + if (_log.shouldLog(Log.DEBUG)) + _log.debug(getPrefix() + "starting muxed availability notifier"); + _msgs.clear(); _alive=true; while (_alive) { + MsgData msg; try { msg = _msgs.take(); } catch (InterruptedException ie) { - _log.debug("I2PSessionMuxedImpl.run() InterruptedException " + String.valueOf(_msgs.size()) + " Messages, Alive " + _alive); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("I2PSessionMuxedImpl.run() InterruptedException " + + String.valueOf(_msgs.size()) + " Messages, Alive " + _alive); continue; } if (msg.size == POISON_SIZE) { @@ -368,7 +399,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 { try { _demultiplexer.messageAvailable(I2PSessionMuxedImpl.this, msg.id, msg.size, msg.proto, msg.fromPort, msg.toPort); - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("Error notifying app of message availability", e); } } diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/impl/I2PSimpleSession.java similarity index 95% rename from core/java/src/net/i2p/client/I2PSimpleSession.java rename to core/java/src/net/i2p/client/impl/I2PSimpleSession.java index ce0ef254f..010121b1c 100644 --- a/core/java/src/net/i2p/client/I2PSimpleSession.java +++ b/core/java/src/net/i2p/client/impl/I2PSimpleSession.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * Released into the public domain @@ -16,6 +16,8 @@ import java.util.Properties; import net.i2p.CoreVersion; import net.i2p.I2PAppContext; +import net.i2p.client.I2PClient; +import net.i2p.client.I2PSessionException; import net.i2p.data.i2cp.BandwidthLimitsMessage; import net.i2p.data.i2cp.DestReplyMessage; import net.i2p.data.i2cp.DisconnectMessage; @@ -37,7 +39,7 @@ import net.i2p.util.OrderedProperties; * * @author zzz */ -class I2PSimpleSession extends I2PSessionImpl2 { +public class I2PSimpleSession extends I2PSessionImpl2 { private static final int BUF_SIZE = 1024; @@ -120,11 +122,11 @@ class I2PSimpleSession extends I2PSessionImpl2 { Properties auth = new OrderedProperties(); auth.setProperty(PROP_USER, opts.getProperty(PROP_USER)); auth.setProperty(PROP_PW, opts.getProperty(PROP_PW)); - sendMessage(new GetDateMessage(CoreVersion.VERSION, auth)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION, auth)); } else { // we must now send a GetDate even in SimpleSession, or we won't know // what version we are talking with and cannot use HostLookup - sendMessage(new GetDateMessage(CoreVersion.VERSION)); + sendMessage_unchecked(new GetDateMessage(CoreVersion.VERSION)); } waitForDate(); } diff --git a/core/java/src/net/i2p/client/MessagePayloadMessageHandler.java b/core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java similarity index 95% rename from core/java/src/net/i2p/client/MessagePayloadMessageHandler.java rename to core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java index 49cc2c45b..47beb2101 100644 --- a/core/java/src/net/i2p/client/MessagePayloadMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -10,6 +10,7 @@ package net.i2p.client; */ import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.DataFormatException; import net.i2p.data.Payload; import net.i2p.data.i2cp.I2CPMessage; @@ -33,7 +34,7 @@ class MessagePayloadMessageHandler extends HandlerImpl { public void handleMessage(I2CPMessage message, I2PSessionImpl session) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handle message " + message); + _log.debug("Handle message " + message + " for session " + session); try { MessagePayloadMessage msg = (MessagePayloadMessage) message; long id = msg.getMessageId(); diff --git a/core/java/src/net/i2p/client/MessageState.java b/core/java/src/net/i2p/client/impl/MessageState.java similarity index 98% rename from core/java/src/net/i2p/client/MessageState.java rename to core/java/src/net/i2p/client/impl/MessageState.java index e56eb9a8a..267a9cb19 100644 --- a/core/java/src/net/i2p/client/MessageState.java +++ b/core/java/src/net/i2p/client/impl/MessageState.java @@ -1,8 +1,10 @@ -package net.i2p.client; +package net.i2p.client.impl; import java.util.concurrent.atomic.AtomicLong; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSession; +import net.i2p.client.SendMessageStatusListener; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.MessageStatusMessage; import net.i2p.util.Log; diff --git a/core/java/src/net/i2p/client/MessageStatusMessageHandler.java b/core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java similarity index 97% rename from core/java/src/net/i2p/client/MessageStatusMessageHandler.java rename to core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java index f967ad956..4654eafa3 100644 --- a/core/java/src/net/i2p/client/MessageStatusMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -10,6 +10,7 @@ package net.i2p.client; */ import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.MessageStatusMessage; import net.i2p.data.i2cp.ReceiveMessageBeginMessage; diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java similarity index 80% rename from core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java rename to core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java index e6e9965a8..09dab72ff 100644 --- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -14,6 +14,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.crypto.KeyGenerator; import net.i2p.crypto.SigType; import net.i2p.data.DataFormatException; @@ -88,9 +89,8 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { String sspk = session.getOptions().getProperty("i2cp.leaseSetSigningPrivateKey"); PrivateKey privKey = null; SigningPrivateKey signingPrivKey = null; - boolean useOldKeys; if (spk != null && sspk != null) { - useOldKeys = true; + boolean useOldKeys = true; int colon = sspk.indexOf(':'); SigType type = dest.getSigType(); if (colon > 0) { @@ -111,6 +111,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { signingPrivKey.fromBase64(sspk); } catch (DataFormatException iae) { useOldKeys = false; + signingPrivKey = null; } } if (useOldKeys) { @@ -118,20 +119,36 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { privKey = new PrivateKey(); privKey.fromBase64(spk); } catch (DataFormatException iae) { - useOldKeys = false; + privKey = null; } } - } else { - useOldKeys = false; } - if (useOldKeys) - li = new LeaseInfo(privKey, signingPrivKey); - else + if (privKey == null && !_existingLeaseSets.isEmpty()) { + // look for keypair from another dest using same pubkey + PublicKey pk = dest.getPublicKey(); + for (Map.Entry e : _existingLeaseSets.entrySet()) { + if (pk.equals(e.getKey().getPublicKey())) { + privKey = e.getValue().getPrivateKey(); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Creating new leaseInfo keys for " + dest + " with private key from " + e.getKey()); + break; + } + } + } + if (privKey != null) { + if (signingPrivKey != null) { + li = new LeaseInfo(privKey, signingPrivKey); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Creating new leaseInfo keys for " + dest + " WITH configured private keys"); + } else { + li = new LeaseInfo(privKey, dest); + } + } else { li = new LeaseInfo(dest); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Creating new leaseInfo keys for " + dest + " without configured private keys"); + } _existingLeaseSets.put(dest, li); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Creating new leaseInfo keys for " - + dest + " using configured private keys? " + useOldKeys); } else { if (_log.shouldLog(Log.DEBUG)) _log.debug("Caching the old leaseInfo keys for " @@ -178,6 +195,9 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { private final SigningPublicKey _signingPubKey; private final SigningPrivateKey _signingPrivKey; + /** + * New keys + */ public LeaseInfo(Destination dest) { SimpleDataStructure encKeys[] = KeyGenerator.getInstance().generatePKIKeys(); // must be same type as the Destination's signing key @@ -194,6 +214,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { } /** + * Existing keys * @since 0.9.18 */ public LeaseInfo(PrivateKey privKey, SigningPrivateKey signingPrivKey) { @@ -203,6 +224,23 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { _signingPrivKey = signingPrivKey; } + /** + * Existing crypto key, new signing key + * @since 0.9.21 + */ + public LeaseInfo(PrivateKey privKey, Destination dest) { + SimpleDataStructure signKeys[]; + try { + signKeys = KeyGenerator.getInstance().generateSigningKeys(dest.getSigningPublicKey().getType()); + } catch (GeneralSecurityException gse) { + throw new IllegalStateException(gse); + } + _pubKey = KeyGenerator.getPublicKey(privKey); + _privKey = privKey; + _signingPubKey = (SigningPublicKey) signKeys[0]; + _signingPrivKey = (SigningPrivateKey) signKeys[1]; + } + public PublicKey getPublicKey() { return _pubKey; } diff --git a/core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java similarity index 97% rename from core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java rename to core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java index 6ba03d8f6..41cc9eb93 100644 --- a/core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others diff --git a/core/java/src/net/i2p/client/SessionIdleTimer.java b/core/java/src/net/i2p/client/impl/SessionIdleTimer.java similarity index 98% rename from core/java/src/net/i2p/client/SessionIdleTimer.java rename to core/java/src/net/i2p/client/impl/SessionIdleTimer.java index 444f73167..5b4fa513e 100644 --- a/core/java/src/net/i2p/client/SessionIdleTimer.java +++ b/core/java/src/net/i2p/client/impl/SessionIdleTimer.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -8,6 +8,7 @@ package net.i2p.client; import java.util.Properties; import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.DataHelper; import net.i2p.util.Log; import net.i2p.util.SimpleTimer; diff --git a/core/java/src/net/i2p/client/SessionStatusMessageHandler.java b/core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java similarity index 96% rename from core/java/src/net/i2p/client/SessionStatusMessageHandler.java rename to core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java index 92bd7db82..ec0b0d674 100644 --- a/core/java/src/net/i2p/client/SessionStatusMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others @@ -10,6 +10,7 @@ package net.i2p.client; */ import net.i2p.I2PAppContext; +import net.i2p.client.I2PSessionException; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.SessionStatusMessage; import net.i2p.util.Log; diff --git a/core/java/src/net/i2p/client/SetDateMessageHandler.java b/core/java/src/net/i2p/client/impl/SetDateMessageHandler.java similarity index 97% rename from core/java/src/net/i2p/client/SetDateMessageHandler.java rename to core/java/src/net/i2p/client/impl/SetDateMessageHandler.java index 68adb2d60..723bb7e2f 100644 --- a/core/java/src/net/i2p/client/SetDateMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/SetDateMessageHandler.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others diff --git a/core/java/src/net/i2p/client/impl/SubSession.java b/core/java/src/net/i2p/client/impl/SubSession.java new file mode 100644 index 000000000..93a115bff --- /dev/null +++ b/core/java/src/net/i2p/client/impl/SubSession.java @@ -0,0 +1,347 @@ +package net.i2p.client.impl; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import net.i2p.I2PAppContext; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.data.Destination; +import net.i2p.data.Hash; +import net.i2p.data.PrivateKey; +import net.i2p.data.SigningPrivateKey; +import net.i2p.data.i2cp.CreateLeaseSetMessage; +import net.i2p.data.i2cp.CreateSessionMessage; +import net.i2p.data.i2cp.I2CPMessage; +import net.i2p.data.i2cp.SessionId; +import net.i2p.util.I2PAppThread; + +/** + * An additional session using another session's connection. + * + * A subsession uses the same connection to the router as the primary session, + * but has a different Destination. It uses the same tunnels as the primary + * but has its own leaseset. It must use the same encryption keys as the primary + * so that garlic encryption/decryption works. + * + * The message handler map and message producer are reused from primary. + * + * Does NOT reuse the session listener ???? + * + * While the I2CP protocol, in theory, allows for fully independent sessions + * over the same I2CP connection, this is not currently supported by the router. + * + * @since 0.9.21 + */ +class SubSession extends I2PSessionMuxedImpl { + private final I2PSessionMuxedImpl _primary; + + /** + * @param primary must be a I2PSessionMuxedImpl + */ + public SubSession(I2PSession primary, InputStream destKeyStream, Properties options) throws I2PSessionException { + super((I2PSessionMuxedImpl)primary, destKeyStream, options); + _primary = (I2PSessionMuxedImpl) primary; + if (!getDecryptionKey().equals(_primary.getDecryptionKey())) + throw new I2PSessionException("encryption key mismatch"); + if (getPrivateKey().equals(_primary.getPrivateKey())) + throw new I2PSessionException("signing key must differ"); + // state management + } + + /** + * Unsupported in a subsession. + * @throws UnsupportedOperationException always + */ + @Override + public I2PSession addSubsession(InputStream destKeyStream, Properties opts) throws I2PSessionException { + throw new UnsupportedOperationException(); + } + + /** + * Unsupported in a subsession. + * Does nothing. + */ + @Override + public void removeSubsession(I2PSession session) {} + + /** + * Unsupported in a subsession. + * @return empty list always + */ + @Override + public List getSubsessions() { + return Collections.emptyList(); + } + + /** + * Does nothing for now + */ + @Override + public void updateOptions(Properties options) {} + + /** + * Connect to the router and establish a session. This call blocks until + * a session is granted. + * + * Should be threadsafe, other threads will block until complete. + * Disconnect / destroy from another thread may be called simultaneously and + * will (should?) interrupt the connect. + * + * @throws I2PSessionException if there is a configuration error or the router is + * not reachable + */ + @Override + public void connect() throws I2PSessionException { + synchronized(_stateLock) { + if (_state != State.OPEN) { + changeState(State.OPENING); + } + } + boolean success = false; + try { + _primary.connect(); + // wait until we have created a lease set + int waitcount = 0; + while (_leaseSet == null) { + if (waitcount++ > 5*60) { + throw new IOException("No tunnels built after waiting 5 minutes. Your network connection may be down, or there is severe network congestion."); + } + synchronized (_leaseSetWait) { + // InterruptedException caught below + _leaseSetWait.wait(1000); + } + } + synchronized(_stateLock) { + if (_state != State.OPEN) { + Thread notifier = new I2PAppThread(_availabilityNotifier, "ClientNotifier " + getPrefix(), true); + notifier.start(); + changeState(State.OPEN); + } + } + success = true; + } catch (InterruptedException ie) { + throw new I2PSessionException("Interrupted", ie); + } catch (IOException ioe) { + throw new I2PSessionException(getPrefix() + "Cannot connect to the router on " + _hostname + ':' + _portNum, ioe); + } finally { + if (!success) { + _availabilityNotifier.stopNotifying(); + changeState(State.CLOSED); + } + } + } + + /** + * Has the session been closed (or not yet connected)? + * False when open and during transitions. + */ + @Override + public boolean isClosed() { + return super.isClosed() || _primary.isClosed(); + } + + /** + * Deliver an I2CP message to the router + * May block for several seconds if the write queue to the router is full + * + * @throws I2PSessionException if the message is malformed or there is an error writing it out + */ + @Override + void sendMessage(I2CPMessage message) throws I2PSessionException { + // workaround for now, as primary will send out our CreateSession + // from his connect, while we are still closed. + // If we did it in connect() we wouldn't need this + if (isClosed() && + message.getType() != CreateSessionMessage.MESSAGE_TYPE && + message.getType() != CreateLeaseSetMessage.MESSAGE_TYPE) + throw new I2PSessionException("Already closed"); + _primary.sendMessage_unchecked(message); + } + + /** + * Deliver an I2CP message to the router. + * Does NOT check state. Call only from connect() or other methods that need to + * send messages when not in OPEN state. + * + * @throws I2PSessionException if the message is malformed or there is an error writing it out + * @since 0.9.23 + */ + @Override + void sendMessage_unchecked(I2CPMessage message) throws I2PSessionException { + _primary.sendMessage_unchecked(message); + } + + /** + * Pass off the error to the listener + * Misspelled, oh well. + * @param error non-null + */ + @Override + void propogateError(String msg, Throwable error) { + _primary.propogateError(msg, error); + if (_sessionListener != null) _sessionListener.errorOccurred(this, msg, error); + } + + /** + * Tear down the session, and do NOT reconnect. + * + * Blocks if session has not been fully started. + */ + @Override + public void destroySession() { + _primary.destroySession(); + if (_availabilityNotifier != null) + _availabilityNotifier.stopNotifying(); + if (_sessionListener != null) _sessionListener.disconnected(this); + changeState(State.CLOSED); + } + + /** + * Will interrupt a connect in progress. + */ + @Override + protected void disconnect() { + _primary.disconnect(); + } + + @Override + protected boolean reconnect() { + return _primary.reconnect(); + } + + /** + * Called by the message handler + * on reception of DestReplyMessage + * + * This will never happen, as the dest reply message does not contain a session ID. + */ + @Override + void destReceived(Destination d) { + _primary.destReceived(d); + } + + /** + * Called by the message handler + * on reception of DestReplyMessage + * + * This will never happen, as the dest reply message does not contain a session ID. + * + * @param h non-null + */ + @Override + void destLookupFailed(Hash h) { + _primary.destLookupFailed(h); + } + + /** + * Called by the message handler + * on reception of HostReplyMessage + * @param d non-null + */ + void destReceived(long nonce, Destination d) { + _primary.destReceived(nonce, d); + } + + /** + * Called by the message handler + * on reception of HostReplyMessage + */ + @Override + void destLookupFailed(long nonce) { + _primary.destLookupFailed(nonce); + } + + /** + * Called by the message handler. + * This will never happen, as the bw limits message does not contain a session ID. + */ + @Override + void bwReceived(int[] i) { + _primary.bwReceived(i); + } + + /** + * Blocking. Waits a max of 10 seconds by default. + * See lookupDest with maxWait parameter to change. + * Implemented in 0.8.3 in I2PSessionImpl; + * previously was available only in I2PSimpleSession. + * Multiple outstanding lookups are now allowed. + * @return null on failure + */ + @Override + public Destination lookupDest(Hash h) throws I2PSessionException { + return _primary.lookupDest(h); + } + + /** + * Blocking. + * @param maxWait ms + * @return null on failure + */ + @Override + public Destination lookupDest(Hash h, long maxWait) throws I2PSessionException { + return _primary.lookupDest(h, maxWait); + } + + /** + * Ask the router to lookup a Destination by host name. + * Blocking. Waits a max of 10 seconds by default. + * + * This only makes sense for a b32 hostname, OR outside router context. + * Inside router context, just query the naming service. + * Outside router context, this does NOT query the context naming service. + * Do that first if you expect a local addressbook. + * + * This will log a warning for non-b32 in router context. + * + * See interface for suggested implementation. + * + * Requires router side to be 0.9.11 or higher. If the router is older, + * this will return null immediately. + */ + @Override + public Destination lookupDest(String name) throws I2PSessionException { + return _primary.lookupDest(name); + } + + /** + * Ask the router to lookup a Destination by host name. + * Blocking. See above for details. + * @param maxWait ms + * @return null on failure + */ + @Override + public Destination lookupDest(String name, long maxWait) throws I2PSessionException { + return _primary.lookupDest(name, maxWait); + } + + /** + * This won't be called, as the reply does not contain a session ID, so + * it won't be routed back to us + */ + @Override + public int[] bandwidthLimits() throws I2PSessionException { + return _primary.bandwidthLimits(); + } + + @Override + protected void updateActivity() { + _primary.updateActivity(); + } + + @Override + public long lastActivity() { + return _primary.lastActivity(); + } + + @Override + public void setReduced() { + _primary.setReduced(); + } +} diff --git a/core/java/src/net/i2p/client/impl/package.html b/core/java/src/net/i2p/client/impl/package.html new file mode 100644 index 000000000..393014d7b --- /dev/null +++ b/core/java/src/net/i2p/client/impl/package.html @@ -0,0 +1,11 @@ + +

              Implements the base I2P SDK for developing applications that communicate +through I2P.

              + +

              +These classes are for implementing the client side of I2CP +and are not to be used externally. +Subject to change and not part of the public API. +Moved from net.i2p.client in 0.9.21. +

              + diff --git a/core/java/src/net/i2p/client/naming/BlockfileNamingService.java b/core/java/src/net/i2p/client/naming/BlockfileNamingService.java index ec12eb792..efa8b3e06 100644 --- a/core/java/src/net/i2p/client/naming/BlockfileNamingService.java +++ b/core/java/src/net/i2p/client/naming/BlockfileNamingService.java @@ -621,11 +621,33 @@ public class BlockfileNamingService extends DummyNamingService { ////////// Start NamingService API /* + * + * Will strip a "www." prefix and retry if lookup fails + * + * @param hostname upper/lower case ok * @param options If non-null and contains the key "list", lookup in * that list only, otherwise all lists */ @Override public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) { + Destination rv = lookup2(hostname, lookupOptions, storedOptions); + if (rv == null) { + // if hostname starts with "www.", strip and try again + // but not for www.i2p + hostname = hostname.toLowerCase(Locale.US); + if (hostname.startsWith("www.") && hostname.length() > 7) { + hostname = hostname.substring(4); + rv = lookup2(hostname, lookupOptions, storedOptions); + } + } + return rv; + } + + /* + * @param options If non-null and contains the key "list", lookup in + * that list only, otherwise all lists + */ + private Destination lookup2(String hostname, Properties lookupOptions, Properties storedOptions) { String listname = null; if (lookupOptions != null) listname = lookupOptions.getProperty("list"); diff --git a/core/java/src/net/i2p/client/naming/DummyNamingService.java b/core/java/src/net/i2p/client/naming/DummyNamingService.java index e3279ab96..fc902f65f 100644 --- a/core/java/src/net/i2p/client/naming/DummyNamingService.java +++ b/core/java/src/net/i2p/client/naming/DummyNamingService.java @@ -15,6 +15,7 @@ import net.i2p.I2PAppContext; import net.i2p.client.I2PSessionException; import net.i2p.data.Destination; import net.i2p.util.LHMCache; +import net.i2p.util.SystemVersion; /** * A Dummy naming service that can only handle base64 and b32 destinations. @@ -23,7 +24,7 @@ class DummyNamingService extends NamingService { protected static final int BASE32_HASH_LENGTH = 52; // 1 + Hash.HASH_LENGTH * 8 / 5 public final static String PROP_B32 = "i2p.naming.hostsTxt.useB32"; - protected static final int CACHE_MAX_SIZE = 32; + protected static final int CACHE_MAX_SIZE = SystemVersion.isAndroid() ? 32 : 128; public static final int DEST_SIZE = 516; // Std. Base64 length (no certificate) /** diff --git a/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java index d7ab37356..25a65c532 100644 --- a/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java +++ b/core/java/src/net/i2p/client/naming/EepGetAndAddNamingService.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.util.Locale; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; /** @@ -57,7 +58,7 @@ public class EepGetAndAddNamingService extends EepGetNamingService { try { fos = new FileOutputStream(f, true); String line = hostname + '=' + rv.toBase64() + System.getProperty("line.separator"); - fos.write(line.getBytes()); + fos.write(DataHelper.getASCII(line)); } catch (IOException ioe) { System.err.println("Error appending: " + ioe); } finally { diff --git a/core/java/src/net/i2p/client/naming/MetaNamingService.java b/core/java/src/net/i2p/client/naming/MetaNamingService.java index ffae355a5..5a4ebd275 100644 --- a/core/java/src/net/i2p/client/naming/MetaNamingService.java +++ b/core/java/src/net/i2p/client/naming/MetaNamingService.java @@ -41,8 +41,8 @@ public class MetaNamingService extends DummyNamingService { while (tok.hasMoreTokens()) { try { Class cls = Class.forName(tok.nextToken()); - Constructor con = cls.getConstructor(new Class[] { I2PAppContext.class }); - addNamingService((NamingService)con.newInstance(new Object[] { context }), false); + Constructor con = cls.getConstructor(I2PAppContext.class); + addNamingService((NamingService)con.newInstance(), false); } catch (Exception ex) { } } diff --git a/core/java/src/net/i2p/client/naming/NamingService.java b/core/java/src/net/i2p/client/naming/NamingService.java index 5a38c9e7f..78e04232d 100644 --- a/core/java/src/net/i2p/client/naming/NamingService.java +++ b/core/java/src/net/i2p/client/naming/NamingService.java @@ -536,8 +536,8 @@ public abstract class NamingService { String impl = context.getProperty(PROP_IMPL, DEFAULT_IMPL); try { Class cls = Class.forName(impl); - Constructor con = cls.getConstructor(new Class[] { I2PAppContext.class }); - instance = (NamingService)con.newInstance(new Object[] { context }); + Constructor con = cls.getConstructor(I2PAppContext.class); + instance = (NamingService)con.newInstance(context); } catch (Exception ex) { Log log = context.logManager().getLog(NamingService.class); // Blockfile may throw RuntimeException but HostsTxt won't diff --git a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java index 6414f64b4..38a174b7e 100644 --- a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java +++ b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java @@ -28,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import net.i2p.I2PAppContext; import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.util.FileUtil; import net.i2p.util.Log; @@ -76,6 +77,8 @@ public class SingleFileNamingService extends NamingService { } /** + * Will strip a "www." prefix and retry if lookup fails + * * @param hostname case-sensitive; caller should convert to lower case * @param lookupOptions ignored * @param storedOptions ignored @@ -84,9 +87,11 @@ public class SingleFileNamingService extends NamingService { public Destination lookup(String hostname, Properties lookupOptions, Properties storedOptions) { try { String key = getKey(hostname); + if (key == null && hostname.startsWith("www.") && hostname.length() > 7) + key = getKey(hostname.substring(4)); if (key != null) return lookupBase64(key); - } catch (Exception ioe) { + } catch (IOException ioe) { if (_file.exists()) _log.error("Error loading hosts file " + _file, ioe); else if (_log.shouldLog(Log.WARN)) @@ -118,7 +123,7 @@ public class SingleFileNamingService extends NamingService { return line.substring(0, split); } return null; - } catch (Exception ioe) { + } catch (IOException ioe) { if (_file.exists()) _log.error("Error loading hosts file " + _file, ioe); else if (_log.shouldLog(Log.WARN)) @@ -235,7 +240,7 @@ public class SingleFileNamingService extends NamingService { // FIXME fails if previous last line didn't have a trailing \n out.write(hostname.getBytes("UTF-8")); out.write('='); - out.write(d.toBase64().getBytes()); + out.write(DataHelper.getASCII(d.toBase64())); out.write('\n'); out.close(); for (NamingServiceListener nsl : _listeners) { diff --git a/core/java/src/net/i2p/client/package.html b/core/java/src/net/i2p/client/package.html index f7287d5ac..9d250b4df 100644 --- a/core/java/src/net/i2p/client/package.html +++ b/core/java/src/net/i2p/client/package.html @@ -1,6 +1,13 @@ -

              Implements the base I2P SDK for developing applications that communicate -through I2P.

              +

              +Interfaces and factories for +the base I2P SDK used to develop applications that communicate +through I2P. +

              + +

              +Implementation moved to net.i2p.client.impl in 0.9.21. +

              When a client application wants to communicate over I2P, the first thing it needs to do is get a {@link net.i2p.client.I2PClient} from the diff --git a/core/java/src/net/i2p/crypto/CertUtil.java b/core/java/src/net/i2p/crypto/CertUtil.java index 4d85aa691..0b5dfe669 100644 --- a/core/java/src/net/i2p/crypto/CertUtil.java +++ b/core/java/src/net/i2p/crypto/CertUtil.java @@ -1,10 +1,18 @@ package net.i2p.crypto; import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.security.GeneralSecurityException; +import java.security.InvalidKeyException; +import java.security.PrivateKey; +import java.security.PublicKey; import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.util.Locale; @@ -30,31 +38,16 @@ public class CertUtil { private static final int LINE_LENGTH = 64; /** - * Modified from: - * http://www.exampledepot.com/egs/java.security.cert/ExportCert.html - * - * This method writes a certificate to a file in base64 format. + * Write a certificate to a file in base64 format. * * @return success * @since 0.8.2, moved from SSLEepGet in 0.9.9 */ public static boolean saveCert(Certificate cert, File file) { OutputStream os = null; - PrintWriter wr = null; try { - // Get the encoded form which is suitable for exporting - byte[] buf = cert.getEncoded(); os = new SecureFileOutputStream(file); - wr = new PrintWriter(os); - wr.println("-----BEGIN CERTIFICATE-----"); - String b64 = Base64.encode(buf, true); // true = use standard alphabet - for (int i = 0; i < b64.length(); i += LINE_LENGTH) { - wr.println(b64.substring(i, Math.min(i + LINE_LENGTH, b64.length()))); - } - wr.println("-----END CERTIFICATE-----"); - wr.flush(); - if (wr.checkError()) - throw new IOException("Failed write to " + file); + exportCert(cert, os); return true; } catch (CertificateEncodingException cee) { error("Error writing X509 Certificate " + file.getAbsolutePath(), cee); @@ -67,6 +60,79 @@ public class CertUtil { } } + /** + * Writes the private key and all certs in base64 format. + * Does NOT close the stream. Throws on all errors. + * + * @param pk non-null + * @param certs certificate chain, null or empty to export pk only + * @throws InvalidKeyException if the key does not support encoding + * @throws CertificateEncodingException if a cert does not support encoding + * @since 0.9.24 + */ + public static void exportPrivateKey(PrivateKey pk, Certificate[] certs, OutputStream out) + throws IOException, GeneralSecurityException { + exportPrivateKey(pk, out); + if (certs == null) + return; + for (int i = 0; i < certs.length; i++) { + exportCert(certs[i], out); + } + } + + /** + * Modified from: + * http://www.exampledepot.com/egs/java.security.cert/ExportCert.html + * + * Writes a certificate in base64 format. + * Does NOT close the stream. Throws on all errors. + * + * @since 0.9.24, pulled out of saveCert() + */ + private static void exportCert(Certificate cert, OutputStream out) + throws IOException, CertificateEncodingException { + // Get the encoded form which is suitable for exporting + byte[] buf = cert.getEncoded(); + PrintWriter wr = new PrintWriter(new OutputStreamWriter(out, "UTF-8")); + wr.println("-----BEGIN CERTIFICATE-----"); + String b64 = Base64.encode(buf, true); // true = use standard alphabet + for (int i = 0; i < b64.length(); i += LINE_LENGTH) { + wr.println(b64.substring(i, Math.min(i + LINE_LENGTH, b64.length()))); + } + wr.println("-----END CERTIFICATE-----"); + wr.flush(); + if (wr.checkError()) + throw new IOException("Failed write to " + out); + } + + /** + * Modified from: + * http://www.exampledepot.com/egs/java.security.cert/ExportCert.html + * + * Writes a private key in base64 format. + * Does NOT close the stream. Throws on all errors. + * + * @throws InvalidKeyException if the key does not support encoding + * @since 0.9.24 + */ + private static void exportPrivateKey(PrivateKey pk, OutputStream out) + throws IOException, InvalidKeyException { + // Get the encoded form which is suitable for exporting + byte[] buf = pk.getEncoded(); + if (buf == null) + throw new InvalidKeyException("encoding unsupported for this key"); + PrintWriter wr = new PrintWriter(new OutputStreamWriter(out, "UTF-8")); + wr.println("-----BEGIN PRIVATE KEY-----"); + String b64 = Base64.encode(buf, true); // true = use standard alphabet + for (int i = 0; i < b64.length(); i += LINE_LENGTH) { + wr.println(b64.substring(i, Math.min(i + LINE_LENGTH, b64.length()))); + } + wr.println("-----END PRIVATE KEY-----"); + wr.flush(); + if (wr.checkError()) + throw new IOException("Failed write to " + out); + } + /** * Get a value out of the subject distinguished name. * @@ -76,12 +142,40 @@ public class CertUtil { * @return value or null if not found */ public static String getSubjectValue(X509Certificate cert, String type) { + X500Principal p = cert.getSubjectX500Principal(); + return getValue(p, type); + } + + /** + * Get a value out of the issuer distinguished name. + * + * Warning - unsupported in Android (no javax.naming), returns null. + * + * @param type e.g. "CN" + * @return value or null if not found + * @since 0.9.24 + */ + public static String getIssuerValue(X509Certificate cert, String type) { + X500Principal p = cert.getIssuerX500Principal(); + return getValue(p, type); + } + + /** + * Get a value out of a X500Principal. + * + * Warning - unsupported in Android (no javax.naming), returns null. + * + * @param type e.g. "CN" + * @return value or null if not found + */ + private static String getValue(X500Principal p, String type) { if (SystemVersion.isAndroid()) { error("Don't call this in Android", new UnsupportedOperationException("I did it")); return null; } + if (p == null) + return null; type = type.toUpperCase(Locale.US); - X500Principal p = cert.getSubjectX500Principal(); String subj = p.getName(); try { LdapName name = new LdapName(subj); @@ -105,4 +199,40 @@ public class CertUtil { Log l = ctx.logManager().getLog(CertUtil.class); l.log(level, msg, t); } + + /** + * Get the Java public key from a X.509 certificate file. + * Throws if the certificate is invalid (e.g. expired). + * + * @return non-null, throws on all errors including certificate invalid + * @since 0.9.24 moved from SU3File private method + */ + public static PublicKey loadKey(File kd) throws IOException, GeneralSecurityException { + return loadCert(kd).getPublicKey(); + } + + /** + * Get the certificate from a X.509 certificate file. + * Throws if the certificate is invalid (e.g. expired). + * + * @return non-null, throws on all errors including certificate invalid + * @since 0.9.24 adapted from SU3File private method + */ + public static X509Certificate loadCert(File kd) throws IOException, GeneralSecurityException { + InputStream fis = null; + try { + fis = new FileInputStream(kd); + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); + cert.checkValidity(); + return cert; + } catch (IllegalArgumentException iae) { + // java 1.8.0_40-b10, openSUSE + // Exception in thread "main" java.lang.IllegalArgumentException: Input byte array has wrong 4-byte ending unit + // at java.util.Base64$Decoder.decode0(Base64.java:704) + throw new GeneralSecurityException("cert error", iae); + } finally { + try { if (fis != null) fis.close(); } catch (IOException foo) {} + } + } } diff --git a/core/java/src/net/i2p/crypto/CryptixAESEngine.java b/core/java/src/net/i2p/crypto/CryptixAESEngine.java index f7429c6d5..e5cf7cb92 100644 --- a/core/java/src/net/i2p/crypto/CryptixAESEngine.java +++ b/core/java/src/net/i2p/crypto/CryptixAESEngine.java @@ -38,34 +38,12 @@ import net.i2p.util.SystemVersion; */ public class CryptixAESEngine extends AESEngine { private final static CryptixRijndael_Algorithm _algo = new CryptixRijndael_Algorithm(); - private final static boolean USE_FAKE_CRYPTO = false; // keys are now cached in the SessionKey objects //private CryptixAESKeyCache _cache; /** see test results below */ private static final int MIN_SYSTEM_AES_LENGTH = 704; - private static final boolean USE_SYSTEM_AES; - static { - boolean systemOK = false; - if (hasAESNI()) { - try { - systemOK = Cipher.getMaxAllowedKeyLength("AES") >= 256; - } catch (GeneralSecurityException gse) { - // a NoSuchAlgorithmException - } catch (NoSuchMethodError nsme) { - // JamVM, gij - try { - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); - cipher.init(Cipher.ENCRYPT_MODE, key); - systemOK = true; - } catch (GeneralSecurityException gse) { - } - } - } - USE_SYSTEM_AES = systemOK; - //System.out.println("Using system AES? " + systemOK); - } + private static final boolean USE_SYSTEM_AES = hasAESNI() && CryptoCheck.isUnlimited(); /** * Do we have AES-NI support in the processor and JVM? @@ -124,12 +102,6 @@ public class CryptixAESEngine extends AESEngine { if (length % 16 != 0) throw new IllegalArgumentException("Only lengths mod 16 are supported here"); - if (USE_FAKE_CRYPTO) { - _log.warn("AES Crypto disabled! Using trivial XOR"); - System.arraycopy(payload, payloadIndex, out, outIndex, length); - return; - } - if (USE_SYSTEM_AES && length >= MIN_SYSTEM_AES_LENGTH) { try { SecretKeySpec key = new SecretKeySpec(sessionKey.getData(), "AES"); @@ -177,12 +149,6 @@ public class CryptixAESEngine extends AESEngine { throw new IllegalArgumentException("out is too small (out.length=" + out.length + " outIndex=" + outIndex + " length=" + length); - if (USE_FAKE_CRYPTO) { - _log.warn("AES Crypto disabled! Using trivial XOR"); - System.arraycopy(payload, payloadIndex, out, outIndex, length); - return ; - } - if (USE_SYSTEM_AES && length >= MIN_SYSTEM_AES_LENGTH) { try { SecretKeySpec key = new SecretKeySpec(sessionKey.getData(), "AES"); diff --git a/core/java/src/net/i2p/crypto/CryptoCheck.java b/core/java/src/net/i2p/crypto/CryptoCheck.java new file mode 100644 index 000000000..31eac62dc --- /dev/null +++ b/core/java/src/net/i2p/crypto/CryptoCheck.java @@ -0,0 +1,47 @@ +package net.i2p.crypto; + +import java.security.GeneralSecurityException; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +/** + * Moved from CryptixAESEngine and net.i2p.router.tasks.CryptoChecker + * + * @since 0.9.23 + */ +public class CryptoCheck { + + private static final boolean _isUnlimited; + + static { + boolean unlimited = false; + try { + unlimited = Cipher.getMaxAllowedKeyLength("AES") >= 256; + } catch (GeneralSecurityException gse) { + // a NoSuchAlgorithmException + } catch (NoSuchMethodError nsme) { + // JamVM, gij + try { + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); + cipher.init(Cipher.ENCRYPT_MODE, key); + unlimited = true; + } catch (GeneralSecurityException gse) { + } + } + _isUnlimited = unlimited; + } + + private CryptoCheck() {} + + /** + * Do we have unlimited crypto? + */ + public static boolean isUnlimited() { + return _isUnlimited; + } + + public static void main(String args[]) { + System.out.println("Unlimited? " + isUnlimited()); + } +} diff --git a/core/java/src/net/i2p/crypto/CryptoConstants.java b/core/java/src/net/i2p/crypto/CryptoConstants.java index 94facd366..b9e0327dd 100644 --- a/core/java/src/net/i2p/crypto/CryptoConstants.java +++ b/core/java/src/net/i2p/crypto/CryptoConstants.java @@ -92,8 +92,8 @@ public class CryptoConstants { if (ECConstants.isBCAvailable()) { try { Class cls = Class.forName("org.bouncycastle.jce.spec.ElGamalParameterSpec"); - Constructor con = cls.getConstructor(new Class[] {BigInteger.class, BigInteger.class}); - spec = (AlgorithmParameterSpec)con.newInstance(new Object[] {elgp, elgg}); + Constructor con = cls.getConstructor(BigInteger.class, BigInteger.class); + spec = (AlgorithmParameterSpec)con.newInstance(elgp, elgg); //System.out.println("BC ElG spec loaded"); } catch (Exception e) { //System.out.println("BC ElG spec failed"); diff --git a/core/java/src/net/i2p/crypto/DSAEngine.java b/core/java/src/net/i2p/crypto/DSAEngine.java index e4a8e6758..76f2004f8 100644 --- a/core/java/src/net/i2p/crypto/DSAEngine.java +++ b/core/java/src/net/i2p/crypto/DSAEngine.java @@ -257,7 +257,7 @@ public class DSAEngine { _log.warn("Took too long to verify the signature (" + diff + "ms)"); } return ok; - } catch (Exception e) { + } catch (RuntimeException e) { _log.log(Log.CRIT, "Error verifying the signature", e); return false; } @@ -285,8 +285,8 @@ public class DSAEngine { try { return altSign(data, offset, length, signingKey); } catch (GeneralSecurityException gse) { - if (_log.shouldLog(Log.WARN)) - _log.warn(type + " Sign Fail", gse); + if (_log.shouldLog(Log.ERROR)) + _log.error(type + " Sign Fail", gse); return null; } } diff --git a/core/java/src/net/i2p/crypto/DirKeyRing.java b/core/java/src/net/i2p/crypto/DirKeyRing.java index cc840b36e..899f41847 100644 --- a/core/java/src/net/i2p/crypto/DirKeyRing.java +++ b/core/java/src/net/i2p/crypto/DirKeyRing.java @@ -35,6 +35,8 @@ class DirKeyRing implements KeyRing { * and have a CN == keyName. * * CN check unsupported on Android. + * + * @return null if file doesn't exist, throws on all other errors */ public PublicKey getKey(String keyName, String scope, SigType type) throws GeneralSecurityException, IOException { @@ -47,26 +49,15 @@ class DirKeyRing implements KeyRing { File kd = new File(sd, fileName + ".crt"); if (!kd.exists()) return null; - InputStream fis = null; - try { - fis = new FileInputStream(kd); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); - cert.checkValidity(); - if (!SystemVersion.isAndroid()) { - // getSubjectValue() unsupported on Android. - // Any cert problems will be caught in non-Android testing. - String cn = CertUtil.getSubjectValue(cert, "CN"); - if (!keyName.equals(cn)) - throw new GeneralSecurityException("CN mismatch: " + cn); - } - return cert.getPublicKey(); - } catch (IllegalArgumentException iae) { - // java 1.8.0_40-b10, openSUSE - throw new GeneralSecurityException("Bad cert", iae); - } finally { - try { if (fis != null) fis.close(); } catch (IOException foo) {} + X509Certificate cert = CertUtil.loadCert(kd); + if (!SystemVersion.isAndroid()) { + // getSubjectValue() unsupported on Android. + // Any cert problems will be caught in non-Android testing. + String cn = CertUtil.getSubjectValue(cert, "CN"); + if (!keyName.equals(cn)) + throw new GeneralSecurityException("CN mismatch: " + cn); } + return cert.getPublicKey(); } /** diff --git a/core/java/src/net/i2p/crypto/ECConstants.java b/core/java/src/net/i2p/crypto/ECConstants.java index affe6e4e8..8bca0b0ac 100644 --- a/core/java/src/net/i2p/crypto/ECConstants.java +++ b/core/java/src/net/i2p/crypto/ECConstants.java @@ -3,6 +3,7 @@ package net.i2p.crypto; import java.lang.reflect.Constructor; import java.math.BigInteger; import java.security.AlgorithmParameters; +import java.security.GeneralSecurityException; import java.security.Provider; import java.security.Security; import java.security.spec.ECField; @@ -42,8 +43,8 @@ class ECConstants { if (Security.getProvider("BC") == null) { try { Class cls = Class.forName("org.bouncycastle.jce.provider.BouncyCastleProvider"); - Constructor con = cls.getConstructor(new Class[0]); - Provider bc = (Provider)con.newInstance(new Object[0]); + Constructor con = cls.getConstructor(); + Provider bc = (Provider)con.newInstance(); Security.addProvider(bc); log("Added BC provider"); loaded = true; @@ -278,7 +279,7 @@ class ECConstants { AlgorithmParameters ap; try { ap = AlgorithmParameters.getInstance("EC"); - } catch (Exception e) { + } catch (GeneralSecurityException e) { if (BC_AVAILABLE) { log("Named curve " + name + " is not available, trying BC", e); ap = AlgorithmParameters.getInstance("EC", "BC"); @@ -292,7 +293,7 @@ class ECConstants { ECParameterSpec rv = ap.getParameterSpec(ECParameterSpec.class); log("Named curve " + name + " loaded"); return rv; - } catch (Exception e) { + } catch (GeneralSecurityException e) { log("Named curve " + name + " is not available", e); return null; } diff --git a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java index 126a06a36..0fe652bb2 100644 --- a/core/java/src/net/i2p/crypto/ElGamalAESEngine.java +++ b/core/java/src/net/i2p/crypto/ElGamalAESEngine.java @@ -327,12 +327,12 @@ public class ElGamalAESEngine { //ByteArrayInputStream bais = new ByteArrayInputStream(decrypted); int cur = 0; long numTags = DataHelper.fromLong(decrypted, cur, 2); - if ((numTags < 0) || (numTags > MAX_TAGS_RECEIVED)) throw new Exception("Invalid number of session tags"); + if ((numTags < 0) || (numTags > MAX_TAGS_RECEIVED)) throw new IllegalArgumentException("Invalid number of session tags"); if (numTags > 0) tags = new ArrayList((int)numTags); cur += 2; //_log.debug("# tags: " + numTags); if (numTags * SessionTag.BYTE_LENGTH > decrypted.length - 2) { - throw new Exception("# tags: " + numTags + " is too many for " + (decrypted.length - 2)); + throw new IllegalArgumentException("# tags: " + numTags + " is too many for " + (decrypted.length - 2)); } for (int i = 0; i < numTags; i++) { byte tag[] = new byte[SessionTag.BYTE_LENGTH]; @@ -344,7 +344,7 @@ public class ElGamalAESEngine { cur += 4; //_log.debug("len: " + len); if ((len < 0) || (len > decrypted.length - cur - Hash.HASH_LENGTH - 1)) - throw new Exception("Invalid size of payload (" + len + ", remaining " + (decrypted.length-cur) +")"); + throw new IllegalArgumentException("Invalid size of payload (" + len + ", remaining " + (decrypted.length-cur) +")"); //byte hashval[] = new byte[Hash.HASH_LENGTH]; //System.arraycopy(decrypted, cur, hashval, 0, Hash.HASH_LENGTH); //readHash = new Hash(); @@ -379,8 +379,8 @@ public class ElGamalAESEngine { return unencrData; } - throw new Exception("Hash does not match"); - } catch (Exception e) { + throw new RuntimeException("Hash does not match"); + } catch (RuntimeException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to decrypt AES block", e); return null; } diff --git a/core/java/src/net/i2p/crypto/EncType.java b/core/java/src/net/i2p/crypto/EncType.java index cb9c0ad96..fc07d5d5a 100644 --- a/core/java/src/net/i2p/crypto/EncType.java +++ b/core/java/src/net/i2p/crypto/EncType.java @@ -108,7 +108,7 @@ public enum EncType { return true; try { getParams(); - } catch (Exception e) { + } catch (InvalidParameterSpecException e) { return false; } return true; diff --git a/core/java/src/net/i2p/crypto/KeyGenerator.java b/core/java/src/net/i2p/crypto/KeyGenerator.java index aa6164e30..efe9bacac 100644 --- a/core/java/src/net/i2p/crypto/KeyGenerator.java +++ b/core/java/src/net/i2p/crypto/KeyGenerator.java @@ -56,11 +56,9 @@ import net.i2p.util.RandomSource; * @author jrandom */ public class KeyGenerator { - //private final Log _log; private final I2PAppContext _context; public KeyGenerator(I2PAppContext context) { - //_log = context.logManager().getLog(KeyGenerator.class); _context = context; } @@ -85,7 +83,6 @@ public class KeyGenerator { /** * PBE the passphrase with the salt. * Warning - SLOW - * Deprecated - Used by Syndie only. */ public SessionKey generateSessionKey(byte salt[], byte passphrase[]) { byte salted[] = new byte[16+passphrase.length]; @@ -122,6 +119,7 @@ public class KeyGenerator { /** * @deprecated use getElGamalExponentSize() which allows override in the properties */ + @Deprecated public static final int PUBKEY_EXPONENT_SIZE = DEFAULT_USE_LONG_EXPONENT ? PUBKEY_EXPONENT_SIZE_FULL : PUBKEY_EXPONENT_SIZE_SHORT; @@ -228,7 +226,7 @@ public class KeyGenerator { } /** - * Generic signature type, supports DSA and ECDSA + * Generic signature type, supports DSA, ECDSA, EdDSA * @since 0.9.9 */ public SimpleDataStructure[] generateSigningKeys(SigType type) throws GeneralSecurityException { @@ -343,7 +341,7 @@ public class KeyGenerator { public static void main(String args[]) { try { main2(args); - } catch (Exception e) { + } catch (RuntimeException e) { e.printStackTrace(); } } @@ -381,7 +379,7 @@ public class KeyGenerator { try { System.out.println("Testing " + type); testSig(type, runs); - } catch (Exception e) { + } catch (GeneralSecurityException e) { System.out.println("error testing " + type); e.printStackTrace(); } @@ -417,6 +415,8 @@ public class KeyGenerator { RandomSource.getInstance().nextBytes(src); long start = System.nanoTime(); Signature sig = DSAEngine.getInstance().sign(src, privkey); + if (sig == null) + throw new GeneralSecurityException("signature generation failed"); long mid = System.nanoTime(); boolean ok = DSAEngine.getInstance().verifySignature(sig, src, pubkey); long end = System.nanoTime(); diff --git a/core/java/src/net/i2p/crypto/KeyStoreUtil.java b/core/java/src/net/i2p/crypto/KeyStoreUtil.java index c374ad120..316b12309 100644 --- a/core/java/src/net/i2p/crypto/KeyStoreUtil.java +++ b/core/java/src/net/i2p/crypto/KeyStoreUtil.java @@ -5,13 +5,13 @@ import java.io.FileInputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; +import java.math.BigInteger; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.Certificate; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateNotYetValidException; -import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.Enumeration; import java.util.Locale; @@ -31,11 +31,75 @@ import net.i2p.util.SystemVersion; */ public class KeyStoreUtil { + public static boolean _blacklistLogged; + public static final String DEFAULT_KEYSTORE_PASSWORD = "changeit"; private static final String DEFAULT_KEY_ALGORITHM = "RSA"; private static final int DEFAULT_KEY_SIZE = 2048; private static final int DEFAULT_KEY_VALID_DAYS = 3652; // 10 years + /** + * No reports of some of these in a Java keystore but just to be safe... + * CNNIC ones are in Ubuntu keystore. + */ + private static final BigInteger[] BLACKLIST_SERIAL = new BigInteger[] { + // CNNIC https://googleonlinesecurity.blogspot.com/2015/03/maintaining-digital-certificate-security.html + new BigInteger("49:33:00:01".replace(":", ""), 16), + // CNNIC EV root https://bugzilla.mozilla.org/show_bug.cgi?id=607208 + new BigInteger("48:9f:00:01".replace(":", ""), 16), + // Superfish http://blog.erratasec.com/2015/02/extracting-superfish-certificate.html + new BigInteger("d2:fc:13:87:a9:44:dc:e7".replace(":", ""), 16), + // eDellRoot https://www.reddit.com/r/technology/comments/3twmfv/dell_ships_laptops_with_rogue_root_ca_exactly/ + new BigInteger("6b:c5:7b:95:18:93:aa:97:4b:62:4a:c0:88:fc:3b:b6".replace(":", ""), 16), + // DSDTestProvider https://blog.hboeck.de/archives/876-Superfish-2.0-Dangerous-Certificate-on-Dell-Laptops-breaks-encrypted-HTTPS-Connections.html + // serial number is actually negative; hex string as reported by certtool below + //new BigInteger("a4:4c:38:47:f8:ee:71:80:43:4d:b1:80:b9:a7:e9:62".replace(":", ""), 16) + new BigInteger("-5b:b3:c7:b8:07:11:8e:7f:bc:b2:4e:7f:46:58:16:9e".replace(":", ""), 16), + // Verisign G1 Roots + // https://googleonlinesecurity.blogspot.com/2015/12/proactive-measures-in-digital.html + // https://knowledge.symantec.com/support/ssl-certificates-support/index?page=content&id=ALERT1941 + // SHA-1 + new BigInteger("3c:91:31:cb:1f:f6:d0:1b:0e:9a:b8:d0:44:bf:12:be".replace(":", ""), 16), + // MD2 + new BigInteger("70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf".replace(":", ""), 16), + // Comodo SHA1 https://cabforum.org/pipermail/public/2015-December/006500.html + // https://bugzilla.mozilla.org/show_bug.cgi?id=1208461 + new BigInteger("44:be:0c:8b:50:00:21:b4:11:d3:2a:68:06:a9:ad:69".replace(":", ""), 16) + }; + + /** + * Corresponding issuer CN for the serial number. + * Must be same number of entries as BLACKLIST_SERIAL. + * Either CN or OU must be non-null + */ + private static final String[] BLACKLIST_ISSUER_CN = new String[] { + "CNNIC ROOT", + "China Internet Network Information Center EV Certificates Root", + "Superfish, Inc.", + "eDellRoot", + "DSDTestProvider", + null, + null, + "UTN - DATACorp SGC" + }; + + /** + * Corresponding issuer OU for the serial number. + * Must be same number of entries as BLACKLIST_SERIAL. + * Either CN or OU must be non-null + */ + private static final String[] BLACKLIST_ISSUER_OU = new String[] { + null, + null, + null, + null, + null, + "Class 3 Public Primary Certification Authority", + "Class 3 Public Primary Certification Authority", + null + }; + + /** * Create a new KeyStore object, and load it from ksFile if it is * non-null and it exists. @@ -63,6 +127,8 @@ public class KeyStoreUtil { if (ksFile != null && !exists) { OutputStream fos = null; try { + // must be initted + ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); fos = new SecureFileOutputStream(ksFile); ks.store(fos, pwchars); } finally { @@ -98,7 +164,8 @@ public class KeyStoreUtil { try { ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); success = addCerts(new File(System.getProperty("java.home"), "etc/security/cacerts"), ks) > 0; - } catch (Exception e) {} + } catch (IOException e) { + } catch (GeneralSecurityException e) {} } else { success = loadCerts(new File(System.getProperty("java.home"), "etc/security/cacerts.bks"), ks); } @@ -109,11 +176,14 @@ public class KeyStoreUtil { } } - if (!success) { + if (success) { + removeBlacklistedCerts(ks); + } else { try { // must be initted ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); - } catch (Exception e) {} + } catch (IOException e) { + } catch (GeneralSecurityException e) {} error("All key store loads failed, will only load local certificates", null); } return ks; @@ -140,13 +210,15 @@ public class KeyStoreUtil { try { // not clear if null is allowed for password ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); - } catch (Exception foo) {} + } catch (IOException foo) { + } catch (GeneralSecurityException e) {} return false; } catch (IOException ioe) { error("KeyStore load error, no default keys: " + file.getAbsolutePath(), ioe); try { ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); - } catch (Exception foo) {} + } catch (IOException foo) { + } catch (GeneralSecurityException e) {} return false; } finally { try { if (fis != null) fis.close(); } catch (IOException foo) {} @@ -167,11 +239,81 @@ public class KeyStoreUtil { for(Enumeration e = ks.aliases(); e.hasMoreElements();) { String alias = e.nextElement(); if (ks.isCertificateEntry(alias)) { - info("Found cert " + alias); + //info("Found cert " + alias); count++; } } - } catch (Exception foo) {} + } catch (GeneralSecurityException e) {} + return count; + } + + /** + * Remove all blacklisted X509 Certs in a key store. + * Match by serial number and issuer CN, which should uniquely identify a cert, + * if the CN is present. Should be faster than fingerprints. + * + * @return number successfully removed + * @since 0.9.24 + */ + private static int removeBlacklistedCerts(KeyStore ks) { + // This matches on the CN or OU in the issuer, + // and we can't do that on Android. + // Alternative is sha1hash(cert.getEncoded()) but that would be slower, + // unless the blacklist gets a little longer. + if (SystemVersion.isAndroid()) + return 0; + int count = 0; + try { + for(Enumeration e = ks.aliases(); e.hasMoreElements();) { + String alias = e.nextElement(); + if (ks.isCertificateEntry(alias)) { + Certificate c = ks.getCertificate(alias); + if (c != null && (c instanceof X509Certificate)) { + X509Certificate xc = (X509Certificate) c; + BigInteger serial = xc.getSerialNumber(); + // debug: + //String xname = CertUtil.getIssuerValue(xc, "CN"); + //info("Found \"" + xname + "\" s/n: " + serial.toString(16)); + //if (xname == null) + // info("name is null, full issuer: " + xc.getIssuerX500Principal().getName()); + for (int i = 0; i < BLACKLIST_SERIAL.length; i++) { + if (BLACKLIST_SERIAL[i].equals(serial)) { + if (BLACKLIST_ISSUER_CN[i] != null) { + String name = CertUtil.getIssuerValue(xc, "CN"); + if (BLACKLIST_ISSUER_CN[i].equals(name)) { + ks.deleteEntry(alias); + count++; + if (!_blacklistLogged) { + // should this be a logAlways? + warn("Ignoring blacklisted certificate \"" + alias + + "\" CN: \"" + name + + "\" s/n: " + serial.toString(16), null); + } + break; + } + } + if (BLACKLIST_ISSUER_OU[i] != null) { + String name = CertUtil.getIssuerValue(xc, "OU"); + if (BLACKLIST_ISSUER_OU[i].equals(name)) { + ks.deleteEntry(alias); + count++; + if (!_blacklistLogged) { + // should this be a logAlways? + warn("Ignoring blacklisted certificate \"" + alias + + "\" OU: \"" + name + + "\" s/n: " + serial.toString(16), null); + } + break; + } + } + } + } + } + } + } + } catch (GeneralSecurityException e) {} + if (count > 0) + _blacklistLogged = true; return count; } @@ -198,7 +340,8 @@ public class KeyStoreUtil { String alias = f.getName().toLowerCase(Locale.US); if (alias.endsWith(".crt") || alias.endsWith(".pem") || alias.endsWith(".key") || alias.endsWith(".der") || alias.endsWith(".key") || alias.endsWith(".p7b") || - alias.endsWith(".p7c") || alias.endsWith(".pfx") || alias.endsWith(".p12")) + alias.endsWith(".p7c") || alias.endsWith(".pfx") || alias.endsWith(".p12") || + alias.endsWith(".cer")) alias = alias.substring(0, alias.length() - 4); boolean success = addCert(f, alias, ks); if (success) @@ -217,45 +360,32 @@ public class KeyStoreUtil { * @since 0.8.2, moved from SSLEepGet in 0.9.9 */ public static boolean addCert(File file, String alias, KeyStore ks) { - InputStream fis = null; try { - fis = new FileInputStream(file); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); + X509Certificate cert = CertUtil.loadCert(file); info("Read X509 Certificate from " + file.getAbsolutePath() + " Issuer: " + cert.getIssuerX500Principal() + + " Serial: " + cert.getSerialNumber().toString(16) + "; Valid From: " + cert.getNotBefore() + " To: " + cert.getNotAfter()); - try { - cert.checkValidity(); - } catch (CertificateExpiredException cee) { - String s = "Rejecting expired X509 Certificate: " + file.getAbsolutePath(); - // Android often has old system certs - if (SystemVersion.isAndroid()) - warn(s, cee); - else - error(s, cee); - return false; - } catch (CertificateNotYetValidException cnyve) { - error("Rejecting X509 Certificate not yet valid: " + file.getAbsolutePath(), cnyve); - return false; - } ks.setCertificateEntry(alias, cert); info("Now trusting X509 Certificate, Issuer: " + cert.getIssuerX500Principal()); + } catch (CertificateExpiredException cee) { + String s = "Rejecting expired X509 Certificate: " + file.getAbsolutePath(); + // Android often has old system certs + if (SystemVersion.isAndroid()) + warn(s, cee); + else + error(s, cee); + return false; + } catch (CertificateNotYetValidException cnyve) { + error("Rejecting X509 Certificate not yet valid: " + file.getAbsolutePath(), cnyve); + return false; } catch (GeneralSecurityException gse) { error("Error reading X509 Certificate: " + file.getAbsolutePath(), gse); return false; } catch (IOException ioe) { error("Error reading X509 Certificate: " + file.getAbsolutePath(), ioe); return false; - } catch (IllegalArgumentException iae) { - // java 1.8.0_40-b10, openSUSE - // Exception in thread "main" java.lang.IllegalArgumentException: Input byte array has wrong 4-byte ending unit - // at java.util.Base64$Decoder.decode0(Base64.java:704) - error("Error reading X509 Certificate: " + file.getAbsolutePath(), iae); - return false; - } finally { - try { if (fis != null) fis.close(); } catch (IOException foo) {} } return true; } @@ -316,7 +446,10 @@ public class KeyStoreUtil { error("Not overwriting key " + alias + ", already exists in " + ks, null); return false; } - } catch (Exception e) { + } catch (IOException e) { + error("Not overwriting key \"" + alias + "\", already exists in " + ks, e); + return false; + } catch (GeneralSecurityException e) { error("Not overwriting key \"" + alias + "\", already exists in " + ks, e); return false; } @@ -354,7 +487,10 @@ public class KeyStoreUtil { success = getPrivateKey(ks, ksPW, alias, keyPW) != null; if (!success) error("Key gen failed to get private key", null); - } catch (Exception e) { + } catch (IOException e) { + error("Key gen failed to get private key", e); + success = false; + } catch (GeneralSecurityException e) { error("Key gen failed to get private key", e); success = false; } @@ -501,10 +637,16 @@ public class KeyStoreUtil { l.log(level, msg, t); } + /** + * Usage: KeyStoreUtil (loads from system keystore) + * KeyStoreUtil foo.ks (loads from system keystore, and from foo.ks keystore if exists, else creates empty) + * KeyStoreUtil certDir (loads from system keystore and all certs in certDir if exists) + */ +/**** public static void main(String[] args) { + File ksf = (args.length > 0) ? new File(args[0]) : null; try { - if (args.length > 0) { - File ksf = new File(args[0]); + if (ksf != null && !ksf.exists()) { createKeyStore(ksf, DEFAULT_KEYSTORE_PASSWORD); System.out.println("Created empty keystore " + ksf); } else { @@ -513,6 +655,17 @@ public class KeyStoreUtil { System.out.println("Loaded system keystore"); int count = countCerts(ks); System.out.println("Found " + count + " certs"); + if (ksf != null && ksf.isDirectory()) { + count = addCerts(ksf, ks); + System.out.println("Found " + count + " certs in " + ksf); + if (count > 0) { + // rerun blacklist as a test + _blacklistLogged = false; + count = removeBlacklistedCerts(ks); + if (count > 0) + System.out.println("Found " + count + " blacklisted certs in " + ksf); + } + } } else { System.out.println("FAIL"); } @@ -521,4 +674,5 @@ public class KeyStoreUtil { e.printStackTrace(); } } +****/ } diff --git a/core/java/src/net/i2p/crypto/SU3File.java b/core/java/src/net/i2p/crypto/SU3File.java index bc4d0251c..3c8154c6e 100644 --- a/core/java/src/net/i2p/crypto/SU3File.java +++ b/core/java/src/net/i2p/crypto/SU3File.java @@ -15,8 +15,6 @@ import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.security.PrivateKey; import java.security.PublicKey; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Arrays; import java.util.EnumSet; @@ -540,9 +538,10 @@ public class SU3File { String ctype = null; String ftype = null; String kfile = null; + String kspass = KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD; boolean error = false; boolean shouldVerify = true; - Getopt g = new Getopt("SU3File", args, "t:c:f:k:x"); + Getopt g = new Getopt("SU3File", args, "t:c:f:k:xp:"); int c; while ((c = g.getopt()) != -1) { switch (c) { @@ -566,6 +565,10 @@ public class SU3File { shouldVerify = false; break; + case 'p': + kspass = g.getOptarg(); + break; + case '?': case ':': default: @@ -586,16 +589,16 @@ public class SU3File { Properties props = new Properties(); props.setProperty("prng.bufferSize", "16384"); new I2PAppContext(props); - ok = signCLI(stype, ctype, ftype, a.get(0), a.get(1), a.get(2), a.get(3), a.get(4), ""); + ok = signCLI(stype, ctype, ftype, a.get(0), a.get(1), a.get(2), a.get(3), a.get(4), "", kspass); } else if ("bulksign".equals(cmd)) { Properties props = new Properties(); props.setProperty("prng.bufferSize", "16384"); new I2PAppContext(props); - ok = bulkSignCLI(stype, ctype, a.get(0), a.get(1), a.get(2), a.get(3)); + ok = bulkSignCLI(stype, ctype, a.get(0), a.get(1), a.get(2), a.get(3), kspass); } else if ("verifysig".equals(cmd)) { ok = verifySigCLI(a.get(0), kfile); } else if ("keygen".equals(cmd)) { - ok = genKeysCLI(stype, a.get(0), a.get(1), a.get(2)); + ok = genKeysCLI(stype, a.get(0), a.get(1), a.get(2), kspass); } else if ("extract".equals(cmd)) { ok = extractCLI(a.get(0), a.get(1), shouldVerify, kfile); } else { @@ -611,12 +614,13 @@ public class SU3File { } private static final void showUsageCLI() { - System.err.println("Usage: SU3File keygen [-t type|code] publicKeyFile keystore.ks you@mail.i2p"); - System.err.println(" SU3File sign [-t type|code] [-c type|code] [-f type|code] inputFile.zip signedFile.su3 keystore.ks version you@mail.i2p"); - System.err.println(" SU3File bulksign [-t type|code] [-c type|code] directory keystore.ks version you@mail.i2p"); - System.err.println(" SU3File showversion signedFile.su3"); - System.err.println(" SU3File verifysig [-k file.crt] signedFile.su3 ## -k use this pubkey cert for verification"); - System.err.println(" SU3File extract [-x] [-k file.crt] signedFile.su3 outFile ## -x don't check sig"); + System.err.println("Usage: SU3File keygen [-t type|code] [-p keystorepw] publicKeyFile keystore.ks you@mail.i2p\n" + + " SU3File sign [-t type|code] [-c type|code] [-f type|code] [-p keystorepw] inputFile.zip signedFile.su3 keystore.ks version you@mail.i2p\n" + + " SU3File bulksign [-t type|code] [-c type|code] [-p keystorepw] directory keystore.ks version you@mail.i2p\n" + + " SU3File showversion signedFile.su3\n" + + " SU3File verifysig [-k file.crt] signedFile.su3 ## -k use this pubkey cert for verification\n" + + " SU3File extract [-x] [-k file.crt] signedFile.su3 outFile ## -x don't check sig"); + System.err.println("Default keystore password: \"" + KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD + '"'); System.err.println(dumpTypes()); } @@ -714,7 +718,7 @@ public class SU3File { * @since 0.9.9 */ private static final boolean bulkSignCLI(String stype, String ctype, String dir, - String privateKeyFile, String version, String signerName) { + String privateKeyFile, String version, String signerName, String kspass) { File d = new File(dir); if (!d.isDirectory()) { System.out.println("Directory does not exist: " + d); @@ -749,7 +753,8 @@ public class SU3File { if (!inputFile.endsWith(".zip")) continue; String signedFile = inputFile.substring(0, inputFile.length() - 4) + ".su3"; - boolean rv = signCLI(stype, ctype, null, inputFile, signedFile, privateKeyFile, version, signerName, keypw); + boolean rv = signCLI(stype, ctype, null, inputFile, signedFile, + privateKeyFile, version, signerName, keypw, kspass); if (!rv) return false; success++; @@ -764,7 +769,7 @@ public class SU3File { * @since 0.9.9 */ private static final boolean signCLI(String stype, String ctype, String ftype, String inputFile, String signedFile, - String privateKeyFile, String version, String signerName, String keypw) { + String privateKeyFile, String version, String signerName, String keypw, String kspass) { SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : SigType.parseSigType(stype); if (type == null) { System.out.println("Signature type " + stype + " is not supported"); @@ -799,7 +804,7 @@ public class SU3File { System.out.println("Warning: File type " + ftype + " is undefined"); } } - return signCLI(type, ct, ft, inputFile, signedFile, privateKeyFile, version, signerName, keypw); + return signCLI(type, ct, ft, inputFile, signedFile, privateKeyFile, version, signerName, keypw, kspass); } /** @@ -807,7 +812,7 @@ public class SU3File { * @since 0.9.9 */ private static final boolean signCLI(SigType type, ContentType ctype, int ftype, String inputFile, String signedFile, - String privateKeyFile, String version, String signerName, String keypw) { + String privateKeyFile, String version, String signerName, String keypw, String kspass) { try { while (keypw.length() < 6) { System.out.print("Enter password for key \"" + signerName + "\": "); @@ -821,7 +826,7 @@ public class SU3File { System.out.println("Key password must be at least 6 characters"); } File pkfile = new File(privateKeyFile); - PrivateKey pk = KeyStoreUtil.getPrivateKey(pkfile,KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD, signerName, keypw); + PrivateKey pk = KeyStoreUtil.getPrivateKey(pkfile, kspass, signerName, keypw); if (pk == null) { System.out.println("Private key for " + signerName + " not found in keystore " + privateKeyFile); return false; @@ -895,13 +900,14 @@ public class SU3File { * @return success * @since 0.9.9 */ - private static final boolean genKeysCLI(String stype, String publicKeyFile, String privateKeyFile, String alias) { + private static final boolean genKeysCLI(String stype, String publicKeyFile, String privateKeyFile, + String alias, String kspass) { SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : SigType.parseSigType(stype); if (type == null) { System.out.println("Signature type " + stype + " is not supported"); return false; } - return genKeysCLI(type, publicKeyFile, privateKeyFile, alias); + return genKeysCLI(type, publicKeyFile, privateKeyFile, alias, kspass); } /** @@ -909,7 +915,8 @@ public class SU3File { * @return success * @since 0.9.9 */ - private static final boolean genKeysCLI(SigType type, String publicKeyFile, String privateKeyFile, String alias) { + private static final boolean genKeysCLI(SigType type, String publicKeyFile, String privateKeyFile, + String alias, String kspass) { File pubFile = new File(publicKeyFile); if (pubFile.exists()) { System.out.println("Error: Not overwriting file " + publicKeyFile); @@ -947,7 +954,7 @@ public class SU3File { if (keylen == 528) keylen = 521; } - boolean success = KeyStoreUtil.createKeys(ksFile, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD, alias, + boolean success = KeyStoreUtil.createKeys(ksFile, kspass, alias, alias, "I2P", 3652, type.getBaseAlgorithm().getName(), keylen, keypw); if (!success) { @@ -969,24 +976,12 @@ public class SU3File { * @since 0.9.15 */ private static PublicKey loadKey(File kd) throws IOException { - InputStream fis = null; try { - fis = new FileInputStream(kd); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - X509Certificate cert = (X509Certificate)cf.generateCertificate(fis); - cert.checkValidity(); - return cert.getPublicKey(); + return CertUtil.loadKey(kd); } catch (GeneralSecurityException gse) { IOException ioe = new IOException("cert error"); ioe.initCause(gse); throw ioe; - } catch (IllegalArgumentException iae) { - // java 1.8.0_40-b10, openSUSE - IOException ioe = new IOException("cert error"); - ioe.initCause(iae); - throw ioe; - } finally { - try { if (fis != null) fis.close(); } catch (IOException foo) {} } } } diff --git a/core/java/src/net/i2p/crypto/SigType.java b/core/java/src/net/i2p/crypto/SigType.java index ca05f8eed..05dd1906e 100644 --- a/core/java/src/net/i2p/crypto/SigType.java +++ b/core/java/src/net/i2p/crypto/SigType.java @@ -1,5 +1,6 @@ package net.i2p.crypto; +import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; @@ -11,7 +12,9 @@ import java.util.Map; import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; import net.i2p.data.Hash; +import net.i2p.data.SigningPrivateKey; import net.i2p.data.SimpleDataStructure; +import net.i2p.util.SystemVersion; /** * Defines the properties for various signature types @@ -193,11 +196,29 @@ public enum SigType { return true; try { getParams(); - if (getBaseAlgorithm() != SigAlgo.EdDSA) - Signature.getInstance(getAlgorithmName()); + if (getBaseAlgorithm() != SigAlgo.EdDSA) { + Signature jsig = Signature.getInstance(getAlgorithmName()); + if (getBaseAlgorithm() == SigAlgo.EC && SystemVersion.isGentoo() ) { + // Do a full keygen/sign test on Gentoo, because it lies. Keygen works but sigs fail. + // https://bugs.gentoo.org/show_bug.cgi?id=528338 + // http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=2497 + // http://zzz.i2p/topics/1931 + // Be sure nothing in the code paths below calls isAvailable() + // get an I2P keypair + SimpleDataStructure[] keys = KeyGenerator.getInstance().generateSigningKeys(this); + SigningPrivateKey privKey = (SigningPrivateKey) keys[1]; + // convert privkey back to Java key and sign + jsig.initSign(SigUtil.toJavaECKey(privKey)); + // use the pubkey as random data + jsig.update(keys[0].getData()); + jsig.sign(); + } + } getDigestInstance(); getHashInstance(); - } catch (Exception e) { + } catch (GeneralSecurityException e) { + return false; + } catch (RuntimeException e) { return false; } return true; diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java index b365a662a..5174292a2 100644 --- a/core/java/src/net/i2p/crypto/TrustedUpdate.java +++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java @@ -344,7 +344,11 @@ riCe6OlAEiNpcc6mMyIYYWFICbrDFTrDR3wXqwc/Jkcx6L5VVWoagpSzbo3yGhc= System.out.println("\r\nPrivate key written to: " + privateKeyFile); System.out.println("Public key written to: " + publicKeyFile); System.out.println("\r\nPublic key: " + signingPublicKey.toBase64() + "\r\n"); - } catch (Exception e) { + } catch (IOException e) { + System.err.println("Error writing keys:"); + e.printStackTrace(); + return false; + } catch (DataFormatException e) { System.err.println("Error writing keys:"); e.printStackTrace(); return false; @@ -758,7 +762,7 @@ riCe6OlAEiNpcc6mMyIYYWFICbrDFTrDR3wXqwc/Jkcx6L5VVWoagpSzbo3yGhc= bytesToSignInputStream = new SequenceInputStream(versionHeaderInputStream, fileInputStream); signature = _context.dsa().sign(bytesToSignInputStream, signingPrivateKey); - } catch (Exception e) { + } catch (IOException e) { if (_log.shouldLog(Log.ERROR)) _log.error("Error signing", e); diff --git a/core/java/src/net/i2p/crypto/YKGenerator.java b/core/java/src/net/i2p/crypto/YKGenerator.java index a714c6c6a..30245c229 100644 --- a/core/java/src/net/i2p/crypto/YKGenerator.java +++ b/core/java/src/net/i2p/crypto/YKGenerator.java @@ -91,7 +91,7 @@ class YKGenerator { return; _precalcThread = new I2PThread(new YKPrecalcRunner(MIN_NUM_BUILDERS, MAX_NUM_BUILDERS), "YK Precalc", true); - _precalcThread.setPriority(Thread.MIN_PRIORITY); + _precalcThread.setPriority(Thread.NORM_PRIORITY - 2); _isRunning = true; _precalcThread.start(); } diff --git a/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java b/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java index d3945976a..4136b321a 100644 --- a/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java +++ b/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java @@ -15,12 +15,12 @@ import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; */ public class EdDSAPrivateKey implements EdDSAKey, PrivateKey { private static final long serialVersionUID = 23495873459878957L; - private transient final byte[] seed; - private transient final byte[] h; - private transient final byte[] a; - private transient final GroupElement A; - private transient final byte[] Abyte; - private transient final EdDSAParameterSpec edDsaSpec; + private final byte[] seed; + private final byte[] h; + private final byte[] a; + private final GroupElement A; + private final byte[] Abyte; + private final EdDSAParameterSpec edDsaSpec; public EdDSAPrivateKey(EdDSAPrivateKeySpec spec) { this.seed = spec.getSeed(); diff --git a/core/java/src/net/i2p/crypto/eddsa/math/FieldElement.java b/core/java/src/net/i2p/crypto/eddsa/math/FieldElement.java index 7b29590ef..4bea7c39e 100644 --- a/core/java/src/net/i2p/crypto/eddsa/math/FieldElement.java +++ b/core/java/src/net/i2p/crypto/eddsa/math/FieldElement.java @@ -1,11 +1,15 @@ package net.i2p.crypto.eddsa.math; +import java.io.Serializable; + /** * * @since 0.9.15 * */ -public abstract class FieldElement { +public abstract class FieldElement implements Serializable { + private static final long serialVersionUID = 1239527465875676L; + protected final Field f; public FieldElement(Field f) { diff --git a/core/java/src/net/i2p/crypto/eddsa/math/GroupElement.java b/core/java/src/net/i2p/crypto/eddsa/math/GroupElement.java index 268005ed7..ec81b5d40 100644 --- a/core/java/src/net/i2p/crypto/eddsa/math/GroupElement.java +++ b/core/java/src/net/i2p/crypto/eddsa/math/GroupElement.java @@ -722,7 +722,7 @@ public class GroupElement implements Serializable { if (!this.repr.equals(ge.repr)) { try { ge = ge.toRep(this.repr); - } catch (Exception e) { + } catch (RuntimeException e) { return false; } } diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java index 4ca506b88..704c79312 100644 --- a/core/java/src/net/i2p/data/Base32.java +++ b/core/java/src/net/i2p/data/Base32.java @@ -72,7 +72,7 @@ public class Base32 { private static void runApp(String args[]) { String cmd = args[0].toLowerCase(Locale.US); if ("encodestring".equals(cmd)) { - System.out.println(encode(args[1].getBytes())); + System.out.println(encode(DataHelper.getUTF8(args[1]))); return; } InputStream in = System.in; @@ -101,8 +101,8 @@ public class Base32 { } private static byte[] read(InputStream in) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - byte buf[] = new byte[4096]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(64); + byte buf[] = new byte[64]; while (true) { int read = in.read(buf); if (read < 0) break; @@ -118,7 +118,7 @@ public class Base32 { } private static void decode(InputStream in, OutputStream out) throws IOException { - byte decoded[] = decode(new String(read(in))); + byte decoded[] = decode(DataHelper.getUTF8(read(in))); if (decoded == null) { System.out.println("FAIL"); return; @@ -143,7 +143,7 @@ public class Base32 { * @param source if null will return "" */ public static String encode(String source) { - return (source != null ? encode(source.getBytes()) : ""); + return (source != null ? encode(DataHelper.getUTF8(source)) : ""); } /** @@ -199,7 +199,7 @@ public class Base32 { byte[] b = decode(s); if (b == null) return null; - return new String(b); + return DataHelper.getUTF8(b); } /** @@ -210,7 +210,7 @@ public class Base32 { * @return decoded data, null on error */ public static byte[] decode(String s) { - return decode(s.getBytes()); + return decode(DataHelper.getASCII(s)); } private final static byte[] dmask = { (byte) 0xf8, (byte) 0x7c, (byte) 0x3e, (byte) 0x1f, diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java index 2633c1b69..3babe10ee 100644 --- a/core/java/src/net/i2p/data/Base64.java +++ b/core/java/src/net/i2p/data/Base64.java @@ -246,8 +246,8 @@ public class Base64 { } private static byte[] read(InputStream in) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - byte buf[] = new byte[4096]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); + byte buf[] = new byte[1024]; while (true) { int read = in.read(buf); if (read < 0) break; @@ -263,7 +263,7 @@ public class Base64 { } private static void decode(InputStream in, OutputStream out) throws IOException { - byte decoded[] = decode(new String(read(in))); + byte decoded[] = decode(DataHelper.getUTF8(read(in))); if (decoded == null) throw new IOException("Invalid base 64 string"); out.write(decoded); diff --git a/core/java/src/net/i2p/data/ByteArray.java b/core/java/src/net/i2p/data/ByteArray.java index 1801b122e..50670c760 100644 --- a/core/java/src/net/i2p/data/ByteArray.java +++ b/core/java/src/net/i2p/data/ByteArray.java @@ -16,7 +16,7 @@ import java.io.Serializable; * maps, and the like. * */ -public class ByteArray implements Serializable, Comparable { +public class ByteArray implements Serializable, Comparable { private byte[] _data; private int _valid; private int _offset; @@ -85,9 +85,8 @@ public class ByteArray implements Serializable, Comparable { return (llen == rlen) && DataHelper.eq(lhs, loff, rhs, roff, llen); } - public final int compareTo(Object obj) { - if (obj.getClass() != getClass()) throw new ClassCastException("invalid object: " + obj); - return DataHelper.compareTo(_data, ((ByteArray)obj).getData()); + public final int compareTo(ByteArray ba) { + return DataHelper.compareTo(_data, ba.getData()); } @Override diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index 0f79b9d53..200423d8b 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -47,21 +47,34 @@ public class Certificate extends DataStructureImpl { public final static int CERTIFICATE_TYPE_KEY = 5; /** - * If null cert, return immutable static instance, else create new - * @throws AIOOBE if not enough bytes, FIXME should throw DataFormatException + * If null, P256 key, or Ed25519 key cert, return immutable static instance, else create new + * @throws DataFormatException if not enough bytes * @since 0.8.3 */ - public static Certificate create(byte[] data, int off) { - int type = data[off] & 0xff; - int length = (int) DataHelper.fromLong(data, off + 1, 2); - if (type == 0 && length == 0) - return NULL_CERT; - // from here down roughly the same as readBytes() below - if (length == 0) - return new Certificate(type, null); - byte[] payload = new byte[length]; - System.arraycopy(data, off + 3, payload, 0, length); + public static Certificate create(byte[] data, int off) throws DataFormatException { + int type; + byte[] payload; + int length; + try { + type = data[off] & 0xff; + length = (int) DataHelper.fromLong(data, off + 1, 2); + if (type == 0 && length == 0) + return NULL_CERT; + // from here down roughly the same as readBytes() below + if (length == 0) + return new Certificate(type, null); + payload = new byte[length]; + System.arraycopy(data, off + 3, payload, 0, length); + } catch (ArrayIndexOutOfBoundsException aioobe) { + throw new DataFormatException("not enough bytes", aioobe); + } if (type == CERTIFICATE_TYPE_KEY) { + if (length == 4) { + if (Arrays.equals(payload, KeyCertificate.Ed25519_PAYLOAD)) + return KeyCertificate.ELG_Ed25519_CERT; + if (Arrays.equals(payload, KeyCertificate.ECDSA256_PAYLOAD)) + return KeyCertificate.ELG_ECDSA256_CERT; + } try { return new KeyCertificate(payload); } catch (DataFormatException dfe) { @@ -72,7 +85,7 @@ public class Certificate extends DataStructureImpl { } /** - * If null cert, return immutable static instance, else create new + * If null, P256 key, or Ed25519 key cert, return immutable static instance, else create new * @since 0.8.3 */ public static Certificate create(InputStream in) throws DataFormatException, IOException { @@ -87,8 +100,15 @@ public class Certificate extends DataStructureImpl { int read = DataHelper.read(in, payload); if (read != length) throw new DataFormatException("Not enough bytes for the payload (read: " + read + " length: " + length + ')'); - if (type == CERTIFICATE_TYPE_KEY) + if (type == CERTIFICATE_TYPE_KEY) { + if (length == 4) { + if (Arrays.equals(payload, KeyCertificate.Ed25519_PAYLOAD)) + return KeyCertificate.ELG_Ed25519_CERT; + if (Arrays.equals(payload, KeyCertificate.ECDSA256_PAYLOAD)) + return KeyCertificate.ELG_ECDSA256_CERT; + } return new KeyCertificate(payload); + } return new Certificate(type, payload); } @@ -156,7 +176,7 @@ public class Certificate extends DataStructureImpl { if (_type < 0) throw new DataFormatException("Invalid certificate type: " + _type); //if ((_type != 0) && (_payload == null)) throw new DataFormatException("Payload is required for non null type"); - DataHelper.writeLong(out, 1, _type); + out.write((byte) _type); if (_payload != null) { DataHelper.writeLong(out, 2, _payload.length); out.write(_payload); @@ -195,7 +215,7 @@ public class Certificate extends DataStructureImpl { throw new DataFormatException("Cert is too small [" + source.length + " off=" + offset + "]"); int cur = offset; - _type = (int)DataHelper.fromLong(source, cur, 1); + _type = source[cur] & 0xff; cur++; int length = (int)DataHelper.fromLong(source, cur, 2); cur += 2; @@ -262,7 +282,7 @@ public class Certificate extends DataStructureImpl { } else { buf.append(" payload size: ").append(_payload.length); if (getCertificateType() == CERTIFICATE_TYPE_HASHCASH) { - buf.append(" Stamp: ").append(new String(_payload)); + buf.append(" Stamp: ").append(DataHelper.getUTF8(_payload)); } else if (getCertificateType() == CERTIFICATE_TYPE_SIGNED && _payload.length == CERTIFICATE_LENGTH_SIGNED_WITH_HASH) { buf.append(" Signed by hash: ").append(Base64.encode(_payload, Signature.SIGNATURE_BYTES, Hash.HASH_LENGTH)); } else { diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 55e15727d..6cce00811 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -37,6 +37,8 @@ import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; import java.util.zip.Deflater; import net.i2p.I2PAppContext; @@ -86,6 +88,7 @@ public class DataHelper { "stat_tunnel.buildExploratorySuccess.60m", "stat_tunnel.participatingTunnels.60m", "stat_uptime", + "family", "family.key", "family.sig", // BlockfileNamingService "version", "created", "upgraded", "lists", "a", "s", @@ -1491,10 +1494,12 @@ public class DataHelper { return (ms / (60 * 1000)) + "m"; } else if (ms < 3 * 24 * 60 * 60 * 1000) { return (ms / (60 * 60 * 1000)) + "h"; - } else if (ms > 1000l * 24l * 60l * 60l * 1000l) { - return "n/a"; - } else { + } else if (ms < 3L * 365 * 24 * 60 * 60 * 1000) { return (ms / (24 * 60 * 60 * 1000)) + "d"; + } else if (ms < 1000L * 365 * 24 * 60 * 60 * 1000) { + return (ms / (365L * 24 * 60 * 60 * 1000)) + "y"; + } else { + return "n/a"; } } @@ -1537,11 +1542,14 @@ public class DataHelper { // hours // alternates: hrs, hr., hrs. t = ngettext("1 hour", "{0} hours", (int) (ms / (60 * 60 * 1000))); - } else if (ams > 1000l * 24l * 60l * 60l * 1000l) { - return _("n/a"); - } else { + } else if (ams < 3L * 365 * 24 * 60 * 60 * 1000) { // days t = ngettext("1 day", "{0} days", (int) (ms / (24 * 60 * 60 * 1000))); + } else if (ams < 1000L * 365 * 24 * 60 * 60 * 1000) { + // years + t = ngettext("1 year", "{0} years", (int) (ms / (365L * 24 * 60 * 60 * 1000))); + } else { + return _t("n/a"); } // Replace minus sign to work around // bug in Chrome (and IE?), line breaks at the minus sign @@ -1581,10 +1589,14 @@ public class DataHelper { t = ngettext("1 min", "{0} min", (int) (ms / (60 * 1000))); } else if (ams < 2 * 24 * 60 * 60 * 1000) { t = ngettext("1 hour", "{0} hours", (int) (ms / (60 * 60 * 1000))); - } else if (ams > 1000l * 24l * 60l * 60l * 1000l) { - return _("n/a"); - } else { + } else if (ams < 3L * 365 * 24 * 60 * 60 * 1000) { + // days t = ngettext("1 day", "{0} days", (int) (ms / (24 * 60 * 60 * 1000))); + } else if (ams < 1000L * 365 * 24 * 60 * 60 * 1000) { + // years + t = ngettext("1 year", "{0} years", (int) (ms / (365L * 24 * 60 * 60 * 1000))); + } else { + return _t("n/a"); } if (ms < 0) t = t.replace("-", "−"); @@ -1593,7 +1605,7 @@ public class DataHelper { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; - private static String _(String key) { + private static String _t(String key) { return Translate.getString(key, I2PAppContext.getGlobalContext(), BUNDLE_NAME); } @@ -1606,11 +1618,11 @@ public class DataHelper { * NOTE: formatDuration2() recommended in most cases for readability */ public static String formatSize(long bytes) { - double val = bytes; + float val = bytes; int scale = 0; - while (val >= 1024) { + while (val >= 1024.0f) { scale++; - val /= 1024; + val /= 1024.0f; } DecimalFormat fmt = new DecimalFormat("##0.00"); @@ -1684,7 +1696,7 @@ public class DataHelper { if (unescaped == null) return null; String escaped = unescaped; for (int i = 0; i < escapeChars.length; i++) { - escaped = escaped.replaceAll(escapeChars[i], escapeCodes[i]); + escaped = escaped.replace(escapeChars[i], escapeCodes[i]); } return escaped; } @@ -1699,7 +1711,7 @@ public class DataHelper { if (escaped == null) return null; String unescaped = escaped; for (int i = 0; i < escapeChars.length; i++) { - unescaped = unescaped.replaceAll(escapeCodes[i], escapeChars[i]); + unescaped = unescaped.replace(escapeCodes[i], escapeChars[i]); } return unescaped; } @@ -1855,7 +1867,6 @@ public class DataHelper { * * @return null if orig is null * @throws RuntimeException - * @deprecated unused */ public static String getUTF8(byte orig[], int offset, int len) { if (orig == null) return null; @@ -1880,4 +1891,38 @@ public class DataHelper { } return rv; } + + /** + * Same as s.split(regex) but caches the compiled pattern for speed. + * This saves about 10 microseconds (Bulldozer) on subsequent invocations. + * + * @param s non-null + * @param regex non-null + * @throws java.util.regex.PatternSyntaxException unchecked + * @since 0.9.24 + */ + public static String[] split(String s, String regex) { + return split(s, regex, 0); + } + + private static final ConcurrentHashMap patterns = new ConcurrentHashMap(); + + /** + * Same as s.split(regex, limit) but caches the compiled pattern for speed. + * This saves about 10 microseconds (Bulldozer) on subsequent invocations. + * + * @param s non-null + * @param regex non-null + * @param limit result threshold + * @throws java.util.regex.PatternSyntaxException unchecked + * @since 0.9.24 + */ + public static String[] split(String s, String regex, int limit) { + Pattern p = patterns.get(regex); + if (p == null) { + p = Pattern.compile(regex); + patterns.putIfAbsent(regex, p); + } + return p.split(s, limit); + } } diff --git a/core/java/src/net/i2p/data/DatabaseEntry.java b/core/java/src/net/i2p/data/DatabaseEntry.java index c2dd42113..32f358879 100644 --- a/core/java/src/net/i2p/data/DatabaseEntry.java +++ b/core/java/src/net/i2p/data/DatabaseEntry.java @@ -98,6 +98,9 @@ public abstract class DatabaseEntry extends DataStructureImpl { /** * Returns the raw payload data, excluding the signature, to be signed by sign(). + * + * Most callers should use writeBytes() or toByteArray() instead. + * * FIXME RouterInfo throws DFE and LeaseSet returns null * @return null on error ??????????????????????? */ @@ -122,13 +125,6 @@ public abstract class DatabaseEntry extends DataStructureImpl { return _currentRoutingKey; } - /** - * @deprecated unused - */ - public void setRoutingKey(Hash key) { - _currentRoutingKey = key; - } - /** * @throws IllegalStateException if not in RouterContext */ @@ -171,8 +167,12 @@ public abstract class DatabaseEntry extends DataStructureImpl { throw new IllegalStateException(); byte[] bytes = getBytes(); if (bytes == null) throw new DataFormatException("Not enough data to sign"); + if (key == null) + throw new DataFormatException("No signing key"); // now sign with the key _signature = DSAEngine.getInstance().sign(bytes, key); + if (_signature == null) + throw new DataFormatException("Signature failed with " + key.getType() + " key"); } /** diff --git a/core/java/src/net/i2p/data/KeyCertificate.java b/core/java/src/net/i2p/data/KeyCertificate.java index 904f77388..1c35d6c31 100644 --- a/core/java/src/net/i2p/data/KeyCertificate.java +++ b/core/java/src/net/i2p/data/KeyCertificate.java @@ -17,15 +17,41 @@ public class KeyCertificate extends Certificate { public static final int HEADER_LENGTH = 4; + /** @since 0.9.22 pkg private for Certificate.create() */ + static final byte[] Ed25519_PAYLOAD = new byte[] { + 0, (byte) (SigType.EdDSA_SHA512_Ed25519.getCode()), 0, 0 + }; + + /** @since 0.9.22 pkg private for Certificate.create() */ + static final byte[] ECDSA256_PAYLOAD = new byte[] { + 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 + }; + + /** + * An immutable ElG/ECDSA-P256 certificate. + */ public static final KeyCertificate ELG_ECDSA256_CERT; + + /** + * An immutable ElG/Ed25519 certificate. + * @since 0.9.22 + */ + public static final KeyCertificate ELG_Ed25519_CERT; + static { KeyCertificate kc; try { kc = new ECDSA256Cert(); } catch (DataFormatException dfe) { - kc = null; // won't happen + throw new RuntimeException(dfe); // won't happen } ELG_ECDSA256_CERT = kc; + try { + kc = new Ed25519Cert(); + } catch (DataFormatException dfe) { + throw new RuntimeException(dfe); // won't happen + } + ELG_Ed25519_CERT = kc; } /** @@ -122,7 +148,7 @@ public class KeyCertificate extends Certificate { /** * Signing Key extra data, if any, is first in the array. * Crypto Key extra data, if any, is second in the array, - * at offset max(0, 128 - getSigType().getPubkeyLen() + * at offset max(0, getSigType().getPubkeyLen() - 128) * * @return null if unset or none */ @@ -148,7 +174,7 @@ public class KeyCertificate extends Certificate { SigType type = getSigType(); if (type == null) throw new UnsupportedOperationException("unknown sig type"); - int extra = 128 - type.getPubkeyLen(); + int extra = Math.max(0, type.getPubkeyLen() - 128); if (_payload.length == HEADER_LENGTH + extra) return getExtraKeyData(); byte[] rv = new byte[extra]; @@ -185,19 +211,17 @@ public class KeyCertificate extends Certificate { /** * An immutable ElG/ECDSA-256 certificate. - * @since 0.8.3 */ private static final class ECDSA256Cert extends KeyCertificate { private static final byte[] ECDSA256_DATA = new byte[] { CERTIFICATE_TYPE_KEY, 0, HEADER_LENGTH, 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 }; private static final int ECDSA256_LENGTH = ECDSA256_DATA.length; - private static final byte[] ECDSA256_PAYLOAD = new byte[] { - 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), 0, 0 - }; + private final int _hashcode; public ECDSA256Cert() throws DataFormatException { super(ECDSA256_PAYLOAD); + _hashcode = super.hashCode(); } /** @throws RuntimeException always */ @@ -246,7 +270,75 @@ public class KeyCertificate extends Certificate { /** Overridden for efficiency */ @Override public int hashCode() { - return 1234567; + return _hashcode; + } + } + + /** + * An immutable ElG/Ed25519 certificate. + * @since 0.9.22 + */ + private static final class Ed25519Cert extends KeyCertificate { + private static final byte[] ED_DATA = new byte[] { CERTIFICATE_TYPE_KEY, + 0, HEADER_LENGTH, + 0, (byte) SigType.EdDSA_SHA512_Ed25519.getCode(), + 0, 0 + }; + private static final int ED_LENGTH = ED_DATA.length; + private final int _hashcode; + + public Ed25519Cert() throws DataFormatException { + super(Ed25519_PAYLOAD); + _hashcode = super.hashCode(); + } + + /** @throws RuntimeException always */ + @Override + public void setCertificateType(int type) { + throw new RuntimeException("Data already set"); + } + + /** @throws RuntimeException always */ + @Override + public void setPayload(byte[] payload) { + throw new RuntimeException("Data already set"); + } + + /** @throws RuntimeException always */ + @Override + public void readBytes(InputStream in) throws DataFormatException, IOException { + throw new RuntimeException("Data already set"); + } + + /** Overridden for efficiency */ + @Override + public void writeBytes(OutputStream out) throws IOException { + out.write(ED_DATA); + } + + /** Overridden for efficiency */ + @Override + public int writeBytes(byte target[], int offset) { + System.arraycopy(ED_DATA, 0, target, offset, ED_LENGTH); + return ED_LENGTH; + } + + /** @throws RuntimeException always */ + @Override + public int readBytes(byte source[], int offset) throws DataFormatException { + throw new RuntimeException("Data already set"); + } + + /** Overridden for efficiency */ + @Override + public int size() { + return ED_LENGTH; + } + + /** Overridden for efficiency */ + @Override + public int hashCode() { + return _hashcode; } } } diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java index b844c7e3a..0fd4ed845 100644 --- a/core/java/src/net/i2p/data/LeaseSet.java +++ b/core/java/src/net/i2p/data/LeaseSet.java @@ -418,10 +418,10 @@ public class LeaseSet extends DatabaseEntry { encryp(key); } catch (DataFormatException dfe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(LeaseSet.class); - log.error("Error encrypting lease: " + _destination.calculateHash()); + log.error("Error encrypting lease: " + _destination.calculateHash(), dfe); } catch (IOException ioe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(LeaseSet.class); - log.error("Error encrypting lease: " + _destination.calculateHash()); + log.error("Error encrypting lease: " + _destination.calculateHash(), ioe); } } @@ -520,7 +520,11 @@ public class LeaseSet extends DatabaseEntry { private synchronized boolean isEncrypted() { if (_decrypted) return true; - if (_checked || _destination == null) + // If the encryption key is not set yet, it can't have been encrypted yet. + // Router-side I2CP sets the destination (but not the encryption key) + // on an unsigned LS which is pending signature (and possibly encryption) + // by the client, and we don't want to attempt 'decryption' on it. + if (_checked || _encryptionKey == null || _destination == null) return false; SessionKey key = I2PAppContext.getGlobalContext().keyRing().get(_destination.calculateHash()); if (key != null) { @@ -529,10 +533,10 @@ public class LeaseSet extends DatabaseEntry { _decrypted = true; } catch (DataFormatException dfe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(LeaseSet.class); - log.error("Error decrypting lease: " + _destination.calculateHash() + dfe); + log.error("Error decrypting lease: " + _destination.calculateHash(), dfe); } catch (IOException ioe) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(LeaseSet.class); - log.error("Error decrypting lease: " + _destination.calculateHash() + ioe); + log.error("Error decrypting lease: " + _destination.calculateHash(), ioe); } } _checked = true; diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java index 4e1a6d74a..7559db7d7 100644 --- a/core/java/src/net/i2p/data/PrivateKeyFile.java +++ b/core/java/src/net/i2p/data/PrivateKeyFile.java @@ -9,6 +9,7 @@ import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.security.GeneralSecurityException; +import java.security.NoSuchAlgorithmException; import java.util.Locale; import java.util.Map; import java.util.Properties; @@ -41,7 +42,7 @@ import net.i2p.util.SecureFileOutputStream; * - Certificate if length != 0 * - Private key (256 bytes) * - Signing Private key (20 bytes, or length specified by key certificate) - * Total 663 bytes + * Total: 663 or more bytes * * * @author welterde, zzz @@ -174,7 +175,10 @@ public class PrivateKeyFile { pkf.write(); verifySignature(pkf.getDestination()); } - } catch (Exception e) { + } catch (I2PException e) { + e.printStackTrace(); + System.exit(1); + } catch (IOException e) { e.printStackTrace(); System.exit(1); } @@ -358,7 +362,7 @@ public class PrivateKeyFile { HashCash hc; try { hc = HashCash.mintCash(resource, effort); - } catch (Exception e) { + } catch (NoSuchAlgorithmException e) { return null; } System.out.println("Generation took: " + DataHelper.formatDuration(System.currentTimeMillis() - begin)); @@ -381,7 +385,7 @@ public class PrivateKeyFile { hcs = hcs.substring(0, end1) + hcs.substring(start2); System.out.println("Short Hashcash is: " + hcs); - c.setPayload(hcs.getBytes()); + c.setPayload(DataHelper.getUTF8(hcs)); return c; } @@ -391,7 +395,9 @@ public class PrivateKeyFile { Destination d2; try { d2 = pkf2.getDestination(); - } catch (Exception e) { + } catch (I2PException e) { + return null; + } catch (IOException e) { return null; } if (d2 == null) @@ -405,7 +411,10 @@ public class PrivateKeyFile { System.arraycopy(this.dest.getPublicKey().getData(), 0, data, 0, PublicKey.KEYSIZE_BYTES); System.arraycopy(this.dest.getSigningPublicKey().getData(), 0, data, PublicKey.KEYSIZE_BYTES, SigningPublicKey.KEYSIZE_BYTES); byte[] payload = new byte[Hash.HASH_LENGTH + Signature.SIGNATURE_BYTES]; - byte[] sig = DSAEngine.getInstance().sign(new ByteArrayInputStream(data), spk2).getData(); + Signature sign = DSAEngine.getInstance().sign(new ByteArrayInputStream(data), spk2); + if (sign == null) + return null; + byte[] sig = sign.getData(); System.arraycopy(sig, 0, payload, 0, Signature.SIGNATURE_BYTES); // Add dest2's Hash for reference byte[] h2 = d2.calculateHash().getData(); @@ -497,7 +506,7 @@ public class PrivateKeyFile { long low = Long.MAX_VALUE; try { low = HashCash.estimateTime(hashEffort); - } catch (Exception e) {} + } catch (NoSuchAlgorithmException e) {} // takes a lot longer than the estimate usually... // maybe because the resource string is much longer than used in the estimate? return "It is estimated that generating a HashCash Certificate with value " + hashEffort + diff --git a/core/java/src/net/i2p/data/SDSCache.java b/core/java/src/net/i2p/data/SDSCache.java index ab7768014..f38fe6bbf 100644 --- a/core/java/src/net/i2p/data/SDSCache.java +++ b/core/java/src/net/i2p/data/SDSCache.java @@ -46,7 +46,6 @@ import net.i2p.util.SystemVersion; public class SDSCache { //private static final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(SDSCache.class); - private static final Class[] conArg = new Class[] { byte[].class }; private static final double MIN_FACTOR = 0.20; private static final double MAX_FACTOR = 5.0; private static final double FACTOR; @@ -74,7 +73,7 @@ public class SDSCache { _cache = new LHMCache>(size); _datalen = len; try { - _rvCon = rvClass.getConstructor(conArg); + _rvCon = rvClass.getConstructor(byte[].class); } catch (NoSuchMethodException e) { throw new RuntimeException("SDSCache init error", e); } diff --git a/core/java/src/net/i2p/data/VerifiedDestination.java b/core/java/src/net/i2p/data/VerifiedDestination.java index dee86800d..1123f6499 100644 --- a/core/java/src/net/i2p/data/VerifiedDestination.java +++ b/core/java/src/net/i2p/data/VerifiedDestination.java @@ -87,7 +87,7 @@ public class VerifiedDestination extends Destination { * zeros and see if it meets our minimum effort. */ protected boolean verifyHashCashCert() { - String hcs = new String(_certificate.getPayload()); + String hcs = DataHelper.getUTF8(_certificate.getPayload()); int end1 = 0; for (int i = 0; i < 3; i++) { end1 = 1 + hcs.indexOf(':', end1); diff --git a/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java b/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java index bc3b9bbc9..00855844c 100644 --- a/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java +++ b/core/java/src/net/i2p/data/i2cp/AbuseSeverity.java @@ -45,7 +45,7 @@ public class AbuseSeverity extends DataStructureImpl { public void writeBytes(OutputStream out) throws DataFormatException, IOException { if (_severityId < 0) throw new DataFormatException("Invalid abuse severity: " + _severityId); - DataHelper.writeLong(out, 1, _severityId); + out.write((byte) _severityId); } @Override diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java index 6477768c5..d7c55e53b 100644 --- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java +++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java @@ -38,6 +38,16 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java index b67f5fa6f..67090011f 100644 --- a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java +++ b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java @@ -32,6 +32,16 @@ public class DestroySessionMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/HostLookupMessage.java b/core/java/src/net/i2p/data/i2cp/HostLookupMessage.java index 1a8fcfe86..66835ef9f 100644 --- a/core/java/src/net/i2p/data/i2cp/HostLookupMessage.java +++ b/core/java/src/net/i2p/data/i2cp/HostLookupMessage.java @@ -76,6 +76,16 @@ public class HostLookupMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + /** * @return 0 to 2**32 - 1 */ diff --git a/core/java/src/net/i2p/data/i2cp/HostReplyMessage.java b/core/java/src/net/i2p/data/i2cp/HostReplyMessage.java index 37faaa276..ad182d6a6 100644 --- a/core/java/src/net/i2p/data/i2cp/HostReplyMessage.java +++ b/core/java/src/net/i2p/data/i2cp/HostReplyMessage.java @@ -73,6 +73,16 @@ public class HostReplyMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + /** * @return 0 to 2**32 - 1 */ diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessage.java b/core/java/src/net/i2p/data/i2cp/I2CPMessage.java index 92c4f6163..3cc7da503 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessage.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessage.java @@ -60,9 +60,20 @@ public interface I2CPMessage extends DataStructure { public void writeMessage(OutputStream out) throws I2CPMessageException, IOException; /** - * Return the unique identifier for this type of APIMessage, as specified in the + * Return the unique identifier for this type of message, as specified in the * network specification document under #ClientAccessLayerMessages - * @return unique identifier for this type of APIMessage + * @return unique identifier for this type of message */ public int getType(); -} \ No newline at end of file + + /** + * Return the SessionId for this type of message. + * Most but not all message types include a SessionId. + * The ones that do already define getSessionId(), but some return a SessionId and + * some return a long, so we define a new method here. + * + * @return SessionId or null if this message type does not include a SessionId + * @since 0.9.21 + */ + public SessionId sessionId(); +} diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java index 63d13b040..b2e38c21e 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageException.java @@ -12,7 +12,7 @@ package net.i2p.data.i2cp; import net.i2p.I2PException; /** - * Represent an error serializing or deserializing an APIMessage + * Represent an error serializing or deserializing a message * * @author jrandom */ diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java index 3ace5df9d..1f91da128 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageImpl.java @@ -105,7 +105,7 @@ public abstract class I2CPMessageImpl extends DataStructureImpl implements I2CPM byte[] data = doWriteMessage(); try { DataHelper.writeLong(out, 4, data.length); - DataHelper.writeLong(out, 1, getType()); + out.write((byte) getType()); } catch (DataFormatException dfe) { throw new I2CPMessageException("Unable to write the message length or type", dfe); } @@ -127,4 +127,15 @@ public abstract class I2CPMessageImpl extends DataStructureImpl implements I2CPM throw new DataFormatException("Error writing the message", ime); } } + + /** + * Return the SessionId for this type of message. + * Most but not all message types include a SessionId. + * The ones that do already define getSessionId(), but some return a SessionId and + * some return a long, so we define a new method here. + * + * @return null always. Extending classes with a SessionId must override. + * @since 0.9.21 + */ + public SessionId sessionId() { return null; } } diff --git a/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java b/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java index 72148a55d..4bfdbc158 100644 --- a/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java +++ b/core/java/src/net/i2p/data/i2cp/I2CPMessageReader.java @@ -158,6 +158,20 @@ public class I2CPMessageReader { } public void run() { + try { + run2(); + } catch (RuntimeException e) { + _log.log(Log.CRIT, "Uncaught I2CP error", e); + _listener.readError(I2CPMessageReader.this, e); + cancelRunner(); + } + } + + /** + * Called by run() + * @since 0.9.21 + */ + protected void run2() { while (_stayAlive) { while (_doRun) { // do read @@ -179,7 +193,7 @@ public class I2CPMessageReader { } catch (OutOfMemoryError oom) { // ooms seen here... maybe log and keep going? throw oom; - } catch (Exception e) { + } catch (RuntimeException e) { _log.log(Log.CRIT, "Unhandled error reading I2CP stream", e); _listener.disconnected(I2CPMessageReader.this); cancelRunner(); diff --git a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java index 6d0c4daac..b34953411 100644 --- a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java +++ b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java @@ -37,6 +37,16 @@ public class MessagePayloadMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId >= 0 ? new SessionId(_sessionId) : null; + } + /** @param id 0-65535 */ public void setSessionId(long id) { _sessionId = (int) id; @@ -96,7 +106,7 @@ public class MessagePayloadMessage extends I2CPMessageImpl { int size = 2 + 4 + 4 + _payload.getSize(); try { DataHelper.writeLong(out, 4, size); - DataHelper.writeLong(out, 1, MESSAGE_TYPE); + out.write((byte) MESSAGE_TYPE); DataHelper.writeLong(out, 2, _sessionId); DataHelper.writeLong(out, 4, _messageId); DataHelper.writeLong(out, 4, _payload.getSize()); diff --git a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java index dd4f43054..b3612eccd 100644 --- a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java +++ b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java @@ -193,6 +193,16 @@ public class MessageStatusMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId >= 0 ? new SessionId(_sessionId) : null; + } + /** @param id 0-65535 */ public void setSessionId(long id) { _sessionId = (int) id; @@ -275,6 +285,12 @@ public class MessageStatusMessage extends I2CPMessageImpl { return "GUARANTEED SUCCESS "; case STATUS_SEND_SUCCESS_LOCAL: return "LOCAL SUCCESS "; + case STATUS_SEND_BEST_EFFORT_FAILURE: + return "PROBABLE FAILURE "; + case STATUS_SEND_FAILURE_NO_TUNNELS: + return "NO LOCAL TUNNELS "; + case STATUS_SEND_FAILURE_NO_LEASESET: + return "LEASESET NOT FOUND "; default: return "SEND FAILURE CODE: " + status; } @@ -308,10 +324,10 @@ public class MessageStatusMessage extends I2CPMessageImpl { try { DataHelper.writeLong(out, 4, len); - DataHelper.writeLong(out, 1, MESSAGE_TYPE); + out.write((byte) MESSAGE_TYPE); DataHelper.writeLong(out, 2, _sessionId); DataHelper.writeLong(out, 4, _messageId); - DataHelper.writeLong(out, 1, _status); + out.write((byte) _status); DataHelper.writeLong(out, 4, _size); DataHelper.writeLong(out, 4, _nonce); } catch (DataFormatException dfe) { diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java index cc685cbab..29c8a02ef 100644 --- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java @@ -36,6 +36,16 @@ public class ReceiveMessageBeginMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId >= 0 ? new SessionId(_sessionId) : null; + } + /** @param id 0-65535 */ public void setSessionId(long id) { _sessionId = (int) id; @@ -76,7 +86,7 @@ public class ReceiveMessageBeginMessage extends I2CPMessageImpl { try { DataHelper.writeLong(out, 4, len); - DataHelper.writeLong(out, 1, MESSAGE_TYPE); + out.write((byte) MESSAGE_TYPE); DataHelper.writeLong(out, 2, _sessionId); DataHelper.writeLong(out, 4, _messageId); } catch (DataFormatException dfe) { diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java index c405b93a3..accf9dbe3 100644 --- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java @@ -35,6 +35,16 @@ public class ReceiveMessageEndMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId >= 0 ? new SessionId(_sessionId) : null; + } + /** @param id 0-65535 */ public void setSessionId(long id) { _sessionId = (int) id; diff --git a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java index 01130670a..7532af358 100644 --- a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java @@ -33,6 +33,16 @@ public class ReconfigureSessionMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java index 76311ae6e..4118ac322 100644 --- a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java +++ b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java @@ -35,6 +35,16 @@ public class ReportAbuseMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java index 1e9b2dcf6..b972fab38 100644 --- a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java +++ b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java @@ -45,6 +45,16 @@ public class RequestLeaseSetMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/RequestVariableLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestVariableLeaseSetMessage.java index 160e193dc..6d172c919 100644 --- a/core/java/src/net/i2p/data/i2cp/RequestVariableLeaseSetMessage.java +++ b/core/java/src/net/i2p/data/i2cp/RequestVariableLeaseSetMessage.java @@ -55,6 +55,16 @@ public class RequestVariableLeaseSetMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java index 1a4a5b612..6462dd595 100644 --- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java @@ -117,7 +117,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage { try { DataHelper.writeLong(out, 4, len); - DataHelper.writeLong(out, 1, MESSAGE_TYPE); + out.write((byte) MESSAGE_TYPE); _sessionId.writeBytes(out); _destination.writeBytes(out); _payload.writeBytes(out); diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java index 18f6c6df3..039ba9e4f 100644 --- a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java @@ -38,6 +38,16 @@ public class SendMessageMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } @@ -129,7 +139,7 @@ public class SendMessageMessage extends I2CPMessageImpl { try { DataHelper.writeLong(out, 4, len); - DataHelper.writeLong(out, 1, getType()); + out.write((byte) getType()); _sessionId.writeBytes(out); _destination.writeBytes(out); _payload.writeBytes(out); diff --git a/core/java/src/net/i2p/data/i2cp/SessionConfig.java b/core/java/src/net/i2p/data/i2cp/SessionConfig.java index de6734349..531194d17 100644 --- a/core/java/src/net/i2p/data/i2cp/SessionConfig.java +++ b/core/java/src/net/i2p/data/i2cp/SessionConfig.java @@ -121,7 +121,11 @@ public class SessionConfig extends DataStructureImpl { public void signSessionConfig(SigningPrivateKey signingKey) throws DataFormatException { byte data[] = getBytes(); if (data == null) throw new DataFormatException("Unable to retrieve bytes for signing"); + if (signingKey == null) + throw new DataFormatException("No signing key"); _signature = DSAEngine.getInstance().sign(data, signingKey); + if (_signature == null) + throw new DataFormatException("Signature failed with " + signingKey.getType() + " key"); } /** diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java index 5af2a649b..49509a552 100644 --- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java +++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java @@ -42,6 +42,16 @@ public class SessionStatusMessage extends I2CPMessageImpl { return _sessionId; } + /** + * Return the SessionId for this message. + * + * @since 0.9.21 + */ + @Override + public SessionId sessionId() { + return _sessionId; + } + public void setSessionId(SessionId id) { _sessionId = id; } diff --git a/core/java/src/net/i2p/internal/I2CPMessageQueue.java b/core/java/src/net/i2p/internal/I2CPMessageQueue.java index eda2d8f95..76584255c 100644 --- a/core/java/src/net/i2p/internal/I2CPMessageQueue.java +++ b/core/java/src/net/i2p/internal/I2CPMessageQueue.java @@ -1,5 +1,7 @@ package net.i2p.internal; +import java.io.Closeable; + import net.i2p.data.i2cp.I2CPMessage; /** @@ -15,7 +17,7 @@ import net.i2p.data.i2cp.I2CPMessage; * @author zzz * @since 0.8.3 */ -public abstract class I2CPMessageQueue { +public abstract class I2CPMessageQueue implements Closeable { /** * Send a message, nonblocking. diff --git a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java index 3e87a8e2f..ba218631f 100644 --- a/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java +++ b/core/java/src/net/i2p/internal/QueuedI2CPMessageReader.java @@ -42,7 +42,7 @@ public class QueuedI2CPMessageReader extends I2CPMessageReader { * Pumps messages from the incoming message queue to the listener. */ @Override - public void run() { + protected void run2() { while (_stayAlive) { while (_doRun) { // do read diff --git a/core/java/src/net/i2p/kademlia/KBucketSet.java b/core/java/src/net/i2p/kademlia/KBucketSet.java index a2d0610a6..0d5daa223 100644 --- a/core/java/src/net/i2p/kademlia/KBucketSet.java +++ b/core/java/src/net/i2p/kademlia/KBucketSet.java @@ -628,6 +628,7 @@ public class KBucketSet { * @param data size <= SDS length, else throws IAE * Can be 1 bigger if top byte is zero */ + @SuppressWarnings("unchecked") private T makeKey(byte[] data) { int len = _us.length(); int dlen = data.length; diff --git a/core/java/src/net/i2p/stat/BufferedStatLog.java b/core/java/src/net/i2p/stat/BufferedStatLog.java index 20b6a2a49..5734e8948 100644 --- a/core/java/src/net/i2p/stat/BufferedStatLog.java +++ b/core/java/src/net/i2p/stat/BufferedStatLog.java @@ -2,8 +2,9 @@ package net.i2p.stat; import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -115,7 +116,7 @@ public class BufferedStatLog implements StatLog { if (_out != null) try { _out.close(); } catch (IOException ioe) {} _outFile = filename; try { - _out = new BufferedWriter(new FileWriter(_outFile, true), 32*1024); + _out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(_outFile, true), "UTF-8"), 32*1024); } catch (IOException ioe) { ioe.printStackTrace(); } } } @@ -144,7 +145,7 @@ public class BufferedStatLog implements StatLog { if (_log.shouldLog(Log.DEBUG)) _log.debug("writing " + writeStart +"->"+ writeEnd); writeEvents(writeStart, writeEnd); - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("error writing " + writeStart +"->"+ writeEnd, e); } } diff --git a/core/java/src/net/i2p/stat/Frequency.java b/core/java/src/net/i2p/stat/Frequency.java index 50536fa4f..721578ce6 100644 --- a/core/java/src/net/i2p/stat/Frequency.java +++ b/core/java/src/net/i2p/stat/Frequency.java @@ -150,4 +150,16 @@ public class Frequency { private final static long now() { return System.currentTimeMillis(); } + + /** + * Appends the data of this frequency to the specified StringBuilder + * @param dest to append data to + * @since 0.9.23 + */ + synchronized void store(StringBuilder dest) { + dest.append("avgInterval:").append(_avgInterval).append(','); + dest.append("minAverageInterval").append(_minAverageInterval).append(','); + dest.append("lastEvent").append(_lastEvent).append(","); + dest.append("count").append(_count); + } } diff --git a/core/java/src/net/i2p/stat/FrequencyStat.java b/core/java/src/net/i2p/stat/FrequencyStat.java index d18a469db..c2c49d6fb 100644 --- a/core/java/src/net/i2p/stat/FrequencyStat.java +++ b/core/java/src/net/i2p/stat/FrequencyStat.java @@ -1,5 +1,10 @@ package net.i2p.stat; +import java.io.IOException; +import java.io.OutputStream; + +import net.i2p.data.DataHelper; + /** coordinate an event frequency over various periods */ public class FrequencyStat { /** unique name of the statistic */ @@ -92,5 +97,34 @@ public class FrequencyStat { if ((obj == null) || !(obj instanceof FrequencyStat)) return false; return _statName.equals(((FrequencyStat)obj)._statName); } + + private final static String NL = System.getProperty("line.separator"); + + /** + * Serializes this FrequencyStat to the provided OutputStream + * @param out to write to + * @param prefix to prepend to the stat + * @throws IOException if something goes wrong + * @since 0.9.23 + */ + public void store(OutputStream out, String prefix) throws IOException { + StringBuilder buf = new StringBuilder(1024); + buf.append(NL); + buf.append("################################################################################").append(NL); + buf.append("# Frequency: ").append(_groupName).append(": ").append(_statName).append(NL); + buf.append("# ").append(_description).append(NL); + buf.append("# ").append(NL).append(NL); + out.write(buf.toString().getBytes("UTF-8")); + buf.setLength(0); + for (Frequency r: _frequencies){ + buf.append("#######").append(NL); + buf.append("# Period : ").append(DataHelper.formatDuration(r.getPeriod())).append(" for rate ") + .append(_groupName).append(" - ").append(_statName).append(NL); + buf.append(NL); + r.store(buf); + out.write(buf.toString().getBytes("UTF-8")); + buf.setLength(0); + } + } } diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index e37f9db9f..edac7d96b 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -14,19 +14,19 @@ import net.i2p.data.DataHelper; */ public class Rate { //private final static Log _log = new Log(Rate.class); - private double _currentTotalValue; + private float _currentTotalValue; // was long, save space private int _currentEventCount; - private long _currentTotalEventTime; - private double _lastTotalValue; + private int _currentTotalEventTime; + private float _lastTotalValue; // was long, save space private int _lastEventCount; - private long _lastTotalEventTime; - private double _extremeTotalValue; + private int _lastTotalEventTime; + private float _extremeTotalValue; // was long, save space private int _extremeEventCount; - private long _extremeTotalEventTime; - private double _lifetimeTotalValue; + private int _extremeTotalEventTime; + private float _lifetimeTotalValue; private long _lifetimeEventCount; private long _lifetimeTotalEventTime; private RateSummaryListener _summaryListener; @@ -227,10 +227,10 @@ public class Rate { // ok ok, lets coalesce // how much were we off by? (so that we can sample down the measured values) - double periodFactor = measuredPeriod / (double)_period; + float periodFactor = measuredPeriod / (float)_period; _lastTotalValue = _currentTotalValue / periodFactor; _lastEventCount = (int) (0.499999 + (_currentEventCount / periodFactor)); - _lastTotalEventTime = (long) (_currentTotalEventTime / periodFactor); + _lastTotalEventTime = (int) (_currentTotalEventTime / periodFactor); _lastCoalesceDate = now; if (_currentEventCount == 0) correctedTotalValue = 0; @@ -244,7 +244,7 @@ public class Rate { _extremeTotalEventTime = _lastTotalEventTime; } - _currentTotalValue = 0.0D; + _currentTotalValue = 0.0f; _currentEventCount = 0; _currentTotalEventTime = 0; } @@ -505,16 +505,16 @@ public class Rate { _period = PersistenceHelper.getInt(props, prefix, ".period"); _creationDate = PersistenceHelper.getLong(props, prefix, ".creationDate"); _lastCoalesceDate = PersistenceHelper.getLong(props, prefix, ".lastCoalesceDate"); - _currentTotalValue = PersistenceHelper.getDouble(props, prefix, ".currentTotalValue"); + _currentTotalValue = (float)PersistenceHelper.getDouble(props, prefix, ".currentTotalValue"); _currentEventCount = PersistenceHelper.getInt(props, prefix, ".currentEventCount"); - _currentTotalEventTime = PersistenceHelper.getLong(props, prefix, ".currentTotalEventTime"); - _lastTotalValue = PersistenceHelper.getDouble(props, prefix, ".lastTotalValue"); + _currentTotalEventTime = (int)PersistenceHelper.getLong(props, prefix, ".currentTotalEventTime"); + _lastTotalValue = (float)PersistenceHelper.getDouble(props, prefix, ".lastTotalValue"); _lastEventCount = PersistenceHelper.getInt(props, prefix, ".lastEventCount"); - _lastTotalEventTime = PersistenceHelper.getLong(props, prefix, ".lastTotalEventTime"); - _extremeTotalValue = PersistenceHelper.getDouble(props, prefix, ".extremeTotalValue"); + _lastTotalEventTime = (int)PersistenceHelper.getLong(props, prefix, ".lastTotalEventTime"); + _extremeTotalValue = (float)PersistenceHelper.getDouble(props, prefix, ".extremeTotalValue"); _extremeEventCount = PersistenceHelper.getInt(props, prefix, ".extremeEventCount"); - _extremeTotalEventTime = PersistenceHelper.getLong(props, prefix, ".extremeTotalEventTime"); - _lifetimeTotalValue = PersistenceHelper.getDouble(props, prefix, ".lifetimeTotalValue"); + _extremeTotalEventTime = (int)PersistenceHelper.getLong(props, prefix, ".extremeTotalEventTime"); + _lifetimeTotalValue = (float)PersistenceHelper.getDouble(props, prefix, ".lifetimeTotalValue"); _lifetimeEventCount = PersistenceHelper.getLong(props, prefix, ".lifetimeEventCount"); _lifetimeTotalEventTime = PersistenceHelper.getLong(props, prefix, ".lifetimeTotalEventTime"); diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java index 512fd6402..018ef1973 100644 --- a/core/java/src/net/i2p/stat/RateStat.java +++ b/core/java/src/net/i2p/stat/RateStat.java @@ -184,7 +184,7 @@ public class RateStat { buf.append("# Rate: ").append(_groupName).append(": ").append(_statName).append(NL); buf.append("# ").append(_description).append(NL); buf.append("# ").append(NL).append(NL); - out.write(buf.toString().getBytes()); + out.write(buf.toString().getBytes("UTF-8")); buf.setLength(0); for (Rate r: _rates){ buf.append("#######").append(NL); @@ -193,7 +193,7 @@ public class RateStat { buf.append(NL); String curPrefix = prefix + "." + DataHelper.formatDuration(r.getPeriod()); r.store(curPrefix, buf); - out.write(buf.toString().getBytes()); + out.write(buf.toString().getBytes("UTF-8")); buf.setLength(0); } } diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java index f0f59a1b9..7f6d9859b 100644 --- a/core/java/src/net/i2p/stat/StatManager.java +++ b/core/java/src/net/i2p/stat/StatManager.java @@ -1,5 +1,7 @@ package net.i2p.stat; +import java.io.IOException; +import java.io.OutputStream; import java.text.Collator; import java.util.HashMap; import java.util.HashSet; @@ -247,4 +249,18 @@ public class StatManager { public boolean ignoreStat(String statName) { return _context.isRouterContext() && !_context.getBooleanProperty(PROP_STAT_FULL); } + + /** + * Serializes all Frequencies and Rates to the provided OutputStream + * @param out to write to + * @param prefix to use when serializing + * @throws IOException if something goes wrong + * @since 0.9.23 + */ + public void store(OutputStream out, String prefix) throws IOException { + for (FrequencyStat fs : _frequencyStats.values()) + fs.store(out, prefix); + for (RateStat rs : _rateStats.values()) + rs.store(out,prefix); + } } diff --git a/core/java/src/net/i2p/update/UpdateManager.java b/core/java/src/net/i2p/update/UpdateManager.java index ce18c59ee..57065dcb3 100644 --- a/core/java/src/net/i2p/update/UpdateManager.java +++ b/core/java/src/net/i2p/update/UpdateManager.java @@ -121,6 +121,114 @@ public interface UpdateManager { * @return true if valid, false if corrupt */ public boolean notifyComplete(UpdateTask task, String actualVersion, File file); + + /** + * Is an update available? + * Blocking. + * An available update may still have a constraint or lack sources. + * @param type the UpdateType of this request + * @return new version or null if nothing newer is available + * @since 0.9.21 + */ + public String checkAvailable(UpdateType type); + + /** + * Is an update available? + * Blocking. + * An available update may still have a constraint or lack sources. + * @param type the UpdateType of this request + * @param maxWait max time to block + * @return new version or null if nothing newer is available + * @since 0.9.21 + */ + public String checkAvailable(UpdateType type, long maxWait); + + /** + * Is an update available? + * Blocking. + * An available update may still have a constraint or lack sources. + * @param type the UpdateType of this request + * @param maxWait max time to block + * @param id id of this request + * @return new version or null if nothing newer is available + * @since 0.9.21 + */ + public String checkAvailable(UpdateType type, String id, long maxWait); + + /** + * Is a router update being downloaded? + * @return true iff router update is being downloaded + * @since 0.9.21 + */ + public boolean isUpdateInProgress(); + + /** + * Is a router update being downloaded? + * @param type the UpdateType of this request + * @return true iff router update is being downloaded + * @since 0.9.21 + */ + public boolean isUpdateInProgress(UpdateType type); + + /** + * Is a router update being downloaded? + * @param type the UpdateType of this request + * @param id of this request + * @return true iff router update is being downloaded + * @since 0.9.21 + */ + public boolean isUpdateInProgress(UpdateType type, String id); + + /** + * Non-blocking. Does not check. + * Fails if check or update already in progress. + * If returns true, then call isUpdateInProgress() in a loop + * @param type the UpdateType of this request + * @return true if task started + * @since 0.9.21 + */ + public boolean update(UpdateType type); + + /** + * Non-blocking. Does not check. + * Fails if check or update already in progress. + * If returns true, then call isUpdateInProgress() in a loop + * @param type the UpdateType of this request + * @param id id of this request + * @return true if task started + * @since 0.9.21 + */ + public boolean update(UpdateType type, String id); + + /** + * Non-blocking. Does not check. + * Fails if check or update already in progress. + * If returns true, then call isUpdateInProgress() in a loop + * @param type the UpdateType of this request + * @param maxTime not honored by all Updaters + * @return true if task started + * @since 0.9.21 + */ + public boolean update(UpdateType type, long maxTime); + + /** + * Non-blocking. Does not check. + * Fails if check or update already in progress. + * If returns true, then call isUpdateInProgress() in a loop + * @param type the UpdateType of this request + * @param maxTime not honored by all Updaters + * @param id id of this request + * @return true if task started + * @since 0.9.21 + */ + public boolean update(UpdateType type, String id, long maxTime); + + /** + * The status on any update current or last finished. + * @return status or "" + * @since 0.9.21 + */ + public String getStatus(); /** * For debugging diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index d522167f4..6022bf35b 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -15,6 +15,8 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.I2PAppContext; /** @@ -60,10 +62,16 @@ public abstract class Addresses { } /** + * Warning: When includeLocal is false, + * all returned addresses should be routable, but they are not necessarily + * appropriate for external use. For example, Teredo and 6to4 addresses + * are included with IPv6 results. Additional validation is recommended. + * See e.g. TransportUtil.isPubliclyRoutable(). + * * @return a sorted set of all addresses including wildcard * @param includeLocal whether to include local * @param includeIPv6 whether to include IPV6 - * @return an array of all addresses + * @return a Set of all addresses * @since 0.8.3 */ public static SortedSet getAddresses(boolean includeLocal, boolean includeIPv6) { @@ -71,11 +79,17 @@ public abstract class Addresses { } /** + * Warning: When includeSiteLocal and includeLoopbackAndWildcard are false, + * all returned addresses should be routable, but they are not necessarily + * appropriate for external use. For example, Teredo and 6to4 addresses + * are included with IPv6 results. Additional validation is recommended. + * See e.g. TransportUtil.isPubliclyRoutable(). + * * @return a sorted set of all addresses * @param includeSiteLocal whether to include private like 192.168.x.x * @param includeLoopbackAndWildcard whether to include 127.x.x.x and 0.0.0.0 * @param includeIPv6 whether to include IPV6 - * @return an array of all addresses + * @return a Set of all addresses * @since 0.9.4 */ public static SortedSet getAddresses(boolean includeSiteLocal, @@ -117,7 +131,15 @@ public abstract class Addresses { } } } - } catch (SocketException e) {} + } catch (SocketException e) { + } catch (java.lang.Error e) { + // Windows, possibly when IPv6 only... + // https://bugs.openjdk.java.net/browse/JDK-8046500 + // java.lang.Error: IP Helper Library GetIfTable function failed + // at java.net.NetworkInterface.getAll(Native Method) + // at java.net.NetworkInterface.getNetworkInterfaces(Unknown Source) + // at net.i2p.util.Addresses.getAddresses ... + } if (includeLoopbackAndWildcard) { if (haveIPv4) @@ -229,10 +251,10 @@ public abstract class Addresses { I2PAppContext ctx = I2PAppContext.getCurrentContext(); if (ctx != null && ctx.isRouterContext()) { long maxMemory = SystemVersion.getMaxMemory(); - long min = 128; + long min = 256; long max = 4096; - // 512 nominal for 128 MB - size = (int) Math.max(min, Math.min(max, 1 + (maxMemory / (256*1024)))); + // 1024 nominal for 128 MB + size = (int) Math.max(min, Math.min(max, 1 + (maxMemory / (128*1024)))); } else { size = 32; } @@ -260,12 +282,9 @@ public abstract class Addresses { } if (rv == null) { try { - boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0; - if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3) - return null; rv = InetAddress.getByName(host).getAddress(); - if (isIPv4 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0) { + if (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host)) { synchronized (_IPAddress) { _IPAddress.put(host, rv); } diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java index a989e32fd..85c34b49b 100644 --- a/core/java/src/net/i2p/util/EepGet.java +++ b/core/java/src/net/i2p/util/EepGet.java @@ -15,7 +15,8 @@ import java.net.InetSocketAddress; import java.net.MalformedURLException; import java.net.Socket; import java.net.UnknownHostException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Date; @@ -24,6 +25,8 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import gnu.getopt.Getopt; @@ -270,7 +273,7 @@ public class EepGet { break; } // switch } // while - } catch (Exception e) { + } catch (RuntimeException e) { e.printStackTrace(); error = true; } @@ -312,22 +315,52 @@ public class EepGet { System.exit(1); } + /** + * Parse URL for a viable filename. + * + * @param url a URL giving the location of an online resource + * @return a filename to save the resource as on local filesystem + */ public static String suggestName(String url) { - int last = url.lastIndexOf('/'); - if ((last < 0) || (url.lastIndexOf('#') > last)) - last = url.lastIndexOf('#'); - if ((last < 0) || (url.lastIndexOf('?') > last)) - last = url.lastIndexOf('?'); - if ((last < 0) || (url.lastIndexOf('=') > last)) - last = url.lastIndexOf('='); + URI nameURL = null; + String name; // suggested name - String name = null; - if (last >= 0) - name = sanitize(url.substring(last+1)); - if ( (name != null) && (name.length() > 0) ) - return name; - else - return sanitize(url); + try { + nameURL = new URI(url); + } catch (URISyntaxException e) { + System.err.println("Please enter a properly formed URL."); + System.exit(1); + } + + String path = nameURL.getRawPath(); // discard any URI queries + + // if no file specified, eepget scrapes webpage - use domain as name + Pattern slashes = Pattern.compile("/+"); + Matcher matcher = slashes.matcher(path); + // if empty path or just /'s - nameURL lets multiple /'s through + if (path.equals("") || matcher.matches()) { + name = sanitize(nameURL.getAuthority()); + // if path specified + } else { + int last = path.lastIndexOf('/'); + // if last / not at end of string, use following string as filename + if (last != path.length() - 1) { + name = sanitize(path.substring(last + 1)); + // if there's a trailing / group look for previous / as trim point + } else { + int i = 1; + int slash; + while (true) { + slash = path.lastIndexOf('/', last - i); + if (slash != last - i) { + break; + } + i += 1; + } + name = sanitize(path.substring(slash + 1, path.length() - i)); + } + } + return name; } @@ -690,24 +723,31 @@ public class EepGet { if (_redirectLocation != null) { // we also are here after a 407 - //try { + try { if (_redirectLocation.startsWith("http://")) { _actualURL = _redirectLocation; } else { // the Location: field has been required to be an absolute URI at least since // RFC 1945 (HTTP/1.0 1996), so it isn't clear what the point of this is. // This oddly adds a ":" even if no port, but that seems to work. - URL url = new URL(_actualURL); - if (_redirectLocation.startsWith("/")) - _actualURL = "http://" + url.getHost() + ":" + url.getPort() + _redirectLocation; + URI url = new URI(_actualURL); + String host = url.getHost(); + if (host == null) + throw new MalformedURLException("Redirected to invalid URL"); + int port = url.getPort(); + if (port < 0) + port = 80; + if (_redirectLocation.startsWith("/")) + _actualURL = "http://" + host + ":" + port + _redirectLocation; else // this blows up completely on a redirect to https://, for example - _actualURL = "http://" + url.getHost() + ":" + url.getPort() + "/" + _redirectLocation; + _actualURL = "http://" + host+ ":" + port + "/" + _redirectLocation; } - // an MUE is an IOE - //} catch (MalformedURLException mue) { - // throw new IOException("Redirected from an invalid URL"); - //} + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Redirected to invalid URL"); + ioe.initCause(use); + throw ioe; + } AuthState as = _authState; if (_responseCode == 407) { @@ -755,6 +795,8 @@ public class EepGet { Thread pusher = null; _decompressException = null; if (_isGzippedResponse) { + if (_log.shouldInfo()) + _log.info("Gzipped response, starting decompressor"); PipedInputStream pi = BigPipedInputStream.getInstance(); PipedOutputStream po = new PipedOutputStream(pi); pusher = new I2PAppThread(new Gunzipper(pi, _out), "EepGet Decompressor"); @@ -923,6 +965,8 @@ public class EepGet { case 409: // bad addr helper case 410: // gone case 414: // URI too long + case 418: // backoff + case 420: // backoff case 429: // too many requests case 431: // headers too long case 503: // no outproxy @@ -1094,8 +1138,8 @@ public class EepGet { */ private int handleStatus(String line) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("Status line: [" + line + "]"); - String[] toks = line.split(" ", 3); + _log.debug("Status line: [" + line.trim() + "]"); + String[] toks = DataHelper.split(line, " ", 3); if (toks.length < 2) { if (_log.shouldLog(Log.WARN)) _log.warn("ERR: status "+ line); @@ -1158,17 +1202,13 @@ public class EepGet { lookahead[1] = lookahead[2]; lookahead[2] = (byte)cur; } + private static boolean isEndOfHeaders(byte lookahead[]) { - byte first = lookahead[0]; - byte second = lookahead[1]; - byte third = lookahead[2]; - return (isNL(second) && isNL(third)) || // \n\n - (isNL(first) && isNL(third)); // \n\r\n + return lookahead[2] == NL && + (lookahead[0] == NL || lookahead[1] == NL); // \n\n or \n\r\n } - /** we ignore any potential \r, since we trim it on write anyway */ private static final byte NL = '\n'; - private static boolean isNL(byte b) { return (b == NL); } /** * @param timeout may be null @@ -1194,10 +1234,12 @@ public class EepGet { if (_shouldProxy) { _proxy = InternalSocket.getSocket(_proxyHost, _proxyPort); } else { - //try { - URL url = new URL(_actualURL); - if ("http".equals(url.getProtocol())) { + try { + URI url = new URI(_actualURL); + if ("http".equals(url.getScheme())) { String host = url.getHost(); + if (host == null) + throw new MalformedURLException("URL is not supported:" + _actualURL); String hostlc = host.toLowerCase(Locale.US); if (hostlc.endsWith(".i2p")) throw new UnknownHostException("I2P addresses must be proxied"); @@ -1216,10 +1258,11 @@ public class EepGet { } else { throw new MalformedURLException("URL is not supported:" + _actualURL); } - // an MUE is an IOE - //} catch (MalformedURLException mue) { - // throw new IOException("Request URL is invalid"); - //} + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Request URL is invalid"); + ioe.initCause(use); + throw ioe; + } } _proxyIn = _proxy.getInputStream(); if (!(_proxy instanceof InternalSocket)) @@ -1241,13 +1284,20 @@ public class EepGet { boolean post = false; if ( (_postData != null) && (_postData.length() > 0) ) post = true; - URL url = new URL(_actualURL); + URI url; + try { + url = new URI(_actualURL); + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Bad URL"); + ioe.initCause(use); + throw ioe; + } String host = url.getHost(); if (host == null || host.length() <= 0) throw new MalformedURLException("Bad URL, no host"); int port = url.getPort(); - String path = url.getPath(); - String query = url.getQuery(); + String path = url.getRawPath(); + String query = url.getRawQuery(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Requesting " + _actualURL); // RFC 2616 sec 5.1.2 - full URL if proxied, absolute path only if not proxied @@ -1313,7 +1363,8 @@ public class EepGet { buf.append("Content-length: ").append(_postData.length()).append("\r\n"); // This will be replaced if we are going through I2PTunnelHTTPClient buf.append("Accept-Encoding: "); - if ((!_shouldProxy) && + // as of 0.9.23, the proxy passes the Accept-Encoding header through + if ( /* (!_shouldProxy) && */ // This is kindof a hack, but if we are downloading a gzip file // we don't want to transparently gunzip it and save it as a .gz file. (!path.endsWith(".gz")) && (!path.endsWith(".tgz"))) @@ -1469,7 +1520,7 @@ public class EepGet { String key = null; for (int i = 0; i < data.length; i++) { switch (data[i]) { - case '\"': + case '"': if (isQuoted) { // keys never quoted if (key != null) { diff --git a/core/java/src/net/i2p/util/EepHead.java b/core/java/src/net/i2p/util/EepHead.java index c1ddb6282..c9f375e45 100644 --- a/core/java/src/net/i2p/util/EepHead.java +++ b/core/java/src/net/i2p/util/EepHead.java @@ -6,7 +6,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; -import java.net.URL; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import gnu.getopt.Getopt; @@ -107,7 +109,7 @@ public class EepHead extends EepGet { break; } // switch } // while - } catch (Exception e) { + } catch (RuntimeException e) { e.printStackTrace(); error = true; } @@ -176,24 +178,31 @@ public class EepHead extends EepGet { // Should we even follow redirects for HEAD? if (_redirectLocation != null) { - //try { + try { if (_redirectLocation.startsWith("http://")) { _actualURL = _redirectLocation; } else { // the Location: field has been required to be an absolute URI at least since // RFC 1945 (HTTP/1.0 1996), so it isn't clear what the point of this is. // This oddly adds a ":" even if no port, but that seems to work. - URL url = new URL(_actualURL); - if (_redirectLocation.startsWith("/")) - _actualURL = "http://" + url.getHost() + ":" + url.getPort() + _redirectLocation; + URI url = new URI(_actualURL); + String host = url.getHost(); + if (host == null) + throw new MalformedURLException("Redirected to invalid URL"); + int port = url.getPort(); + if (port < 0) + port = 80; + if (_redirectLocation.startsWith("/")) + _actualURL = "http://" + host + ":" + port + _redirectLocation; else // this blows up completely on a redirect to https://, for example - _actualURL = "http://" + url.getHost() + ":" + url.getPort() + "/" + _redirectLocation; + _actualURL = "http://" + host+ ":" + port + "/" + _redirectLocation; } - // an MUE is an IOE - //} catch (MalformedURLException mue) { - // throw new IOException("Redirected from an invalid URL"); - //} + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Redirected to invalid URL"); + ioe.initCause(use); + throw ioe; + } AuthState as = _authState; if (_responseCode == 407) { if (!_shouldProxy) @@ -252,11 +261,20 @@ public class EepHead extends EepGet { @Override protected String getRequest() throws IOException { StringBuilder buf = new StringBuilder(512); - URL url = new URL(_actualURL); + URI url; + try { + url = new URI(_actualURL); + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Bad URL"); + ioe.initCause(use); + throw ioe; + } String host = url.getHost(); + if (host == null) + throw new MalformedURLException("Bad URL"); int port = url.getPort(); - String path = url.getPath(); - String query = url.getQuery(); + String path = url.getRawPath(); + String query = url.getRawQuery(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Requesting " + _actualURL); // RFC 2616 sec 5.1.2 - full URL if proxied, absolute path only if not proxied diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java index eeca4416f..296030818 100644 --- a/core/java/src/net/i2p/util/FileUtil.java +++ b/core/java/src/net/i2p/util/FileUtil.java @@ -300,9 +300,9 @@ public class FileUtil { if (!_failedOracle) { try { Class p200 = Class.forName("java.util.jar.Pack200", true, ClassLoader.getSystemClassLoader()); - Method newUnpacker = p200.getMethod("newUnpacker", (Class[]) null); + Method newUnpacker = p200.getMethod("newUnpacker"); Object unpacker = newUnpacker.invoke(null,(Object[]) null); - Method unpack = unpacker.getClass().getMethod("unpack", new Class[] {InputStream.class, JarOutputStream.class}); + Method unpack = unpacker.getClass().getMethod("unpack", InputStream.class, JarOutputStream.class); // throws IOException unpack.invoke(unpacker, new Object[] {in, out}); return; @@ -321,9 +321,9 @@ public class FileUtil { if (!_failedApache) { try { Class p200 = Class.forName("org.apache.harmony.unpack200.Archive", true, ClassLoader.getSystemClassLoader()); - Constructor newUnpacker = p200.getConstructor(new Class[] {InputStream.class, JarOutputStream.class}); - Object unpacker = newUnpacker.newInstance(new Object[] {in, out}); - Method unpack = unpacker.getClass().getMethod("unpack", (Class[]) null); + Constructor newUnpacker = p200.getConstructor(InputStream.class, JarOutputStream.class); + Object unpacker = newUnpacker.newInstance(in, out); + Method unpack = unpacker.getClass().getMethod("unpack"); // throws IOException or Pack200Exception unpack.invoke(unpacker, (Object[]) null); return; diff --git a/core/java/src/net/i2p/util/FortunaRandomSource.java b/core/java/src/net/i2p/util/FortunaRandomSource.java index 340b836a4..e386e325c 100644 --- a/core/java/src/net/i2p/util/FortunaRandomSource.java +++ b/core/java/src/net/i2p/util/FortunaRandomSource.java @@ -11,6 +11,7 @@ package net.i2p.util; import gnu.crypto.prng.AsyncFortunaStandalone; +import java.io.IOException; import java.security.SecureRandom; import net.i2p.I2PAppContext; @@ -262,8 +263,14 @@ public class FortunaRandomSource extends RandomSource implements EntropyHarveste /** reseed the fortuna */ @Override public void feedEntropy(String source, byte[] data, int offset, int len) { - synchronized(_fortuna) { - _fortuna.addRandomBytes(data, offset, len); + try { + synchronized(_fortuna) { + _fortuna.addRandomBytes(data, offset, len); + } + } catch (RuntimeException e) { + // AIOOBE seen, root cause unknown, ticket #1576 + Log log = _context.logManager().getLog(FortunaRandomSource.class); + log.warn("feedEntropy()", e); } } @@ -284,6 +291,6 @@ public class FortunaRandomSource extends RandomSource implements EntropyHarveste rand.nextBytes(buf); System.out.write(buf); } - } catch (Exception e) { e.printStackTrace(); } + } catch (IOException e) { e.printStackTrace(); } } } diff --git a/core/java/src/net/i2p/util/HexDump.java b/core/java/src/net/i2p/util/HexDump.java index 0d56d2f98..69adacf7c 100644 --- a/core/java/src/net/i2p/util/HexDump.java +++ b/core/java/src/net/i2p/util/HexDump.java @@ -13,6 +13,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import net.i2p.data.DataHelper; + /** * Hexdump class (well, it's actually a namespace with some functions, * but let's stick with java terminology :-). These methods generate @@ -25,7 +27,7 @@ public class HexDump { private static final int FORMAT_OFFSET_PADDING = 8; private static final int FORMAT_BYTES_PER_ROW = 16; - private static final byte[] HEXCHARS = "0123456789abcdef".getBytes(); + private static final byte[] HEXCHARS = DataHelper.getASCII("0123456789abcdef"); /** * Dump a byte array in a String. @@ -37,11 +39,10 @@ public class HexDump { try { dump(data, 0, data.length, out); + return out.toString("ISO-8859-1"); } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException("no 8859?", e); } - - return out.toString(); } /** @@ -56,11 +57,10 @@ public class HexDump { try { dump(data, off, len, out); + return out.toString("ISO-8859-1"); } catch (IOException e) { - e.printStackTrace(); + throw new RuntimeException("no 8859?", e); } - - return out.toString(); } /** @@ -91,9 +91,10 @@ public class HexDump { hexoff = Integer.toString(dumpoff, 16); hexofflen = hexoff.length(); for (i = 0; i < FORMAT_OFFSET_PADDING - hexofflen; ++i) { - hexoff = "0" + hexoff; + out.write('0'); } - out.write((hexoff + " ").getBytes()); + out.write(DataHelper.getASCII(hexoff)); + out.write(' '); // Bytes to be printed in the current line nextbytes = (FORMAT_BYTES_PER_ROW < (end - dumpoff) ? FORMAT_BYTES_PER_ROW : (end - dumpoff)); @@ -101,35 +102,48 @@ public class HexDump { for (i = 0; i < FORMAT_BYTES_PER_ROW; ++i) { // Put two spaces to separate 8-bytes blocks if ((i % 8) == 0) { - out.write(" ".getBytes()); + out.write(' '); } if (i >= nextbytes) { - out.write(" ".getBytes()); + out.write(DataHelper.getASCII(" ")); } else { val = data[dumpoff + i] & 0xff; out.write(HEXCHARS[val >>> 4]); out.write(HEXCHARS[val & 0xf]); - out.write(" ".getBytes()); + out.write(' '); } } - out.write(" |".getBytes()); + out.write(DataHelper.getASCII(" |")); for (i = 0; i < FORMAT_BYTES_PER_ROW; ++i) { if (i >= nextbytes) { - out.write(" ".getBytes()); + out.write(' '); } else { val = data[i + dumpoff]; // Is it a printable character? if ((val > 31) && (val < 127)) { out.write(val); } else { - out.write(".".getBytes()); + out.write('.'); } } } - out.write("|\n".getBytes()); + out.write('|'); + out.write('\n'); } } -} \ No newline at end of file + + /** + * @since 0.9.21 + */ +/**** + public static void main(String[] args) { + byte[] b = new byte[9993]; + RandomSource.getInstance().nextBytes(b); + System.out.println(dump(b)); + System.out.println(dump("test test test abcde xyz !!!".getBytes())); + } +****/ +} diff --git a/core/java/src/net/i2p/util/I2PAppThread.java b/core/java/src/net/i2p/util/I2PAppThread.java index da291d210..ebbe6c06e 100644 --- a/core/java/src/net/i2p/util/I2PAppThread.java +++ b/core/java/src/net/i2p/util/I2PAppThread.java @@ -14,10 +14,13 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** - * Like I2PThread but with per-thread OOM listeners, + * Like {@link I2PThread} but with per-thread OOM listeners, * rather than a static router-wide listener list, * so that an OOM in an app won't call the router listener * to shutdown the whole router. + * + * This is preferred for application use. + * See {@link I2PThread} for features. */ public class I2PAppThread extends I2PThread { @@ -38,9 +41,17 @@ public class I2PAppThread extends I2PThread { public I2PAppThread(Runnable r, String name) { super(r, name); } + public I2PAppThread(Runnable r, String name, boolean isDaemon) { super(r, name, isDaemon); } + + /** + * @since 0.9.23 + */ + public I2PAppThread(ThreadGroup group, Runnable r, String name) { + super(group, r, name); + } @Override protected void fireOOM(OutOfMemoryError oom) { diff --git a/core/java/src/net/i2p/util/I2PSSLSocketFactory.java b/core/java/src/net/i2p/util/I2PSSLSocketFactory.java index 6c149252b..1b8342808 100644 --- a/core/java/src/net/i2p/util/I2PSSLSocketFactory.java +++ b/core/java/src/net/i2p/util/I2PSSLSocketFactory.java @@ -83,6 +83,7 @@ import javax.net.ssl.TrustManagerFactory; import net.i2p.I2PAppContext; import net.i2p.crypto.KeyStoreUtil; +import net.i2p.data.DataHelper; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.util.PublicSuffixList; @@ -204,7 +205,15 @@ public class I2PSSLSocketFactory { "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", - "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA" + "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", + // following is disabled because it is weak + // see e.g. https://bugzilla.mozilla.org/show_bug.cgi?id=1107787 + "TLS_DHE_DSS_WITH_AES_128_CBC_SHA" + // ??? "TLS_DHE_DSS_WITH_AES_256_CBC_SHA" + // + // NOTE: + // If you add anything here, please also add to installer/resources/eepsite/jetty-ssl.xml + // })); /** @@ -284,7 +293,7 @@ public class I2PSSLSocketFactory { host.equals("localhost") || host.equals("127.0.0.1") || host.equals("::1") || - host.equals("0:0:0:0:0:0:0::1")) { + host.equals("0:0:0:0:0:0:0:1")) { if (log.shouldWarn()) log.warn("Skipping hostname validation for " + host); return; @@ -301,7 +310,6 @@ public class I2PSSLSocketFactory { // is not a viable option because the default HostnameVerifier expects to only be called // in the case that there is a mismatch (and therefore always returns false) while some // of the AsyncHttpClient providers (e.g. Netty, the default) call it on all connections. - // in the case that there is a mismatch (and therefore always returns false) while some // To make matters worse, the check is not trivial (consider SAN and wildcard matching) // and is implemented in sun.security.util.HostnameChecker (a Sun internal proprietary API). // This leaves the developer in the position of either depending on an internal API or @@ -436,7 +444,7 @@ public class I2PSSLSocketFactory { try { if (line.charAt(0) == '#') continue; - String[] s = line.split(","); + String[] s = DataHelper.split(line, ","); String lc = s[0].toLowerCase(Locale.US); tlds.add(lc); i++; diff --git a/core/java/src/net/i2p/util/I2PThread.java b/core/java/src/net/i2p/util/I2PThread.java index 044b82f54..196bae7d5 100644 --- a/core/java/src/net/i2p/util/I2PThread.java +++ b/core/java/src/net/i2p/util/I2PThread.java @@ -14,68 +14,63 @@ import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** - * In case its useful later... - * (e.g. w/ native programatic thread dumping, etc) - * + * Preferred over {@link Thread} for all router uses. + * For applications, {@link I2PAppThread} is preferred. + *

              + * Provides the following features: + *

                + *
              • Logging to wrapper log on unexpected termination in {@link #run()}. + *
              • Notification of OOM to registered listener (the router), + * which will cause logging to the wrapper log and a router restart + *
              • Catching and logging "OOM" caused by thread limit in {@link #start()} + * with distinct message, and does not call the OOM listener. + *
              • As of 0.9.21, initialization to NORM_PRIORITY + * (not the priority of the creating thread). + *
              */ public class I2PThread extends Thread { - /** - * Non-static to avoid refs to old context in Android. - * Probably should just remove all the logging though. - * Logging removed, too much trouble with extra contexts - */ - //private volatile Log _log; + private static final Set _listeners = new CopyOnWriteArraySet(); - //private String _name; - //private Exception _createdBy; public I2PThread() { super(); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } public I2PThread(String name) { super(name); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } public I2PThread(Runnable r) { super(r); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } public I2PThread(Runnable r, String name) { super(r, name); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } + public I2PThread(Runnable r, String name, boolean isDaemon) { super(r, name); setDaemon(isDaemon); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } public I2PThread(ThreadGroup g, Runnable r) { super(g, r); - //if ( (_log == null) || (_log.shouldLog(Log.DEBUG)) ) - // _createdBy = new Exception("Created by"); + setPriority(NORM_PRIORITY); } -/**** - private void log(int level, String msg) { log(level, msg, null); } - - private void log(int level, String msg, Throwable t) { - // we cant assume log is created - if (_log == null) _log = new Log(I2PThread.class); - if (_log.shouldLog(level)) - _log.log(level, msg, t); + /** + * @since 0.9.23 + */ + public I2PThread(ThreadGroup group, Runnable r, String name) { + super(group, r, name); + setPriority(NORM_PRIORITY); } -****/ - + /** * Overridden to provide useful info to users on OOM, and to prevent * shutting down the whole JVM for what is most likely not a heap issue. @@ -95,25 +90,18 @@ public class I2PThread extends Thread { System.out.println("Check ulimit -u, /etc/security/limits.conf, or /proc/sys/kernel/threads-max"); } oom.printStackTrace(); + if (!(SystemVersion.isWindows() || SystemVersion.isAndroid())) + throw new RuntimeException("Thread could not be started, " + + "Check ulimit -u, /etc/security/limits.conf, or /proc/sys/kernel/threads-max", oom); throw new RuntimeException("Thread could not be started", oom); } } @Override public void run() { - //_name = Thread.currentThread().getName(); - //log(Log.INFO, "New thread started" + (isDaemon() ? " (daemon): " : ": ") + _name, _createdBy); try { super.run(); } catch (Throwable t) { - /**** - try { - log(Log.CRIT, "Thread terminated unexpectedly: " + getName(), t); - } catch (Throwable woof) { - System.err.println("Died within the OOM itself"); - t.printStackTrace(); - } - ****/ if (t instanceof OutOfMemoryError) { fireOOM((OutOfMemoryError)t); } else { @@ -121,18 +109,8 @@ public class I2PThread extends Thread { t.printStackTrace(); } } - // This creates a new I2PAppContext after it was deleted - // in Router.finalShutdown() via RouterContext.killGlobalContext() - //log(Log.INFO, "Thread finished normally: " + _name); } -/**** - protected void finalize() throws Throwable { - //log(Log.DEBUG, "Thread finalized: " + _name); - super.finalize(); - } -****/ - protected void fireOOM(OutOfMemoryError oom) { for (OOMEventListener listener : _listeners) listener.outOfMemory(oom); diff --git a/core/java/src/net/i2p/util/InternalSocket.java b/core/java/src/net/i2p/util/InternalSocket.java index d2b4cb458..6e7d3c8d0 100644 --- a/core/java/src/net/i2p/util/InternalSocket.java +++ b/core/java/src/net/i2p/util/InternalSocket.java @@ -68,7 +68,7 @@ public class InternalSocket extends Socket { } @Override - public void close() { + public synchronized void close() { try { if (_is != null) { _is.close(); @@ -84,7 +84,7 @@ public class InternalSocket extends Socket { } @Override - public boolean isClosed() { + public synchronized boolean isClosed() { return _is == null || _os == null; } diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 85d948c53..a88fc1df9 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -10,6 +10,7 @@ package net.i2p.util; */ import java.io.File; +import java.io.Flushable; import java.io.IOException; import java.text.DateFormat; import java.text.DecimalFormat; @@ -21,7 +22,6 @@ import java.util.Map; import java.util.Properties; import java.util.Queue; import java.util.Set; -import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; @@ -37,7 +37,7 @@ import net.i2p.data.DataHelper; * writes them where appropriate. * */ -public class LogManager { +public class LogManager implements Flushable { public final static String CONFIG_LOCATION_PROP = "loggerConfigLocation"; public final static String FILENAME_OVERRIDE_PROP = "loggerFilenameOverride"; public final static String CONFIG_LOCATION_DEFAULT = "logger.config"; @@ -478,9 +478,7 @@ public class LogManager { if (!format.equals("")) fmt.applyPattern(format); // the router sets the JVM time zone to UTC but saves the original here so we can get it - String systemTimeZone = _context.getProperty("i2p.systemTimeZone"); - if (systemTimeZone != null) - fmt.setTimeZone(TimeZone.getTimeZone(systemTimeZone)); + fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); _dateFormatPattern = format; _dateFormat = fmt; return true; @@ -762,7 +760,7 @@ public class LogManager { private static final AtomicInteger __id = new AtomicInteger(); - private class ShutdownHook extends Thread { + private class ShutdownHook extends I2PAppThread { private final int _id; public ShutdownHook() { _id = __id.incrementAndGet(); diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index d46a6ec76..78ecd11a7 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -9,19 +9,20 @@ package net.i2p.util; * */ -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Date; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; /** * Render a log record according to the log manager's settings * */ class LogRecordFormatter { - private final static String NL = System.getProperty("line.separator"); + final static String NL = System.getProperty("line.separator"); // arbitrary max length for the classname property (this makes is it lines up nicely) private final static int MAX_WHERE_LENGTH = 30; // if we're going to have one for where... be consistent @@ -71,16 +72,11 @@ class LogRecordFormatter { } buf.append(NL); if (rec.getThrowable() != null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(512); - PrintWriter pw = new PrintWriter(baos, true); + StringWriter sw = new StringWriter(512); + PrintWriter pw = new PrintWriter(sw); rec.getThrowable().printStackTrace(pw); - try { - pw.flush(); - baos.flush(); - } catch (IOException ioe) { // nop - } - byte tb[] = baos.toByteArray(); - buf.append(new String(tb)); + pw.flush(); + buf.append(sw.toString()); } return buf.toString(); } diff --git a/core/java/src/net/i2p/util/LogWriterBase.java b/core/java/src/net/i2p/util/LogWriterBase.java index 117e2786f..4eb6b8942 100644 --- a/core/java/src/net/i2p/util/LogWriterBase.java +++ b/core/java/src/net/i2p/util/LogWriterBase.java @@ -67,13 +67,15 @@ abstract class LogWriterBase implements Runnable { public void run() { _write = true; + // don't bother on Android + final boolean shouldReadConfig = !SystemVersion.isAndroid(); try { while (_write) { flushRecords(); - if (_write) + if (_write && shouldReadConfig) rereadConfig(); } - } catch (Exception e) { + } catch (RuntimeException e) { System.err.println("Error writing the log: " + e); e.printStackTrace(); } @@ -97,8 +99,7 @@ abstract class LogWriterBase implements Runnable { dupCount++; } else { if (dupCount > 0) { - writeRecord(_last.getPriority(), dupMessage(dupCount, _last, false)); - _manager.getBuffer().add(dupMessage(dupCount, _last, true)); + writeDupMessage(dupCount, _last); dupCount = 0; } writeRecord(rec); @@ -106,8 +107,7 @@ abstract class LogWriterBase implements Runnable { _last = rec; } if (dupCount > 0) { - writeRecord(_last.getPriority(), dupMessage(dupCount, _last, false)); - _manager.getBuffer().add(dupMessage(dupCount, _last, true)); + writeDupMessage(dupCount, _last); } flushWriter(); } @@ -125,14 +125,30 @@ abstract class LogWriterBase implements Runnable { } } + /** + * Write a msg with the date stamp of the last duplicate + * @since 0.9.21 + */ + private void writeDupMessage(int dupCount, LogRecord lastRecord) { + String dmsg = dupMessage(dupCount, lastRecord, false); + writeRecord(lastRecord.getPriority(), dmsg); + if (_manager.getDisplayOnScreenLevel() <= lastRecord.getPriority() && _manager.displayOnScreen()) + System.out.print(dmsg); + dmsg = dupMessage(dupCount, lastRecord, true); + _manager.getBuffer().add(dmsg); + if (lastRecord.getPriority() >= Log.CRIT) + _manager.getBuffer().addCritical(dmsg); + } + /** * Return a msg with the date stamp of the last duplicate * @since 0.9.3 */ private String dupMessage(int dupCount, LogRecord lastRecord, boolean reverse) { - String arrows = reverse ? "↓↓↓" : "^^^"; + String arrows = reverse ? (SystemVersion.isAndroid() ? "vvv" : "↓↓↓") : "^^^"; return LogRecordFormatter.getWhen(_manager, lastRecord) + ' ' + arrows + ' ' + - _(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + '\n'; + _t(dupCount, "1 similar message omitted", "{0} similar messages omitted") + ' ' + arrows + + LogRecordFormatter.NL; } private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; @@ -141,7 +157,7 @@ abstract class LogWriterBase implements Runnable { * gettext * @since 0.9.3 */ - private String _(int a, String b, String c) { + private String _t(int a, String b, String c) { return Translate.getString(a, b, c, _manager.getContext(), BUNDLE_NAME); } diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java index afb380cf9..96129b5ac 100644 --- a/core/java/src/net/i2p/util/NativeBigInteger.java +++ b/core/java/src/net/i2p/util/NativeBigInteger.java @@ -35,6 +35,7 @@ import freenet.support.CPUInformation.UnknownCPUException; import net.i2p.I2PAppContext; import net.i2p.crypto.CryptoConstants; +import net.i2p.data.DataHelper; /** *

              BigInteger that takes advantage of the jbigi library for the modPow operation, @@ -734,7 +735,7 @@ public class NativeBigInteger extends BigInteger { in = new BufferedReader(new InputStreamReader(new FileInputStream("/proc/cpuinfo"), "ISO-8859-1"), 4096); String line = null; while ( (line = in.readLine()) != null) { - String[] parts = line.split(":", 2); + String[] parts = DataHelper.split(line, ":", 2); if (parts.length < 2) continue; String key = parts[0].trim().toLowerCase(Locale.US); diff --git a/core/java/src/net/i2p/util/PartialEepGet.java b/core/java/src/net/i2p/util/PartialEepGet.java index baab6e039..9d853137d 100644 --- a/core/java/src/net/i2p/util/PartialEepGet.java +++ b/core/java/src/net/i2p/util/PartialEepGet.java @@ -6,7 +6,8 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Locale; import gnu.getopt.Getopt; @@ -106,7 +107,7 @@ public class PartialEepGet extends EepGet { break; } // switch } // while - } catch (Exception e) { + } catch (RuntimeException e) { e.printStackTrace(); error = true; } @@ -167,13 +168,20 @@ public class PartialEepGet extends EepGet { @Override protected String getRequest() throws IOException { StringBuilder buf = new StringBuilder(2048); - URL url = new URL(_actualURL); + URI url; + try { + url = new URI(_actualURL); + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Bad URL"); + ioe.initCause(use); + throw ioe; + } String host = url.getHost(); if (host == null || host.length() <= 0) throw new MalformedURLException("Bad URL, no host"); int port = url.getPort(); - String path = url.getPath(); - String query = url.getQuery(); + String path = url.getRawPath(); + String query = url.getRawQuery(); if (_log.shouldLog(Log.DEBUG)) _log.debug("Requesting " + _actualURL); // RFC 2616 sec 5.1.2 - full URL if proxied, absolute path only if not proxied diff --git a/core/java/src/net/i2p/util/PortMapper.java b/core/java/src/net/i2p/util/PortMapper.java index b3c8e65e7..28127dd0e 100644 --- a/core/java/src/net/i2p/util/PortMapper.java +++ b/core/java/src/net/i2p/util/PortMapper.java @@ -2,6 +2,7 @@ package net.i2p.util; import java.io.IOException; import java.io.Writer; +import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -16,7 +17,7 @@ import net.i2p.I2PAppContext; * @since 0.8.12 */ public class PortMapper { - private final ConcurrentHashMap _dir; + private final ConcurrentHashMap _dir; public static final String SVC_CONSOLE = "console"; public static final String SVC_HTTPS_CONSOLE = "https_console"; @@ -29,15 +30,21 @@ public class PortMapper { public static final String SVC_SMTP = "SMTP"; public static final String SVC_POP = "POP3"; public static final String SVC_SAM = "SAM"; + /** @since 0.9.24 */ + public static final String SVC_SAM_UDP = "SAM-UDP"; + /** @since 0.9.24 */ + public static final String SVC_SAM_SSL = "SAM-SSL"; public static final String SVC_BOB = "BOB"; /** not necessary, already in config? */ public static final String SVC_I2CP = "I2CP"; + /** @since 0.9.23 */ + public static final String SVC_I2CP_SSL = "I2CP-SSL"; /** * @param context unused for now */ public PortMapper(I2PAppContext context) { - _dir = new ConcurrentHashMap(8); + _dir = new ConcurrentHashMap(8); } /** @@ -46,9 +53,19 @@ public class PortMapper { * @return success, false if already registered */ public boolean register(String service, int port) { - if (port <= 0) + return register(service, "127.0.0.1", port); + } + + /** + * Add the service + * @param port > 0 + * @return success, false if already registered + * @since 0.9.21 + */ + public boolean register(String service, String host, int port) { + if (port <= 0 || port > 65535) return false; - return _dir.putIfAbsent(service, Integer.valueOf(port)) == null; + return _dir.putIfAbsent(service, InetSocketAddress.createUnresolved(host, port)) == null; } /** @@ -73,10 +90,24 @@ public class PortMapper { * @return def if not registered */ public int getPort(String service, int def) { - Integer port = _dir.get(service); - if (port == null) + InetSocketAddress ia = _dir.get(service); + if (ia == null) return def; - return port.intValue(); + return ia.getPort(); + } + + /** + * Get the registered host for a service. + * Will return "127.0.0.1" if the service was registered without a host. + * @param def default + * @return def if not registered + * @since 0.9.21 + */ + public String getHost(String service, String def) { + InetSocketAddress ia = _dir.get(service); + if (ia == null) + return def; + return ia.getHostName(); } /** @@ -84,11 +115,14 @@ public class PortMapper { * @since 0.9.20 */ public void renderStatusHTML(Writer out) throws IOException { - List services = new ArrayList(_dir.keySet()); - out.write("

              Port Mapper

              ServicePort\n"); + List services = new ArrayList(_dir.keySet()); + out.write("

              Port Mapper

              ServiceHostPort\n"); Collections.sort(services); for (String s : services) { - out.write("
              " + s + "" + _dir.get(s) + '\n'); + InetSocketAddress ia = _dir.get(s); + if (ia == null) + continue; + out.write("
              " + s + "" + ia.getHostName() + "" + ia.getPort() + '\n'); } out.write("
              \n"); } diff --git a/core/java/src/net/i2p/util/ResettableGZIPInputStream.java b/core/java/src/net/i2p/util/ResettableGZIPInputStream.java index b7a163e59..13eecb518 100644 --- a/core/java/src/net/i2p/util/ResettableGZIPInputStream.java +++ b/core/java/src/net/i2p/util/ResettableGZIPInputStream.java @@ -110,7 +110,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { //if (_lookaheadStream.getEOFReached()) { if (inf.finished()) { verifyFooter(); - inf.reset(); // so it doesn't bitch about missing data... + inf.reset(); // so it doesn't complain about missing data... _complete = true; } return read; @@ -124,7 +124,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { public long getTotalRead() { try { return inf.getBytesRead(); - } catch (Exception e) { + } catch (RuntimeException e) { return 0; } } @@ -136,7 +136,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { public long getTotalExpanded() { try { return inf.getBytesWritten(); - } catch (Exception e) { + } catch (RuntimeException e) { // possible NPE in some implementations return 0; } @@ -149,7 +149,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { public long getRemaining() { try { return inf.getRemaining(); - } catch (Exception e) { + } catch (RuntimeException e) { // possible NPE in some implementations return 0; } @@ -162,7 +162,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { public boolean getFinished() { try { return inf.finished(); - } catch (Exception e) { + } catch (RuntimeException e) { // possible NPE in some implementations return true; } @@ -375,40 +375,51 @@ public class ResettableGZIPInputStream extends InflaterInputStream { /****** public static void main(String args[]) { - for (int i = 129; i < 64*1024; i++) { - if (!test(i)) return; + + java.util.Random r = new java.util.Random(); + for (int i = 129; i < 64*1024; i+= 17) { + byte[] b = new byte[i]; + r.nextBytes(b); + if (!test(b)) return; } - byte orig[] = "ho ho ho, merry christmas".getBytes(); try { - java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(64); - java.util.zip.GZIPOutputStream o = new java.util.zip.GZIPOutputStream(baos); - o.write(orig); - o.finish(); - o.flush(); - o.close(); - byte compressed[] = baos.toByteArray(); - ResettableGZIPInputStream i = new ResettableGZIPInputStream(); - i.initialize(new ByteArrayInputStream(compressed)); - byte readBuf[] = new byte[128]; - int read = i.read(readBuf); - if (read != orig.length) - throw new RuntimeException("read=" + read); - for (int j = 0; j < read; j++) - if (readBuf[j] != orig[j]) - throw new RuntimeException("wtf, j=" + j + " readBuf=" + readBuf[j] + " orig=" + orig[j]); - boolean ok = (-1 == i.read()); - if (!ok) throw new RuntimeException("wtf, not EOF after the data?"); + for (int k = 1; k < 1599; k++) { + byte orig[] = new byte[k]; + r.nextBytes(orig); + java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(k+100); + java.util.zip.GZIPOutputStream o = new java.util.zip.GZIPOutputStream(baos); + o.write(orig); + o.finish(); + o.flush(); + o.close(); + byte compressed[] = baos.toByteArray(); + + i.initialize(new java.io.ByteArrayInputStream(compressed)); + byte readBuf[] = new byte[k]; + int read = DataHelper.read(i, readBuf); + if (read != orig.length) + throw new RuntimeException("read=" + read + " expected " + orig.length); + for (int j = 0; j < read; j++) { + if (readBuf[j] != orig[j]) + throw new RuntimeException("wtf, j=" + j + " readBuf=" + readBuf[j] + " orig=" + orig[j]); + } + boolean ok = (-1 == i.read()); + if (!ok) throw new RuntimeException("wtf, not EOF after the data?"); + //System.out.println("Match ok"); + // try both closing and not + if ((k % 2) != 0) + i.close(); + } System.out.println("Match ok"); } catch (Exception e) { e.printStackTrace(); } } - private static boolean test(int size) { - byte b[] = new byte[size]; - new java.util.Random().nextBytes(b); + private static boolean test(byte[] b) { + int size = b.length; try { java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(size); java.util.zip.GZIPOutputStream o = new java.util.zip.GZIPOutputStream(baos); @@ -417,7 +428,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { o.flush(); byte compressed[] = baos.toByteArray(); - ResettableGZIPInputStream in = new ResettableGZIPInputStream(new ByteArrayInputStream(compressed)); + ResettableGZIPInputStream in = new ResettableGZIPInputStream(new java.io.ByteArrayInputStream(compressed)); java.io.ByteArrayOutputStream baos2 = new java.io.ByteArrayOutputStream(size); byte rbuf[] = new byte[512]; while (true) { @@ -433,7 +444,7 @@ public class ResettableGZIPInputStream extends InflaterInputStream { if (!net.i2p.data.DataHelper.eq(rv, 0, b, 0, b.length)) { throw new RuntimeException("foo, read=" + rv.length); } else { - System.out.println("match, w00t @ " + size); + //System.out.println("match, w00t @ " + size); return true; } } catch (Exception e) { diff --git a/core/java/src/net/i2p/util/ReusableGZIPInputStream.java b/core/java/src/net/i2p/util/ReusableGZIPInputStream.java index 4a0b392ba..a7f50542e 100644 --- a/core/java/src/net/i2p/util/ReusableGZIPInputStream.java +++ b/core/java/src/net/i2p/util/ReusableGZIPInputStream.java @@ -43,6 +43,15 @@ public class ReusableGZIPInputStream extends ResettableGZIPInputStream { private ReusableGZIPInputStream() { super(); } + /** + * Clear the cache. + * @since 0.9.21 + */ + public static void clearCache() { + if (_available != null) + _available.clear(); + } + /******* public static void main(String args[]) { for (int i = 0; i < 2; i++) diff --git a/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java b/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java index 3c239ffc7..aa670a9ef 100644 --- a/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java +++ b/core/java/src/net/i2p/util/ReusableGZIPOutputStream.java @@ -75,6 +75,15 @@ public class ReusableGZIPOutputStream extends ResettableGZIPOutputStream { /** pull the contents of the stream written */ public byte[] getData() { return _buffer.toByteArray(); } + /** + * Clear the cache. + * @since 0.9.21 + */ + public static void clearCache() { + if (_available != null) + _available.clear(); + } + /****** public static void main(String args[]) { try { diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java index 3a6e7ebd9..35905dec2 100644 --- a/core/java/src/net/i2p/util/SSLEepGet.java +++ b/core/java/src/net/i2p/util/SSLEepGet.java @@ -46,7 +46,8 @@ import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.net.InetSocketAddress; import java.net.MalformedURLException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.security.KeyStore; import java.security.GeneralSecurityException; import java.security.cert.CertificateException; @@ -179,7 +180,7 @@ public class SSLEepGet extends EepGet { break; } // switch } // while - } catch (Exception e) { + } catch (RuntimeException e) { e.printStackTrace(); error = true; } @@ -369,7 +370,7 @@ public class SSLEepGet extends EepGet { System.out.println(" Valid To: " + cert.getNotAfter()); try { cert.checkValidity(); - } catch (Exception e) { + } catch (GeneralSecurityException e) { System.out.println(" WARNING: Certificate is not currently valid, it cannot be used"); } CertUtil.saveCert(cert, new File(name)); @@ -553,12 +554,14 @@ public class SSLEepGet extends EepGet { String req = getRequest(); - //try { - URL url = new URL(_actualURL); - String host = null; - int port = 0; - if ("https".equals(url.getProtocol())) { + String host; + int port; + try { + URI url = new URI(_actualURL); + if ("https".equals(url.getScheme())) { host = url.getHost(); + if (host == null) + throw new MalformedURLException("Bad URL"); if (host.toLowerCase(Locale.US).endsWith(".i2p")) throw new MalformedURLException("I2P addresses unsupported"); port = url.getPort(); @@ -589,10 +592,11 @@ public class SSLEepGet extends EepGet { } else { throw new MalformedURLException("Only https supported: " + _actualURL); } - // an MUE is an IOE - //} catch (MalformedURLException mue) { - // throw new IOException("Request URL is invalid"); - //} + } catch (URISyntaxException use) { + IOException ioe = new MalformedURLException("Redirected to invalid URL"); + ioe.initCause(use); + throw ioe; + } _proxyIn = _proxy.getInputStream(); _proxyOut = _proxy.getOutputStream(); diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java index 70de62ea8..4a5daac55 100644 --- a/core/java/src/net/i2p/util/ShellCommand.java +++ b/core/java/src/net/i2p/util/ShellCommand.java @@ -51,7 +51,7 @@ public class ShellCommand { * * @author hypercubus */ - private class CommandThread extends Thread { + private class CommandThread extends I2PAppThread { private final boolean consumeOutput; private final Object shellCommand; private final Result result; @@ -84,7 +84,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamConsumer extends Thread { + private static class StreamConsumer extends I2PAppThread { private final BufferedReader bufferedReader; public StreamConsumer(InputStream inputStream) { @@ -115,7 +115,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamReader extends Thread { + private static class StreamReader extends I2PAppThread { private final BufferedReader bufferedReader; public StreamReader(InputStream inputStream) { @@ -149,7 +149,7 @@ public class ShellCommand { * * @author hypercubus */ - private static class StreamWriter extends Thread { + private static class StreamWriter extends I2PAppThread { private final BufferedWriter bufferedWriter; public StreamWriter(OutputStream outputStream) { @@ -439,7 +439,7 @@ public class ShellCommand { System.out.println("ShellCommand waiting for \"" + name + '\"'); try { process.waitFor(); - } catch (Exception e) { + } catch (InterruptedException e) { if (DEBUG) { System.out.println("ShellCommand exception waiting for \"" + name + '\"'); e.printStackTrace(); @@ -457,7 +457,7 @@ public class ShellCommand { if (process.exitValue() > 0) return false; } - } catch (Exception e) { + } catch (IOException e) { // probably IOException, file not found from exec() if (DEBUG) { System.out.println("ShellCommand execute exception for \"" + name + '\"'); diff --git a/core/java/src/net/i2p/util/SimpleTimer2.java b/core/java/src/net/i2p/util/SimpleTimer2.java index ec4f2528d..f3eb4ee05 100644 --- a/core/java/src/net/i2p/util/SimpleTimer2.java +++ b/core/java/src/net/i2p/util/SimpleTimer2.java @@ -6,6 +6,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; @@ -38,7 +39,7 @@ public class SimpleTimer2 { private static final int MAX_THREADS = 4; private final ScheduledThreadPoolExecutor _executor; private final String _name; - private volatile int _count; + private final AtomicInteger _count = new AtomicInteger(); private final int _threads; /** @@ -102,7 +103,7 @@ public class SimpleTimer2 { super.afterExecute(r, t); if (t != null) { // shoudn't happen, caught in RunnableEvent.run() Log log = I2PAppContext.getGlobalContext().logManager().getLog(SimpleTimer2.class); - log.log(Log.CRIT, "wtf, event borked: " + r, t); + log.log(Log.CRIT, "event borked: " + r, t); } } } @@ -110,18 +111,19 @@ public class SimpleTimer2 { private class CustomThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); - rv.setName(_name + ' ' + (++_count) + '/' + _threads); + rv.setName(_name + ' ' + _count.incrementAndGet() + '/' + _threads); // Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates! // String name = rv.getThreadGroup().getName(); // if(!name.equals("main")) { // (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace(); // } rv.setDaemon(true); + rv.setPriority(Thread.NORM_PRIORITY + 1); return rv; } } - private ScheduledFuture schedule(TimedEvent t, long timeoutMs) { + private ScheduledFuture schedule(TimedEvent t, long timeoutMs) { return _executor.schedule(t, timeoutMs, TimeUnit.MILLISECONDS); } @@ -164,7 +166,8 @@ public class SimpleTimer2 { * New code should use SimpleTimer2.TimedEvent. * * @since 0.9.20 - * @param timeoutMs run first and subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public void addPeriodicEvent(final SimpleTimer.TimedEvent event, final long timeoutMs) { addPeriodicEvent(event, timeoutMs, timeoutMs); @@ -183,7 +186,8 @@ public class SimpleTimer2 { * * @since 0.9.20 * @param delay run the first iteration of this event after delay ms - * @param timeoutMs run subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public void addPeriodicEvent(final SimpleTimer.TimedEvent event, final long delay, final long timeoutMs) { @@ -245,7 +249,7 @@ public class SimpleTimer2 { private final SimpleTimer2 _pool; private int _fuzz; protected static final int DEFAULT_FUZZ = 3; - private ScheduledFuture _future; // _executor.remove() doesn't work so we have to use this + private ScheduledFuture _future; // _executor.remove() doesn't work so we have to use this // ... and I expect cancelling this way is more efficient /** state of the current event. All access should be under lock. */ @@ -254,6 +258,8 @@ public class SimpleTimer2 { private long _nextRun; /** whether this was scheduled during RUNNING state. LOCKING: this */ private boolean _rescheduleAfterRun; + /** whether this was cancelled during RUNNING state. LOCKING: this */ + private boolean _cancelAfterRun; /** must call schedule() later */ public TimedEvent(SimpleTimer2 pool) { @@ -286,12 +292,17 @@ public class SimpleTimer2 { public synchronized void schedule(long timeoutMs) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Scheduling: " + this + " timeout = " + timeoutMs + " state: " + _state); - if (timeoutMs <= 0 && _log.shouldLog(Log.WARN)) + if (timeoutMs <= 0) { + // streaming timers do call with timeoutMs == 0 + if (timeoutMs < 0 && _log.shouldLog(Log.WARN)) + _log.warn("Sched. timeout < 0: " + this + " timeout = " + timeoutMs + " state: " + _state); timeoutMs = 1; // otherwise we may execute before _future is updated, which is fine // except it triggers 'early execution' warning logging + } // always set absolute time of execution _nextRun = timeoutMs + System.currentTimeMillis(); + _cancelAfterRun = false; switch(_state) { case RUNNING: @@ -326,6 +337,11 @@ public class SimpleTimer2 { * two timeouts, else use the later */ public synchronized void reschedule(long timeoutMs, boolean useEarliestTime) { + if (timeoutMs <= 0) { + if (timeoutMs < 0 && _log.shouldWarn()) + _log.warn("Resched. timeout < 0: " + this + " timeout = " + timeoutMs + " state: " + _state); + timeoutMs = 1; + } final long now = System.currentTimeMillis(); long oldTimeout; boolean scheduled = _state == TimedEventState.SCHEDULED; @@ -338,6 +354,12 @@ public class SimpleTimer2 { if ((oldTimeout - _fuzz > timeoutMs && useEarliestTime) || (oldTimeout + _fuzz < timeoutMs && !useEarliestTime)|| (!scheduled)) { + if (scheduled && oldTimeout <= 5) { + // don't reschedule to avoid race + if (_log.shouldWarn()) + _log.warn("not rescheduling to " + timeoutMs + ", about to execute " + this + " in " + oldTimeout); + return; + } if (scheduled && (now + timeoutMs) < _nextRun) { if (_log.shouldLog(Log.INFO)) _log.info("Re-scheduling: " + this + " timeout = " + timeoutMs + " old timeout was " + oldTimeout + " state: " + _state); @@ -352,11 +374,13 @@ public class SimpleTimer2 { * @param timeoutMs */ public synchronized void forceReschedule(long timeoutMs) { - cancel(); + // don't cancel while running! + if (_state == TimedEventState.SCHEDULED) + cancel(); schedule(timeoutMs); } - /** returns true if cancelled */ + /** @return true if cancelled */ public synchronized boolean cancel() { // always clear _rescheduleAfterRun = false; @@ -365,12 +389,18 @@ public class SimpleTimer2 { case CANCELLED: // fall through case IDLE: break; // my preference is to throw IllegalState here, but let it be. - case RUNNING: // fall through + case RUNNING: + _cancelAfterRun = true; + return true; case SCHEDULED: - boolean cancelled = _future.cancel(false); + // There's probably a race here, where it's cancelled after it's running + // The result (if rescheduled) is a dup on the queue, see tickets 1694, 1705 + // Mitigated by close-to-execution check in reschedule() + boolean cancelled = _future.cancel(true); if (cancelled) _state = TimedEventState.CANCELLED; - else {} // log something as this could be serious, we remain RUNNING otherwise + else + _log.error("could not cancel " + this + " to run in " + (_nextRun - System.currentTimeMillis()), new Exception()); return cancelled; } return false; @@ -378,27 +408,42 @@ public class SimpleTimer2 { } public void run() { + try { + run2(); + } catch (RuntimeException re) { + _log.error("timer error", re); + throw re; + } + } + + private void run2() { if (_log.shouldLog(Log.DEBUG)) _log.debug("Running: " + this); long before = System.currentTimeMillis(); long delay = 0; synchronized(this) { + if (Thread.currentThread().isInterrupted()) { + _log.warn("I was interrupted in run, state "+_state+" event "+this); + return; + } if (_rescheduleAfterRun) - throw new IllegalStateException("rescheduleAfterRun cannot be true here"); + throw new IllegalStateException(this + " rescheduleAfterRun cannot be true here"); switch(_state) { case CANCELLED: return; // goodbye case IDLE: // fall through case RUNNING: - throw new IllegalStateException("not possible to be in " + _state); - case SCHEDULED: // proceed, switch to IDLE in case I need to reschedule - _state = TimedEventState.IDLE; + throw new IllegalStateException(this + " not possible to be in " + _state); + case SCHEDULED: + // proceed, will switch to IDLE to reschedule } // if I was rescheduled by the user, re-submit myself to the executor. - int difference = (int)(_nextRun - before); // careful with long uptimes + long difference = _nextRun - before; // careful with long uptimes if (difference > _fuzz) { + // proceed, switch to IDLE to reschedule + _state = TimedEventState.IDLE; schedule(difference); return; } @@ -411,12 +456,14 @@ public class SimpleTimer2 { if (_future != null) delay = _future.getDelay(TimeUnit.MILLISECONDS); else if (_log.shouldLog(Log.WARN)) - _log.warn(_pool + " wtf, no _future " + this); + _log.warn(_pool + " no _future " + this); // This can be an incorrect warning especially after a schedule(0) - if (_log.shouldLog(Log.WARN) && delay > 100) - _log.warn(_pool + " wtf, early execution " + delay + ": " + this); - else if (_log.shouldLog(Log.WARN) && delay < -1000) - _log.warn(" wtf, late execution " + (0 - delay) + ": " + this + _pool.debug()); + if (_log.shouldWarn()) { + if (delay > 100) + _log.warn(_pool + " early execution " + delay + ": " + this); + else if (delay < -1000) + _log.warn(" late execution " + (0 - delay) + ": " + this + _pool.debug()); + } try { timeReached(); } catch (Throwable t) { @@ -426,22 +473,27 @@ public class SimpleTimer2 { switch(_state) { case SCHEDULED: // fall through case IDLE: - throw new IllegalStateException("can't be " + _state); + throw new IllegalStateException(this + " can't be " + _state); case CANCELLED: break; // nothing case RUNNING: - _state = TimedEventState.IDLE; - // do we need to reschedule? - if (_rescheduleAfterRun) { - _rescheduleAfterRun = false; - schedule(_nextRun - System.currentTimeMillis()); + if (_cancelAfterRun) { + _cancelAfterRun = false; + _state = TimedEventState.CANCELLED; + } else { + _state = TimedEventState.IDLE; + // do we need to reschedule? + if (_rescheduleAfterRun) { + _rescheduleAfterRun = false; + schedule(_nextRun - System.currentTimeMillis()); + } } } } } long time = System.currentTimeMillis() - before; if (time > 500 && _log.shouldLog(Log.WARN)) - _log.warn(_pool + " wtf, event execution took " + time + ": " + this); + _log.warn(_pool + " event execution took " + time + ": " + this); if (_log.shouldLog(Log.INFO)) { // this call is slow - iterates through a HashMap - // would be better to have a local AtomicLong if we care @@ -470,6 +522,7 @@ public class SimpleTimer2 { return _executor.getCompletedTaskCount(); } + /** warning - slow */ private String debug() { _executor.purge(); // Remove cancelled tasks from the queue so we get a good queue size stat return @@ -490,10 +543,13 @@ public class SimpleTimer2 { * Schedule periodic event * * @param delay run the first iteration of this event after delay ms - * @param timeoutMs run subsequent iterations of this event every timeoutMs ms + * @param timeoutMs run subsequent iterations of this event every timeoutMs ms, 5000 minimum + * @throws IllegalArgumentException if timeoutMs less than 5000 */ public PeriodicTimedEvent(SimpleTimer2 pool, long delay, long timeoutMs) { super(pool, delay); + if (timeoutMs < 5000) + throw new IllegalArgumentException("timeout minimum 5000"); _timeoutMs = timeoutMs; } diff --git a/core/java/src/net/i2p/util/SystemVersion.java b/core/java/src/net/i2p/util/SystemVersion.java index 6650cf479..47644f427 100644 --- a/core/java/src/net/i2p/util/SystemVersion.java +++ b/core/java/src/net/i2p/util/SystemVersion.java @@ -5,6 +5,9 @@ package net.i2p.util; */ import java.lang.reflect.Field; +import java.util.TimeZone; + +import net.i2p.I2PAppContext; /** * Methods to find out what system we are running on @@ -18,6 +21,8 @@ public abstract class SystemVersion { private static final boolean _isArm = System.getProperty("os.arch").startsWith("arm"); private static final boolean _isX86 = System.getProperty("os.arch").contains("86") || System.getProperty("os.arch").equals("amd64"); + private static final boolean _isGentoo = System.getProperty("os.version").contains("gentoo") || + System.getProperty("os.version").contains("hardened"); // Funtoo private static final boolean _isAndroid; private static final boolean _isApache; private static final boolean _isGNU; @@ -27,6 +32,7 @@ public abstract class SystemVersion { private static final boolean _oneDotSix; private static final boolean _oneDotSeven; private static final boolean _oneDotEight; + private static final boolean _oneDotNine; private static final int _androidSDK; static { @@ -62,10 +68,12 @@ public abstract class SystemVersion { _oneDotSix = _androidSDK >= 9; _oneDotSeven = _androidSDK >= 19; _oneDotEight = false; + _oneDotNine = false; } else { _oneDotSix = VersionComparator.comp(System.getProperty("java.version"), "1.6") >= 0; _oneDotSeven = _oneDotSix && VersionComparator.comp(System.getProperty("java.version"), "1.7") >= 0; _oneDotEight = _oneDotSeven && VersionComparator.comp(System.getProperty("java.version"), "1.8") >= 0; + _oneDotNine = _oneDotEight && VersionComparator.comp(System.getProperty("java.version"), "1.9") >= 0; } } @@ -95,6 +103,13 @@ public abstract class SystemVersion { return _isGNU; } + /** + * @since 0.9.23 + */ + public static boolean isGentoo() { + return _isGentoo; + } + /** * @since 0.9.8 */ @@ -139,6 +154,15 @@ public abstract class SystemVersion { return _oneDotEight; } + /** + * + * @return true if Java 1.9 or higher, false for Android. + * @since 0.9.23 + */ + public static boolean isJava9() { + return _oneDotNine; + } + /** * This isn't always correct. * http://stackoverflow.com/questions/807263/how-do-i-detect-which-kind-of-jre-is-installed-32bit-vs-64bit @@ -181,4 +205,59 @@ public abstract class SystemVersion { maxMemory = 96*1024*1024l; return maxMemory; } + + /** + * The system's time zone, which is probably different from the + * JVM time zone, because Router changes the JVM default to GMT. + * It saves the old default in the context properties where we can get it. + * Use this to format a time in local time zone with DateFormat.setTimeZone(). + * + * @return non-null + * @since 0.9.24 + */ + public static TimeZone getSystemTimeZone() { + return getSystemTimeZone(I2PAppContext.getGlobalContext()); + } + + /** + * The system's time zone, which is probably different from the + * JVM time zone, because Router changes the JVM default to GMT. + * It saves the old default in the context properties where we can get it. + * Use this to format a time in local time zone with DateFormat.setTimeZone(). + * + * @return non-null + * @since 0.9.24 + */ + public static TimeZone getSystemTimeZone(I2PAppContext ctx) { + String systemTimeZone = ctx.getProperty("i2p.systemTimeZone"); + if (systemTimeZone != null) + return TimeZone.getTimeZone(systemTimeZone); + return TimeZone.getDefault(); + } + + /** + * @since 0.9.24 + */ +/**** + public static void main(String[] args) { + System.out.println("64 bit : " + is64Bit()); + System.out.println("Java 6 : " + isJava6()); + System.out.println("Java 7 : " + isJava7()); + System.out.println("Java 8 : " + isJava8()); + System.out.println("Java 9 : " + isJava9()); + System.out.println("Android : " + isAndroid()); + if (isAndroid()) + System.out.println(" Version: " + getAndroidVersion()); + System.out.println("Apache : " + isApache()); + System.out.println("ARM : " + isARM()); + System.out.println("Mac : " + isMac()); + System.out.println("Gentoo : " + isGentoo()); + System.out.println("GNU : " + isGNU()); + System.out.println("Windows : " + isWindows()); + System.out.println("Wrapper : " + hasWrapper()); + System.out.println("x86 : " + isX86()); + System.out.println("Max mem : " + getMaxMemory()); + + } +****/ } diff --git a/core/java/src/net/i2p/util/Translate.java b/core/java/src/net/i2p/util/Translate.java index 8c5342849..e76121c8a 100644 --- a/core/java/src/net/i2p/util/Translate.java +++ b/core/java/src/net/i2p/util/Translate.java @@ -65,7 +65,7 @@ public abstract class Translate { * The {0} will be replaced by the parameter. * Single quotes must be doubled, i.e. ' -> '' in the string. * @param o parameter, not translated. - * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * To translate parameter also, use _t("foo {0} bar", _t("baz")) * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ @@ -218,5 +218,6 @@ public abstract class Translate { public static void clearCache() { _missing.clear(); _bundles.clear(); + ResourceBundle.clearCache(); } } diff --git a/core/java/src/net/i2p/util/TranslateReader.java b/core/java/src/net/i2p/util/TranslateReader.java index bc26bbe59..171edd4a8 100644 --- a/core/java/src/net/i2p/util/TranslateReader.java +++ b/core/java/src/net/i2p/util/TranslateReader.java @@ -351,7 +351,7 @@ public class TranslateReader extends FilterReader { public void tag(List args) { if (args.size() <= 0) return; - _out.print("\t_("); + _out.print("\t_t("); for (int i = 0; i < args.size(); i++) { if (i > 0) _out.print(", "); @@ -373,6 +373,9 @@ public class TranslateReader extends FilterReader { } } + /** + * Do not comment out, used to extract tags as a part of the build process. + */ public static void main(String[] args) { try { if (args.length >= 2 && args[0].equals("test")) diff --git a/core/java/src/net/metanotion/io/RandomAccessInterface.java b/core/java/src/net/metanotion/io/RandomAccessInterface.java index fa382621c..1f3df6af6 100644 --- a/core/java/src/net/metanotion/io/RandomAccessInterface.java +++ b/core/java/src/net/metanotion/io/RandomAccessInterface.java @@ -28,9 +28,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.io; +import java.io.Closeable; import java.io.IOException; -public interface RandomAccessInterface { +public interface RandomAccessInterface extends Closeable { public long getFilePointer() throws IOException; public long length() throws IOException; public int read() throws IOException; diff --git a/core/java/src/net/metanotion/io/block/BlockFile.java b/core/java/src/net/metanotion/io/block/BlockFile.java index f6ea7d634..122f30796 100644 --- a/core/java/src/net/metanotion/io/block/BlockFile.java +++ b/core/java/src/net/metanotion/io/block/BlockFile.java @@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.io.block; +import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -64,7 +65,7 @@ import net.i2p.util.Log; * Pages are 1 KB and are numbered starting from 1. * e.g. the Metaindex skiplist is at offset 1024 bytes */ -public class BlockFile { +public class BlockFile implements Closeable { public static final int PAGESIZE = 1024; public static final long OFFSET_MOUNTED = 20; public final Log log = I2PAppContext.getGlobalContext().logManager().getLog(BlockFile.class); @@ -146,7 +147,7 @@ public class BlockFile { bf.bfck(true); bf.close(); raif.close(); - } catch (Exception e) { + } catch (IOException e) { e.printStackTrace(); } } diff --git a/core/java/src/net/metanotion/io/block/index/BSkipList.java b/core/java/src/net/metanotion/io/block/index/BSkipList.java index 5eef949cf..3a2d8b599 100644 --- a/core/java/src/net/metanotion/io/block/index/BSkipList.java +++ b/core/java/src/net/metanotion/io/block/index/BSkipList.java @@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.io.block.index; +import java.io.Closeable; import java.io.IOException; import java.util.HashMap; @@ -50,7 +51,7 @@ import net.i2p.util.Log; * * Always fits on one page. */ -public class BSkipList extends SkipList { +public class BSkipList extends SkipList implements Closeable { private static final long MAGIC = 0x536b69704c697374l; // "SkipList" public int firstSpanPage = 0; public int firstLevelPage = 0; diff --git a/core/java/src/net/metanotion/util/skiplist/SkipLevels.java b/core/java/src/net/metanotion/util/skiplist/SkipLevels.java index e4665fc4b..bd9da7ba1 100644 --- a/core/java/src/net/metanotion/util/skiplist/SkipLevels.java +++ b/core/java/src/net/metanotion/util/skiplist/SkipLevels.java @@ -28,12 +28,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.util.skiplist; +import java.io.Flushable; + import net.metanotion.io.block.BlockFile; import net.i2p.I2PAppContext; import net.i2p.util.Log; -public class SkipLevels { +public class SkipLevels implements Flushable { /** We can't have more than 2**32 pages */ public static final int MAX_SIZE = 32; diff --git a/core/java/src/net/metanotion/util/skiplist/SkipList.java b/core/java/src/net/metanotion/util/skiplist/SkipList.java index 74e35f56a..6f44e9e23 100644 --- a/core/java/src/net/metanotion/util/skiplist/SkipList.java +++ b/core/java/src/net/metanotion/util/skiplist/SkipList.java @@ -28,13 +28,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.util.skiplist; +import java.io.Flushable; import java.util.Random; import net.i2p.util.RandomSource; //import net.metanotion.io.block.BlockFile; -public class SkipList { +public class SkipList implements Flushable { /** the probability of each next higher level */ protected static final int P = 2; private static final int MIN_SLOTS = 4; diff --git a/core/java/src/net/metanotion/util/skiplist/SkipSpan.java b/core/java/src/net/metanotion/util/skiplist/SkipSpan.java index ae2cc9ef7..94210ebd4 100644 --- a/core/java/src/net/metanotion/util/skiplist/SkipSpan.java +++ b/core/java/src/net/metanotion/util/skiplist/SkipSpan.java @@ -28,9 +28,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package net.metanotion.util.skiplist; +import java.io.Flushable; + //import net.metanotion.io.block.BlockFile; -public class SkipSpan { +public class SkipSpan implements Flushable { /** This is actually limited by BlockFile.spanSize which is much smaller */ public static final int MAX_SIZE = 256; diff --git a/core/java/test/junit/net/i2p/client/I2PClientTestSuite.java b/core/java/test/junit/net/i2p/client/I2PClientTestSuite.java index 208ddf351..fef8aed52 100644 --- a/core/java/test/junit/net/i2p/client/I2PClientTestSuite.java +++ b/core/java/test/junit/net/i2p/client/I2PClientTestSuite.java @@ -11,6 +11,7 @@ package net.i2p.client; import junit.framework.Test; import junit.framework.TestSuite; import net.i2p.client.datagram.DatagramTest; +import net.i2p.client.impl.I2PSessionTest; /** * @author Comwiz @@ -26,4 +27,4 @@ public class I2PClientTestSuite { return suite; } -} \ No newline at end of file +} diff --git a/core/java/test/junit/net/i2p/client/datagram/DatagramTest.java b/core/java/test/junit/net/i2p/client/datagram/DatagramTest.java index 92a8e0b66..706311324 100644 --- a/core/java/test/junit/net/i2p/client/datagram/DatagramTest.java +++ b/core/java/test/junit/net/i2p/client/datagram/DatagramTest.java @@ -43,15 +43,15 @@ public class DatagramTest extends TestCase { I2PSession session = client.createSession(new ByteArrayInputStream(out.toByteArray()), null); I2PDatagramMaker dm = new I2PDatagramMaker(session); - byte[] dg = dm.makeI2PDatagram("What's the deal with 42?".getBytes()); + byte[] dg = dm.makeI2PDatagram(DataHelper.getASCII("What's the deal with 42?")); I2PDatagramDissector dd = new I2PDatagramDissector(); dd.loadI2PDatagram(dg); byte[] x = dd.getPayload(); - assertTrue(DataHelper.eq(x, "What's the deal with 42?".getBytes())); + assertTrue(DataHelper.eq(x, DataHelper.getASCII("What's the deal with 42?"))); x = dd.extractPayload(); - assertTrue(DataHelper.eq(x, "What's the deal with 42?".getBytes())); + assertTrue(DataHelper.eq(x, DataHelper.getASCII("What's the deal with 42?"))); assertEquals(d, dd.getSender()); assertEquals(d, dd.extractSender()); @@ -67,7 +67,7 @@ public class DatagramTest extends TestCase { ByteArrayOutputStream dout = new ByteArrayOutputStream(); d.writeBytes(dout); dsaEng.sign(Hash.FAKE_HASH.toByteArray(), session.getPrivateKey()).writeBytes(dout); - dout.write("blah".getBytes()); + dout.write(DataHelper.getASCII("blah")); byte[] data = dout.toByteArray(); I2PDatagramDissector dd = new I2PDatagramDissector(); diff --git a/core/java/test/junit/net/i2p/client/I2PSessionTest.java b/core/java/test/junit/net/i2p/client/impl/I2PSessionTest.java similarity index 85% rename from core/java/test/junit/net/i2p/client/I2PSessionTest.java rename to core/java/test/junit/net/i2p/client/impl/I2PSessionTest.java index a3a2cd603..769a4a058 100644 --- a/core/java/test/junit/net/i2p/client/I2PSessionTest.java +++ b/core/java/test/junit/net/i2p/client/impl/I2PSessionTest.java @@ -1,4 +1,4 @@ -package net.i2p.client; +package net.i2p.client.impl; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain @@ -15,6 +15,11 @@ import java.util.Set; import junit.framework.TestCase; import net.i2p.I2PAppContext; +import net.i2p.client.I2PClientFactory; +import net.i2p.client.I2PSession; +import net.i2p.client.I2PSessionException; +import net.i2p.client.I2PSessionListener; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -62,10 +67,10 @@ public class I2PSessionTest extends TestCase implements I2PSessionListener{ _s.add("c"); _s.add("d"); - session.sendMessage(d, "a".getBytes()); - session.sendMessage(d, "b".getBytes()); - session.sendMessage(d, "c".getBytes()); - session.sendMessage(d, "d".getBytes()); + session.sendMessage(d, DataHelper.getASCII("a")); + session.sendMessage(d, DataHelper.getASCII("b")); + session.sendMessage(d, DataHelper.getASCII("c")); + session.sendMessage(d, DataHelper.getASCII("d")); for(int i = 0; (i < 20)&&(!_s.isEmpty()); i++){ Thread.sleep(1000); @@ -87,4 +92,4 @@ public class I2PSessionTest extends TestCase implements I2PSessionListener{ } } public void reportAbuse(I2PSession session, int severity){} -} \ No newline at end of file +} diff --git a/core/java/test/junit/net/i2p/crypto/AES256Bench.java b/core/java/test/junit/net/i2p/crypto/AES256Bench.java index c5e718d47..59c4a342b 100644 --- a/core/java/test/junit/net/i2p/crypto/AES256Bench.java +++ b/core/java/test/junit/net/i2p/crypto/AES256Bench.java @@ -86,7 +86,7 @@ public class AES256Bench { System.out.println("Standard test D(E(value)) == value? " + same); if (!same) throw new RuntimeException("moo"); - plain = "1234567890123456".getBytes(); + plain = DataHelper.getASCII("1234567890123456"); e = new byte[plain.length]; _context.aes().encrypt(plain, 0, e, 0, key, iv, plain.length); d = new byte[e.length]; diff --git a/core/java/test/junit/net/i2p/crypto/AESInputStream.java b/core/java/test/junit/net/i2p/crypto/AESInputStream.java index 09446b222..c489cae7c 100644 --- a/core/java/test/junit/net/i2p/crypto/AESInputStream.java +++ b/core/java/test/junit/net/i2p/crypto/AESInputStream.java @@ -287,9 +287,9 @@ public class AESInputStream extends FilterInputStream { log.setMinimumPriority(Log.DEBUG); byte orig[] = new byte[1024 * 32]; RandomSource.getInstance().nextBytes(orig); - //byte orig[] = "you are my sunshine, my only sunshine".getBytes(); + //byte orig[] = DataHelper.getASCII("you are my sunshine, my only sunshine"); SessionKey key = KeyGenerator.getInstance().generateSessionKey(); - byte iv[] = "there once was a".getBytes(); + byte iv[] = DataHelper.getASCII("there once was a"); for (int i = 0; i < 20; i++) { runTest(ctx, orig, key, iv); diff --git a/core/java/test/junit/net/i2p/crypto/AESInputStreamTest.java b/core/java/test/junit/net/i2p/crypto/AESInputStreamTest.java index 961dad91c..716aa6ef0 100644 --- a/core/java/test/junit/net/i2p/crypto/AESInputStreamTest.java +++ b/core/java/test/junit/net/i2p/crypto/AESInputStreamTest.java @@ -23,7 +23,7 @@ import net.i2p.util.RandomSource; public class AESInputStreamTest extends TestCase { public void testMultiple() throws Exception{ SessionKey key = KeyGenerator.getInstance().generateSessionKey(); - byte iv[] = "there once was a".getBytes(); + byte iv[] = DataHelper.getASCII("there once was a"); int[] sizes = {1024 * 32, 20, 3, 0}; @@ -70,7 +70,7 @@ public class AESInputStreamTest extends TestCase { RandomSource.getInstance().nextBytes(orig); SessionKey key = KeyGenerator.getInstance().generateSessionKey(); - byte iv[] = "there once was a".getBytes(); + byte iv[] = DataHelper.getASCII("there once was a"); ByteArrayOutputStream origStream = new ByteArrayOutputStream(512); AESOutputStream out = new AESOutputStream(ctx, origStream, key, iv); diff --git a/core/java/test/junit/net/i2p/crypto/ElGamalTest.java b/core/java/test/junit/net/i2p/crypto/ElGamalTest.java index 2bb886338..46b5da7b6 100644 --- a/core/java/test/junit/net/i2p/crypto/ElGamalTest.java +++ b/core/java/test/junit/net/i2p/crypto/ElGamalTest.java @@ -136,11 +136,11 @@ public class ElGamalTest extends TestCase{ System.arraycopy(h.getData(), 0, iv, 0, 16); String msg = "Hello world01234012345678901234501234567890123450123456789012345"; - h = SHA256Generator.getInstance().calculateHash(msg.getBytes()); + h = SHA256Generator.getInstance().calculateHash(DataHelper.getASCII(msg)); - byte aesEncr[] = new byte[msg.getBytes().length]; + byte aesEncr[] = new byte[DataHelper.getASCII(msg).length]; byte aesDecr[] = new byte[aesEncr.length]; - _context.aes().encrypt(msg.getBytes(), 0, aesEncr, 0, sessionKey, iv, aesEncr.length); + _context.aes().encrypt(DataHelper.getASCII(msg), 0, aesEncr, 0, sessionKey, iv, aesEncr.length); _context.aes().decrypt(aesEncr, 0, aesDecr, 0, sessionKey, iv, aesEncr.length); h = SHA256Generator.getInstance().calculateHash(aesDecr); @@ -155,7 +155,7 @@ public class ElGamalTest extends TestCase{ String msg = "Hello world"; - byte encrypted[] = _context.elGamalAESEngine().encryptAESBlock(msg.getBytes(), sessionKey, iv, null, null, 64); + byte encrypted[] = _context.elGamalAESEngine().encryptAESBlock(DataHelper.getASCII(msg), sessionKey, iv, null, null, 64); Set foundTags = new HashSet(); SessionKey foundKey = new SessionKey(); byte decrypted[] = null; @@ -180,7 +180,7 @@ public class ElGamalTest extends TestCase{ SessionKey key = _context.sessionKeyManager().getCurrentKey(pubKey); if (key == null) key = _context.sessionKeyManager().createSession(pubKey); - byte[] encrypted = _context.elGamalAESEngine().encrypt(msg.getBytes(), pubKey, key, 64); + byte[] encrypted = _context.elGamalAESEngine().encrypt(DataHelper.getASCII(msg), pubKey, key, 64); byte[] decrypted = null; try{ decrypted = _context.elGamalAESEngine().decrypt(encrypted, privKey); @@ -286,7 +286,7 @@ public class ElGamalTest extends TestCase{ PrivateKey priv = (PrivateKey)keypair[1]; for (int i = 0; i < UNENCRYPTED.length; i++) { - byte orig[] = UNENCRYPTED[i].getBytes(); + byte orig[] = DataHelper.getASCII(UNENCRYPTED[i]); byte encrypted[] = _context.elGamalEngine().encrypt(orig, pub); byte decrypted[] = _context.elGamalEngine().decrypt(encrypted, priv); @@ -310,7 +310,7 @@ public class ElGamalTest extends TestCase{ byte enc[] = Base64.decode(ENCRYPTED[i]); byte decrypted[] = _context.elGamalEngine().decrypt(enc, priv); - assertTrue(DataHelper.eq(decrypted, UNENCRYPTED[i].getBytes())); + assertTrue(DataHelper.eq(decrypted, DataHelper.getASCII(UNENCRYPTED[i]))); } } @@ -343,7 +343,7 @@ public class ElGamalTest extends TestCase{ for (int j = 0; j < 5; j++) tags.add(new SessionTag(true)); } - byte encrypted[] = e.encrypt("blah".getBytes(), pubKey, sessionKey, tags, 1024); + byte encrypted[] = e.encrypt(DataHelper.getASCII("blah"), pubKey, sessionKey, tags, 1024); byte decrypted[] = e.decrypt(encrypted, privKey); assertEquals("blah", new String(decrypted)); diff --git a/core/java/test/junit/net/i2p/crypto/HMACSHA256Bench.java b/core/java/test/junit/net/i2p/crypto/HMACSHA256Bench.java index 11981c985..dd5ff0b9e 100644 --- a/core/java/test/junit/net/i2p/crypto/HMACSHA256Bench.java +++ b/core/java/test/junit/net/i2p/crypto/HMACSHA256Bench.java @@ -32,6 +32,7 @@ package net.i2p.crypto; import java.util.Properties; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.SessionKey; @@ -74,12 +75,12 @@ public class HMACSHA256Bench { for (int x = 0; x < 2*1024; x++) { buf.append("a"); } - byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); + byte[] mmess = DataHelper.getASCII(buf.toString()); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); buf = new StringBuilder(); for (int x = 0; x < 10000; x++) { buf.append("a"); } - byte[] lmess = buf.toString().getBytes(); + byte[] lmess = DataHelper.getASCII(buf.toString()); // warm up the engines ctx.hmac().calculate(key, smess); diff --git a/core/java/test/junit/net/i2p/crypto/SHA256Bench.java b/core/java/test/junit/net/i2p/crypto/SHA256Bench.java index 0988fde34..fc9ccc221 100644 --- a/core/java/test/junit/net/i2p/crypto/SHA256Bench.java +++ b/core/java/test/junit/net/i2p/crypto/SHA256Bench.java @@ -29,11 +29,12 @@ package net.i2p.crypto; * POSSIBILITY OF SUCH DAMAGE. */ +import net.i2p.data.DataHelper; import net.i2p.data.Hash; public class SHA256Bench { public static void main(String args[]) { - Hash asdfs = SHA256Generator.getInstance().calculateHash("qwerty".getBytes()); + Hash asdfs = SHA256Generator.getInstance().calculateHash(DataHelper.getASCII("qwerty")); int times = 100; long shorttime = 0; @@ -56,17 +57,17 @@ public class SHA256Bench { long minLong1 = 0; long maxLong1 = 0; - byte[] smess = new String("abc").getBytes(); + byte[] smess = DataHelper.getASCII(new String("abc")); StringBuilder buf = new StringBuilder(); for (int x = 0; x < 10*1024; x++) { buf.append("a"); } - byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); + byte[] mmess = DataHelper.getASCII(buf.toString()); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes(); buf = new StringBuilder(); for (int x = 0; x < 1000000; x++) { buf.append("a"); } - byte[] lmess = buf.toString().getBytes(); + byte[] lmess = DataHelper.getASCII(buf.toString()); // warm up the engines SHA256Generator.getInstance().calculateHash(smess); diff --git a/core/java/test/junit/net/i2p/crypto/SHA256Test.java b/core/java/test/junit/net/i2p/crypto/SHA256Test.java index fd612b5d0..3dc78b078 100644 --- a/core/java/test/junit/net/i2p/crypto/SHA256Test.java +++ b/core/java/test/junit/net/i2p/crypto/SHA256Test.java @@ -10,6 +10,7 @@ package net.i2p.crypto; import junit.framework.TestCase; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; /** * @author Comwiz @@ -36,7 +37,7 @@ public class SHA256Test extends TestCase{ * Check if the behaviour remains the same. */ public void testMultipleEquality(){ - byte[] data = "blahblah".getBytes(); + byte[] data = DataHelper.getASCII("blahblah"); Hash firstHash = SHA256Generator.getInstance().calculateHash(data); diff --git a/core/java/test/junit/net/i2p/data/Base64Test.java b/core/java/test/junit/net/i2p/data/Base64Test.java index fc7dbea21..b8c57db00 100644 --- a/core/java/test/junit/net/i2p/data/Base64Test.java +++ b/core/java/test/junit/net/i2p/data/Base64Test.java @@ -13,7 +13,7 @@ import junit.framework.TestCase; public class Base64Test extends TestCase{ public void testBase64(){ String orig = "you smell"; - String encoded = Base64.encode(orig.getBytes()); + String encoded = Base64.encode(DataHelper.getASCII(orig)); byte decoded[] = Base64.decode(encoded); String transformed = new String(decoded); assertTrue(orig.equals(transformed)); diff --git a/core/java/test/junit/net/i2p/data/DataStructureImplTest.java b/core/java/test/junit/net/i2p/data/DataStructureImplTest.java index f0d30f5ee..b03cac488 100644 --- a/core/java/test/junit/net/i2p/data/DataStructureImplTest.java +++ b/core/java/test/junit/net/i2p/data/DataStructureImplTest.java @@ -60,7 +60,7 @@ public class DataStructureImplTest extends TestCase{ public void testErrors() throws Exception{ boolean error = false; try{ - _struct.fromByteArray("water is poison".getBytes()); + _struct.fromByteArray(DataHelper.getASCII("water is poison")); }catch(DataFormatException dfe){ error = true; } diff --git a/core/java/test/junit/net/i2p/data/KeyCertificateTest.java b/core/java/test/junit/net/i2p/data/KeyCertificateTest.java new file mode 100644 index 000000000..032b3ef70 --- /dev/null +++ b/core/java/test/junit/net/i2p/data/KeyCertificateTest.java @@ -0,0 +1,45 @@ +package net.i2p.data; +/* + * free (adj.): unencumbered; not under the control of others + * Written by str4d in 2015 and released into the public domain + * with no warranty of any kind, either expressed or implied. + * It probably won't make your computer catch on fire, or eat + * your children, but it might. Use at your own risk. + * + */ + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import net.i2p.crypto.EncType; +import net.i2p.crypto.SigType; +import junit.framework.TestCase; + +/** + * @author str4d + */ +public class KeyCertificateTest extends TestCase { + private static final byte[] P256_PAYLOAD = new byte[] { + 0, (byte) (SigType.ECDSA_SHA256_P256.getCode()), + 0, (byte) (EncType.EC_P256.getCode()) + }; + + private static final byte[] P521_PAYLOAD = new byte[] { + 0, (byte) (SigType.ECDSA_SHA512_P521.getCode()), + 0, (byte) (EncType.ELGAMAL_2048.getCode()), + 0, 0, 0, 0 + }; + + public void testFromP256Payload() throws DataFormatException { + KeyCertificate cert = new KeyCertificate(P256_PAYLOAD); + assertThat(cert.getSigTypeCode(), is(equalTo(SigType.ECDSA_SHA256_P256.getCode()))); + assertThat(cert.getCryptoTypeCode(), is(equalTo(EncType.EC_P256.getCode()))); + assertThat(cert.getExtraSigningKeyData(), is(nullValue())); + } + + public void testFromEd25519Payload() throws DataFormatException { + KeyCertificate cert = new KeyCertificate(P521_PAYLOAD); + assertThat(cert.getSigTypeCode(), is(equalTo(SigType.ECDSA_SHA512_P521.getCode()))); + assertThat(cert.getCryptoTypeCode(), is(equalTo(EncType.ELGAMAL_2048.getCode()))); + assertThat(cert.getExtraSigningKeyData().length, is(4)); + } +} \ No newline at end of file diff --git a/core/java/test/junit/net/i2p/data/PayloadTest.java b/core/java/test/junit/net/i2p/data/PayloadTest.java index 143c794b3..074f4691d 100644 --- a/core/java/test/junit/net/i2p/data/PayloadTest.java +++ b/core/java/test/junit/net/i2p/data/PayloadTest.java @@ -20,7 +20,7 @@ package net.i2p.data; Payload payload = new Payload(); SessionKey key = (SessionKey)(new SessionKeyTest()).createDataStructure(); - byte data[] = "Hello, I2P".getBytes(); + byte data[] = DataHelper.getASCII("Hello, I2P"); // This causes equals() to fail unless we override the test // to set the unencrypted data after reading. // Unencrypted data is deprecated, just use encrypted data for the test. diff --git a/core/java/test/junit/net/i2p/data/PrivateKeyTest.java b/core/java/test/junit/net/i2p/data/PrivateKeyTest.java index 9d25fb449..f2581b3d1 100644 --- a/core/java/test/junit/net/i2p/data/PrivateKeyTest.java +++ b/core/java/test/junit/net/i2p/data/PrivateKeyTest.java @@ -81,7 +81,7 @@ public class PrivateKeyTest extends StructureTest { public void testShortRead() throws Exception{ PrivateKey privateKey = new PrivateKey(); - ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes()); + ByteArrayInputStream in = new ByteArrayInputStream(DataHelper.getASCII("six times nine equals forty-two")); boolean error = false; try{ privateKey.readBytes(in); diff --git a/core/java/test/junit/net/i2p/data/PublicKeyTest.java b/core/java/test/junit/net/i2p/data/PublicKeyTest.java index 8fed332bd..4e404a955 100644 --- a/core/java/test/junit/net/i2p/data/PublicKeyTest.java +++ b/core/java/test/junit/net/i2p/data/PublicKeyTest.java @@ -81,7 +81,7 @@ public class PublicKeyTest extends StructureTest { public void testShortRead() throws Exception{ PublicKey publicKey = new PublicKey(); - ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes()); + ByteArrayInputStream in = new ByteArrayInputStream(DataHelper.getASCII("six times nine equals forty-two")); boolean error = false; try{ publicKey.readBytes(in); diff --git a/core/java/test/junit/net/i2p/data/SigningPrivateKeyTest.java b/core/java/test/junit/net/i2p/data/SigningPrivateKeyTest.java index baa038812..4ccfc10c9 100644 --- a/core/java/test/junit/net/i2p/data/SigningPrivateKeyTest.java +++ b/core/java/test/junit/net/i2p/data/SigningPrivateKeyTest.java @@ -81,7 +81,7 @@ public class SigningPrivateKeyTest extends StructureTest { public void testShortRead() throws Exception{ SigningPrivateKey signingPrivateKey = new SigningPrivateKey(); - ByteArrayInputStream in = new ByteArrayInputStream("short".getBytes()); + ByteArrayInputStream in = new ByteArrayInputStream(DataHelper.getASCII("short")); boolean error = false; try{ signingPrivateKey.readBytes(in); diff --git a/core/java/test/junit/net/i2p/data/SigningPublicKeyTest.java b/core/java/test/junit/net/i2p/data/SigningPublicKeyTest.java index b97099e6e..1e5718b42 100644 --- a/core/java/test/junit/net/i2p/data/SigningPublicKeyTest.java +++ b/core/java/test/junit/net/i2p/data/SigningPublicKeyTest.java @@ -82,7 +82,7 @@ public class SigningPublicKeyTest extends StructureTest { public void testShortRead() throws Exception{ SigningPublicKey publicKey = new SigningPublicKey(); - ByteArrayInputStream in = new ByteArrayInputStream("six times nine equals forty-two".getBytes()); + ByteArrayInputStream in = new ByteArrayInputStream(DataHelper.getASCII("six times nine equals forty-two")); boolean error = false; try{ publicKey.readBytes(in); diff --git a/core/java/test/junit/net/i2p/stat/RateTest.java b/core/java/test/junit/net/i2p/stat/RateTest.java index 45d9278a8..2fbca7eb4 100644 --- a/core/java/test/junit/net/i2p/stat/RateTest.java +++ b/core/java/test/junit/net/i2p/stat/RateTest.java @@ -2,6 +2,7 @@ package net.i2p.stat; import java.io.ByteArrayInputStream; import java.util.Properties; +import net.i2p.data.DataHelper; import org.junit.Test; @@ -21,7 +22,7 @@ public class RateTest extends TestCase { StringBuilder buf = new StringBuilder(1024); rate.store("rate.test", buf); - byte data[] = buf.toString().getBytes(); + byte data[] = DataHelper.getUTF8(buf.toString()); Properties props = new Properties(); props.load(new ByteArrayInputStream(data)); diff --git a/core/java/test/junit/net/i2p/util/ResettableGZIPInputStreamTest.java b/core/java/test/junit/net/i2p/util/ResettableGZIPInputStreamTest.java index d78166654..d4ea56708 100644 --- a/core/java/test/junit/net/i2p/util/ResettableGZIPInputStreamTest.java +++ b/core/java/test/junit/net/i2p/util/ResettableGZIPInputStreamTest.java @@ -45,7 +45,7 @@ public class ResettableGZIPInputStreamTest extends TestCase { } - byte orig[] = "ho ho ho, merry christmas".getBytes(); + byte orig[] = DataHelper.getASCII("ho ho ho, merry christmas"); ByteArrayOutputStream baos = new ByteArrayOutputStream(64); GZIPOutputStream o = new GZIPOutputStream(baos); o.write(orig); diff --git a/core/java/test/junit/net/i2p/util/ResettableGZIPOutputStreamTest.java b/core/java/test/junit/net/i2p/util/ResettableGZIPOutputStreamTest.java index 58c2dd9ee..37cad3f3e 100644 --- a/core/java/test/junit/net/i2p/util/ResettableGZIPOutputStreamTest.java +++ b/core/java/test/junit/net/i2p/util/ResettableGZIPOutputStreamTest.java @@ -18,7 +18,7 @@ import net.i2p.data.DataHelper; public class ResettableGZIPOutputStreamTest extends TestCase { public void testResettableGZIPOutputStream() throws Exception{ - byte b[] = "hi, how are you today?".getBytes(); + byte b[] = DataHelper.getASCII("hi, how are you today?"); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ResettableGZIPOutputStream o = new ResettableGZIPOutputStream(baos); o.write(b); diff --git a/core/java/test/junit/net/i2p/util/ReusableGZIPInputStreamTest.java b/core/java/test/junit/net/i2p/util/ReusableGZIPInputStreamTest.java index 7f10a25fa..ec3ad7a48 100644 --- a/core/java/test/junit/net/i2p/util/ReusableGZIPInputStreamTest.java +++ b/core/java/test/junit/net/i2p/util/ReusableGZIPInputStreamTest.java @@ -20,7 +20,7 @@ import net.i2p.data.DataHelper; public class ReusableGZIPInputStreamTest extends TestCase { public void testReusableGZIPInputStream() throws Exception{ { - byte b[] = "hi, how are you today?".getBytes(); + byte b[] = DataHelper.getASCII("hi, how are you today?"); ByteArrayOutputStream baos = new ByteArrayOutputStream(64); GZIPOutputStream o = new GZIPOutputStream(baos); o.write(b); diff --git a/core/java/test/junit/net/i2p/util/ReusableGZIPOutputStreamTest.java b/core/java/test/junit/net/i2p/util/ReusableGZIPOutputStreamTest.java index b48d267fe..537108e13 100644 --- a/core/java/test/junit/net/i2p/util/ReusableGZIPOutputStreamTest.java +++ b/core/java/test/junit/net/i2p/util/ReusableGZIPOutputStreamTest.java @@ -19,7 +19,7 @@ import net.i2p.data.DataHelper; public class ReusableGZIPOutputStreamTest extends TestCase { public void testReusableGZIPOutputStream() throws Exception{ { - byte b[] = "hi, how are you today?".getBytes(); + byte b[] = DataHelper.getASCII("hi, how are you today?"); ReusableGZIPOutputStream o = ReusableGZIPOutputStream.acquire(); o.write(b); o.finish(); diff --git a/core/java/test/scalatest/net/i2p/data/PrivateKeySpec.scala b/core/java/test/scalatest/net/i2p/data/PrivateKeySpec.scala index 583c329be..2804be67d 100644 --- a/core/java/test/scalatest/net/i2p/data/PrivateKeySpec.scala +++ b/core/java/test/scalatest/net/i2p/data/PrivateKeySpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class PrivateKeySpec extends FunSpec with ShouldMatchers { + val privateKey = new PrivateKey + describe("A PrivateKey") { - it("should be 256 bytes long") (pending) + it("should be 256 bytes long") { + privateKey should have length (256) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/PublicKeySpec.scala b/core/java/test/scalatest/net/i2p/data/PublicKeySpec.scala index 5d131a8fd..b45230bb3 100644 --- a/core/java/test/scalatest/net/i2p/data/PublicKeySpec.scala +++ b/core/java/test/scalatest/net/i2p/data/PublicKeySpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class PublicKeySpec extends FunSpec with ShouldMatchers { + val publicKey = new PublicKey + describe("A PublicKey") { - it("should be 256 bytes long") (pending) + it("should be 256 bytes long") { + publicKey should have length (256) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/SessionKeySpec.scala b/core/java/test/scalatest/net/i2p/data/SessionKeySpec.scala index 77c62bcf6..7330b5968 100644 --- a/core/java/test/scalatest/net/i2p/data/SessionKeySpec.scala +++ b/core/java/test/scalatest/net/i2p/data/SessionKeySpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class SessionKeySpec extends FunSpec with ShouldMatchers { + val sessionKey = new SessionKey + describe("A SessionKey") { - it("should be 32 bytes long") (pending) + it("should be 32 bytes long") { + sessionKey should have length (32) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/SessionTagSpec.scala b/core/java/test/scalatest/net/i2p/data/SessionTagSpec.scala index 8a755bfc7..c845585b9 100644 --- a/core/java/test/scalatest/net/i2p/data/SessionTagSpec.scala +++ b/core/java/test/scalatest/net/i2p/data/SessionTagSpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class SessionTagSpec extends FunSpec with ShouldMatchers { + val sessionTag = new SessionTag + describe("A SessionTag") { - it("should be 32 bytes long") (pending) + it("should be 32 bytes long") { + sessionTag should have length (32) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/SignatureSpec.scala b/core/java/test/scalatest/net/i2p/data/SignatureSpec.scala index ff17c365d..4476d9f8a 100644 --- a/core/java/test/scalatest/net/i2p/data/SignatureSpec.scala +++ b/core/java/test/scalatest/net/i2p/data/SignatureSpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class SignatureSpec extends FunSpec with ShouldMatchers { + val signature = new Signature + describe("A Signature") { - it("should be 40 bytes long") (pending) + it("should be 40 bytes long") { + signature should have length (40) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/SigningPrivateKeySpec.scala b/core/java/test/scalatest/net/i2p/data/SigningPrivateKeySpec.scala index a4ad5ff33..e6e9107ec 100644 --- a/core/java/test/scalatest/net/i2p/data/SigningPrivateKeySpec.scala +++ b/core/java/test/scalatest/net/i2p/data/SigningPrivateKeySpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class SigningPrivateKeySpec extends FunSpec with ShouldMatchers { + val signingPrivateKey = new SigningPrivateKey + describe("A SigningPrivateKey") { - it("should be 20 bytes long") (pending) + it("should be 20 bytes long") { + signingPrivateKey should have length (20) + } } } diff --git a/core/java/test/scalatest/net/i2p/data/SigningPublicKeySpec.scala b/core/java/test/scalatest/net/i2p/data/SigningPublicKeySpec.scala index 97541c2d5..6a9d450a5 100644 --- a/core/java/test/scalatest/net/i2p/data/SigningPublicKeySpec.scala +++ b/core/java/test/scalatest/net/i2p/data/SigningPublicKeySpec.scala @@ -7,7 +7,11 @@ import org.scalatest.matchers.ShouldMatchers * @author str4d */ class SigningPublicKeySpec extends FunSpec with ShouldMatchers { + val signingPublicKey = new SigningPublicKey + describe("A SigningPublicKey") { - it("should be 128 bytes long") (pending) + it("should be 128 bytes long") { + signingPublicKey should have length (128) + } } } diff --git a/debian/apparmor/i2p b/debian/apparmor/i2p index abf4f8a01..0e33fb9d8 100644 --- a/debian/apparmor/i2p +++ b/debian/apparmor/i2p @@ -1,14 +1,15 @@ -# Last Modified: Sun Apr 12 22:08:32 2015 +# Last Modified: Sun Dec 06 12:30:32 2015 # vim:syntax=apparmor et ts=4 sw=4 -#include -#include -#include -#include -#include + #include + #include + #include + #include -network inet stream, -network inet6 stream, + network inet stream, + network inet dgram, + network inet6 stream, + network inet6 dgram, # Needed by Java @{PROC} r, @@ -16,8 +17,6 @@ network inet6 stream, owner @{PROC}/[0-9]*/status r, @{PROC}/[0-9]*/net/ipv6_route r, @{PROC}/[0-9]*/net/if_inet6 r, - /dev/random r, - /dev/urandom r, /sys/devices/system/cpu/ r, /sys/devices/system/cpu/** r, @@ -53,15 +52,28 @@ network inet6 stream, /usr/share/java/wrapper*.jar r, # 'm' is needed by the I2P-Bote plugin - /{,var/}tmp/ rwm, - owner /{,var/}tmp/** rwklm, + /{,lib/live/mount/overlay/}tmp/ rwm, + owner /{,lib/live/mount/overlay/}tmp/hsperfdata_i2psvc/ rwk, + owner /{,lib/live/mount/overlay/}tmp/hsperfdata_i2psvc/** rw, + owner /{,lib/live/mount/overlay/}tmp/wrapper* rwk, + owner /{,lib/live/mount/overlay/}tmp/wrapper*/** rw, + # Scrypt used by I2P-Bote + owner /{,lib/live/mount/overlay/}tmp/scrypt* rwk, + owner /{,lib/live/mount/overlay/}tmp/scrypt*/** rw, + owner /{,lib/live/mount/overlay/}tmp/i2p-daemon/ rwm, + owner /{,lib/live/mount/overlay/}tmp/i2p-daemon/** rwkm, + # /graphs in the router console + owner /{,lib/live/mount/overlay/}tmp/imageio[0-9]*.tmp rwk, # Prevent spamming the logs deny /dev/tty rw, + deny /{,lib/live/mount/overlay/}var/tmp/ r, deny @{PROC}/[0-9]*/fd/ r, deny /usr/sbin/ r, deny /var/cache/fontconfig/ wk, - # Used by some versions of the Tanuki wrapper, not needed by I2P + # Some versions of the Tanuki wrapper package will try to load these jars but + # they are not needed by I2P. The deny rule here will prevent the logs from + # being spammed. deny /usr/share/java/hamcrest*.jar r, deny /usr/share/java/junit*.jar r, diff --git a/debian/apparmor/system_i2p b/debian/apparmor/system_i2p index 9af33b524..2eabd775b 100644 --- a/debian/apparmor/system_i2p +++ b/debian/apparmor/system_i2p @@ -1,10 +1,12 @@ +# Last Modified: Sun Dec 06 12:30:32 2015 # vim:syntax=apparmor et #include -profile system_i2p { +profile system_i2p flags=(complain) { #include - owner /{,lib/live/mount/overlay/}var/lib/i2p/** rwkl, + owner /{,lib/live/mount/overlay/}var/lib/i2p/** rwk, + owner /{,lib/live/mount/overlay/}var/lib/i2p/i2p-config/eepsite/cgi-bin rix, owner /{,lib/live/mount/overlay/}var/log/i2p/* rw, owner /{,var/}run/i2p/{i2p,routerjvm}.pid rw, diff --git a/debian/apparmor/usr.bin.i2prouter b/debian/apparmor/usr.bin.i2prouter index 9f871e7ed..9fb11d452 100644 --- a/debian/apparmor/usr.bin.i2prouter +++ b/debian/apparmor/usr.bin.i2prouter @@ -1,9 +1,9 @@ -# Last Modified: Sun Apr 12 22:08:32 2015 +# Last Modified: Sun Dec 06 12:30:32 2015 # vim:syntax=apparmor et ts=8 sw=4 #include -/usr/bin/i2prouter { +/usr/bin/i2prouter flags=(complain) { #include capability sys_ptrace, @@ -41,6 +41,7 @@ @{HOME}/.java/fonts/** r, owner @{HOME}/.i2p/ rw, owner @{HOME}/.i2p/** rwk, + owner @{HOME}/.i2p/eepsite/cgi-bin/** rix, # Prevent spamming the logs deny owner @{HOME}/.java/ wk, diff --git a/debian/changelog b/debian/changelog index cb969c5d2..44d2292f0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,207 @@ +i2p (0.9.23-2) unstable; urgency=medium + + * Backport of two fixes from after the release of 0.9.23 + - debian/patches/0005-Console-Fix-escaping-of-plugin-description-on-config.patch + - debian/patches/0006-NetDb-Fix-deadlock-ticket-1722.patch + * AppArmor: + - Remove 'l' from the debian AppArmor profiles + - Allow writing to /tmp/imageio*, needed by graph creation on some systems + + -- Kill Your TV Sun, 06 Dec 2015 14:28:23 +0000 + +i2p (0.9.23-1) unstable; urgency=medium + + * New Upstream Version + - Accelerate transition to Ed25519 + - Fix some bugs soft restarting after a large clock shift (e.g. resume) (but more to do) + - Fix streaming retransmission timers that were dying, and related timer bugs + - Fix streaming connections rejected while tunnel is opening + - Fix rare i2psnark and UPnP deadlocks + - Fix lifetime participating bandwidth display in console + - Increase default outbound exploratory tunnel length to 3 + - Use max of 2 not-failing peers in exploratory tunnels to improve build success + - Add support for hostnames prefixed with "www."; + - Store news feed items separately on disk, show on new /news page, limit display on home page to 2 + - Increase probability of rekeying to EdDSA + - Detect for broken ECDSA support in Gentoo + - Console: Add a Java 6 warning, this is the last release to support Java 6 + - Changes to prepare for Java 9 compatibility + - i2ptunnel: Pass Accept-Encoding header through client and server proxies, to allow end-to-end compression + - i2psnark: Increase piece size, piece count, and file count limits + - i2psnark: Save added and completed times + - i2psnark: Save magnet parameters across restart + - i2psnark: Don't delete .torrent file on errors at startup, rename to .torrent.BAD + - i2psnark: Add recheck, start, stop buttons on details pages + - i2psnark: Add option to disable "smart sort" + - Speed up IP address validation + - Separate streaming blacklists for ECDSA and EdDSA + - Translation updates + - Update GeoIP data (new installs and PPA only) + + -- Kill Your TV Thu, 19 Nov 2015 12:41:36 +0000 + +i2p (0.9.22-1) unstable; urgency=medium + + * New Upstream Version + - Start migration to Ed25519 router info signatures + - Fix i2psnark getting stuck before download complete, and not deleting temp + files + - Fix excluded SSL ciphers in console + - Translation updates + - Update GeoIP data + + -- Kill Your TV Sun, 13 Sep 2015 11:27:16 +0000 + +i2p (0.9.21-2) unstable; urgency=medium + + * Add exception to apparmor rules for scrypt, needed by I2P-Bote + + -- Kill Your TV Sun, 02 Aug 2015 15:00:30 +0000 + +i2p (0.9.21-1) unstable; urgency=medium + + * New Upstream Version + - Add multisession support for dual-signature crypto on the same tunnels + - Use multisession for shared clients + - Increase default outbound bandwidth limit to 60 KBps + - Increase default maximum participating tunnels + - Floodfills will send database store acks directly if connected, for efficiency + - Set TCP keepalive on I2CP and SAM sockets + - More efficient decompression in HTTP proxy, use less threads + - Add support for fast extensions in i2psnark + - i2psnark only autostarts torrents that were running previously + - Add support for translated console news + - SSU fixes to compete better with NTCP for bandwidth when limited + - Fixes to prevent SSU stalls + - Wait for outbound tunnels before sending first leaseset to client, to + prevent dropping first message + - Clean up resources correctly when SAM stops + - Better error handling and notification when HTTP proxy is not running + - More i2ptunnel fixes at startup and shutdown of tunnels + - Fix total_size in i2psnark metadata message + - Restore dates in console news headers + - Several I2CP fixes + - Use same session for naming lookups in I2PSocketEepGet + - Increase max bandwidth to 16 MBps, add larger Bloom filter + - New floodfills will send their info to nearby floodfills to speed integration + - Apache Tomcat 6.0.44 + - Translation updates + * Drop the following patches; included in 0.9.21: + - 0005-i2ptunnel-Don-t-connect-manager-to-router-in-constru.patch + - 0006-i2ptunnel-Don-t-call-startup-in-chained-constructor-.patch + - 0007-Define-I2PTunnelClientBase-stats-in-one-place.patch + - 0008-i2psnark-Fix-NPE-ticket-1602.patch + + + -- Kill Your TV Fri, 31 Jul 2015 20:01:42 +0000 + +i2p (0.9.20-3) unstable; urgency=medium + + * Add datagram exception to the apparmor profile + + -- Kill Your TV Sat, 20 Jun 2015 11:22:28 +0000 +i2p (0.9.20-2) unstable; urgency=medium + + [str4d] + * i2ptunnel: Don't connect manager to router in constructor (ticket #815) + * i2ptunnel: Don't call startup() in chained constructor (ticket #1593) + * Define I2PTunnelClientBase stats in one place + + [killyourtv] + * Tighten apparmor rules for TMPDIR + * Add support for specifying limits to the initscript + * Fix NPE in I2PSnark (I2P Trac #1602) + + -- Kill Your TV Sun, 14 Jun 2015 16:11:33 +0000 + +i2p (0.9.20-1) unstable; urgency=medium + + * New Upstream Version + - Add support for address book export + - Add support for SSL in HTTP server tunnel + - Allow class 'M' (64-128 KBps share bandwidth) to become floodfill + - Raise connection limits for new classes 'P' (512-2000 KBps share + bandwidth) and 'X' (over 2000 KBps) + - Add support for signed development builds + - Clock skew fixes + - Fixes and configuration for when IPv4 is firewalled but IPv6 still works + - Locking fixes for i2ptunnel clients to prevent hangs at startup + - Verify hostnames when reseeding + - Fix deletion of config files for deleted torrents in i2psnark + - Fix hangs fetching proxy.i2p local resources via Privoxy + - Fixes for duplicate shared clients + - Fix for occasional page truncation in HTTP client + - Fixes for handling corrupted SSU packets + - Fix closing of SAM sessions when I2P session closes + - Reduce NTCP threads + - Eliminate SimpleScheduler threads + - Add continent-based NTP servers as fallbacks for country-based ones + - Remove all default non-SSL reseed hosts + - Disable fallback to non-su3 reseeding + - Several fixes in streaming for better "loopback" performance, + may or may not help in real world + - Reduce latency in i2ptunnel + - Add a larger Bloom filter for very high bandwidth and memory + - Add Bloom filter warning when configured for high bandwidth but not + enough memory + - Reduce max netdb search depth to reduce floodfill load + - Improved header processing and error handling in i2ptunnel HTTP server + - Better error handling and user feedback when HTTP client tunnel is + disabled + - More changes to improve floodfill capacity + - New configuration for forcing IPv4 (only) to firewalled on /confignet + - New configuration for floodfill on /configadvanced + - Show separate IPv4 and IPv6 status in summary bar when appropriate + - Better handling of corrupt SSU packets + - Jetty 8.1.17.v20150415 + - Translation updates + - Update GeoIP data (new installs and PPA only) + + -- Kill Your TV Tue, 02 Jun 2015 18:36:42 +0000 + +i2p (0.9.19-4) unstable; urgency=medium + + * Re-enable systemd unit file + + -- Kill Your TV Thu, 30 Apr 2015 22:54:56 +0000 + +i2p (0.9.19-3) unstable; urgency=medium + + * A couple more apparmor profile tweaks + + -- Kill Your TV Tue, 14 Apr 2015 20:35:39 +0000 + +i2p (0.9.19-2) unstable; urgency=medium + + * Fix usr.bin.i2prouter apparmor profile + + -- Kill Your TV Tue, 14 Apr 2015 12:58:22 +0000 + +i2p (0.9.19-1) unstable; urgency=medium + + * New Upstream Version + - Floodfill performance improvements + - Easier ways to reseed manually from a file or URL + - New way to export reseed data for others + - Support for installing plugin from file + - Fixes for high CPU usage in floodfills + - i2ptunnel locking fixes + - Fixes in read timeout handling in streaming + - Update to UPnP library 3.0 + - Improve tracking of floodfill lookup success + - Direct router info lookups if connected to floodfill + - Auto-adjustment of i2psnark tunnel quantity + - Increase exploratory tunnel quantity when floodfill + - Increase min and default bandwidth for i2psnark + - Improved strategies for dropping jobs on high job lag to prevent overload + - Apache Tomcat 6.0.43 + - Translation updates + - Update GeoIP data + * debconf translation updates + * Minor updates to AppArmor profiles + + -- Kill Your TV Sun, 12 Apr 2015 22:34:40 +0000 + i2p (0.9.18-1) unstable; urgency=medium * New Upstream Version diff --git a/debian/control b/debian/control index 6e24840d0..af289f1f5 100644 --- a/debian/control +++ b/debian/control @@ -9,10 +9,10 @@ Build-Depends: debhelper (>= 7.0.50~) ,ant (>= 1.8) ,ant-optional ,debconf - ,default-jdk | openjdk-7-jdk | openjdk-6-jdk + ,default-jdk | openjdk-7-jdk ,dh-apparmor ,gettext - ,libgmp3-dev + ,libgmp-dev (>= 2:5.0.5) # uncomment the next line for official builds # ,libservice-wrapper-java ,libcommons-logging-java @@ -72,7 +72,7 @@ Architecture: all Section: net Priority: optional Depends: ${misc:Depends}, ${java:Depends}, ${shlibs:Depends}, - openjdk-8-jre-headless | openjdk-7-jre-headless | openjdk-6-jre-headless | default-jre-headless | java8-runtime-headless | java7-runtime-headless | java6-runtime-headless, libecj-java + openjdk-8-jre-headless | openjdk-7-jre-headless | default-jre-headless | java8-runtime-headless | java7-runtime-headless, libecj-java Replaces: i2p ( << 0.8.6-5) Breaks: i2p (<< 0.8.6-5) Recommends: libjbigi-jni, ttf-dejavu diff --git a/debian/i2p.init b/debian/i2p.init index eac736f70..3b61904de 100755 --- a/debian/i2p.init +++ b/debian/i2p.init @@ -32,7 +32,6 @@ WRAPPERLOG="/var/log/i2p/wrapper.log" RUN_DAEMON="False" NICE=0 I2PUSER="i2psvc" -USE_AA="yes" I2P_ARGS="/etc/i2p/wrapper.config \ wrapper.java.additional.1=-DloggerFilenameOverride=/var/log/i2p/log-router-@.txt \ @@ -67,6 +66,15 @@ if [ -z "$RUN_DAEMON" ]; then exit 1 fi +case "$CONFINE_WITH_APPARMOR" in + [NnFf]*) + USE_AA="no" + ;; + *) + USE_AA="yes" + ;; +esac + case "$RUN_DAEMON" in [NnFf]*) log_action_msg "$DESC daemon disabled in /etc/default/$NAME". @@ -83,6 +91,7 @@ esac do_start() { + [ ! -z $ULIMIT ] && ulimit -n $ULIMIT start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null 2>&1 \ || return 1 [ -d $RUN ] || mkdir $RUN > /dev/null 2>&1 diff --git a/debian/i2p.postinst b/debian/i2p.postinst index 328926704..d612902ba 100755 --- a/debian/i2p.postinst +++ b/debian/i2p.postinst @@ -6,7 +6,7 @@ I2PHOME=/var/lib/i2p I2PSYSUSER=i2psvc conffile="/etc/default/i2p" -#systemdservice="/lib/systemd/system/i2p.service" +systemdservice="/lib/systemd/system/i2p.service" # Source debconf library -- we have a Depends line # to make sure it is there... @@ -25,6 +25,7 @@ case "$1" in echo >> $conffile echo "RUN_DAEMON=" >> $conffile echo "I2PUSER=" >> $conffile + echo "ULIMIT=" >> $conffile echo "CONFINE_WITH_APPARMOR=" >> $conffile echo "# The next value is also wrapper.java.maxmemory in /etc/i2p/wrapper.config" >> $conffile echo "MEMORYLIMIT=" >> $conffile @@ -49,6 +50,8 @@ case "$1" in echo "I2PUSER=" >> $conffile test -z "$MEMORYLIMIT" || grep -Eq '^ *MEMORYLIMIT=' $conffile || \ echo "MEMORYLIMIT=" >> $conffile + test -z "$ULIMIT" || grep -Eq '^ *ULIMIT=' $conffile || \ + echo "ULIMIT=" >> $conffile test -z "$CONFINE_WITH_APPARMOR" || grep -Eq '^ *CONFINE_WITH_APPARMOR=' $conffile || \ echo "CONFINE_WITH_APPARMOR=" >> $conffile @@ -57,8 +60,6 @@ case "$1" in I2PUSER="i2psvc" fi - - sed -e "s/^ *RUN_DAEMON=.*/RUN_DAEMON=\"$RUN_DAEMON\"/" \ -e "s/^ *I2PUSER=.*/I2PUSER=\"$I2PUSER\"/" \ -e "s/^ *MEMORYLIMIT=.*/MEMORYLIMIT=\"$MEMORYLIMIT\"/" \ @@ -66,19 +67,19 @@ case "$1" in < $conffile > $conffile.tmp mv -f $conffile.tmp $conffile -# if [ -e "$systemdservice" ]; then -# sed -e "s/User=.*/User=$I2PUSER/" < "$systemdservice" > "$systemdservice.tmp" -# mv -f "$systemdservice.tmp" "$systemdservice" -# chmod 0644 -f "$systemdservice" -# if grep -q 'systemd' /proc/1/comm > /dev/null 2>&1; then -# systemctl --system daemon-reload -# if [ $RUN_DAEMON = 'true' ]; then -# systemctl enable i2p.service -# else -# systemctl disable i2p.service -# fi -# fi -# fi + if [ -e "$systemdservice" ]; then + sed -e "s/User=.*/User=$I2PUSER/" < "$systemdservice" > "$systemdservice.tmp" + mv -f "$systemdservice.tmp" "$systemdservice" + chmod 0644 -f "$systemdservice" + if grep -q 'systemd' /proc/1/comm > /dev/null 2>&1; then + systemctl --system daemon-reload + if [ $RUN_DAEMON = 'true' ]; then + systemctl enable i2p.service + else + systemctl disable i2p.service + fi + fi + fi sed -e "s/^ *wrapper\.java\.maxmemory=.*/wrapper\.java\.maxmemory=$MEMORYLIMIT/" \ < /etc/i2p/wrapper.config > /etc/i2p/wrapper.config.tmp diff --git a/debian/i2p.service b/debian/i2p.service index 6a4c8d3b4..4199e9910 100644 --- a/debian/i2p.service +++ b/debian/i2p.service @@ -1,10 +1,31 @@ +# It's not recommended to modify this file because it will be +# overwritten during package upgrades. If you want to make changes, the +# best way is to create a file "/etc/systemd/system/i2p.service.d/foo.conf" +# and make your changes there. This file will be parsed after the file +# i2p.service itself is parsed. +# +# For more info about custom unit files, see systemd.unit(5) or +# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F + +# For example, if you want to increase I2P's open-files-limit to 10000, +# you need to increase systemd's LimitNOFILE setting, so create a file named +# "/etc/systemd/system/i2p.service.d/limits.conf" containing: +# [Service] +# LimitNOFILE=10000 + +# Don't forget to reload systemd daemon after you change unit configuration: +# root> systemctl --system daemon-reload + [Unit] Description=load-balanced unspoofable packet switching network -After=network.target +After=local-fs.target network.target time-sync.target [Service] Type=forking EnvironmentFile=/etc/default/i2p +RuntimeDirectory=i2p +RuntimeDirectoryMode=750 +PIDFile=/run/i2p/i2p.pid Environment="I2P_ARGS=/etc/i2p/wrapper.config \ wrapper.java.additional.1=-DloggerFilenameOverride=/var/log/i2p/log-router-@.txt \ wrapper.java.additional.10=-Dwrapper.logfile=/var/log/i2p/wrapper.log \ @@ -16,11 +37,12 @@ Environment="I2P_ARGS=/etc/i2p/wrapper.config \ wrapper.daemonize=TRUE" TZ=UTC User=i2psvc PermissionsStartOnly=true -ExecStartPre=/bin/mkdir -p /run/i2p /tmp/i2p-daemon +AppArmorProfile=system_i2p +ExecStartPre=/bin/mkdir -p /tmp/i2p-daemon ExecStartPre=/bin/chown -R ${I2PUSER}:${I2PUSER} /var/log/i2p /run/i2p /tmp/i2p-daemon ExecStartPre=/bin/chmod 750 /var/log/i2p ExecStart=/usr/sbin/wrapper "$I2P_ARGS" -ExecStopPost=/bin/rm -rf /run/i2p /tmp/i2p-daemon +ExecStopPost=/bin/rm -rf /run/i2p [Install] WantedBy=multi-user.target diff --git a/debian/patches/0001-path-substitution.patch b/debian/patches/0001-path-substitution.patch index e4cb1fcac..9af1e19ed 100644 --- a/debian/patches/0001-path-substitution.patch +++ b/debian/patches/0001-path-substitution.patch @@ -309,11 +309,10 @@ Debian wrapper.config to try to prevent confusion. #******************************************************************** # Wrapper General Properties -@@ -258,30 +239,3 @@ - wrapper.umask=0022 +@@ -259,32 +240,6 @@ wrapper.java.umask=0022 wrapper.logfile.umask=0077 -- + -#******************************************************************** -# Wrapper NT Service Properties -#******************************************************************** @@ -340,22 +339,25 @@ Debian wrapper.config to try to prevent confusion. -# Allow the service to interact with the desktop. -wrapper.ntservice.interactive=false - + # http://wrapper.tanukisoftware.com/doc/english/prop-check-deadlock.html + # requires wrapper 3.5.0 or higher + # interval is seconds --- a/installer/resources/locale/po/messages_de.po +++ b/installer/resources/locale/po/messages_de.po @@ -195,15 +195,15 @@ msgstr "Falls gestartet, fordere einen Java Thread dump an" - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Bitte bearbeite i2prouter und setze die Variable RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Bitte bearbeite /etc/default/i2p und setze die Variable RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "I2P als root Benutzer auszuführen ist *nicht* empfehlenswert." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -367,16 +369,16 @@ Debian wrapper.config to try to prevent confusion. @@ -185,7 +185,7 @@ msgstr "" - #: ../i2prouter:1825 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" msgstr "" - #: ../i2prouter:1830 + #: ../i2prouter:1869 @@ -193,5 +193,5 @@ msgstr "" - #: ../i2prouter:1833 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -385,16 +387,16 @@ Debian wrapper.config to try to prevent confusion. @@ -187,7 +187,7 @@ msgstr "" - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" msgstr "" - #: ../i2prouter:1812 + #: ../i2prouter:1869 @@ -195,5 +195,5 @@ msgstr "" - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -403,57 +405,59 @@ Debian wrapper.config to try to prevent confusion. @@ -187,13 +187,13 @@ msgstr "请求Java转储(如果在运行)。" - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "请编辑 i2prouter 设置 RUN_AS_USER 变量" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "请编辑 /etc/default/i2p 设置 RUN_AS_USER 变量" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "推荐 *不要* 以 root 身份运行 I2P 。" - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "要以root运行,请编辑 i2prouter 并设置 ALLOW_ROOT=true。" +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." +msgstr "要以root运行,请编辑 /etc/default/i2p 并设置 ALLOW_ROOT=true。" --- a/installer/resources/locale/po/messages_tr.po +++ b/installer/resources/locale/po/messages_tr.po -@@ -186,13 +186,13 @@ +@@ -188,15 +188,15 @@ msgstr "Çalışıyorsa Java iş parçacığı dökümü isteyin." - #: ../i2prouter:1796 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "i2prouter dosyasını düzenleyin ve RUN_AS_USER değişkenini ayarlayın" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "/etc/default/i2p dosyasını düzenleyin ve RUN_AS_USER değişkenini ayarlayın" - #: ../i2prouter:1801 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "I2P yazılımının root olarak çalıştırmanız *önerilmez*." - #: ../i2prouter:1804 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." --msgstr "Root olarak çalıştırmak için i2prouter dosyasını düzenleyin ve ALLOW_ROOT=true ayarını yapın." -+msgid "To run as root anyway, edit /etc/defalt/i2p and set ALLOW_ROOT=true." -+msgstr "Root olarak çalıştırmak için /etc/default/i2p dosyasını düzenleyin ve ALLOW_ROOT=true ayarını yapın." ++msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." + msgstr "" +-"Root olarak çalıştırmak için i2prouter dosyasını düzenleyin ve " ++"Root olarak çalıştırmak için /etc/default/i2p dosyasını düzenleyin ve " + "ALLOW_ROOT=true ayarını yapın." --- a/installer/resources/locale/po/messages_es.po +++ b/installer/resources/locale/po/messages_es.po @@ -193,15 +193,15 @@ msgstr "Solicitar un volcado del hilo JAVA si se está ejecutando." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Por favor edite i2prouter e introduzca la variable RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Por favor edite /etc/default/i2p e introduzca la variable RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "\"No\" se recomienda ejecutar I2P como root." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -465,17 +469,17 @@ Debian wrapper.config to try to prevent confusion. @@ -189,15 +189,15 @@ msgstr "Requisitar o histórico Java se iniciado." - #: ../i2prouter:1796 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Favor editar o arquivo i2prouter e configurar a variável RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Favor editar o arquivo /etc/default/i2p e configurar a variável RUN_AS_USER" - #: ../i2prouter:1801 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Iniciar I2P como permissões root *não* é recomendado." - #: ../i2prouter:1804 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -487,18 +491,18 @@ Debian wrapper.config to try to prevent confusion. @@ -190,8 +190,8 @@ msgstr "Request a Java thread dump if running." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Veuillez éditer i2prouter et paramétrer la variable RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Veuillez éditer /etc/default/i2p et paramétrer la variable RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." @@ -199,7 +199,7 @@ "Faire fonctionner I2P en tant qu'utilisateur root n'est *pas* recommandé." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -507,40 +511,43 @@ Debian wrapper.config to try to prevent confusion. "ALLOW_ROOT=true." --- a/installer/resources/locale/po/messages_ru.po +++ b/installer/resources/locale/po/messages_ru.po -@@ -191,13 +191,13 @@ +@@ -193,16 +193,16 @@ msgstr "Запросить дамп нитей Java, если запущено." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" --msgstr "Пожалуйста, отредактируйте i2prouter и установите переменную RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" -+msgstr "Пожалуйста, отредактируйте /etc/default/i2p и установите переменную RUN_AS_USER" + msgstr "" +-"Пожалуйста, отредактируйте i2prouter и установите переменную RUN_AS_USER" ++"Пожалуйста, отредактируйте /etc/default/i2p и установите переменную RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Запускать I2P от имени root'а *НЕ* рекомендуется." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." --msgstr "Чтобы всё равно запустить под root'ом, отредактируйте i2prouter и установите ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." -+msgstr "Чтобы всё равно запустить под root'ом, отредактируйте /etc/default/i2p и установите ALLOW_ROOT=true." + msgstr "" +-"Чтобы всё равно запустить под root'ом, отредактируйте i2prouter и установите " ++"Чтобы всё равно запустить под root'ом, отредактируйте /etc/default/i2p и установите " + "ALLOW_ROOT=true." --- a/installer/resources/locale/po/messages_sv.po +++ b/installer/resources/locale/po/messages_sv.po @@ -187,14 +187,14 @@ msgstr "Fråga efter en Java thread dump vid drift." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Var god ändra i2prouter och set variabeln RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Var god ändra /etc/default/i2p och set variabeln RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Att köra I2P som användare root är *inte* rekommenderat." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -551,17 +558,17 @@ Debian wrapper.config to try to prevent confusion. @@ -187,15 +187,15 @@ msgstr "Solicitarea dump-ului firului Java daca este pornit" - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Vă rugăm să editați i2prouter și setați variabila RUN_AS_USER " +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Vă rugăm să editați /etc/default/i2p și setați variabila RUN_AS_USER " - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Rularea I2P ca root *nu* este recomandată." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." msgstr "" @@ -570,81 +577,87 @@ Debian wrapper.config to try to prevent confusion. "true." --- a/installer/resources/locale/po/messages_pt_BR.po +++ b/installer/resources/locale/po/messages_pt_BR.po -@@ -187,13 +187,13 @@ - msgstr "" +@@ -190,15 +190,15 @@ + msgstr "Solicitar um despejo de thread se está sendo executado." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Por favor, edite i2prouter e especifique a variável RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Por favor, edite /etc/default/i2p e especifique a variável RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Executar o roteador I2P como usuário root *não* é recomendado." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." --msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite i2prouter e ponha ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." -+msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite /etc/default/i2p e ponha ALLOW_ROOT=true." + msgstr "" + "De qualquer forma, se quiser mesmo executar o roteador como root, edite " +-"i2prouter e ponha ALLOW_ROOT=true." ++"/etc/default/i2p e ponha ALLOW_ROOT=true." --- a/installer/resources/locale/po/messages_pl.po +++ b/installer/resources/locale/po/messages_pl.po -@@ -186,13 +186,13 @@ +@@ -191,13 +191,13 @@ msgstr "Zażądaj zrzutu wątków Java jeśli jest uruchomiona." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Proszę edytuj i2prouter i ustaw zmienną RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Proszę edytuj /etc/default/i2p i ustaw zmienną RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Nie jest polecane uruchamianie I2P jako root." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Aby uruchomić jako root, edytuj i2prouter i ustaw ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." +msgstr "Aby uruchomić jako root, edytuj /etc/default/i2p i ustaw ALLOW_ROOT=true." --- a/installer/resources/locale/po/messages_ja.po +++ b/installer/resources/locale/po/messages_ja.po -@@ -186,13 +186,13 @@ +@@ -189,15 +189,15 @@ msgstr "起動中の場合、 Java スレッドダンプを要求" - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "i2prouter を編集して、変数 RUN_AS_USER を設定してください" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "/etc/default/i2p を編集して、変数 RUN_AS_USER を設定してください" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "root ユーザーとしての I2P の起動は推奨され*ません*。" - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." --msgstr "とにかく root として起動し、 i2prouter を編集して、ALLOW_ROOT=true と設定する。" +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." -+msgstr "とにかく root として起動し、/etc/default/i2p を編集して、ALLOW_ROOT=true と設定する。" + msgstr "" +-"とにかく root として起動し、 i2prouter を編集して、ALLOW_ROOT=true と設定す" ++"とにかく root として起動し、 /etc/default/i2p を編集して、ALLOW_ROOT=true と設定す" + "る。" --- a/installer/resources/locale/po/messages_sk.po +++ b/installer/resources/locale/po/messages_sk.po -@@ -187,13 +187,13 @@ +@@ -189,15 +189,15 @@ msgstr "Vyžiadať zrušenie vlákna Javy, ak je spustený." - #: ../i2prouter:1807 + #: ../i2prouter:1864 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Prosím upravte i2prouter a nastavte premennú RUN_AS_USER" +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Prosím upravte /etc/default/i2p a nastavte premennú RUN_AS_USER" - #: ../i2prouter:1812 + #: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Spúšťať I2P ako root *nie* je odporúčané." - #: ../i2prouter:1815 + #: ../i2prouter:1872 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." --msgstr "Ak ho chcete spustiť ako root aj tak, upravte i2prouter a nastavte ALLOW_ROOT=true." +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." -+msgstr "Ak ho chcete spustiť ako root aj tak, upravte /etc/default/i2p a nastavte ALLOW_ROOT=true." + msgstr "" +-"Ak ho chcete spustiť ako root aj tak, upravte i2prouter a nastavte " ++"Ak ho chcete spustiť ako root aj tak, upravte /etc/default/i2p a nastavte " + "ALLOW_ROOT=true." diff --git a/debian/po/cs.po b/debian/po/cs.po index 22833ff5e..06b3cac21 100644 --- a/debian/po/cs.po +++ b/debian/po/cs.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: msgid "" msgstr "" @@ -11,10 +11,10 @@ msgstr "" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" "Language-Team: Czech (http://www.transifex.com/projects/p/I2P/language/cs/)\n" +"Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: cs\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #. Type: boolean @@ -29,7 +29,9 @@ msgstr "Spustit I2P routr při spuštění počítače?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P routr bude spuštěn při startu počítače jako služba na pozadí (démon). Toto je doporučené nastavení." +msgstr "" +"I2P routr bude spuštěn při startu počítače jako služba na pozadí (démon). " +"Toto je doporučené nastavení." #. Type: string #. Description @@ -41,11 +43,16 @@ msgstr "Jméno uživatele I2P démona (daemon user):" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "I2P démon je ve výchozím stavu nakonfigurován aby běžel pod uživatelským účtem i2psvc. Pokud chcete použít **existující** I2P profil zadejte přihlašovací jméno (login) jiného uživatelského účtu. Například pokud se Vaše předchozí instalace I2P nachází v adresáři /home/franta/i2p, zadejte sem franta." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"I2P démon je ve výchozím stavu nakonfigurován aby běžel pod uživatelským " +"účtem i2psvc. Pokud chcete použít **existující** I2P profil zadejte " +"přihlašovací jméno (login) jiného uživatelského účtu. Například pokud se " +"Vaše předchozí instalace I2P nachází v adresáři /home/franta/i2p, zadejte " +"sem franta." #. Type: string #. Description @@ -53,7 +60,9 @@ msgstr "I2P démon je ve výchozím stavu nakonfigurován aby běžel pod uživa msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Důležité: pokud zadáte jiné jméno uživatele než je výchozí i2psvc, jeho účet už musí předem existovat." +msgstr "" +"Důležité: pokud zadáte jiné jméno uživatele než je výchozí i2psvc, jeho účet " +"už musí předem existovat." #. Type: string #. Description @@ -73,7 +82,9 @@ msgstr "Standardně I2P použije nanejvýš 128MB RAM." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Pokud máte velmi rychlé připojení, používáte hodně pluginů a nebo stahujete velké množství torrentů, zvyšte tuto hodnotu." +msgstr "" +"Pokud máte velmi rychlé připojení, používáte hodně pluginů a nebo stahujete " +"velké množství torrentů, zvyšte tuto hodnotu." #. Type: boolean #. Description diff --git a/debian/po/de.po b/debian/po/de.po index 95e1e8c4e..ebd36be81 100644 --- a/debian/po/de.po +++ b/debian/po/de.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # D.A. Loader <>, 2012 # Ettore Atalan , 2015 @@ -13,11 +13,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 16:34+0000\n" "Last-Translator: Ettore Atalan \n" -"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/de/)\n" +"Language-Team: German (http://www.transifex.com/projects/p/I2P/language/" +"de/)\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -32,7 +33,9 @@ msgstr "Soll der I2P-Router beim Hochfahren mitgestartet werden?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Der I2P-Router kann als Dämon laufen und beim Hochfahren des Betriebssystems mitgestartet werden. Diese Option wird empfohlen." +msgstr "" +"Der I2P-Router kann als Dämon laufen und beim Hochfahren des Betriebssystems " +"mitgestartet werden. Diese Option wird empfohlen." #. Type: string #. Description @@ -44,11 +47,15 @@ msgstr "Benutzer für den I2P-Dämon" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Standardmäßig ist I2P so eingestellt, dass es im Dämonmodus der unter dem Benutzer i2psvc läuft. Um ein bereits **vorhandenes** I2P-Profil zu benutzen, kannst du hier einen anderen Benutzer angeben. Beispiel: Wenn deine alte I2P-Installation in /home/ich/i2p residiert, gib hier 'ich' ein." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Standardmäßig ist I2P so eingestellt, dass es im Dämonmodus der unter dem " +"Benutzer i2psvc läuft. Um ein bereits **vorhandenes** I2P-Profil zu " +"benutzen, kannst du hier einen anderen Benutzer angeben. Beispiel: Wenn " +"deine alte I2P-Installation in /home/ich/i2p residiert, gib hier 'ich' ein." #. Type: string #. Description @@ -56,7 +63,9 @@ msgstr "Standardmäßig ist I2P so eingestellt, dass es im Dämonmodus der unter msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Achtung: Wenn etwas anderes als das Standartmäßige 'i2psvc' hier eingetrangen ist, musst du einen Benutzernamen angeben der schon existiert !" +msgstr "" +"Achtung: Wenn etwas anderes als das Standartmäßige 'i2psvc' hier " +"eingetrangen ist, musst du einen Benutzernamen angeben der schon existiert !" #. Type: string #. Description @@ -76,7 +85,9 @@ msgstr "Standartmäßig kann I2P bist zu 128 MB RAM belegen." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Router mit hoher Bandbreite, sowie vielen aktiven Torrents oder Plugins, müssen gegebenenfalls diesen Wert erhöhen." +msgstr "" +"Router mit hoher Bandbreite, sowie vielen aktiven Torrents oder Plugins, " +"müssen gegebenenfalls diesen Wert erhöhen." #. Type: boolean #. Description @@ -90,4 +101,6 @@ msgstr "Mit AppArmor beschränkten I2P-Daemon ausführen" msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." -msgstr "Wenn diese Option aktiviert ist, läuft I2P in einer AppArmor-Sandbox, welche den Zugriff von I2P auf Dateien und Verzeichnisse beschränkt." +msgstr "" +"Wenn diese Option aktiviert ist, läuft I2P in einer AppArmor-Sandbox, welche " +"den Zugriff von I2P auf Dateien und Verzeichnisse beschränkt." diff --git a/debian/po/el.po b/debian/po/el.po index 258f74a56..3c125cd30 100644 --- a/debian/po/el.po +++ b/debian/po/el.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # lixtetrax , 2012 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" "Language-Team: Greek (http://www.transifex.com/projects/p/I2P/language/el/)\n" +"Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -30,7 +30,9 @@ msgstr "Έναρξη λειτουργίας του δρομολογητή I2P κ msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Ο δρομολογητής I2P μπορει να εκκινήσει ως υπηρεσίας κατά την εκκίνηση του υπολογιστή σας. Αυτή είναι η προτεινόμενη ρύθμιση." +msgstr "" +"Ο δρομολογητής I2P μπορει να εκκινήσει ως υπηρεσίας κατά την εκκίνηση του " +"υπολογιστή σας. Αυτή είναι η προτεινόμενη ρύθμιση." #. Type: string #. Description @@ -42,11 +44,16 @@ msgstr "Χρήστης Ι2Ρ υπηρεσίας:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Αν τρέχει ως υπηρεσία, εξ' ορισμού το Ι2Ρ είναι ρυθμισμένο να τρέχει ύπο τον λογαριασμό χρήστη 'i2psvc. Για να χρησιμοποιηθεί ένα **υπάρχον** προφίλ Ι2Ρ, μπορείτε να εισάγετε ένα διαφορετικό όνομα λογαριασμού εδώ. Για παράδειγμα, αν η προηγούμενη εγκατάσταση Ι2Ρ βρίσκεται στο /home/user/i2p, μπορείτε να εισάγετε 'user' εδώ." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Αν τρέχει ως υπηρεσία, εξ' ορισμού το Ι2Ρ είναι ρυθμισμένο να τρέχει ύπο τον " +"λογαριασμό χρήστη 'i2psvc. Για να χρησιμοποιηθεί ένα **υπάρχον** προφίλ Ι2Ρ, " +"μπορείτε να εισάγετε ένα διαφορετικό όνομα λογαριασμού εδώ. Για παράδειγμα, " +"αν η προηγούμενη εγκατάσταση Ι2Ρ βρίσκεται στο /home/user/i2p, μπορείτε να " +"εισάγετε 'user' εδώ." #. Type: string #. Description @@ -54,7 +61,9 @@ msgstr "Αν τρέχει ως υπηρεσία, εξ' ορισμού το Ι2Ρ msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Πολύ σημαντικό: αν οριστεί εδώ όνομα χρήστη πέραν του εξ' ορισμού 'i2psvc', το επιλεγμένο όνομα χρήστη *ΠΡΕΠΕΙ* να υπάρχει ήδη." +msgstr "" +"Πολύ σημαντικό: αν οριστεί εδώ όνομα χρήστη πέραν του εξ' ορισμού 'i2psvc', " +"το επιλεγμένο όνομα χρήστη *ΠΡΕΠΕΙ* να υπάρχει ήδη." #. Type: string #. Description @@ -74,7 +83,9 @@ msgstr "Εξ' ορισμού, θα επετραπεί στο Ι2Ρ να χρησ msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Δρομολογητές με υψηλό εύρος ζώνης, καθώς και δρομολογητές με πολλά ενεργά αρθρώματα μπορεί να χρειαστεί να αυξήσουν αυτή την τιμή." +msgstr "" +"Δρομολογητές με υψηλό εύρος ζώνης, καθώς και δρομολογητές με πολλά ενεργά " +"αρθρώματα μπορεί να χρειαστεί να αυξήσουν αυτή την τιμή." #. Type: boolean #. Description diff --git a/debian/po/es.po b/debian/po/es.po index 344b3dba1..599cd69b3 100644 --- a/debian/po/es.po +++ b/debian/po/es.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Adolfo Jayme Barrientos, 2013 # mixxy , 2011 @@ -14,11 +14,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 23:53+0000\n" "Last-Translator: strel\n" -"Language-Team: Spanish (http://www.transifex.com/projects/p/I2P/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/projects/p/I2P/language/" +"es/)\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -33,7 +34,9 @@ msgstr "¿Iniciar el enrutador I2P al arrancar?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "El enrutador I2P se puede ejecutar como demonio que inicia automaticamente al arrancar el equipo. Esta es la opción recomendada." +msgstr "" +"El enrutador I2P se puede ejecutar como demonio que inicia automaticamente " +"al arrancar el equipo. Esta es la opción recomendada." #. Type: string #. Description @@ -45,11 +48,16 @@ msgstr "Usuario del demonio I2P:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "De forma predeterminada, I2P está configurado para ejecutarse con la cuenta i2psvc si el modo de demonio está activado. Para usar un perfil **ya existente** de I2P, puede especificar aquí un nombre de cuenta diferente. Por ejemplo, si su instalación anterior de I2P está en /home/pepe/i2p, puedes escribir «pepe» aquí." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"De forma predeterminada, I2P está configurado para ejecutarse con la cuenta " +"i2psvc si el modo de demonio está activado. Para usar un perfil **ya " +"existente** de I2P, puede especificar aquí un nombre de cuenta diferente. " +"Por ejemplo, si su instalación anterior de I2P está en /home/pepe/i2p, " +"puedes escribir «pepe» aquí." #. Type: string #. Description @@ -57,7 +65,9 @@ msgstr "De forma predeterminada, I2P está configurado para ejecutarse con la cu msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Muy importante: Si se introduce un nombre de usuario en este campo distinto a «i2psvc», el nombre elegido *DEBE* existir de antemano." +msgstr "" +"Muy importante: Si se introduce un nombre de usuario en este campo distinto " +"a «i2psvc», el nombre elegido *DEBE* existir de antemano." #. Type: string #. Description @@ -69,7 +79,8 @@ msgstr "La memoria que se puede asignar a I2P:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "De forma predeterminada, a I2P solo se le permitirá usar hasta 128MB de RAM." +msgstr "" +"De forma predeterminada, a I2P solo se le permitirá usar hasta 128MB de RAM." #. Type: string #. Description @@ -77,7 +88,9 @@ msgstr "De forma predeterminada, a I2P solo se le permitirá usar hasta 128MB de msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Los enrutadores con ancho de banda alto, además de los enrutadores con muchos torrents/complementos activos, pueden necesitar aumentar este valor." +msgstr "" +"Los enrutadores con ancho de banda alto, además de los enrutadores con " +"muchos torrents/complementos activos, pueden necesitar aumentar este valor." #. Type: boolean #. Description @@ -91,4 +104,6 @@ msgstr "Ejecutar el demonio I2P confinado con AppArmor" msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." -msgstr "Con esta opción habilitada I2P sera encerrada con AppArmor, restringiendo a qué ficheros y directorios se puede acceder por I2P." +msgstr "" +"Con esta opción habilitada I2P sera encerrada con AppArmor, restringiendo a " +"qué ficheros y directorios se puede acceder por I2P." diff --git a/debian/po/fi.po b/debian/po/fi.po index 9d77961ac..a9c37db6f 100644 --- a/debian/po/fi.po +++ b/debian/po/fi.po @@ -1,28 +1,29 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # oselotti, 2014-2015 +# outolumo , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 15:00+0000\n" -"Last-Translator: oselotti\n" -"Language-Team: Finnish (http://www.transifex.com/projects/p/I2P/language/fi/)\n" +"PO-Revision-Date: 2015-09-14 21:51+0000\n" +"Last-Translator: outolumo \n" +"Language-Team: Finnish (http://www.transifex.com/otf/I2P/language/fi/)\n" +"Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean #. Description #: ../i2p.templates:2001 msgid "Should the I2P router be started at boot?" -msgstr "Tulisiko I2P-reititin käynnistää järjestelmän käynnistyksen yhteydessä?" +msgstr "Käynnistetäänkö I2P-reititin järjestelmää käynnistettäessä?" #. Type: boolean #. Description @@ -30,7 +31,9 @@ msgstr "Tulisiko I2P-reititin käynnistää järjestelmän käynnistyksen yhteyd msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P-reititin voi toimia taustapalveluna, joka käynnistyy automaattisesti tietokoneen käynnistyessä. Tämä on suositeltu asetus." +msgstr "" +"I2P-reititin voi toimia taustapalveluna, joka käynnistetään automaattisesti " +"tietokoneen käynnistyessä. Tämä on suositus." #. Type: string #. Description @@ -42,11 +45,15 @@ msgstr "I2P daemon käyttäjä:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Oletuksena I2P on säädetty toimimaan taustapalveluna i2psvc-käyttäjällä. Käytettäessä **olemassa olevaa** I2P-profiilia, voidaan eri käyttäjänimi syöttää tähän. Esimerkiksi, jos edellinen I2P-asennus oli /home/user/i2p, voidaan tähän syöttää 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Oletuksena I2P on asetettu taustapalveluksi i2psvc-käyttäjänä. Käyttääksesi " +"**jo olemassa olevaa** I2P-profiilia, voit syöttää käyttäjätunnuksen tähän. " +"Esimerkiksi, jos edellinen I2P-asennuksesi on /home/user/i2p, voit syöttää " +"tähän 'user'." #. Type: string #. Description @@ -54,19 +61,21 @@ msgstr "Oletuksena I2P on säädetty toimimaan taustapalveluna i2psvc-käyttäj msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Erittäin tärkeää: jos joku muu käyttäjä kuin oletusarvo 'i2psvc' syötetään tähän, käyttäjän *TÄYTYY* olla ennestään olemassa." +msgstr "" +"Erittäin tärkeää: jos muutat oletuskäyttäjää 'i2psvc', ilmoittamasi " +"käyttäjän *TÄYTYY* olla jo ennestään olemassa." #. Type: string #. Description #: ../i2p.templates:4001 msgid "Memory that can be allocated to I2P:" -msgstr "Muisti, joka voidaan varata I2P:n käyttöön:" +msgstr "Kuinka paljon muistia I2P saa käyttää:" #. Type: string #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "Oletuksena I2P voi käyttää maksimissaan vain 128MB RAM-muistia." +msgstr "Oletuksena I2P voi käyttää korkeintaan 128MB RAM-muistia." #. Type: string #. Description @@ -74,7 +83,9 @@ msgstr "Oletuksena I2P voi käyttää maksimissaan vain 128MB RAM-muistia." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Suurikaistaiset reitittimet, sekä reitittimet, joilla on paljon aktiivisia torrenteja / lisäosia, saattavat tarvita tämän arvon korotettuna." +msgstr "" +"Laajakaistaiset reitittimet, sekä koneet, joilla on paljon aktiivisia " +"torrenteja / lisäosia, saattavat tarvita enemmän muistia." #. Type: boolean #. Description @@ -88,4 +99,6 @@ msgstr "Suorita I2P-daemon AppArmorin kanssa" msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." -msgstr "Jos tämä asetus on päällä, I2P hiekkalaatikoidaan AppArmorilla, rajoittaen tiedostot ja hakemistot, jotka ovat I2P:n saatavissa." +msgstr "" +"Jos tämä asetus on päällä, I2P koteiloidaan AppArmorilla, mikä kansioita ja " +"tiedostoja, joihin I2P pääsee käsiksi." diff --git a/debian/po/fr.po b/debian/po/fr.po index 8be0a3548..6ffd9a221 100644 --- a/debian/po/fr.po +++ b/debian/po/fr.po @@ -1,23 +1,24 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Boxoa590, 2012 # Boxoa590, 2012 -# Towinet, 2013 +# syl_, 2015 +# Towinet, 2013,2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: French (http://www.transifex.com/projects/p/I2P/language/fr/)\n" +"PO-Revision-Date: 2015-10-31 23:04+0000\n" +"Last-Translator: syl_\n" +"Language-Team: French (http://www.transifex.com/otf/I2P/language/fr/)\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. Type: boolean @@ -32,7 +33,9 @@ msgstr "Le routeur I2P devrait-il être démarré au boot ?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Ce routeur I2P peut être lancé comme un service qui se lance automatiquement quand l'ordinateur démarre. Ceci est la configuration recommandée." +msgstr "" +"Ce routeur I2P peut être lancé comme un service qui se lance automatiquement " +"quand l'ordinateur démarre. Ceci est la configuration recommandée." #. Type: string #. Description @@ -44,11 +47,16 @@ msgstr "Utilisateur du service I2P :" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "D'origine I2P est configuré pour fonctionner sous le compte i2psvc quand il fonctionne comme service. Pour utiliser un profil **existant** vous pouvez entrer ici un nom de compte différent. Par exemple, si votre précédente installation est dans /home/user/i2p, vous pouvez entrer 'user' ici." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Par défaut I2P est configuré pour fonctionner sous le compte i2psvc quand il " +"fonctionne comme service. Pour utiliser un profil I2P **existant** vous " +"pouvez entrer ici un nom de compte différent. Par exemple, si votre " +"précédente installation est dans /home/user/i2p, vous pouvez entrer 'user' " +"ici." #. Type: string #. Description @@ -56,19 +64,22 @@ msgstr "D'origine I2P est configuré pour fonctionner sous le compte i2psvc quan msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Très important : si un utilisateur autre que celui par défaut de 'i2psvc' est entré ici, l'utilisateur choisi *DOIT* déjà exister." +msgstr "" +"Très important : si un utilisateur autre que celui par défaut de 'i2psvc' " +"est entré ici, l'utilisateur choisi *DOIT* déjà exister." #. Type: string #. Description #: ../i2p.templates:4001 msgid "Memory that can be allocated to I2P:" -msgstr "Mémoire qui peut être allouée à I2P:" +msgstr "Mémoire qui peut être allouée à I2P :" #. Type: string #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "D'origine, I2P va sera seulement autorisé à utiliser jusqu'à 128 Mo de RAM." +msgstr "" +"Par défaut, I2P sera seulement autorisé à utiliser jusqu'à 128 Mo de RAM." #. Type: string #. Description @@ -76,13 +87,15 @@ msgstr "D'origine, I2P va sera seulement autorisé à utiliser jusqu'à 128 Mo d msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Les routeurs haut débit, ainsi que les routeurs avec beaucoup de torrents / plugins actifs, pourrait nécessiter d'avoir cette valeur augmentée." +msgstr "" +"Les routeurs haut débit, ainsi que les routeurs avec beaucoup de torrents / " +"plugins actifs, pourraient nécessiter d'avoir cette valeur augmentée." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Exécuter le démon I2P confiné avec AppArmor" #. Type: boolean #. Description @@ -91,3 +104,6 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Avec cette option activée I2P sera exécuté dans un bac à sable (sandbox) " +"grâce à AppArmor, mais ceci limitera les fichiers et les répertoires " +"auxquels I2P pourra avoir accès." diff --git a/debian/po/hu.po b/debian/po/hu.po index d83e99973..a6b411214 100644 --- a/debian/po/hu.po +++ b/debian/po/hu.po @@ -1,20 +1,22 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: +# benewfy , 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/I2P/language/hu/)\n" +"PO-Revision-Date: 2015-06-29 12:34+0000\n" +"Last-Translator: benewfy \n" +"Language-Team: Hungarian (http://www.transifex.com/projects/p/I2P/language/" +"hu/)\n" +"Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: hu\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -29,7 +31,9 @@ msgstr "Az I2P router elinduljon a rendszer betöltésekor?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Az I2P router képes háttérszolgáltatásként futni, mely automatikusan elindul a számítógép indításakor. Ez a javasolt beállítás." +msgstr "" +"Az I2P router képes háttérszolgáltatásként futni, mely automatikusan elindul " +"a számítógép indításakor. Ez a javasolt beállítás." #. Type: string #. Description @@ -41,11 +45,15 @@ msgstr "Az I2P háttérszolgáltatás felhasználója:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Alapértelmezésben az I2P arra van beállítva, hogy az i2psvc fiók alatt fusson, mint háttérszolgáltatás. **Létező** I2P profil használatához írj egy másik fióknevet ide. Például, ha az előzőleg installált I2P-d a /home/felhasznalo/i2p alatt található, ide a következőt írhatod: 'felhasznalo'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Alapértelmezésben az I2P arra van beállítva, hogy az i2psvc fiók alatt " +"fusson, mint háttérszolgáltatás. **Létező** I2P profil használatához írj egy " +"másik fióknevet ide. Például, ha az előzőleg installált I2P-d a /home/" +"felhasznalo/i2p alatt található, ide a következőt írhatod: 'felhasznalo'." #. Type: string #. Description @@ -53,7 +61,9 @@ msgstr "Alapértelmezésben az I2P arra van beállítva, hogy az i2psvc fiók al msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Nagyon fontos: Ha az alapértelmezett 'i2psvc' helyett más felhasználó kerül megadásra, a választott felhasználónévnek már léteznie *KELL*." +msgstr "" +"Nagyon fontos: Ha az alapértelmezett 'i2psvc' helyett más felhasználó kerül " +"megadásra, a választott felhasználónévnek már léteznie *KELL*." #. Type: string #. Description @@ -73,13 +83,16 @@ msgstr "Alapeseten az I2P számára csak maximum 128MB memória engedélyezett." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Lehetséges, hogy nagy szávszélességű routerek, úgyis mint sok aktív torrenttel vagy kiegészítővel rendelkező routerek számára ezt az értéket növelni szükséges." +msgstr "" +"Lehetséges, hogy nagy szávszélességű routerek, úgyis mint sok aktív " +"torrenttel vagy kiegészítővel rendelkező routerek számára ezt az értéket " +"növelni szükséges." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "I2P kiszolgáló futtatása korlátozva az AppArmor-ral" #. Type: boolean #. Description @@ -88,3 +101,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Ezzel az opcióval engedélyezed, hogy az I2P sandboxolva legyen az AppArmor-" +"ral, korlátozva, hogy melyik fájlokat és könyvtárakat érheti el az I2P." diff --git a/debian/po/id.po b/debian/po/id.po index 842c7c029..8a0cecbde 100644 --- a/debian/po/id.po +++ b/debian/po/id.po @@ -1,28 +1,29 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: -# Khairul Agasta , 2014 +# Khairul Agasta , 2014-2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/I2P/language/id/)\n" +"PO-Revision-Date: 2015-06-02 04:22+0000\n" +"Last-Translator: Khairul Agasta \n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/I2P/language/" +"id/)\n" +"Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Type: boolean #. Description #: ../i2p.templates:2001 msgid "Should the I2P router be started at boot?" -msgstr "Apakah router I2P perlu dimuali saat boot?" +msgstr "Apakah router I2P perlu memulai saat boot?" #. Type: boolean #. Description @@ -30,7 +31,9 @@ msgstr "Apakah router I2P perlu dimuali saat boot?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Router I2P dapat dijalankan sebagai daemon yang memulai secara otomatis ketika komputer Anda booting. Ini adalah konfigurasi yang direkomendasikan." +msgstr "" +"Router I2P dapat dijalankan sebagai daemon yang memulai secara otomatis " +"ketika komputer anda booting. Ini adalah konfigurasi yang direkomendasikan." #. Type: string #. Description @@ -42,11 +45,16 @@ msgstr "I2P pengguna daemon:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Dengan default, I2P dikonfigurasikan untuk berjalan dibawah akun i2psvc ketika menjalankan sebagai daemon. Untuk menggunakan profil I2P **yang ada** Anda perlu memasukkan nama akun berbeda disini. Sebagai contoh, jika sebelumnya Anda memasang I2P pada /home/user/i2p, maka Anda harus memasukkan 'user' disini." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Dengan default, I2P dikonfigurasikan untuk berjalan dibawah akun i2psvc " +"ketika menjalankan sebagai daemon. Untuk menggunakan profil I2P **yang ada** " +"Anda perlu memasukkan nama akun berbeda disini. Sebagai contoh, jika " +"sebelumnya Anda memasang I2P pada /home/user/i2p, maka Anda harus memasukkan " +"'user' disini." #. Type: string #. Description @@ -54,7 +62,9 @@ msgstr "Dengan default, I2P dikonfigurasikan untuk berjalan dibawah akun i2psvc msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Sangat penting: Jika pengguna selain default 'i2psvc' dimasukkan disini, nama pengguna yang dipilih *HARUS* yang sudah ada." +msgstr "" +"Sangat penting: Jika pengguna selain default 'i2psvc' dimasukkan disini, " +"nama pengguna yang dipilih *HARUS* yang sudah ada." #. Type: string #. Description @@ -74,13 +84,15 @@ msgstr "Dengan default, I2P hanya akan diizinkan menggunakan RAM hingga 128MB." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Router bandwidth tinggi, seperti halnya router dengan banyak torrent / pengaya yang aktif, Anda mungkin perlu menambahkan value ini." +msgstr "" +"Router bandwidth tinggi, seperti halnya router dengan banyak torrent / " +"pengaya yang aktif, Anda mungkin perlu menambahkan value ini." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Jalankan daemon I2P yang dibatasi dengan AppArmor" #. Type: boolean #. Description @@ -89,3 +101,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Dengan mengaktifkan opsi ini I2P akan di sandboxkan dengan AppArmor, " +"membatasi file dan direktori mana yang dapat diakses oleh I2P." diff --git a/debian/po/it.po b/debian/po/it.po index eafce94a2..3b0cf840f 100644 --- a/debian/po/it.po +++ b/debian/po/it.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Leelium , 2012 # Sparta83 , 2012 @@ -12,11 +12,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" -"Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/it/)\n" +"Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/" +"it/)\n" +"Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -31,7 +32,9 @@ msgstr "Avviare il router I2P all'avvio?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Il router I2P può essere eseguito come daemon che si avvia al boot del computer. Questa è la configurazione raccomandata." +msgstr "" +"Il router I2P può essere eseguito come daemon che si avvia al boot del " +"computer. Questa è la configurazione raccomandata." #. Type: string #. Description @@ -43,11 +46,16 @@ msgstr "Utente I2P Daemon: " #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Di Default I2P è configurato in modo da essere eseguito sotto l'account i2psvc quando eseguito come daemon. Per usare un profilo I2P **esistente** puoi accedere con un diverso account qui. Per esempio, se la tua precedente installazione di I2P si trova in /casa/utente/i2p, dovresti inserire \"utente\" qui." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Di Default I2P è configurato in modo da essere eseguito sotto l'account " +"i2psvc quando eseguito come daemon. Per usare un profilo I2P **esistente** " +"puoi accedere con un diverso account qui. Per esempio, se la tua precedente " +"installazione di I2P si trova in /casa/utente/i2p, dovresti inserire \"utente" +"\" qui." #. Type: string #. Description @@ -55,7 +63,9 @@ msgstr "Di Default I2P è configurato in modo da essere eseguito sotto l'account msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Molto Importante: Se qui è inserito un nome utente diverso da quello base di \"i2psvc\", l'username scelto *DEVE* essere stato già inserito in precedenza." +msgstr "" +"Molto Importante: Se qui è inserito un nome utente diverso da quello base di " +"\"i2psvc\", l'username scelto *DEVE* essere stato già inserito in precedenza." #. Type: string #. Description @@ -75,7 +85,9 @@ msgstr "Di base I2P è abilitato ad usare fino a 128MB di RAM. " msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Router con connessioni veloci, così come i router con molti torrent/plugin attivi, potrebbero necessitare l'aumento di questo valore." +msgstr "" +"Router con connessioni veloci, così come i router con molti torrent/plugin " +"attivi, potrebbero necessitare l'aumento di questo valore." #. Type: boolean #. Description diff --git a/debian/po/ja.po b/debian/po/ja.po index 95ec1889c..fa715268b 100644 --- a/debian/po/ja.po +++ b/debian/po/ja.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # a1678991 , 2015 # タカハシ , 2014 @@ -12,11 +12,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-04-01 09:06+0000\n" "Last-Translator: a1678991 \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/" +"ja/)\n" +"Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Type: boolean @@ -31,7 +32,9 @@ msgstr "I2P ルーターをブート時に起動しますか?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P は、コンピューターのブート時に自動的に開始するデーモンとして起動できます。これは推奨の設定です。" +msgstr "" +"I2P は、コンピューターのブート時に自動的に開始するデーモンとして起動できま" +"す。これは推奨の設定です。" #. Type: string #. Description @@ -43,11 +46,15 @@ msgstr "I2P デーモンユーザー:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "デフォルトでは、 I2P はデーモンとして起動時、アカウント i2psvc で起動するよう設定されています。**既存の** I2P プロファイルを使用するには、ここに異なるアカウント名を入力してください。例えば、以前の I2P インストールが /home/user/i2p であれば、ここに 'user' と入力してください。" +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"デフォルトでは、 I2P はデーモンとして起動時、アカウント i2psvc で起動するよう" +"設定されています。**既存の** I2P プロファイルを使用するには、ここに異なるアカ" +"ウント名を入力してください。例えば、以前の I2P インストールが /home/user/i2p " +"であれば、ここに 'user' と入力してください。" #. Type: string #. Description @@ -55,7 +62,9 @@ msgstr "デフォルトでは、 I2P はデーモンとして起動時、アカ msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "非常に重要: 'i2psvc' のデフォルト以外のユーザーがここで入力されるなら、選択されるユーザー名は既存のものでなければ*なりません*。" +msgstr "" +"非常に重要: 'i2psvc' のデフォルト以外のユーザーがここで入力されるなら、選択さ" +"れるユーザー名は既存のものでなければ*なりません*。" #. Type: string #. Description @@ -67,7 +76,8 @@ msgstr "I2P に割り当てられうるメモリ:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "デフォルトでは、 I2P は最大 128MB メモリまでしか使用を許可されていません。" +msgstr "" +"デフォルトでは、 I2P は最大 128MB メモリまでしか使用を許可されていません。" #. Type: string #. Description @@ -75,7 +85,9 @@ msgstr "デフォルトでは、 I2P は最大 128MB メモリまでしか使用 msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "高い帯域幅のルーター、またたくさんのアクティブな torrent / プラグインがあるルーターも、この値を増やす必要がある場合があります。" +msgstr "" +"高い帯域幅のルーター、またたくさんのアクティブな torrent / プラグインがある" +"ルーターも、この値を増やす必要がある場合があります。" #. Type: boolean #. Description diff --git a/debian/po/ko.po b/debian/po/ko.po index f17411889..40fca7504 100644 --- a/debian/po/ko.po +++ b/debian/po/ko.po @@ -1,21 +1,22 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: -# Choi Yeon-Ung , 2014 +# Choi Yeon-Ung , 2014-2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Korean (http://www.transifex.com/projects/p/I2P/language/ko/)\n" +"PO-Revision-Date: 2015-05-15 16:18+0000\n" +"Last-Translator: Choi Yeon-Ung \n" +"Language-Team: Korean (http://www.transifex.com/projects/p/I2P/language/" +"ko/)\n" +"Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ko\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Type: boolean @@ -30,7 +31,9 @@ msgstr "I2P 라우터가 부팅시 시작되게 할까요?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P 라우터는 컴퓨터 부팅시 자동적으로 데몬으로 실행될 수 있습니다. 설정이 권장됩니다." +msgstr "" +"I2P 라우터는 컴퓨터 부팅시 자동적으로 데몬으로 실행될 수 있습니다. 설정이 권" +"장됩니다." #. Type: string #. Description @@ -42,11 +45,14 @@ msgstr "I2P 데몬 유저:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "기본적으로 I2P는 데몬으로 실행시 i2psvc 계정으로 시작됩니다. **기존** I2P 프로필 적용을 위해선 다른 계정의 이름을 적어야 합니다. 예를 들어, 기존 I2P 설치가 /home/user/i2p에 되었다면, 여기에 'user'를 입력하세요." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"기본적으로 I2P는 데몬으로 실행시 i2psvc 계정으로 시작됩니다. **기존** I2P 프" +"로필 적용을 위해선 다른 계정의 이름을 적어야 합니다. 예를 들어, 기존 I2P 설치" +"가 /home/user/i2p에 되었다면, 여기에 'user'를 입력하세요." #. Type: string #. Description @@ -54,7 +60,9 @@ msgstr "기본적으로 I2P는 데몬으로 실행시 i2psvc 계정으로 시작 msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "중요: 기본값인 'i2psvc' 대신 다른 유저를 이용시에, 결정된 유저는 *반드시* 이미 존재해야 합니다." +msgstr "" +"중요: 기본값인 'i2psvc' 대신 다른 유저를 이용시에, 결정된 유저는 *반드시* 이" +"미 존재해야 합니다." #. Type: string #. Description @@ -74,13 +82,15 @@ msgstr "기본적으로, I2P는 128MB의 램으로 동작합니다." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "높은 대역폭의 라우터, 또는 활성화된 torrent / 플러그인을 많이 사용하는 라우터의 경우, 이 값을 증가시켜야 할 수 있습니다." +msgstr "" +"높은 대역폭의 라우터, 또는 활성화된 torrent / 플러그인을 많이 사용하는 라우터" +"의 경우, 이 값을 증가시켜야 할 수 있습니다." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "I2P 데몬은 AppArmor 안에서 실행" #. Type: boolean #. Description @@ -89,3 +99,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"이 옵션을 활성화 시 I2P는 AppArmor에 의해 샌드박싱되고, I2P가 어떤 파일과 폴" +"더를 접근할 지 제한됩니다." diff --git a/debian/po/nl.po b/debian/po/nl.po index 5cbfbf4c6..c28d2030a 100644 --- a/debian/po/nl.po +++ b/debian/po/nl.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Nathan Follens, 2015 msgid "" @@ -12,10 +12,10 @@ msgstr "" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/I2P/language/nl/)\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -30,7 +30,9 @@ msgstr "Moet de I2P-router worden gestart bij het opstarten?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "De I2P-router kan als een daemon draaien die automatisch start wanneer je computer opstart. Dit is de aanbevolen configuratie." +msgstr "" +"De I2P-router kan als een daemon draaien die automatisch start wanneer je " +"computer opstart. Dit is de aanbevolen configuratie." #. Type: string #. Description @@ -42,11 +44,15 @@ msgstr "I2P-daemon gebruiker:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Standaard is I2P ingesteld om onder de account i2psvc te draaien wanneer het draait als daemon. Om een **bestaand** I2P-profiel te gebruiken kan je hier een andere accountnaam ingeven. Bijvoorbeeld, als je vorige I2P-installatie zich bevond in /home/user/i2p, kan je hier 'user' ingeven." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Standaard is I2P ingesteld om onder de account i2psvc te draaien wanneer het " +"draait als daemon. Om een **bestaand** I2P-profiel te gebruiken kan je hier " +"een andere accountnaam ingeven. Bijvoorbeeld, als je vorige I2P-installatie " +"zich bevond in /home/user/i2p, kan je hier 'user' ingeven." #. Type: string #. Description @@ -54,7 +60,9 @@ msgstr "Standaard is I2P ingesteld om onder de account i2psvc te draaien wanneer msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Zeer belangrijk: als hier een gebruiker anders dan 'i2psvc' wordt ingegeven, *MOET* de gekozen gebruikersnaam reeds bestaan." +msgstr "" +"Zeer belangrijk: als hier een gebruiker anders dan 'i2psvc' wordt ingegeven, " +"*MOET* de gekozen gebruikersnaam reeds bestaan." #. Type: string #. Description @@ -74,7 +82,9 @@ msgstr "Standaard is I2P toegestaan maximum 128MB van het RAM te gebruiken." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Voor hoge bandbreedte-routers, evenals routers met veel actieve torrents / plugins, is het mogelijk dat deze waarde verhoogd moet worden." +msgstr "" +"Voor hoge bandbreedte-routers, evenals routers met veel actieve torrents / " +"plugins, is het mogelijk dat deze waarde verhoogd moet worden." #. Type: boolean #. Description diff --git a/debian/po/pl.po b/debian/po/pl.po index 64484263a..57ae539e7 100644 --- a/debian/po/pl.po +++ b/debian/po/pl.po @@ -1,22 +1,25 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # PolishAnon , 2011, 2012 +# seb, 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"PO-Revision-Date: 2015-06-09 20:57+0000\n" +"Last-Translator: seb\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/" +"pl/)\n" +"Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" #. Type: boolean #. Description @@ -30,7 +33,9 @@ msgstr "Czy router I2P powinien być uruchamiany podczas startu systemu?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Router I2P może być uruchamiany jako demon, który uruchamia się automatycznie po starcie komputera. Jest to zalecana konfiguracja." +msgstr "" +"Router I2P może być uruchamiany jako demon, który uruchamia się " +"automatycznie po starcie komputera. Jest to zalecana konfiguracja." #. Type: string #. Description @@ -42,11 +47,15 @@ msgstr "Użytkownik demona I2P:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Domyślnie I2P jest skonfigurowany do pracy pod kontem i2psvc gdy działa jako demon. Aby korzystać z **istniejącego** profilu I2P można wprowadzić tu inną nazwę konta. Na przykład, jeśli poprzednia instalacja I2P jest w /home/user/i2p, można wpisać tutaj 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Domyślnie I2P jest skonfigurowany do pracy pod kontem i2psvc gdy działa " +"jako demon. Aby korzystać z **istniejącego** profilu I2P można wprowadzić tu " +"inną nazwę konta. Na przykład, jeśli poprzednia instalacja I2P jest w /home/" +"user/i2p, można wpisać tutaj 'user'." #. Type: string #. Description @@ -54,7 +63,9 @@ msgstr "Domyślnie I2P jest skonfigurowany do pracy pod kontem i2psvc gdy dzia msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Bardzo ważne: Jeżeli użytkownik inni niż domyślny 'i2psvc' jest tutaj wprowadzony, wybrane imię *MUSI* już istniec." +msgstr "" +"Bardzo ważne: Jeżeli użytkownik inni niż domyślny 'i2psvc' jest tutaj " +"wprowadzony, wybrane imię *MUSI* już istniec." #. Type: string #. Description @@ -74,13 +85,15 @@ msgstr "Domyślnie, I2P może użyc tylko 128MB RAMu." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Rutery z wysoka przepustowościa oraz rutery z wieloma aktywnymi torrentami/wtyczkami mogą wymagać zwiększenia tej wartości." +msgstr "" +"Rutery z wysoka przepustowościa oraz rutery z wieloma aktywnymi torrentami/" +"wtyczkami mogą wymagać zwiększenia tej wartości." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Uruchom I2P deamon ograniczony przez AppArmor" #. Type: boolean #. Description @@ -89,3 +102,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Z tą opcją I2P będzie w sandboxie z AppArmor, broniąc plików i folderów do " +"których I2P mogłoby mieć dostęp." diff --git a/debian/po/pt.po b/debian/po/pt.po index c45a76ca6..ed7363a35 100644 --- a/debian/po/pt.po +++ b/debian/po/pt.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # wtfisthis , 2015 # wtfisthis , 2013 @@ -13,11 +13,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-31 20:53+0000\n" "Last-Translator: wtfisthis \n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/pt/)\n" +"Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/" +"pt/)\n" +"Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -32,7 +33,9 @@ msgstr "Devera o i2p router ser iniciado no arranque " msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "O i2p router pode correr como serviso que inicaiara quando o computudor iniciar. Esta é a configuração recomendada" +msgstr "" +"O i2p router pode correr como serviso que inicaiara quando o computudor " +"iniciar. Esta é a configuração recomendada" #. Type: string #. Description @@ -44,11 +47,15 @@ msgstr "Utilizador do serviço I2P:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Por padrão o I2P é configurado para executar como usuário i2psvc no modo Serviço. Para usar um perfil I2P **existente** você pode digitar um nome de usuário diferente aqui. Por exemplo, se a sua instalação antiga está em /home/user/i2p, você pode digitar 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Por padrão o I2P é configurado para executar como usuário i2psvc no modo " +"Serviço. Para usar um perfil I2P **existente** você pode digitar um nome de " +"usuário diferente aqui. Por exemplo, se a sua instalação antiga está em /" +"home/user/i2p, você pode digitar 'user'." #. Type: string #. Description @@ -56,7 +63,9 @@ msgstr "Por padrão o I2P é configurado para executar como usuário i2psvc no m msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Muito importante: Se um usuário diferente de 'i2psvc' for digitado aqui, este usuário PRECISA existir." +msgstr "" +"Muito importante: Se um usuário diferente de 'i2psvc' for digitado aqui, " +"este usuário PRECISA existir." #. Type: string #. Description @@ -76,7 +85,9 @@ msgstr "Por defeito o I2P apenas vai ser autorizado a usar até 128MB de RAM." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Roteadores I2P com internet rápida, e também com muitos torrents e plugins ativos, podem precisar aumentar este valor." +msgstr "" +"Roteadores I2P com internet rápida, e também com muitos torrents e plugins " +"ativos, podem precisar aumentar este valor." #. Type: boolean #. Description @@ -90,4 +101,6 @@ msgstr "Correr daemon I2p confinado com o AppArmor" msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." -msgstr "Com esta opção ativada o I2P Vai correr em sandbox com AppArmor, retingindo que ficheiros e diretórios são acessíveis pelo I2P " +msgstr "" +"Com esta opção ativada o I2P Vai correr em sandbox com AppArmor, retingindo " +"que ficheiros e diretórios são acessíveis pelo I2P " diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po index 067db03f3..c08795f88 100644 --- a/debian/po/pt_BR.po +++ b/debian/po/pt_BR.po @@ -1,22 +1,23 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: -# blueboy, 2014 +# blueboy, 2014-2015 # Victor Maximiliano , 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n" +"PO-Revision-Date: 2015-06-10 17:27+0000\n" +"Last-Translator: blueboy\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/" +"language/pt_BR/)\n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. Type: boolean @@ -31,23 +32,29 @@ msgstr "O roteador I2P deve inicializar junto com o sistema?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "O roteador I2P pode rodar como um daemon que inicia automaticamente quando o sistema carrega. Esse é a configuração recomendada." +msgstr "" +"O roteador I2P pode rodar como um daemon que inicia automaticamente quando o " +"sistema carrega. Esse é a configuração recomendada." #. Type: string #. Description #: ../i2p.templates:3001 msgid "I2P daemon user:" -msgstr "Usuário I2P daemon:" +msgstr "Usuário daemon I2P:" #. Type: string #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Por padrão o I2P é configurado para funcionar sobre a conta i2psvc quando funcionando como um daemon. Para usar uma conta I2P **existente** você deve digitar um nome de conta diferente aqui. Por exemplo, se a sua instalação anterior do I2P estava em /home/user/i2p, você deve digitar 'user' aqui." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Por padrão o I2P é configurado para funcionar sobre a conta i2psvc quando " +"funcionando como um daemon. Para usar uma conta I2P **existente** você deve " +"digitar um nome de conta diferente aqui. Por exemplo, se a sua instalação " +"anterior do I2P estava em /home/user/i2p, você deve digitar 'user' aqui." #. Type: string #. Description @@ -55,7 +62,9 @@ msgstr "Por padrão o I2P é configurado para funcionar sobre a conta i2psvc qua msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Muito importante: Se um outro usuário além do padrão \"i2psvc\" é colocado aqui, o nome de usuário escolhido já deve existir." +msgstr "" +"Muito importante: Se um outro usuário além do padrão \"i2psvc\" é colocado " +"aqui, o nome de usuário escolhido já deve existir." #. Type: string #. Description @@ -67,7 +76,8 @@ msgstr "Memória que pode ser alocada para o roteador I2P:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "Por omissão, será permitido ao roteador I2P usar apenas até 128 MB de RAM." +msgstr "" +"Por omissão, será permitido ao roteador I2P usar apenas até 128 MB de RAM." #. Type: string #. Description @@ -75,13 +85,15 @@ msgstr "Por omissão, será permitido ao roteador I2P usar apenas até 128 MB de msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Roteadores de alta velocidade, assim como roteadores com uma porção de torrents / plugins ativos, talvez precisem que esse valor seja aumentado." +msgstr "" +"Roteadores de alta velocidade, assim como roteadores com uma porção de " +"torrents / extensões ativas, talvez precisem ter esse valor aumentado." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Confinar a execução do daemon I2P com AppArmor" #. Type: boolean #. Description @@ -90,3 +102,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Com essa opção selecionada, o roteador I2P funcionará confinado pelo " +"AppArmor, sendo restritos os arquivos e diretórios passíveis de acesso." diff --git a/debian/po/ro.po b/debian/po/ro.po index d7db4c154..dd9e5b4f9 100644 --- a/debian/po/ro.po +++ b/debian/po/ro.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: msgid "" msgstr "" @@ -10,12 +10,14 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" -"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/ro/)\n" +"Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/" +"ro/)\n" +"Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ro\n" -"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" #. Type: boolean #. Description @@ -29,7 +31,9 @@ msgstr "Router-ul I2P trebuie sa fie pornit la încărcarea? " msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Router-ul I2P poate fi rulat ca un demon care pornește automat atunci când calculatorul se porneste. Aceasta este configurația recomandată." +msgstr "" +"Router-ul I2P poate fi rulat ca un demon care pornește automat atunci când " +"calculatorul se porneste. Aceasta este configurația recomandată." #. Type: string #. Description @@ -41,11 +45,16 @@ msgstr "I2P daemon utilizator:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "În mod implicit I2P este configurat pentru a rula sub contul i2psvc atunci când se rulează ca un demon. Pentru a utiliza o ** profil I2P existent** s-ar putea introduce aici un nume de cont diferit. De exemplu, în cazul în care instalarea I2P anterioara este de la / home/user/i2p, s-ar putea introduce \"user\" aici." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"În mod implicit I2P este configurat pentru a rula sub contul i2psvc atunci " +"când se rulează ca un demon. Pentru a utiliza o ** profil I2P existent** s-" +"ar putea introduce aici un nume de cont diferit. De exemplu, în cazul în " +"care instalarea I2P anterioara este de la / home/user/i2p, s-ar putea " +"introduce \"user\" aici." #. Type: string #. Description @@ -53,7 +62,10 @@ msgstr "În mod implicit I2P este configurat pentru a rula sub contul i2psvc at msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "FOARTE IMPORTANT: Dacă o altă persoană decât cea de utilizator implicit \"i2psvc\" este introdus aici, numele de utilizator *TREBUIE* sa exista deja." +msgstr "" +"FOARTE IMPORTANT: Dacă o altă persoană decât cea de utilizator implicit " +"\"i2psvc\" este introdus aici, numele de utilizator *TREBUIE* sa exista " +"deja." #. Type: string #. Description @@ -65,7 +77,9 @@ msgstr "Memorie care poate fi alocata la I2P:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "În mod implicit, I2P li se va permite să utilizeze numai până la 128MB de RAM." +msgstr "" +"În mod implicit, I2P li se va permite să utilizeze numai până la 128MB de " +"RAM." #. Type: string #. Description @@ -73,7 +87,9 @@ msgstr "În mod implicit, I2P li se va permite să utilizeze numai până la 128 msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Routere în bandă largă, precum și routere, cu o mulțime de torente/plugin-uri active, ar putea avea nevoie pentru a avea această valoare marita." +msgstr "" +"Routere în bandă largă, precum și routere, cu o mulțime de torente/plugin-" +"uri active, ar putea avea nevoie pentru a avea această valoare marita." #. Type: boolean #. Description diff --git a/debian/po/ru.po b/debian/po/ru.po index 81b398de0..74275493b 100644 --- a/debian/po/ru.po +++ b/debian/po/ru.po @@ -1,23 +1,27 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Hidden Z , 2011 +# Maxym Mykhalchuk, 2015 # Roman A. , 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" +"PO-Revision-Date: 2015-05-15 12:40+0000\n" +"Last-Translator: Maxym Mykhalchuk\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/" +"language/ru_RU/)\n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru_RU\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" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" +"%100>=11 && n%100<=14)? 2 : 3);\n" #. Type: boolean #. Description @@ -31,7 +35,9 @@ msgstr "Должен ли I2P-роутер запускаться во врем msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P-роутер может работать в качестве демона, который запускается автоматически во время загрузки компьютера. Это рекомендуемая конфигурация." +msgstr "" +"I2P-роутер может работать в качестве демона, который запускается " +"автоматически во время загрузки компьютера. Это рекомендуемая конфигурация." #. Type: string #. Description @@ -43,11 +49,15 @@ msgstr "Псевдопользователь для I2P-демона:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "При работе в качестве демона, I2P по умолчанию использует аккаунт i2psvc для работы. Для использования **существующего** профиля I2P вы можете ввести здесь другое имя пользователя. Например, если ваша предыдущая установка I2P находится в /home/user/i2p, вы можете ввести здесь 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"При работе в качестве демона, I2P по умолчанию использует аккаунт i2psvc для " +"работы. Для использования **существующего** профиля I2P вы можете ввести " +"здесь другое имя пользователя. Например, если ваша предыдущая установка I2P " +"находится в /home/user/i2p, вы можете ввести здесь 'user'." #. Type: string #. Description @@ -55,7 +65,9 @@ msgstr "При работе в качестве демона, I2P по умол msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Важно: если здесь введено имя пользователя, отличное от имени пользователя по умолчанию 'i2psvc', оно уже *ДОЛЖНО* существовать." +msgstr "" +"Важно: если здесь введено имя пользователя, отличное от имени пользователя " +"по умолчанию 'i2psvc', оно уже *ДОЛЖНО* существовать." #. Type: string #. Description @@ -67,7 +79,8 @@ msgstr "Обьем памяти, который может быть выделе #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "По умолчанию, I2P будет разрешено использовать до 128 МБ оперативной памяти." +msgstr "" +"По умолчанию, I2P будет разрешено использовать до 128 МБ оперативной памяти." #. Type: string #. Description @@ -75,13 +88,16 @@ msgstr "По умолчанию, I2P будет разрешено исполь msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Для роутеров с высокой пропускнй способностью, а также для роутеров с большим количеством активных торрентов/плагинов, возможно, потребуется увеличить это значение." +msgstr "" +"Для роутеров с высокой пропускнй способностью, а также для роутеров с " +"большим количеством активных торрентов/плагинов, возможно, потребуется " +"увеличить это значение." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Выполнять I2P-демон в ограниченной среде AppArmor" #. Type: boolean #. Description @@ -90,3 +106,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Если включить эту опцию, то I2P будет выполняться в песочнице AppArmor, " +"которая ограничит доступ I2P к файлам и каталогам вашего компьютера." diff --git a/debian/po/sk.po b/debian/po/sk.po index d105bbb51..67347e68f 100644 --- a/debian/po/sk.po +++ b/debian/po/sk.po @@ -1,22 +1,23 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Jakub Srna , 2014 +# ondysk, 2015 # Roman 'Kaktuxista' Benji , 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/sk/)\n" +"PO-Revision-Date: 2015-10-21 05:56+0000\n" +"Last-Translator: ondysk\n" +"Language-Team: Slovak (http://www.transifex.com/otf/I2P/language/sk/)\n" +"Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #. Type: boolean @@ -31,7 +32,9 @@ msgstr "Mal by sa I2P router spustiť pri boote?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P router sa dá spustiť ako daemon pri boote vášho počítača. Táto konfigurácia je odporúčaná." +msgstr "" +"I2P router sa dá spustiť ako daemon pri boote vášho počítača. Táto " +"konfigurácia je odporúčaná." #. Type: string #. Description @@ -43,11 +46,15 @@ msgstr "I2P daemon užívateľ:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "I2P je predvolene nastavený tak, aby v čase, keď je spustený ako daemon, bol pod účom i2psvc. Pre použitie **existujúceho** I2P profilu môžete zadať iný názov účtu. Napríklad, ak sa vaša predchádzajúca inštalácia I2P nachádza v /home/user/i2p, môžete sem zadať 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"I2P je predvolene nastavený tak, aby v čase, keď je spustený ako daemon, bol " +"pod účom i2psvc. Pre použitie **existujúceho** I2P profilu môžete zadať iný " +"názov účtu. Napríklad, ak sa vaša predchádzajúca inštalácia I2P nachádza v /" +"home/user/i2p, môžete sem zadať 'user'." #. Type: string #. Description @@ -55,7 +62,9 @@ msgstr "I2P je predvolene nastavený tak, aby v čase, keď je spustený ako dae msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Veľmi dôležité: Ak užívateľ, ktorý je sem zadaný, je iný ako predvolený 'i2psvc', zvolené užívateľské meno *MUSÍ* už existovať. " +msgstr "" +"Veľmi dôležité: Ak užívateľ, ktorý je sem zadaný, je iný ako predvolený " +"'i2psvc', zvolené užívateľské meno *MUSÍ* už existovať. " #. Type: string #. Description @@ -75,13 +84,15 @@ msgstr "Predvolene bude môcť I2P použiť najviac 128MB RAM." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Routre s vysokou šírkou pásma, rovnako aj routre s veľa aktívnymi torrentmi / pluginmi, môžu potrebovať zvýšenie tejto hodnoty." +msgstr "" +"Routre s vysokou šírkou pásma, rovnako aj routre s veľa aktívnymi " +"torrentmi / pluginmi, môžu potrebovať zvýšenie tejto hodnoty." #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Spustiť I2P daemon s obmedzením pomocou AppArmor" #. Type: boolean #. Description @@ -90,3 +101,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Povolením tejto možnosti I2P bude v bežať v sandboxe pomocou AppArmor, ktorý " +"vymedzí súbory a priečinky, ku ktorým môže I2P pristupovať." diff --git a/debian/po/sq.po b/debian/po/sq.po index 91ab0a454..2ba14265a 100644 --- a/debian/po/sq.po +++ b/debian/po/sq.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Shpetim , 2014 msgid "" @@ -11,11 +11,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" -"Language-Team: Albanian (http://www.transifex.com/projects/p/I2P/language/sq/)\n" +"Language-Team: Albanian (http://www.transifex.com/projects/p/I2P/language/" +"sq/)\n" +"Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sq\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -30,7 +31,9 @@ msgstr "Duhet router'i i I2P'së të startojë në boot? " msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "Router'i i I2P'së mund të punojë edhe si një daemon, që starton automatikisht kur kompjuteri boot'et. Ky është konfikurimi rekomandues. " +msgstr "" +"Router'i i I2P'së mund të punojë edhe si një daemon, që starton " +"automatikisht kur kompjuteri boot'et. Ky është konfikurimi rekomandues. " #. Type: string #. Description @@ -42,11 +45,16 @@ msgstr "I2P përdorues i daemon'it:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Zakonisht I2P është konfiguruar të punojë ndër llogarinë i2psvc kur është duke punuar si një deamon. Për të përdorur një profil **ekzistues** të I2P'së mund ta shtypni një emër tjetër llogarie këtu. Për shembull, nëse instalimi i kaluar është në shtëpi/përdorues/i2p, mund të hyni si \"përdorues\" këtu. " +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Zakonisht I2P është konfiguruar të punojë ndër llogarinë i2psvc kur është " +"duke punuar si një deamon. Për të përdorur një profil **ekzistues** të " +"I2P'së mund ta shtypni një emër tjetër llogarie këtu. Për shembull, nëse " +"instalimi i kaluar është në shtëpi/përdorues/i2p, mund të hyni si \"përdorues" +"\" këtu. " #. Type: string #. Description @@ -54,7 +62,9 @@ msgstr "Zakonisht I2P është konfiguruar të punojë ndër llogarinë i2psvc ku msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Shumë e rëndësishme: Nëse një përdorues përveq default'i i 'i2psvc' është entruar këtu, emri i zgjedhur *DUHET* tashmë të ekzistojë. " +msgstr "" +"Shumë e rëndësishme: Nëse një përdorues përveq default'i i 'i2psvc' është " +"entruar këtu, emri i zgjedhur *DUHET* tashmë të ekzistojë. " #. Type: string #. Description @@ -66,7 +76,8 @@ msgstr "Kujtesat që mund të ndahen te I2P:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "Normalisht, I2P do ti lejohet të përdorë vetëm deri në 128Mb të RAM'it." +msgstr "" +"Normalisht, I2P do ti lejohet të përdorë vetëm deri në 128Mb të RAM'it." #. Type: string #. Description diff --git a/debian/po/sv.po b/debian/po/sv.po index 3d40b3fa3..1bd0b62f3 100644 --- a/debian/po/sv.po +++ b/debian/po/sv.po @@ -1,8 +1,9 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: +# cacapo , 2015 # hottuna , 2013 # Martin Svensson , 2011 msgid "" @@ -10,13 +11,14 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 14:31+0000\n" -"Last-Translator: kytv \n" -"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/language/sv_SE/)\n" +"PO-Revision-Date: 2015-04-24 21:35+0000\n" +"Last-Translator: cacapo \n" +"Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/" +"language/sv_SE/)\n" +"Language: sv_SE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sv_SE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Type: boolean @@ -31,7 +33,9 @@ msgstr "Ska I2P routern startas vid systemstart?" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P routern kan köras som en tjänst (daemon) som automatiskt startas när datorn startas. Detta rekommenderas. " +msgstr "" +"I2P routern kan köras som en tjänst (daemon) som automatiskt startas när " +"datorn startas. Detta rekommenderas. " #. Type: string #. Description @@ -43,11 +47,15 @@ msgstr "Användare för I2P tjänsten:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "Som standard är I2P inställt för att köras under användaren i2psvc när det körs som tjänst. För att använda ett **existerande** I2P profil, ange en annan användare här. Exempelvis, om din tidigare I2P installation är /home/user/i2p så ange 'user' här." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"Som standard är I2P inställt för att köras under användaren i2psvc när det " +"körs som tjänst. För att använda ett **existerande** I2P profil, ange en " +"annan användare här. Exempelvis, om din tidigare I2P installation är /home/" +"user/i2p så ange 'user' här." #. Type: string #. Description @@ -55,7 +63,9 @@ msgstr "Som standard är I2P inställt för att köras under användaren i2psvc msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "OBS! Viktigt: Om en annan användare än standard 'i2psvc' skrivs in här. *MÅSTE* det användarnamnet redan existera." +msgstr "" +"OBS! Viktigt: Om en annan användare än standard 'i2psvc' skrivs in här. " +"*MÅSTE* det användarnamnet redan existera." #. Type: string #. Description @@ -75,13 +85,15 @@ msgstr "Som standard kommer I2P bara att använda up till 128MB RAM." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "För routrar med hög bandbredd eller routrar med hög aktivitet kan detta behöva ökas" +msgstr "" +"För routrar med hög bandbredd eller routrar med hög aktivitet kan detta " +"behöva ökas" #. Type: boolean #. Description #: ../i2p.templates:5001 msgid "Run I2P daemon confined with AppArmor" -msgstr "" +msgstr "Kör I2Pdaemon begränsad av AppArmor" #. Type: boolean #. Description @@ -90,3 +102,5 @@ msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." msgstr "" +"Med det här valet aktiverat kommer I2P att köras i sandlåda med AppArmor, " +"som begränsar vilka filer och mappar som kan kommas åt av I2P." diff --git a/debian/po/tr.po b/debian/po/tr.po index 21cbe2e4e..697882955 100644 --- a/debian/po/tr.po +++ b/debian/po/tr.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Kaya Zeren , 2013 msgid "" @@ -11,11 +11,12 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-03-29 14:31+0000\n" "Last-Translator: kytv \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/" +"language/tr_TR/)\n" +"Language: tr_TR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Type: boolean @@ -30,7 +31,9 @@ msgstr "I2P yönelticisi açılışta başlatılsın" msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P yönelticisi sistem başlatılırken artalan hizmeti olarak çalıştırılır. Bu ayarı kullanmanız önerilir." +msgstr "" +"I2P yönelticisi sistem başlatılırken artalan hizmeti olarak çalıştırılır. Bu " +"ayarı kullanmanız önerilir." #. Type: string #. Description @@ -42,11 +45,15 @@ msgstr "I2P artalan hizmeti kullanıcısı:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "I2P artalan hizmeti olarak kullanıldığında varsayılan olarak i2psvc hesabı altında çalışır. **Varolan** bir I2P profili kullanmak için buraya farklı bir hesap adı yazabilirsiniz. Örneğin, mnceki I2P kurulumunuz /home/user/i2p klasörü altındaysa buraya 'user' yazabilirsiniz." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"I2P artalan hizmeti olarak kullanıldığında varsayılan olarak i2psvc hesabı " +"altında çalışır. **Varolan** bir I2P profili kullanmak için buraya farklı " +"bir hesap adı yazabilirsiniz. Örneğin, mnceki I2P kurulumunuz /home/user/i2p " +"klasörü altındaysa buraya 'user' yazabilirsiniz." #. Type: string #. Description @@ -54,7 +61,9 @@ msgstr "I2P artalan hizmeti olarak kullanıldığında varsayılan olarak i2psvc msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Çok önemli: Buraya varsayılan 'i2psvc' kullanıcısından başka bir değer yazılırsa, bu kullanıcı *MUHAKKAK* varolmalıdır." +msgstr "" +"Çok önemli: Buraya varsayılan 'i2psvc' kullanıcısından başka bir değer " +"yazılırsa, bu kullanıcı *MUHAKKAK* varolmalıdır." #. Type: string #. Description @@ -74,7 +83,9 @@ msgstr "I2P varsayılan olarak yalnız 128MB RAM bellek kullanır." msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Torrent ve uygulama ekleri kullandığından yüksek bant genişliğine gerek duyan yönelticiler için bu değerin arttırılması gerekebilir." +msgstr "" +"Torrent ve uygulama ekleri kullandığından yüksek bant genişliğine gerek " +"duyan yönelticiler için bu değerin arttırılması gerekebilir." #. Type: boolean #. Description diff --git a/debian/po/uk.po b/debian/po/uk.po index 6a6047999..d1cea50ce 100644 --- a/debian/po/uk.po +++ b/debian/po/uk.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Denis Blank , 2011 # LinuxChata, 2014 @@ -14,12 +14,14 @@ msgstr "" "POT-Creation-Date: 2015-02-18 22:14+0000\n" "PO-Revision-Date: 2015-04-08 20:08+0000\n" "Last-Translator: madjong \n" -"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/language/uk_UA/)\n" +"Language-Team: Ukrainian (Ukraine) (http://www.transifex.com/projects/p/I2P/" +"language/uk_UA/)\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: uk_UA\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" +"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" #. Type: boolean #. Description @@ -33,7 +35,9 @@ msgstr "Чи повинен I2P роутер запускатись при за msgid "" "The I2P router can be run as a daemon that starts automatically when your " "computer boots up. This is the recommended configuration." -msgstr "I2P роутер може працювати в якості демона, який запускається автоматично під час запуску комп'ютера. Це рекомендована настройка." +msgstr "" +"I2P роутер може працювати в якості демона, який запускається автоматично під " +"час запуску комп'ютера. Це рекомендована настройка." #. Type: string #. Description @@ -45,11 +49,15 @@ msgstr "Псевдокористувач для I2P-демона:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "При роботі в якості демона, I2P за замовчуванням використовує аккаунт i2psvc для роботи. Для використовування **існуючого** профілю I2P ви можете ввести тут ім'я іншого користувача. Для прикладу, якщо ваша попередня інсталяція I2p знаходиться в /home/user/i2p, ви можете ввести тут 'user'." +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"При роботі в якості демона, I2P за замовчуванням використовує аккаунт i2psvc " +"для роботи. Для використовування **існуючого** профілю I2P ви можете ввести " +"тут ім'я іншого користувача. Для прикладу, якщо ваша попередня інсталяція " +"I2p знаходиться в /home/user/i2p, ви можете ввести тут 'user'." #. Type: string #. Description @@ -57,7 +65,9 @@ msgstr "При роботі в якості демона, I2P за замовч msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "Дуже важливо: якщо користувач відмінний від стандартний 'i2psvc' введений тут, обраний нікнейм *ПОВИНЕН* вже існувати." +msgstr "" +"Дуже важливо: якщо користувач відмінний від стандартний 'i2psvc' введений " +"тут, обраний нікнейм *ПОВИНЕН* вже існувати." #. Type: string #. Description @@ -69,7 +79,8 @@ msgstr "Пам'ять яка може бути виділена для I2P:" #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "За замовчуванням, I2P буде використовувати до 128 МБ оперативної пам'яті." +msgstr "" +"За замовчуванням, I2P буде використовувати до 128 МБ оперативної пам'яті." #. Type: string #. Description @@ -77,7 +88,10 @@ msgstr "За замовчуванням, I2P буде використовува msgid "" "High bandwidth routers, as well as routers with a lot of active torrents / " "plugins, may need to have this value increased." -msgstr "Роутери з високою швидкістю передачі інформації, так само як роутери з великою кількістю активних торрентів / плагінів, можуть потребувати збільшення цього значення." +msgstr "" +"Роутери з високою швидкістю передачі інформації, так само як роутери з " +"великою кількістю активних торрентів / плагінів, можуть потребувати " +"збільшення цього значення." #. Type: boolean #. Description @@ -91,4 +105,6 @@ msgstr "Запустити демон I2P, обмежений AppArmor" msgid "" "With this option enabled I2P will be sandboxed with AppArmor, restricting " "which files and directories may be accessed by I2P." -msgstr "При активації цієї опції I2P працюватиме в пісочниці AppArmor, доступ до файлів і директорій для I2P буде обмежено" +msgstr "" +"При активації цієї опції I2P працюватиме в пісочниці AppArmor, доступ до " +"файлів і директорій для I2P буде обмежено" diff --git a/debian/po/zh.po b/debian/po/zh.po index cd6466b54..523f56bf5 100644 --- a/debian/po/zh.po +++ b/debian/po/zh.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # walking , 2013 # YF , 2015 @@ -10,13 +10,14 @@ msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" "POT-Creation-Date: 2015-02-18 22:14+0000\n" -"PO-Revision-Date: 2015-03-29 15:00+0000\n" +"PO-Revision-Date: 2015-06-07 16:29+0000\n" "Last-Translator: YF \n" -"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/I2P/language/zh_CN/)\n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/I2P/" +"language/zh_CN/)\n" +"Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Type: boolean @@ -43,11 +44,13 @@ msgstr "运行I2P服务的账户:" #. Description #: ../i2p.templates:3001 msgid "" -"By default I2P is configured to run under the account i2psvc when running as" -" a daemon. To use an **existing** I2P profile you may enter a different " -"account name here. For example, if your previous I2P installation is at " -"/home/user/i2p, you may enter 'user' here." -msgstr "I2P后台服务默认以i2psvc账户运行。要使用*已有*的I2P配置文件,您可以输入不同的账户名。例如,如果您之前的I2P安装在 /home/user/i2p,此处可输入'user'。" +"By default I2P is configured to run under the account i2psvc when running as " +"a daemon. To use an **existing** I2P profile you may enter a different " +"account name here. For example, if your previous I2P installation is at /" +"home/user/i2p, you may enter 'user' here." +msgstr "" +"I2P后台服务默认以 i2psvc 账户运行。要使用*已有*的I2P配置文件,您可以输入不同" +"的账户名。例如,如果您之前的I2P安装在 /home/user/i2p,此处可输入 'user'。" #. Type: string #. Description @@ -55,19 +58,19 @@ msgstr "I2P后台服务默认以i2psvc账户运行。要使用*已有*的I2P配 msgid "" "Very important: If a user other than the default of 'i2psvc' is entered " "here, the chosen username *MUST* already exist." -msgstr "重要:如果您输入默认'i2psvc'以外的账户,此账户务必已经存在。" +msgstr "重要:如果您输入默认的 'i2psvc' 以外的账户,此账户必须已经存在。" #. Type: string #. Description #: ../i2p.templates:4001 msgid "Memory that can be allocated to I2P:" -msgstr "I2P 可用最大内存:" +msgstr "I2P 最多可占用内存:" #. Type: string #. Description #: ../i2p.templates:4001 msgid "By default, I2P will only be allowed to use up to 128MB of RAM." -msgstr "I2P 默认最大内存128M。" +msgstr "默认情况下,I2P 最多只允许使用 128MB 系统内存。" #. Type: string #. Description diff --git a/history.txt b/history.txt index dee09afc2..f340136d1 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,594 @@ +2015-12-21 zzz + * SSU: Hand all messages pending after establishment to the + outbound queue at once, for efficiency. + Don't sort outbound messages by size, keep priority order instead. + +2015-12-20 zzz + * BuildHandler: Additional fixes (ticket #1738) + * CertUtil: Add methods to export private keys + * Console: Sybil tool enhancementsrivate keys + * Transports: + - Disconnect faster when first message is a + tunnel build request which we reject + - Display SSU sent/received messages, not packets, + on /peers to be consistent with NTCP + +2015-12-18 zzz + * BuildHandler: Fix NPE (ticket #1738) + +2015-12-16 zzz + * Profiles: + - Don't use same family in a tunnel + - Reduce IPv6 mask from 8 to 6 + +2015-12-13 zzz + * Data: Optimize router info writes, disable caching + +2015-12-12 zzz + * Router: + - Add family public key to router info (ticket #1510) + - More deadlock prevention (ticket #1722) + +2015-12-11 zzz + * Logs: Windows line ending fixes + * Router: + - Fix family verification, partially hook into netdb store() + - Limit wait for NTP to 45 seconds (ticket #1725) + - Increase lookup cache max sizes, + reduce max lookup depth, and increase non-floodfill profile bonus + to attempt to reduce load on floodfills + - Don't let context clock shifts affect calculated uptime + * Transport: More deadlock prevention (ticket #1722) + * SSU: Fix outbound IPv6 errors on Windows without a real v6 address + when explict host is set. Validate addresses before confirming that + we have an IPv6 address. Possibly related to ticket #1538. + * Wrapper: Listen for Windows Service shutdown events to stop router + +2015-12-10 zzz + * Router: + - Change addCapabilities() to getCapabilities() + - Add netdb family sign/verify utility (ticket #1510) + * RouterInfo: + - Remove addCapability() and delCapability() + * StatPublisher: + - Remove Service interface, not required + - Consolidate getCapabilities() and network ID here + - Add family signatures + +2015-12-08 str4d + * Core: Fill in basic datastructure length tests + * Ministreaming: Add unit tests + * Streaming: + - Add more unit tests + - Separate out integration tests + +2015-12-08 zzz + * Crypto: Consolidate certificate import methods + +2015-12-06 zzz + * Console: Don't force profile creation when loading floodfill tab + * Installer: Add wrapper deadlock detection to default wrapper.config + * NetDb: Stub out a "family" indicator (ticket #1510) + * Profiles: More changes to reduce memory usage + * Startup: Increase rekey probability + * Sybil tool: Tweaks and enhancements + +2015-12-04 zzz + * Console: Fix NPE on /profiles + * Profiles: + - Fix first heard about to be earliest, undeprecate + - Fixup first heard about at profile readin + - Persist good/bad lookup/store DBHistory stats added in 0.7.8 + - Remove unused DBHistory methods and fields to save memory + - Change bonus longs to ints to save memory + - Extend profile expiration time from 3 days to 15 + - Consolidate getLong() + - Synch fixes + * Sybil tool: Tweaks and enhancements + +2015-12-03 zzz + * Console: Add experimental Sybil analysis tool + * NetDb: Fix deadlock (ticket #1722) + +2015-12-01 zzz + * i2psnark: + - Consolidate default tunnel length definition + - Increase max peers and uploaders per torrent + - Increase default max total uploaders + - Increase max peers sent and returned in DHT +* SAM: + - Don't map keys to upper case in parser, corrupts I2CP options + - Register SSL and UDP ports with PortMapper +* SSU: Allow IP and port in relay request if it matches the source +* Transport: Interrupt DH refiller thread when pool is empty, + to speed refilling and reduce pumper stalls + +2015-11-30 zzz + * SAM: + - Timeout for first command after HELLO + - Send error message if no NAME key in LOOKUP + - Destination caching enhancements + - Client: Add SSL forward support, handle header line in forwarded stream + +2015-11-29 zzz + * i2ptunnel: + - Change preferred sig type to Ed + - Set permissions on backup tunnel keys file + +2015-11-28 zzz + * i2psnark: + - Fix NPE caused by URL-to-URI conversion in -2 (ticket #1715) + - Increase max pieces to 32K + - BEP 21 support (upload_only) + * SAM: + - Fix parser to allow spaces in quoted values (tickets #1325, #1488) + - Handle UTF-8 in ReadLine (ticket #1488) + - 3.2 complete (ticket #1574) + +2015-11-27 zzz + * SAM: + - Use DataHelper to load/store sam.keys + - Move sam.keys to config dir (ticket #677) + +2015-11-27 zzz +Prop from i2p.i2p.zzz.sam: + * PasswordManager: new methods for use by SAM + * SAM: + - Use getopt for SAM args processing + - Change default host from 0.0.0.0 to 127.0.0.1 + - Add SSL support with -s option (ticket #1106) + - Add -c configfile option, default sam.config + - Add protocol and port notification (ticket #1323) + - Add authorization options in HELLO (ticket #1106) + - Add AUTH commands: ENABLE, DISABLE, ADD, REMOVE + - Add PING, PONG commands (tickets #1572, #1573) + - Add QUIT, STOP, EXIT commands + - Add SSL option for STREAM FORWARD + - Move DatagramServer from SAMv3Handler to its own file + - Make DatagramServer a Handler, register with bridge + - Use ReadLine with timeout for SAMHandlerFactory + - Support parallel STREAM ACCEPTs + - Add HEADER option for RAW forwarding + - Better exception handling + - Extensive enhancements to Java client for testing + - Bump version to 3.2 (ticket #1574) + * Streaming: Fix recognition of PoisonPacket in ConnectionHandler + +2015-11-22 zzz +Prop from i2p.i2p.zzz.test2: + * Build: + - More release checks + - Add systray dependency tracking to build + - Remove commons-logging classes from commons-logging.jar (ticket #1679) + * Lint: + - Replace URL with URI where possible + - Don't use DataHelper.fromLong() for 1-byte reads, for efficiency + - Don't catch Exception, catch RuntimeException or checked exception. + * i2psnark: + - Minor details page reformatting + - Add skipped length on details page + * NewsManager: Make it a ClientApp, not a RouterApp + * Profiles: Don't allow creation of our own profile + * Router: Revert JobTiming being a clock shift listener, not needed + * SSU: + - Support extended options + - Add support for requesting a relay tag via + Session Request extended options (ticket #1465) + * Tunnels: + - Locking fixes + - Don't set stats in our own profile + - Minor optimizations + * Utils: + - Centralize time zone code in DataHelper + - Add caching string split() + +2015-11-21 zzz + * Console: Fix escaping of plugin description on /configclients (ticket #1711) + +* 2015-11-19 0.9.23 released + +2015-11-19 str4d + * build.xml: Stop building SUD and SU2 update files in "ant release" (ticket #1709) + +2015-11-15 kytv + * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country + database from 2015-11-03. + * Translation updates + +2015-11-13 zab + * Interrupt() when cancelling scheduled tasks (tickets #1694, #1705) + +2015-11-13 zzz + * Console: Fix lifetime participating bandwidth display (ticket #1706) + +2015-11-12 zzz + * Console /configclients: + = Fix filtering and escaping + - Fix autostart setting on new client, was inverted + +2015-11-11 zzz + * i2psnark: + - Change log level to hide socket closed error at tunnel shutdown (ticket #1687) + - Increase max pieces + * Timers: State fix 4th try (tickets #1694, #1705) + +2015-11-05 zzz + * I2CP: Fix additional connections getting rejected during tunnel open (tickets #1650, #1698) + * Streaming: Split blacklist into one for EC and one for Ed + +2015-11-04 zzz + * Threads: More conversions to I2PAppThread + * Timers: Improve OutboundMessageRegistry locking (ticket #1694) + +2015-11-02 z3r0fox + * EepGet: Fix command line filename selection (ticket #1616) + +2015-11-01 zzz + * Utils: Double IP lookup cache size (ticket #1700) + +2015-10-31 zzz + * Convert remaining Threads to I2PThread or I2PAppThread + * UPnP: Fix deadlock in callbacks (ticket #1699) + +2015-10-30 zzz + * Router: Fix cascading I2CP error (ticket #1692) + +2015-10-21 zzz + * i2psnark: More consistency and torrent links in messages + * Router: Increase timer thread priority + +2015-10-17 zzz + * Crypto: + - Consolidate duplicate unlimited strength crypto check code + - Disable TLS_DHE_DSS_WITH_AES_128_CBC_SHA + +2015-10-16 zzz + * Console: Add Java 6 warning to summary bar + * i2psnark: + - Fix deadlock (ticket #1432) + - Add "smart sort" option, set sort based on language (tickets #637, #1303) + - Don't balloon files on ARM (ticket #1684) + +2015-10-14 zzz + * Update: + - Require Java 7 to download dev builds (ticket #1669) + - Fix persistence of the available dev version + +2015-10-13 zzz + * Startup: Delete our old RI from netDB when rekeying + +2015-10-11 zzz + * Crypto: Test for broken Gentoo ECDSA support + +2015-10-10 zzz + * i2psnark: Increase max piece size to 16 MB, max files to 999, + close files faster based on file count (tickets #1626, #1671) + * JobQueue: Only adjust timing for negative clock shifts + * NamingServices: Add support for lookups prefixed with "www." + * Startup: Increase rekey probability + +2015-10-08 zzz + * SimpleTimer2: Additional fix for uncaught IllegalStateException + affecting streaming timers (ticket #1672) + +2015-10-02 zzz + * Router: Don't check config files for reload on Android + +2015-09-28 zzz + * Addressbook: Fix isValidDest() for EC/Ed dests + * i2psnark: Support adding plain base 32 hashes + * Susimail: Hide headers and buttons if search results are empty + +2015-09-27 dg + * Router: Fix soft restarts for 'massive' clock jumps (over +150s or -61s) and recover from standby + and hibernate (ticket #1014). + +2015-09-27 zzz + * Console: + - Export SSL cert on creation + - New /certs page to show local SSL certs + - Show 'none' if no leasesets + * SimpleTimer2: Fix bug in forceReschedule() that caused subsequent uncaught IllegalStateException, + affected streaming timers + * Streaming: Move throttler from context timer to streaming timer + * Tunnels: Use max of 2 not-failing peers in an exploratory tunnel, + use high cap for the rest; change outbound exploratory + default length from 2 + 0-1 to 3+0. + * Util: Speed up IP address validation by using Apache's implementation (ticket #1198) + +2015-09-25 dg + * Rename _() for translation to _t() for Java 9 compatibility (ticket #1456) + +2015-09-24 zzz + - Rename bad .torrent files instead of deleting them + +2015-09-20 dg + * /configreseed: Add 'Reset URL list' button for revert to default hosts (ticket #1554, thanks dzirtt@gmail.com) + +2015-09-19 zzz + * i2psnark: Add recheck/start/stop buttons to details page (ticket #372) + +2015-09-18 zzz + * EepGet: + - Send Accept-Encoding: gzip even when proxied + - Fix man page (ticket #1631) + * i2psnark: + - Don't display "Tracker Error" if torrent is stopped (ticket #1654) + - Improve directory listing efficiency (ticket #1079) + * i2ptunnel: + - Pass Accept-Encoding header through HTTP client and server proxies, + to allow end-to-end compression + - Don't do transparent response compression if response + Content-Encoding indicates it is already compressed + * Streaming: Move remaining timers from the context to streaming's SimpleTimer2 + +2015-09-17 zzz + * i2psnark: + - Store magnet parameters across restart (ticket #1485) + - Don't delete torrent config file after error on initial startup (tickets #1575, #1658) + +2015-09-16 zzz + * Build: + - Include geoip in update files for next release + - Add created-by string to release torrents + * i2psnark: + - Store torrent added and completed times in config files, display on details page + - Add metainfo creation command line support for created-by string + * Profiles: Bias slightly away from floodfills + +2015-09-15 zzz + * Console: + - Store news feed items separately on disk in XML, like a real feed reader + - Limit display to 2 news items in summary bar, /home and /console + - New /news page to show all news (ticket #1425) + +* 2015-09-12 0.9.22 released + +2015-09-11 kytv + * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country + database from 2015-09-02. + * Translation updates pulled from Transifex + +2015-09-04 zzz + * UPnP: Fix "content not allowed in trailing section" + (tickets #481, #1653) + +2015-08-31 zzz + * Data: Cache P256 and Ed255i9 key certificates + * i2psnark: Change default sig type to Ed25519 + +2015-08-29 zzz + * Router: + - Change default RI sig type to Ed25519, with a 10% chance od + rekeying from DSA at each restart + - Don't initialize KeyManager before selecting sig type + - Don't log KeyManager error when changing sig type + +2015-08-25 zzz + * i2psnark: + - Return partial piece to coordinator after reject + - Fix tracking of downloaded portion of piece after reject + - Send reject on receipt of bad request + - Mark piece unrequested after receiving bad data, so it + will be requested again, but not from the same peer + - Fix NPE in Request constructor on error + - Fix stuck before completion due to reject handling (ticket #1633) + - Fix orphaned temp files due to reject handling (ticket #1635) + +2015-08-02 zzz + * Console: Fix SSL excluded ciphers (thx lazyg) + * SU3File: Add keystore password command line option + +* 2015-07-31 0.9.21 released + +2015-07-27 zzz + * Update: Fix processing of translated news su3 files + +2015-07-26 zzz + * Update translations + +2015-07-25 zzz + * i2psnark: Fix total_size in metadata message (ticket #1618) + * NetDB: Fix NPE (ticket #1619) + +2015-07-21 str4d + * Core: Throw DFE in Certificate.create() instead of AIOOBE (ticket #1016) + +2015-07-21 str4d + * Core: Fix parsing bug in KeyCertificate + +2015-07-16 zzz + * Console: Add dates to news headings + +2015-07-12 zzz + * Findbugs all over + +2015-07-08 zzz + * Tunnels: New Bloom filter size, increase bandwidth limit (ticket #1505) + +2015-07-07 zzz + * Crypto: Check for error return from sign() + * i2psnark: Tweak dest display in footer + * Streaming: New config to add to DSA-only list + * Updates: New news URL + +2015-07-05 zzz + * SSU: Compete better with NTCP for outbound bandwidth allocations + * Transport: Adjust thread priorities to prevent I/O stalling + +2015-06-29 zzz + * Transport: More fixes for SSU stalling + +2015-06-28 zzz + * Apache Tomcat 6.0.44 + +2015-06-25 zzz + * Console: Use registered host/port for eepsite link (ticket #1604) + * Jetty starter: Register host/port when started + * PortMapper: Add hostname support + +2015-06-24 zzz + * Transport: Add failsafe to prevent complete SSU stall waiting + for bandwidth limiter + +2015-06-23 zzz + * Console: Fix NPE on /configtunnels + * GeoIP: Add countries and flags for Asia/Pacific, Bonaire, St. Barts, + St. Maarten, South Sudan + * I2CP: Don't try to decrypt an LS before it's encrypted (ticket #1608) + * Router: Increase default outbound bandwidth to 60 KBps; + raise class L/M boundary to match so defaulted routers are still L + +2015-06-22 dg + * NetDB: Partially revert last NetDB change: flood because we don't want + to create a hole in the DHT before publisher resends to somebody else. + +2015-06-20 dg + * I2PSnark: Auto-start now only starts torrents which were running at shutdown (#766) + * NetDB: Don't say we stored, and don't flood, if we're shutting down + +2015-06-19 zzz + * I2CP: Fix simple session lookups, broken in prop + * I2PSocketEepGet: Do hostname lookups in-session for efficiency + * Tunnels: Increase default max tunnels + +2015-06-18 zzz + * I2CP: + - Don't send the first LS request to the client until we have + at least one OB tunnel, so the client waits until we are ready. + - Fixes to prevent multiple pending LS requests + - Move client-side implementation classes to + new package net.i2p.client.impl, leaving only the + factories and interfaces in net.i2p.client + * Update: Add language param to news fetch for translated news (ticket #1425) + +2015-06-17 zzz +Prop from i2p.i2p.zzz.multisess: + * Router, I2CP, Streaming, i2ptunnel: + - Multisession support and multiple destinations in one tunnel pool + - Connections to Hardcoded blacklist of destinations that do not + support ECDSA will use the DSA session + - Change shared clients to ECDSA by default, with a DSA subsession + - Add support for 'aliased' local destinations that use the same tunnel pools + - No UI or config support, no server support, may be added later + - Catch uncaught exceptions in ClientConnectionRunner and stop connection + - When socket is closed, set sessionID and LS to null, + close subsession and set its sessionID and LS to null + - Checks on client side for null session ID + - Check for null session in Destroy Session message + +2015-06-13 zzz + * i2psnark: Fix NPE (ticket #1602) + * NetDB: + - Improve routing of DatabaseStoreMessage acks + - Send our own RI unsolicited in reply if we aren't floodfill + - Don't ack or flood a store of an unknown type + - Don't say we stored, and don't flood if we're shutting down + * PeerTestJob: Don't generate zero reply token + * Timestamper: Reduce NTP timeouts to shorten startup time + when NTP is blocked + * Tunnels: More checks of messages received down exploratory tunnels + +2015-06-08 dg + * Language fixes + * Make netDb.storeFloodNew graphable for testing (#1195) + * Directly connect to nearby floodfills to share our RI + to speed up integration of new floodfills (#1195) + * Silence Irc{Inbound,Outbound}Filter warnings about 'no streams' + when we can't connect to an IRC server. Change to WARN. + +2015-06-07 zzz + * Logs: Correct wrapper.config location when running as a service + * NetDB: Fix early NPE + * SSU: Possible fix for NPE in establisher + +2015-06-06 zzz + * Console: Add indication of current ff status on /configadvanced, + change immediately when config changes, force republish + +2015-06-06 str4d + * newsxml: Don't use XXX for parsing dates on Android + +2015-06-04 str4d + * i2ptunnel: + - Don't connect manager to router in constructor (ticket #815) + - Don't call startup() in chained constructor (ticket #1593) + +2015-06-03 zzz +Prop from i2p.i2p.zzz.sam: + * I2CP: Set keepalive on sockets (ticket #1573) + * SAM: + - Close sockets and stop tunnels when router-side SAM stops (ticket #1572) + - Better checks for quoting status message strings (ticket #1488) + - Set encoding for sam.keys file + - Don't throw NPE on rare stream errors + - Comment out unused dumpProperties() + - Cleanups, log tweaks, thread name tweaks + - Set keepalive on sockets (ticket #1573) +Prop from i2p.i2p.zzz.test2: + * Console: + - Don't allow unbanning of all-zero hash + - Nicer "move" icons on /configsidebar, add tooltips + - Prevent bad line-wrap of very long menu items + * HTTP Client: Greatly simplify decompression by using InflaterOutputStream + * I2CP: Prevent sending messages before handshake with router is complete + * i2psnark: + - Add support for fast extensions (BEP 6) + - Don't say 'download finished' unless we downloaded something + - Don't lose sort param when hiding peers + * i2ptunnel: Strip top-level supercookies too + * LogWriter: Write dup message to wrapper log and crit buf also (ticket #1585) + * Reseed: Only log reseed network disconnected warning once + * Router: Add gzip and translate caches to clearCaches() + * Susidns, addressbook: Don't attempt to fetch subscriptions if + HTTP proxy is down (ticket #1530) + * SSU: More synchronization in PeerState + * Stats: Reduce number of rates in required stats to save memory + * UPnP: Only log network disconnected warning once + +* 2015-06-02 0.9.20 released + +2015-05-31 zzz + * Fortuna: Catch AIOOBE (ticket #1576) + +2015-05-30 zzz + * i2ptunnel: Fix +/- variance config (ticket #1587) + +2015-05-29 zzz + * HTTP client: Fix occasional truncation of compressed responses + +2015-05-27 zzz + * Banlist: Ban all-zero hash + * DataHelper: Add year output to formatDuration() + * Graphs: prevent NaNs if we are skewed ahead of system time + * NetDb: Drop all-zero lookups and stores, add stats + * SSU: + - Fix debug logging of dumped packets + - Drop sessions with bad clock skew, banlist peer, add stats + - Drop sessions with corrupt DSM, banlist peer, add stats + +2015-05-23 zzz + * I2CP: Add an INIT state for session, so a newly created session + isn't treated as CLOSED and immediately replaced by i2ptunnel, + which caused dup shared clients in a race at startup + (possible related tickets #642, #650, #815, #1545) + +2015-05-21 kytv + * Updates to geoip.txt and geoipv6.dat.gz based on Maxmind GeoLite Country + database from 2015-05-06. + * Translation updates + +2015-05-13 zzz + * Console: Fix URLs caught in XSS filter on /confighome (ticket #1569) + * i2psnark: Fix deletion of single-file torrent outside snark dir (ticket #1544) + * NTCP: Catch race in Reader (ticket #1534) + +2015-02-12 dg + * Job Queue/stats: add stat/graph for amount of scheduled jobs (router.tunnelBacklog) + * FloodfillMonitorJob: + - Use avg of router.tunnelBacklog instead of current backlog + * Some language/spelling fixes + 2015-05-11 zzz * Util: Fix corruption of cached ReusableGZIPInputStreams @@ -10,7 +601,7 @@ 2015-05-07 zzz * SAM: Close datagram or raw session when underlying - I2P session closes (ticket #1563) + I2P session closes (tickets #1455, #1563) * Update: Add support for su3-signed development builds (ticket #1381) 2015-05-06 zzz @@ -4264,7 +4855,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel - Use new synchronized change-and-save-config methods to eliminate races with ReadConfigJob * Tunnels: - - When a peer is shitlisted, fail all our tunnels where + - When a peer is banlisted, fail all our tunnels where that peer is the adjacent hop. In particular this will remove outbound tunnels when we can't contact the first hop, and enable quicker recovery. @@ -4783,7 +5374,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2011-09-30 zzz * logs.jsp: Add wrapper version - * Shitlist: Shorten time + * Banlist: Shorten time * Wrapper: Update armv7 to 3.5.12 2011-09-30 kytv @@ -4874,7 +5465,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel tunnels from being expired and causing high CPU usage 2011-09-08 zzz - * Blocklist: Include IP in shitlist reason + * Blocklist: Include IP in banlist reason * Ministreaming: Drop old classes replaced by streaming years ago. * NTCP: Hopefully fix race NPE, thx devzero @@ -7046,7 +7637,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * Transport clock skews: - Store and report UDP clock skews even for large values, so a badly skewed local clock will be reported to the console - - Don't shitlist for NTCP clock skew if we don't know what time it is + - Don't banlist for NTCP clock skew if we don't know what time it is - If NTP hasn't worked yet, have NTCP or SSU update the clock one time - Include failed clock skew in NTCP skew vector if there aren't many connections - Don't include NTCP clock skews for non-established connections @@ -7408,7 +7999,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * addressbook: Move class to net.i2p.addressbook * build: Take two test scripts out of the installer * i2psnark: Bye TPB - * Shitlist: Fix bug from two checkins ago, all were forever + * Banlist: Fix bug from two checkins ago, all were forever 2009-11-14 zzz * HTTP Proxy: @@ -7423,7 +8014,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2009-11-11 zzz * Console: Some colon cleansing * FloodfillPeerSelector: Adjustments - * Shitlist: Move HTML renderer to router console, + * Banlist: Move HTML renderer to router console, add cause parameter for ease of translation, tag all causes @@ -7771,13 +8362,13 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * logs.jsp: Add system encoding * Ministreaming: Cleanups, deprecation, move demos out of the lib * netdb.jsp: Flags for leases - * NTCP: Clean up clock skew shitlist message + * NTCP: Clean up clock skew banlist message * profiles.jsp: - Rename the Failing column - Reduce the time cutoff again to 90m (was 2h) * readme*html: localhost -> 127.0.0.1 * Router: Don't do some things when we are shutting down - * Shitlist: Clean up expire message + * Banlist: Clean up expire message * Stats: - Fix BufferedStatsLog so it works at all - Don't instantiate BufferedStatsLog unless stats.logFilters @@ -7843,7 +8434,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel including our own 2) It randomly dies after a while * Console: - - Rename the shitlist and the blocklist + - Rename the banlist and the blocklist - Try to reduce servlet problems on iframe - Select server or client icon for local dests * EepHead: New @@ -8578,7 +9169,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel spiff up tunnels.jsp and profiles.jsp. Existing installs can get files with 'ant updaterWIthGeoIP' or in the console docs bundle 'ant consoleDocs' - - Use flags for shitlist and peers.jsp too + - Use flags for banlist and peers.jsp too - Tweak tunnels.jsp to show class letters - Hide in-progress details on tunnels.jsp - Add a little color to confignav @@ -9059,7 +9650,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel - Plug in-progress build leak 2009-02-07 zzz - * ClientConnectionRunner, Shitlist, TunnelDispatcher: + * ClientConnectionRunner, Banlist, TunnelDispatcher: Update using concurrent * Streaming ConnectionHandler: Bound SYN queue and use concurrent to prevent blowup @@ -9207,13 +9798,13 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel - Floodfills periodically shuffle their KBuckets, and FloodfillPeerSelector sorts more keys, so that exploration works well - * Shitlist: Reduce max time to 30m (was 60m) + * Banlist: Reduce max time to 30m (was 60m) * Streaming: - Reduce default initial window size from 12 to 6, to account for the MTU increase in the last release and try to limit initial packet loss - Reduce fast retransmit threshold from 3 to 2 - * Transport: Don't shitlist a peer if we are at our + * Transport: Don't banlist a peer if we are at our connection limit 2009-01-03 zzz @@ -9337,7 +9928,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-11-21 zzz * Cache DNS and negative DNS for 5m (was 1m and forever) - * Delay shitlist cleaner at startup + * Delay banlist cleaner at startup * Strip wrapper properties from client config * Define multiple cert type * Prohibit negative maxSends in streaming @@ -9545,7 +10136,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * configpeer.jsp: Add blocklist info * help.jsp: Add link to German FAQ * tunnels.jsp: Fix inactive participating count - * SearchReplyJob: Don't look up references to shitlisted peers + * SearchReplyJob: Don't look up references to banlisted peers * TunnelPeerSelector: Avoid a peer for 20s after a reject or timeout 2008-09-20 zzz @@ -9608,7 +10199,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-09-06 zzz * EepGet command line: Fix byte counts after a failed resume * NTCP: Mark unreachable on outbound connection timeout - * Shitlist: Fix partial shitlisting (still unused though) + * Banlist: Fix partial banlisting (still unused though) * Summary Bar: Warn if firewalled and floodfill * Throttle: Combine current and last bw measurement, reduce default max tunnels to 2500 (was 3000) @@ -9652,16 +10243,16 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-08-04 zzz * Floodfill Peer Selector: - Avoid peers whose netdb is old, or have a recent failed store, - or are forever-shitlisted + or are forever-banlisted 2008-07-30 zzz * Blocklists: - New, disabled by default, except for blocking of - forever-shitlisted peers. See source for instructions + forever-banlisted peers. See source for instructions and file format. * Transport - Reject peers from inbound connections: - Check IP against blocklist - - Check router hash against forever-shitlist, then block IP + - Check router hash against forever-banlist, then block IP 2008-07-16 zzz * configpeer.jsp: New @@ -9693,7 +10284,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel - Change some logging from WARN to INFO - Clean up toString() * SSU: - - Try to pick better introducers by checking shitlist, + - Try to pick better introducers by checking banlist, wasUnreachable list, failing list, and idle times - To keep introducer connections up and valid, periodically send a "ping" (a data packet with no data and no acks) @@ -9780,8 +10371,8 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-06-07 zzz * NetDb: Tweak some logging on lease problems - * Shitlist: - - Add shitlistForever() and isShitlistedForever(), unused for now + * Banlist: + - Add banlistForever() and isBanlistedForever(), unused for now - Sort the HTML output by router hash * netdb.jsp: - Sort the lease HTML output by dest hash, local first @@ -9823,7 +10414,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel (for SAM for example). Defaults to true of course. * Logging: Move common WARN output to DEBUG so we can ask users to set the default log level to WARN without massive spewage - * ProfileOrganizer: Restrict !isSelectable() (i.e. shitlisted) peers from the High Capacity tier, + * ProfileOrganizer: Restrict !isSelectable() (i.e. banlisted) peers from the High Capacity tier, not just the Fast tier, since we don't use them for tunnels anyway * SAM: Add some compiler flexibility to two obscure makefiles * i2psnark: Change displayed peer idents to match that shown by bytemonsoon @@ -9986,7 +10577,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-04-17 zzz * Reachability: - Track unreachable peers persistently - (i.e. separately from shitlist, and not cleared when they contact us) + (i.e. separately from banlist, and not cleared when they contact us) - Exclude detected unreachable peers from inbound tunnels - Exclude detected unreachable peers from selected leases - Exclude detected unreachable floodfill peers from lookups @@ -9994,15 +10585,15 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-04-16 zzz * SSU/Reachability: - - Extend shitlist time from 4-8m to 40-60m - - Add some shitlist logging - - Don't shitlist twice when unreachable on all transports + - Extend banlist time from 4-8m to 40-60m + - Add some banlist logging + - Don't banlist twice when unreachable on all transports - Exclude netDb-listed unreachable peers from inbound tunnels; this won't help much since there are very few of these now - Remove 10s delay on inbound UDP connections used for the 0.6.1.10 transition - Track and display UDP connection direction on peers.jsp - - Show shitlist status in-line on profiles.jsp + - Show banlist status in-line on profiles.jsp 2008-04-15 zzz * SSU Reachability/PeerTestManager: @@ -10100,7 +10691,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2008-03-14 zzz * Floodfill Search: - - Prefer heard-from, unfailing, unshitlisted floodfill peers + - Prefer heard-from, unfailing, unbanlisted floodfill peers 2008-03-14 zzz * ProfileOrganizer: @@ -10885,8 +11476,8 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel new "identlog.txt" text file in the I2P install directory. For debugging purposes, publish the count of how many identities the router has cycled through, though not the identities itself. - * Cleaned up the way the multitransport shitlisting worked, and - added per-transport shitlists + * Cleaned up the way the multitransport banlisting worked, and + added per-transport banlists * When dropping a router reference locally, first fire a netDb lookup for the entry * Take the peer selection filters into account when organizing the @@ -10916,7 +11507,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel even if those shouldn't exist) 2006-07-14 jrandom - * Improve the multitransport shitlisting (thanks Complication!) + * Improve the multitransport banlisting (thanks Complication!) * Allow routers with a capacity of 16-32KBps to be used in tunnels under the default configuration (thanks for the stats Complication!) * Properly allow older router references to load on startup @@ -10938,7 +11529,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel GNU/Classpath based JVMs * Adjust the Fortuna PRNG's pooling system to reduce contention on refill with a background thread to refill the output buffer - * Add per-transport support for the shitlist + * Add per-transport support for the banlist * Add a new async pumped tunnel gateway to reduce tunnel dispatcher contention @@ -11008,7 +11599,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * SSU modifications to cut down on unnecessary connection failures 2006-05-16 jrandom - * Further shitlist randomizations + * Further banlist randomizations * Adjust the stats monitored for detecting cpu overload when dropping new tunnel requests @@ -11221,7 +11812,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel picker. * Cut down on subsequent streaming lib reset packets transmitted * Use a larger MTU more often - * Allow netDb searches to query shitlisted peers, as the queries are + * Allow netDb searches to query banlisted peers, as the queries are indirect. * Add an option to disable non-floodfill netDb searches (non-floodfill searches are used by default, but can be disabled by adding @@ -11283,7 +11874,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel searches outside the floodfill set) * Fix to the SSU IP detection code so we won't use introducers when we don't need them (thanks Complication!) - * Add a brief shitlist to i2psnark so it doesn't keep on trying to reach + * Add a brief banlist to i2psnark so it doesn't keep on trying to reach peers given to it * Don't let netDb searches wander across too many peers * Don't use the 1s bandwidth usage in the tunnel participation throttle, @@ -11842,7 +12433,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel left to the (work in progress) web UI. 2005-12-14 jrandom - * Fix to drop peer references when we shitlist people again (thanks zzz!) + * Fix to drop peer references when we banlist people again (thanks zzz!) * Further I2PSnark fixes to deal with arbitrary torrent info attributes (thanks Complication!) @@ -11941,7 +12532,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel separate jdom or rome, as they're inside syndie.war. 2005-11-30 jrandom - * Don't let the TCP transport alone shitlist a peer, since other + * Don't let the TCP transport alone banlist a peer, since other transports may be working. Also display whether TCP connections are inbound or outbound on the peers page. * Fixed some substantial bugs in the SSU introducers where we wouldn't @@ -12009,7 +12600,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel address (read: SSU IP or port). This only offers minimal additional protection against trivial attackers, but should provide functional improvement for people who have periodic IP changes, since their new - router address would not be shitlisted while their old one would be. + router address would not be banlisted while their old one would be. * Added further infrastructure for restricted route operation, but its use is not recommended. @@ -12157,10 +12748,10 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * Improved the bandwidth throtting on tunnel participation, especially for low bandwidth peers. * Improved failure handling in SSU with proactive reestablishment of - failing idle peers, and rather than shitlisting a peer who failed too + failing idle peers, and rather than banlisting a peer who failed too much, drop the SSU session and allow a new attempt (which, if it fails, - will cause a shitlisting) - * Clarify the cause of the shitlist on the profiles page, and include + will cause a banlisting) + * Clarify the cause of the banlist on the profiles page, and include bandwidth limiter info at the bottom of the peers page. 2005-10-26 jrandom @@ -12173,7 +12764,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2005-10-25 jrandom * Defer netDb searches for newly referenced peers until we actually want them - * Ignore netDb references to peers on our shitlist + * Ignore netDb references to peers on our banlist * Set the timeout for end to end client messages to the max delay after finding the leaseSet, so we don't have as many expired messages floating around. @@ -12388,7 +12979,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel reseeding - useful on OSes that make it hard to create dot files. Thanks Complication (and anon)! * Fixed the installer version string (thanks Frontier!) - * Added cleaner rejection of invalid IP addresses, shitlist those who send + * Added cleaner rejection of invalid IP addresses, banlist those who send us invalid IP addresses, verify again that we are not sending invalid IP addresses, and log an error if it happens. (Thanks Complication, ptm, and adab!) @@ -12416,7 +13007,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel instead of k/cwin) * Limit the number of inbound SSU sessions being built at once (using half of the i2np.udp.maxConcurrentEstablish config prop) - * Don't shitlist on a message send failure alone (unless there aren't any + * Don't banlist on a message send failure alone (unless there aren't any common transports). * More careful bandwidth bursting @@ -12553,7 +13144,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2005-09-13 jrandom * More careful error handling with introductions (thanks dust!) * Fix the forceIntroducers checkbox on config.jsp (thanks Complication!) - * Hide the shitlist on the summary so it doesn't confuse new users. + * Hide the banlist on the summary so it doesn't confuse new users. 2005-09-12 comwiz * Migrated the router tests to junit @@ -12660,8 +13251,8 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel 2005-08-24 jrandom * Catch errors with corrupt tunnel messages more gracefully (no need to kill the thread and cause an OOM...) - * Don't skip shitlisted peers for netDb store messages, as they aren't - necessarily shitlisted by other people (though they probably are). + * Don't skip banlisted peers for netDb store messages, as they aren't + necessarily banlisted by other people (though they probably are). * Adjust the netDb store per-peer timeout based on each particular peer's profile (timeout = 4x their average netDb store response time) * Don't republish leaseSets to *failed* peers - send them to peers who @@ -12704,14 +13295,14 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel netDb. * Don't overwrite the status with 'unknown' unless we haven't had a valid status in a while. - * Make sure to avoid shitlisted peers for peer testing. + * Make sure to avoid banlisted peers for peer testing. * When we get an unknown result to a peer test, try again soon afterwards. * When a peer tells us that our address is different from what we expect, if we've done a recent peer test with a result of OK, fire off a peer test to make sure our IP/port is still valid. If our test is old or the result was not OK, accept their suggestion, but queue up a peer test for later. - * Don't try to do a netDb store to a shitlisted peer, and adjust the way + * Don't try to do a netDb store to a banlisted peer, and adjust the way we monitor netDb store progress (to clear up the high netDb.storePeers stat) @@ -13343,7 +13934,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel * Fix a fencepost in the tunnel building so that e.g. a variance of 2 means +/- 2, not +/- 1 (thanks dm!) * Avoid an NPE on client disconnect - * Never select a shitlisted peer to participate in a tunnel + * Never select a banlisted peer to participate in a tunnel * Have netDb store messages timeout after 10s, not the full 60s (duh) * Keep session tags around for a little longer, just in case (grr) * Cleaned up some closing event issues on the streaming lib @@ -14193,7 +14784,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel (thanks Jonva!) 2004-10-04 jrandom - * Update the shitlist to reject a peer for an exponentially increasing + * Update the banlist to reject a peer for an exponentially increasing period of time (with an upper bounds of an hour). * Various minor stat and debugging fixes @@ -14207,7 +14798,7 @@ i2psnark: Fix ConnectionAcceptor not restarting after tunnel such as "dbResponseTime" or "tunnelTestResponseTime". 2004-10-02 jrandom - * Assure that we quickly fail messages bound for shitlisted peers. + * Assure that we quickly fail messages bound for banlisted peers. * Address a race on startup where the first peer contacted could hang the router (thanks Romster!) * Only whine about an intermittent inability to query the time server once diff --git a/installer/install.xml b/installer/install.xml index 2513b80bc..3a5408618 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ i2p - 0.9.19 + 0.9.23 diff --git a/installer/java/src/net/i2p/installer/Exec.java b/installer/java/src/net/i2p/installer/Exec.java index b8488ceff..de7419202 100644 --- a/installer/java/src/net/i2p/installer/Exec.java +++ b/installer/java/src/net/i2p/installer/Exec.java @@ -1,6 +1,7 @@ package net.i2p.installer; import java.io.File; +import java.io.IOException; /** *

              This class can be used by the installer to execute shell commands.

              @@ -20,8 +21,9 @@ public class Exec { // http://cephas.net/blog/2004/03/23/external_applications_javas_runtimeexec.html try { proc.exitValue(); } catch (Throwable t) { } Runtime.getRuntime().halt(0); - - } catch (Exception e) { + } catch (IOException e) { + e.printStackTrace(); + } catch (RuntimeException e) { e.printStackTrace(); } } diff --git a/installer/resources/certificates/news/ampernand_at_gmail.com.crt b/installer/resources/certificates/news/ampernand_at_gmail.com.crt new file mode 100644 index 000000000..70956369b --- /dev/null +++ b/installer/resources/certificates/news/ampernand_at_gmail.com.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFhTCCA22gAwIBAgIEGdD2PTANBgkqhkiG9w0BAQ0FADBzMQswCQYDVQQGEwJY +WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt +b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEcMBoGA1UEAwwTYW1wZXJuYW5kQGdt +YWlsLmNvbTAeFw0xNTA3MjIxMjMxMTBaFw0yNTA3MjExMjMxMTBaMHMxCzAJBgNV +BAYTAlhYMQswCQYDVQQIEwJYWDELMAkGA1UEBxMCWFgxHjAcBgNVBAoTFUkyUCBB +bm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMRwwGgYDVQQDDBNhbXBlcm5h +bmRAZ21haWwuY29tMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjpTU +nBYHsqpQbAodtOQlEaRTMMI4YUi+JBMNEmlU2/9MozW13xxFr6brfgYTje0dTTgN +eGe/pvDM7H/a5ppSIEFCGDnn9mwrciIjHMaXeb7Z4cvxwFVwOxMclsFiw/+3sHQj +GyoR6TQQfsIupdtKwedmBQgVmHU+UKg3WKCyaE6J7DNHa0/nD4vtW+vaXFpv8o1w +PqEOar1Y34glxq6NTiivgGFtckBWkFLTQNjOAh/uSsdhnSDKiNHKFa3mNzjm2glf +B0ETP3yOMkEbVf9tTanlJbYsMEpfeajymGd5+P1S/2Eo0c2MlJOvLkLXAvXMdHzK +kmOTsSn/65bm5Rc2X+GQflLJlC0kuBoIyTXqFiAY7CN5y4F9llbjQ91CE2WgRv5U +dGcEilAjE36ZenQvHlKfHEs0SLAfb86GA0R5cBPQeTZq3AEqAJ9NaFgFzGvKzlJ/ +8c3JeOMyc/1YwodoWwhuNICGijAA5X7MUrJVZAh4Z18ZoOd3ITkUz/ugkHhmFU3Z +vV8LrHUoIiZxTsjSxhxYz7JHQa3eZQty4/66j+FXZThzwBm419RlXLnHVURwwQaX +znC7qYUE0YeiHDw4NaGwM8qlayPYMyD8sggZfXDH+SoeJBCji6zfgbdpF/aEsQhi +++/SWDNJfy6V1TQL5AXpmJEZmUTnZKm7paJfgyUCAwEAAaMhMB8wHQYDVR0OBBYE +FIBx9Nz6oPIgX8pKgmL04wxFkVWuMA0GCSqGSIb3DQEBDQUAA4ICAQAMsHfnEB/q +p8ToRmythRTiDjgSEc0VDOzKdizieJtFcFgK0WEzpuTeTXo012bTCv+qE5wWf32d +Lgv49PDJw+j8spkkdZzO6GIRhbI1C/4sCPe6p6ev/a3SZIbUi4NGIW48DeEIArjt +AwF94b3v4t067oZ1rNIHgdiKvqIMdztPiyqOjcx1/iuFDkrOnByqvWXVmOxHGskZ +F7CqId1/WVRCdzVYK6Ln5HwDHfZr8EYWTZE6zUd5osHJMYeitRYBtk7tylrDk3uP +88BD/fHRxc5+hBKEhVHua7Arm9R2CPvgK352dyxIpoiGuOUr98A8tM08pU6gNnuO +OZ7LU+5+Oc8FqPuUyhogwgDuBFA7s0fx464F1jofVPWOlarNZq7Mc0AwlA6jwLRY +1HExOlKkMbhALSOOAnSypozxFg1t8bkb0QUaUuz7Rck3gKvHX99mqzl7Ql6ZS4rm +umJNDEsGh0F6dxEQJ+b2I7NbSpGEf8PaUM5jASZeQncjPCMfBjPC8QwzYySLad5Y +n9e9sZN92zPYetdiQfpHwRY4N8itb4rb6TpwiSG6vVVvQJdFt77Y+4MtgFm9ofqA +ZDOBxt0r2AOT4Jrj92ifCKLDjevTaZjCSS2lPMMZbxoL+TXvNu12IKCm9rKn/+oP +WX+lDNy2nNJXrnKSvcyrBWxAi8+t0ZzGug== +-----END CERTIFICATE----- diff --git a/installer/resources/certificates/plugin/cacapo_at_mail.i2p.crt b/installer/resources/certificates/plugin/cacapo_at_mail.i2p.crt new file mode 100644 index 000000000..f56b88d6b --- /dev/null +++ b/installer/resources/certificates/plugin/cacapo_at_mail.i2p.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFfTCCA2WgAwIBAgIEUTjHEzANBgkqhkiG9w0BAQ0FADBvMQswCQYDVQQGEwJY +WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt +b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEYMBYGA1UEAwwPY2FjYXBvQG1haWwu +aTJwMB4XDTE1MDIwOTEyNTQxOFoXDTI1MDIwODEyNTQxOFowbzELMAkGA1UEBhMC +WFgxCzAJBgNVBAgTAlhYMQswCQYDVQQHEwJYWDEeMBwGA1UEChMVSTJQIEFub255 +bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxGDAWBgNVBAMMD2NhY2Fwb0BtYWls +LmkycDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJjVqyjEJqCCufjO +E80hXMPZiQZCiBjSKiA27dTX5rKABI26eLzcKl7e80Ooe9wEGBXEHZCxGIXAFt8x +EHBP4W2u1dmBLpnz6cGxZRMvlTuCKHAbzdJwsWblruXgRg6EQCrtewJ9yuY5SypM +WyJEkL68XMiTeg6fsU367ifWeuPnaO9wqL45pjt9raJMYzXZb3dc6WNUIhg0u7w0 +GA4z7X3CZc3f58/4F5ivKOmDd3FqM/suIH6qZJHvQQJZqLtfReLquD5TlqQjcZ1I +vtfYJWsx3Mx3tyXU4x7CHlXyxM4hEGOgMb041GR8td7AvqM0PLuexvNUHO1wDyWF +C6lydNlBwOOUXqPZCG5afgjliwAIIt0WoASEUqSFDiRmhaQZyShQ9P7NUg7jo8x1 +SK/YL6agSRfyARvKG+lVoSPlVMdwuP4SGYHW9OA0wlI1fO3aY+q71iP3DFfWsLCh +hE/KXKzruDdGe0tIQdWaz5Xrv4bLN8Ot5a79TYRFUeY7lCyFP7vqert+l31hiyZS +gVugjF6zz91F/gtLsjG+y2HdbdlD3TR/+I/dZFuoiZoVPtXGla36CHLrzyTmKPg9 +nZLtrVmOKAfUW1ejYjSeO9Rv05hOsGtPtdi70jw1b7WkUC7Ic8L4HzJE0zDzKwEk +ESVZiLX9G9b0O9CDQnKxRluuZDmVAgMBAAGjITAfMB0GA1UdDgQWBBT9cbSyt2cH +nN9RnC6o9TOoPH5QWTANBgkqhkiG9w0BAQ0FAAOCAgEAVMpgq3aTTv4v3ZmSJ1P6 +jZBXX85IdnRUvadXX0HDgqpqs8k3Sm67C0UwpLQHeYw5t6ilSJocCw62pMCgfxwf +dmJ9VEcFoQSd30BdCMXNmPxAnQ+/INUBPzmcZwe+KlI07IQUsjoEPtRG9LBxwric +PifjxKzzVgOlPPb5XGNmVLdlncY9Z4v5McZPQx6+hG4CqNULEOrx/xRpQDTsGUem +AXR/ocHm7dDwUIQrkRPkbPK+urEtqKS+RL5ttQ4myzJWasCiDoAdlDv15X7u2G+i +E8rTSohtr4Crd4DbNpT11aQHtnympNJCAc7PyRLcQRV3FASXvDUsvwT4dMcPN+M1 +ZR5oatbo9hxy/MPyhQun4awMRvaF7HSKrPI8XJRdJzzufusv662N6A7UX31i5W82 +rnSxfP/haklNfwcBAQ0R3R/MkoURYanJYoHnr2WuAx0yfxNIYlJMX7hfPdWOW6a4 +7nQQAkrgW3knQGlKwCEypjm0tdK0bsUrQ0F91wUUYSUSFuPDPb19ifKXklBoCVlB +6u3ckHu7LG/YZcHmtsxMRMuT+6LtIs/huFnfs4YhJYggswFJHjEX5PcBfsiQklz+ +ahs+UsJAb+lbMOlWj+LYDdyC4T7ZHT+Ii/JZdBN3WNXiBzNuXGC7bd0KWBgCaFuU +ZAPV0YlmPjsGRaSl7vfh+cI= +-----END CERTIFICATE----- diff --git a/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt b/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt new file mode 100644 index 000000000..4a2789ec0 --- /dev/null +++ b/installer/resources/certificates/reseed/j_at_torontocrypto.org.crt @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF7TCCA9egAwIBAgIQJpzITX40IacsYOr3X98gPzALBgkqhkiG9w0BAQswczEL +MAkGA1UEBhMCWFgxHjAcBgNVBAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoG +A1UECxMDSTJQMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxHDAaBgNVBAMME2pA +dG9yb250b2NyeXB0by5vcmcwHhcNMTUwOTIyMjIxNTMzWhcNMjUwOTIyMjIxNTMz +WjBzMQswCQYDVQQGEwJYWDEeMBwGA1UEChMVSTJQIEFub255bW91cyBOZXR3b3Jr +MQwwCgYDVQQLEwNJMlAxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEcMBoGA1UE +AwwTakB0b3JvbnRvY3J5cHRvLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAKbQH61RibAeLRemYah/071wPid99vpPoVxJMwFc/42kbnpSFHUiXRYP +WMkzqPmdZRkr9BNqt3Fa19IiMQbJ49yKRh9+HPJ09b88r2Z75wo71b4eq4Ohd8/4 +pSfn7zPCxtqvBh79N0e6O1jC7I01WkXaQfRN1BpIpRT/80H7muWOHoN/AFbJL2KK +eRx+G1hsHqn3pBcsq5QV+bAQdpzxYYYKHn/EPFYk9LM3p1F2uWOQDN0UU+rINvpw +JIR+cvk/bTpPpMCQrYIXdn4hxgCX7KeKYvsFpTieMmGU0omFGWMRc5nm23REpm1N +cU7Oj8kUIW9YbCMzR4KT/x6h1BwRS4L9Hq/ofQM+vDXff3zvcw7MMmVpgU/jh/9I +XNc6A3IBHfpJaxIzhk7UfOZX6k1kyeXjXA8Gr5FvA9Ap9eH7KVFXeyaYq1gTWrGA +MPvgY6dNAH7OFXtqZUGrIAqyWnbaxEsO1HWyRYitCM91LI5gFURUwQPzo2ewgshq +0uGaO+2J61fM9cb8aKOU8Yaa4N04sZfu85k402Kr7bP/DE7Hv9K0+U5ZtbCJxrOU +z5YgbfCrh/iwFti8VP8wFv29S1d6Kqj9OVroM1ns9aNwqyYsMbj/STe8BBRncxuw +lkf69FXxyaGtyfc9ry8enkL8QYyzbVDRXw01yogwToZ8Mc/PinI7AgMBAAGjgYAw +fjAOBgNVHQ8BAf8EBAMCAIQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB +MA8GA1UdEwEB/wQFMAMBAf8wHAYDVR0OBBUEE2pAdG9yb250b2NyeXB0by5vcmcw +HgYDVR0jBBcwFYATakB0b3JvbnRvY3J5cHRvLm9yZzALBgkqhkiG9w0BAQsDggIB +AJGmZv3TKCwuNafmPUCvvJV6PwdBqYdVX270pLI2IjPa5sE+dDiCrrrH5tVsoUfY +1xAy0eclic3SCu2DdQxicYFIsyN91oyZWljnVuOWDRQoyeGvcwN3FN8WQZ/VnoX/ +b4Xtx0D3HsQjLXfzk0AzSXp9TP9/orMR5bkWiqhUhXvlb7XhpZ+p9/8N0D7bjcaJ +74Rn6g3sS+/wKJ0c7h5R3+mRNPW1SecbfQFN/GkgDQxZscvmbRsCG03IRQeYpqt2 +M8KA5KXu/H6ZU5XlC6+VI7vf6yWWPf3s8CRBDgfYtI7uRFkfwJLsTBZCOFoyQe+F +CIZZj4lg6f46FHMekbPouw+g2B+2QNdW+fZqdVLAXbuN2xMsVakZn5X9iBfanNmN +t5QH4T81SZb9ZIJSD+L0lKiMw1klbaYYPp2mjwbo42DhsezcJX3TKXhMe3qkYZ3I +E0a9Kq4TmoWAkdycT1oH51wmybwWc3ix7rXbUe8h6KgBEXqJV60ybX7iacrq9WgG +xIr5hnSUEGZtMcdhEA4oD319h+8j/UjXKgWwuuNExpSnARbwQTbPJ/PLD6mQVpHv +jL2S9nbb1r/GmRdzCpHVwLGczUJvwfjAZ8bDCONSGHzuzw8lgpdRpdeWCLfQzXyo +mjh0U8QNpeHEMdQhmnaYa8WJ83DTnO7pwaoYqjeDQ9yM +-----END CERTIFICATE----- diff --git a/installer/resources/certificates/reseed/matt_at_drollette.com.crt b/installer/resources/certificates/reseed/matt_at_drollette.com.crt deleted file mode 100644 index e490a152a..000000000 --- a/installer/resources/certificates/reseed/matt_at_drollette.com.crt +++ /dev/null @@ -1,32 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIEB52rdjANBgkqhkiG9w0BAQ0FADByMQswCQYDVQQGEwJY -WDELMAkGA1UECBMCWFgxCzAJBgNVBAcTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnlt -b3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEbMBkGA1UEAwwSbWF0dEBkcm9sbGV0 -dGUuY29tMB4XDTE0MDcyMTEzMjYxM1oXDTI0MDcyMDEzMjYxM1owcjELMAkGA1UE -BhMCWFgxCzAJBgNVBAgTAlhYMQswCQYDVQQHEwJYWDEeMBwGA1UEChMVSTJQIEFu -b255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxGzAZBgNVBAMMEm1hdHRAZHJv -bGxldHRlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL5M9wKT -csNLg4EA3fW7LleTQdrm3stPnoUvFmsNZHGgsKt1Nc1qCNis3kr2QEY+4Z398U7r -7xGEQFa7D/9SPHf6n1uVXc9DIcmwBtEB0FPB1XPFp2h00ZXIv24yiLN3GQT1woAM -yEbBWsUgn8K/iMBeA5dU2vPwAbGO/0ibD62frgGdYqU2EeiJ/U6vBmKxvC+q2noL -gnyfQJEJANXgf+Cw/gBaS6yn5ZsYcenLNenID2TQKQ6Q/NxYrDYRdWdId29iwldt -dmNSmASv8C7g9d/isZkpmtYNkE4J4m0W9wKziOoyvLSMo8ec67QmCKaPaYKTHTjx -aUuja02+mnlV4DSdZo6nPkSdokRY0+5e6q7+dIPefu8ealGEAE5oedEfl5iM5Fnz -phTR+ePodBK3sB+bMi1NMppbWugpFpdqs1hg2KNKSSG8C4/eTqf2nnlDiVvvFANc -imt6tk0pZcKqveRiDSgI8mTzTcrNgVClsCLoInY5Vab7onZjY9bGijPQ2i1P6+qu -5G6LiLFW7xFq2BcX1DnTztcJ8Yu9NYHhR21J6u7Dr8YHntes3mnth1F0BX3FVA1s -9SaE9/pNhdqap9owpEhNoE1Ke3LorVLL8jyQsqgRHx8VdhWdi9Ao0mzzeI9HYX0j -nZ7uXK5DqGG74K6eWoS9jZSDJLj3IBkIr3B/AgMBAAGjITAfMB0GA1UdDgQWBBTK -YjH+9Jv82Zqi86r95/1sXUCOnDANBgkqhkiG9w0BAQ0FAAOCAgEAsDyl3dS/5pR1 -iDN0zE70HN1Sjv55c5um6N39rgz8JSObbAMihhpjRXPR6yl0PdfVcswdCuEaaykp -ppPNY5ObqZIdqI92XOaOhSA3AkZwZffbwaoXFYiawq1aQG1HP7oxXzWwbnbPOxgz -6ThNP5DJan53Mk8TAhxoJkEJxVlMwIiC+QEgqDNYrP8oNOR2J1EXgzsHheEKObyP -xTwRYFqZU/7BQlFeB0LG1LIy9zXAHlb/XIor10w6ChPDW7DiDwGq3zDJw1d8eiUn -RoPRmFjTqn+3rGaEkk+vUFHoWo7cLCEIC3+P9wlY4Kel+ldXMmuJ+BZ1glFXeO3L -VO85n7iVIyBbwo7RLtNaBvrRQIEG3ld5UOKklLlWwhrX/FXksEhdFvmuF9sbiYNr -cg81sbwZlX7Gi7VicXkykFFXwRRr3UblDtfeevouxk4nMVzcDsmzGeAZKQBvcxHa -Pzc70YwnVRqTc87c0bEwPoxK1Vb26+DILyDjKb/AkTw/rwj6vcJZP2ad+hpiz5Ka -nlbY2cI3JJb0TQiDiOIk+xFqC5oHUTSEmfqA6sA5o/RqdwDpkfpgI5mCwhYzDSLD -jfS+263ylhanl7oz0sM+GtH63owVbYJAFT2EozT9siTIErvJESL4Z80yUQG63d/7 -fss8T6gOo19esb/KEMZGZE4pAApakWM= ------END CERTIFICATE----- diff --git a/installer/resources/certificates/reseed/parg_at_mail.i2p.crt b/installer/resources/certificates/reseed/parg_at_mail.i2p.crt new file mode 100644 index 000000000..e78b264c2 --- /dev/null +++ b/installer/resources/certificates/reseed/parg_at_mail.i2p.crt @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF1TCCA7+gAwIBAgIRAPmuHtSxMcNIUXNc0N4+7RIwCwYJKoZIhvcNAQELMG0x +CzAJBgNVBAYTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAK +BgNVBAsTA0kyUDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMRYwFAYDVQQDDA1w +YXJnQG1haWwuaTJwMB4XDTE1MDUxOTIwMjExM1oXDTI1MDUxOTIwMjExM1owbTEL +MAkGA1UEBhMCWFgxHjAcBgNVBAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoG +A1UECxMDSTJQMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxFjAUBgNVBAMMDXBh +cmdAbWFpbC5pMnAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/jINR +maFCnuCZwofrhtJoneIuJn6kauYYfjPF/nRrPffiooX2vo0Tp6cpTAulMul0Nh2I +/trJSbBqzneg+0zDS2wpLb1U7FJ5WGqb+yk7eo8X+Upjsuu4JoFr6ap81+J5oFBR +zTyYba6TYYwAZoBXAkY3qMjbfbYkqceY/p5WqAhEO7N4/DVLRA42FsQQMFwJYHnD +SgcyrTXiBbWJzvEF/4LSpL2CXB3Efkti/1MggVhXBu83PSkPvYQQTGFmwKP+ivVZ +V339xNGGKqPd+B1LOI8xUEAGGbOgfdB3c/x8weOwRip6bp+0SfLcVHO9X1lD95SA +dvtz2qABWDhqcMTyfJIEuOQSpQO6DhhBViHR2cjcu+z5Ugf+X6ZWhtFMBJsLb0Um +R3gKhPaMizCYVW6uRyA1B5SnO3Pd1ve1qX+K1h+NZPXoMpBxmyg+ds/WuhmAZUEB +bzUr7DczImb29WlBFCbYjA/fBN8QOc2qZpQFckY4CrBhCmFevxSpwHOxSkVEeXet +tYZ2BZIxN+I5p5SZc+6Ba1O3hqJsqv4D8H4TqXYZaw50ySRYIl9LDAEYp7owZzwA +oMxmjnsZBVtkGZpKk/RColQVLT/xmUqDJPQlWRw2te7tr1LiH2ZkVu7TUuhIep+i +4U8H4S9+zNQEAyn87L589AsGQ9hRtwrUOqy1ywIDAQABo3QwcjAOBgNVHQ8BAf8E +BAMCAIQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMA8GA1UdEwEB/wQF +MAMBAf8wFgYDVR0OBA8EDXBhcmdAbWFpbC5pMnAwGAYDVR0jBBEwD4ANcGFyZ0Bt +YWlsLmkycDALBgkqhkiG9w0BAQsDggIBAGaVJunmmO0EfDuTAN8Psjq7YVwwSyMk +6h1dMHz/U1GwY/jjKIIyfzKh6SfZmBfQT5fnGLM84m1O0267s9PZpHFcw9Kn+KQ4 +YkfzVaYgsADjeyqQ1XIHJ/CZ60BWCs9aqWgYoTscbTtadaGscFBTegispkt8+Mj6 +aaEQnajCD4f2GFHEi0miG+gRu6MDgqG2ka5tg3j+zfSDiq5lclq5qS97Lu/EVLRr +HlLKBDPnLKeGYnPOAlzTNqwWtvLho7jIFHt7DP1Qzn3nvDoOQb40ToHCAAcMr9jy +ncS6Eo4veeWeaSIGMnaDuzZoTWadizZo1G9z3ADMXRJ5IxdLKbBZiSkCHuAMnDSe +NKREmXewzjtRQBgf7RkyU0JwIqTKJsLTMX8oLecyvZHunmuKkqpJ/AgIyRB2X/nz +/LFeg4cru20Q+mpzVBnZPCS6X45jbew14ajURRgp4MrX52Ph+9/mS4RVQhHL+GDU +4OwF6tkqFD0umw1Gn1CAvKPOn9EVHa7nLDYxPo9LEX7Dnb5WkwKDqtALrcMDYjJr +4TqJFbsijYehVn+kFQ4I4aN54ECzwu9RKmebrXyDDe0e0fErRsF5+qII8/wOo4WT +XUjHCvK6THeaC8k5jcostgVszIx7rwqXj1ailbV/nAFr8NgADs04//5DJA0ieD+4 +N1tGWBZt9Prq +-----END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/193.150.121.66.crt b/installer/resources/certificates/ssl/193.150.121.66.crt deleted file mode 100644 index 450581d23..000000000 --- a/installer/resources/certificates/ssl/193.150.121.66.crt +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDgDCCAmgCCQCAKEkFUJcEezANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UEBhMC -Tk8xDTALBgNVBAgMBE9zbG8xDTALBgNVBAcMBE9zbG8xDDAKBgNVBAoMA0kyUDEM -MAoGA1UECwwDSTJQMRcwFQYDVQQDDA4xOTMuMTUwLjEyMS42NjEfMB0GCSqGSIb3 -DQEJARYQbWVlaEBpMnBtYWlsLm9yZzAeFw0xMzA2MjcxODM2MjhaFw0yMDA2MjUx -ODM2MjhaMIGBMQswCQYDVQQGEwJOTzENMAsGA1UECAwET3NsbzENMAsGA1UEBwwE -T3NsbzEMMAoGA1UECgwDSTJQMQwwCgYDVQQLDANJMlAxFzAVBgNVBAMMDjE5My4x -NTAuMTIxLjY2MR8wHQYJKoZIhvcNAQkBFhBtZWVoQGkycG1haWwub3JnMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuBuFY4ZFvsbr5l1/s/GeUBLIWQLB -nqrRkonrwCyxgjSnnG1uz/Z5nf6QDUjiVnFKMXenLaDn4KCmEi4LjWQllhK9r6pj -BRkR7C0DTHq7WqfyvWnGSZZsOJDiH2vLlivV8N9oGdjxvv0N9No3AJcsmLYrxSLi -6/JF8xZ2HGuT/oWW6aWvpIOKpIqti865BJw5P5KgYAS24J8vHRFM3FA4dfLNTBA2 -IGqPqYLQA+2zfOC4z01aArmcYnT1iJLT7krgKnr/BXdJfGQ2GjxkRSt8IwB6WmXA -byz6QdNYM/0eubi102/zpD/DrySTU2kc8xKjknGUqBJvVdsL+iLK98uJrQIDAQAB -MA0GCSqGSIb3DQEBBQUAA4IBAQCTimMu3X7+ztXxlIFhwGh42GfMjeBYT0NHOLAy -ZtQNRqhNvkl3jZ4ERPLxP99+bcAfCX0wgVpgD32OWEZopwveRyMImP8HfFr4NnZ+ -edbM37fRYiVJv57kbi6O0rhEC7J5JF+fnCaZVLCuvYIrIXTdxTjvxuLhyan6Ej7V -7iGDJ8t16tpLVJgcXfRg+dvAa6aDOK6x3w78j0bvh6rhvpOd9sW/Nk3LBKP4Xgkx -PHkqm3hNfDIu8Hubeav9SA1kLVMS/uce52VyYMEDauObfC65ds0GRmCtYhZqMvj+ -FFCbssLraVJE9Hi/ZKGu33jNngDCG+wG+nmleksMYE1yTSRt ------END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/i2p.mooo.com.crt b/installer/resources/certificates/ssl/i2p.mooo.com.crt index ac10e1ff4..839767b3b 100644 --- a/installer/resources/certificates/ssl/i2p.mooo.com.crt +++ b/installer/resources/certificates/ssl/i2p.mooo.com.crt @@ -1,23 +1,23 @@ -----BEGIN CERTIFICATE----- -MIIDvjCCAyegAwIBAgICZhcwDQYJKoZIhvcNAQEFBQAwdTELMAkGA1UEBhMCVVMx -DTALBgNVBAgMBG5vbmUxDTALBgNVBAcMBG5vbmUxDTALBgNVBAoMBG5vbmUxDTAL -BgNVBAsMBG5vbmUxFTATBgNVBAMMDGkycC5tb29vLmNvbTETMBEGCSqGSIb3DQEJ -ARYEbm9uZTAeFw0xMTEwMjMyMTM2NDFaFw0xOTEwMjMyMTM2NDFaMGYxCzAJBgNV -BAYTAlVTMQ0wCwYDVQQIDARub25lMQ0wCwYDVQQKDARub25lMQ0wCwYDVQQLDARu -b25lMRUwEwYDVQQDDAxpMnAubW9vby5jb20xEzARBgkqhkiG9w0BCQEWBG5vbmUw -ggGPMA0GCSqGSIb3DQEBAQUAA4IBfAAwggF3AoIBbgMG1O7HRVa7UoiKbQTmKy5m -x79Na8vjD3etcOwfc4TSenQFvn+GbAWkJwKpM8uvOcgj1CxNeHWdSaeTFH1OwJsw -vl3leJ7clMdo3hpQDhPeGzBLyOiWwFHVn15YKa9xcM7S9Op5Q6rKBHUyyx1vGSz+ -/NBmkktpI6rcGFfP3ISRL0auR+db+adWv4TS6W8YiwQIVZNbSlKP6FNO9Mv1kxQZ -KoHPn8vT/LtAh1fcI6ryBuy3F5oHfbGumIwsS5dpowryFxQzwg5vtMA7AMCMKyXv -hP/W6OuaaEP5MCIxkWjQs35gOYa8eF1dLoy3AD9yVVhoNrA8Bc5FnVFJ32Qv7agy -qRY85cXBA6hT/Qzs/wWwp7WrrnZuifaSv/u/Ayi5vX42/bf86PSM2IRNIESoA98A -NFz4U2KGq9s1K2JbkQmnFy8IU0w7CMq6PvNEm/uNjSk6OE1rcCXML+EuX0zmXy8d -PjRbLzC9csSg2CqMtQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQf -Fh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUdjuOczdG -hUpYzH0UXqKrOleT8GkwHwYDVR0jBBgwFoAU+SKWC49cM5sCodv89AFin3pkS0Yw -DQYJKoZIhvcNAQEFBQADgYEAKYyWlDIStjjbn/ZzVScKR174I8whTbdqrX/vp9dr -2hMv5m4F+aswX4Jr58WneKg2LvRaL6xEhoL7OAQ6aB/7xVSpDjIrrBLZd513NAam -X6bOPYJ6IH7Vw9ClFY3AlfzsNlgRMXno7rySKKzhg24kusNwKDH2yCphZy4BgjMn -y6A= +MIIDvTCCAqWgAwIBAgIJAOeW0ejPrHimMA0GCSqGSIb3DQEBCwUAMHUxCzAJBgNV +BAYTAlVTMQ0wCwYDVQQIDARub25lMQ0wCwYDVQQHDARub25lMQ0wCwYDVQQKDARu +b25lMQ0wCwYDVQQLDARub25lMRUwEwYDVQQDDAxpMnAubW9vby5jb20xEzARBgkq +hkiG9w0BCQEWBG5vbmUwHhcNMTUwMjA4MTczMzA5WhcNMTkwMzE5MTczMzA5WjB1 +MQswCQYDVQQGEwJVUzENMAsGA1UECAwEbm9uZTENMAsGA1UEBwwEbm9uZTENMAsG +A1UECgwEbm9uZTENMAsGA1UECwwEbm9uZTEVMBMGA1UEAwwMaTJwLm1vb28uY29t +MRMwEQYJKoZIhvcNAQkBFgRub25lMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAqxej7oRl9GOb8benIBCENrJXoow1iWhI9M+2nU0SaonrCDql5M2YMlwd +HzYUWtFbRjz2NinjB0fgFq9cfzHfr1Sc8k/OeGg1jvNfqt8wWo9tryQNjiHtDQUZ +6lQ5T13I+lj0CBasowgbApKQfrYjvaeuTaVYTfP8IVA60hoUQ+sy9JN+Unsx3/0Y +PLLd98+bT27qYuBNRB1g/ifUTd9Wosj2PevGBlCxYDaUjmCG4Q8kcQr87KvM6RTu +3AV61s/Wyy1j2YemlGG/ZhJ44YnlVMSu1vTjt9HInVf3lRRx/+RzbQO3lqeVC8LC +Bq3KbSlfJVx4vHslfHwBFw9A4rmD1QIDAQABo1AwTjAdBgNVHQ4EFgQUsSUvX0ED +yivB67iksVwZ+b8vLtQwHwYDVR0jBBgwFoAUsSUvX0EDyivB67iksVwZ+b8vLtQw +DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAde4wts7Q8TylFEc38ftJ +2f285fFIR7P1SSbBcHPK2eBwLEg0zJyFrCeiHuEpPrn+d5GqL2zOskjfcESGmDBT +aFajj8jPBJj/AmpkdWJG6a1YKro5tu9wrlenGwHOHu2/Cl0IJvafxrOs2x4G+2Nl +5Hcw/FIy8mK7eIch4pACfi0zNMZ6KMCKfX9bxPrQo78WdBfVjbrIBlgyOQJ5NJEF +JlWvS7Butv7eERi4I2huN5VRJSCFzjbuO+tjP3I8IB6WgdBmTeqq8ObtXRgahBuD +ZmkvqVSfIzK5JN4GjO8FOdCBomuwm9A92kgmAptwQwAHM9qCDJpH8L07/7poxlGb +iA== -----END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/i2p.mooo.com2.crt b/installer/resources/certificates/ssl/i2p.mooo.com2.crt deleted file mode 100644 index 839767b3b..000000000 --- a/installer/resources/certificates/ssl/i2p.mooo.com2.crt +++ /dev/null @@ -1,23 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDvTCCAqWgAwIBAgIJAOeW0ejPrHimMA0GCSqGSIb3DQEBCwUAMHUxCzAJBgNV -BAYTAlVTMQ0wCwYDVQQIDARub25lMQ0wCwYDVQQHDARub25lMQ0wCwYDVQQKDARu -b25lMQ0wCwYDVQQLDARub25lMRUwEwYDVQQDDAxpMnAubW9vby5jb20xEzARBgkq -hkiG9w0BCQEWBG5vbmUwHhcNMTUwMjA4MTczMzA5WhcNMTkwMzE5MTczMzA5WjB1 -MQswCQYDVQQGEwJVUzENMAsGA1UECAwEbm9uZTENMAsGA1UEBwwEbm9uZTENMAsG -A1UECgwEbm9uZTENMAsGA1UECwwEbm9uZTEVMBMGA1UEAwwMaTJwLm1vb28uY29t -MRMwEQYJKoZIhvcNAQkBFgRub25lMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAqxej7oRl9GOb8benIBCENrJXoow1iWhI9M+2nU0SaonrCDql5M2YMlwd -HzYUWtFbRjz2NinjB0fgFq9cfzHfr1Sc8k/OeGg1jvNfqt8wWo9tryQNjiHtDQUZ -6lQ5T13I+lj0CBasowgbApKQfrYjvaeuTaVYTfP8IVA60hoUQ+sy9JN+Unsx3/0Y -PLLd98+bT27qYuBNRB1g/ifUTd9Wosj2PevGBlCxYDaUjmCG4Q8kcQr87KvM6RTu -3AV61s/Wyy1j2YemlGG/ZhJ44YnlVMSu1vTjt9HInVf3lRRx/+RzbQO3lqeVC8LC -Bq3KbSlfJVx4vHslfHwBFw9A4rmD1QIDAQABo1AwTjAdBgNVHQ4EFgQUsSUvX0ED -yivB67iksVwZ+b8vLtQwHwYDVR0jBBgwFoAUsSUvX0EDyivB67iksVwZ+b8vLtQw -DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAde4wts7Q8TylFEc38ftJ -2f285fFIR7P1SSbBcHPK2eBwLEg0zJyFrCeiHuEpPrn+d5GqL2zOskjfcESGmDBT -aFajj8jPBJj/AmpkdWJG6a1YKro5tu9wrlenGwHOHu2/Cl0IJvafxrOs2x4G+2Nl -5Hcw/FIy8mK7eIch4pACfi0zNMZ6KMCKfX9bxPrQo78WdBfVjbrIBlgyOQJ5NJEF -JlWvS7Butv7eERi4I2huN5VRJSCFzjbuO+tjP3I8IB6WgdBmTeqq8ObtXRgahBuD -ZmkvqVSfIzK5JN4GjO8FOdCBomuwm9A92kgmAptwQwAHM9qCDJpH8L07/7poxlGb -iA== ------END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/link.mx24.eu.crt b/installer/resources/certificates/ssl/link.mx24.eu.crt deleted file mode 100644 index 8e0d910fc..000000000 --- a/installer/resources/certificates/ssl/link.mx24.eu.crt +++ /dev/null @@ -1,24 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIJAMsPNG1k0yV4MA0GCSqGSIb3DQEBCwUAMIGdMQswCQYD -VQQGEwJERTEVMBMGA1UECAwMbGluay5teDI0LmV1MRUwEwYDVQQHDAxsaW5rLm14 -MjQuZXUxFTATBgNVBAoMDGxpbmsubXgyNC5ldTEVMBMGA1UECwwMbGluay5teDI0 -LmV1MRUwEwYDVQQDDAxsaW5rLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDGxpbmsu -bXgyNC5ldTAeFw0xNDExMTkxOTE4NTRaFw0yMDA1MTExOTE4NTRaMIGdMQswCQYD -VQQGEwJERTEVMBMGA1UECAwMbGluay5teDI0LmV1MRUwEwYDVQQHDAxsaW5rLm14 -MjQuZXUxFTATBgNVBAoMDGxpbmsubXgyNC5ldTEVMBMGA1UECwwMbGluay5teDI0 -LmV1MRUwEwYDVQQDDAxsaW5rLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDGxpbmsu -bXgyNC5ldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL8modDBRkyh -SHSm92pTfguO3F6n5ocsBJ4vaVoosYq3ILCsapjqmynMHZUef6gEB7+Gn5cKXsH2 -JaKOeb8DHrOFCaxfj187x1QfZj1UNMQblx2T9q4th12tqp+k4JuLwgemr+2uAUpM -xx/uHRJXD0hf67+fHQFYNVfa+WvT46xlKGsWDQ0LBsA/z4YGnyeaV4PrS5nj3euA -IbdfDj7rJea3bfhSqYA1ZH1cquKlsXOOYO5cIcXsa5dxDWX51QS+i7+ocph+JN1X -dRh6ZirE9OXZVXwXXVRnJSYjgBlP/DQBdE7YkE1R3LyCVZsgxJaaLV/ujijOIK61 -SqEhHvFNRe0CAwEAAaNQME4wHQYDVR0OBBYEFB6XRz6VZlrAE+3xL6AyKrkq+y2X -MB8GA1UdIwQYMBaAFB6XRz6VZlrAE+3xL6AyKrkq+y2XMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQELBQADggEBADhxBA5GHisDVf5a+1hIi7FBGBjJJLqzlaKh+bFB -gTCYfk3F4wYzndr1HpdCZSSYDtY3mXFNMWQCpwvwvy1DM+9AMRY68wKNXHa/WypW -zQSqTfEH8cdaIXUALB7pdWFVr3rx0f7/8I0Gj/ByUbJ94rzd22vduX5riY0Rag6B -dPtW0M9bJrC1AIjexzDcStupj9v/ceGYZQYC4zb2tZ7Ek/6q+vei8TxWZjku7Dl4 -YRPXXufyB24uQ1hJVy2fSyIJ63tIRJoEFLBNaKDOB53i10xLWBcsJpXKY57AOQMn -flqW4HG8uGJ/o1WjhiOB9eI7T9toy08zNzt+kSI/blFIoek= ------END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/netdb.rows.io.crt b/installer/resources/certificates/ssl/netdb.rows.io.crt deleted file mode 100644 index 5d99233cf..000000000 --- a/installer/resources/certificates/ssl/netdb.rows.io.crt +++ /dev/null @@ -1,33 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFszCCA52gAwIBAgIRALWZzF745GPT8GVUcZ0RMg0wCwYJKoZIhvcNAQELMG0x -CzAJBgNVBAYTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAK -BgNVBAsTA0kyUDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMRYwFAYDVQQDEw1u -ZXRkYi5yb3dzLmlvMB4XDTE0MTIyMDE2NDIwNVoXDTE2MTIxOTE2NDIwNVowbTEL -MAkGA1UEBhMCWFgxHjAcBgNVBAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoG -A1UECxMDSTJQMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgxFjAUBgNVBAMTDW5l -dGRiLnJvd3MuaW8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCTZyJF -Im9pnc7OO5DfQy4SuotUztO5BJX7xniTqD4fKLQQXzZFeT4XHrkDste8TsTzUfxt -CWDEBH3af5cpnwWMT28rlRw2DlPr+LnAgt7VjFXdhFZr1N5VfNlTI1K3OiZ/DRlB -92CoTypyx4ebNfLtZfh+TPLOdg5UqROpHIrybsUj2IaG3IpGHJK8FuH79b/X5oVI -FlDZJs5QsJEARzq2QMJd6fnNqkCBSSjNpeL7TtDar9EKa6+O7s351kH8MVFNSogB -F0Hqu8LYaRC1L1JCz5lsOYKepp3MMIOdDOhy+FTd8NuNZXYkUTdTNI4dB6w4Z6o+ -xlnHEPpezIAAlPXLiupvlEi0om69/TMS+pLDBLAOlCZ2YaXS18UrSbmYYlekg40J -nEeALt8ZdsU/is7Q6SJZ3UltFIPCuMD+ixvaIvakkhNiqEWPxdg0XxAK1ZJYFup+ -2aVtPLQIzWePkG/VbdA5cxQKNtRwOgvCoKIE29nUbxuq2PCmMhLAfXHeieSzP5c7 -Q8A23qX94hwCIePj1YA9uNtStjECfVS1wjyXV4M1tTFUdSJv4aVtFjtya7PY+6SG -Srz11SqBWSqyJ/C14Su0QY/HquglzMRnkJ49Scwb+79hl7kPslO1iIgPLE5S2fIW -ZwJ/4AgGb6BZT8XPEYYANEA5y7KGanYNo8KdYwIDAQABo1IwUDAOBgNVHQ8BAf8E -BAMCAKQwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAYBgNV -HREEETAPgg1uZXRkYi5yb3dzLmlvMAsGCSqGSIb3DQEBCwOCAgEAMjQSHPR/p9If -mJA1y489D1NB2CxfwO+CgAIs9HA7OsdneQBZTldMgBHoQGifkpD1uSl8DHoZqnJ8 -wo5YWcT1rYkP+V1jGfZj92VvfQL0/R4G4hWdQwYY0CcXN8ixS36UDQVSFKb4zvNG -j9iIN57WToEmxp5noHguKrpViwhXCMCpAXr3ZIv/Fd+QACNEXuvdZgbtwfOTPLKh -ZlkUPgVHiQopeQnZhZCT3aLZ5lndrUtWlQYiGN/OolVyRie+ysuxjRR4L5brt4Rz -hrwFBswbQZlgxJ3Nod9/wEdEJWP4+X69ggzOkBB+PgpOFpuDlJxNTcPA/WFIlsm0 -CzCv/o8Vg+MMWFPMwEZrk6UQXXACr1AEF+MUnZq3o5JaLvHoUcikewbZPcTCNvDp -nqT1RN9vq/MGdlRfPJkF028IXPz7T9DXXPXhJvv+FAfnOkREeUYpzBIftyYf92ol -l63z0FooVUTKWYPvFFgl5ShNnINTMVXPCZp8j7myLGSLOAFFwiaL1OtvftgxXfzC -B7Qj42SNhFUrHmO9fH3H2ptm/iW/Xe5eqgeb6MVGQ/eQJpdp0AvpDa50/AYNt1Iq -CcMKmBgzUezrIN24XXW/LZwazlc7I8e5RzgbEgXEDBZu21TApTKlmOqEYle8294W -fWThMdwk1kTrWxLooiVrS5A1hXqADqE= ------END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/reseed.i2p.vzaws.com.crt b/installer/resources/certificates/ssl/reseed.i2p.vzaws.com.crt new file mode 100644 index 000000000..25f9e3699 --- /dev/null +++ b/installer/resources/certificates/ssl/reseed.i2p.vzaws.com.crt @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFyDCCA7KgAwIBAgIRAJD+6g+eAsWKlwas0Ymsq24wCwYJKoZIhvcNAQELMHQx +CzAJBgNVBAYTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAK +BgNVBAsTA0kyUDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR0wGwYDVQQDExRy +ZXNlZWQuaTJwLnZ6YXdzLmNvbTAeFw0xNTA1MTkyMDIwNTRaFw0xNzA1MTgyMDIw +NTRaMHQxCzAJBgNVBAYTAlhYMR4wHAYDVQQKExVJMlAgQW5vbnltb3VzIE5ldHdv +cmsxDDAKBgNVBAsTA0kyUDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR0wGwYD +VQQDExRyZXNlZWQuaTJwLnZ6YXdzLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAJCAUT9WD2kLPgh5tK5Pb9xpvjKZU5o4HxzM2Nja34+AESnjDwSw +vIuQgjUQ3mqlHS292sdy30nk8kLJvnQ8rRVFrBn9xWdWzSp53thm5rn8h+7cUsBG +r51w0VY/5Zo8b3oxd8PWDd91otuRgJc6xSqIz5i3G1IvTIhHjXfqPwIFvaAbgGOb +xyf5q/LNz9KPAE9DzI4g63AM7+EIBUd/3+TO/27+s6rOWQlIBpHmd+YvyyG9PwM/ +bpj9sVpz8S6THSu8srxoI/L4vxsMp0KkySxPAVdmZi8Z5HyJ8b7LtabeEmXaOeIh +F9ZRWyIZWqPZm+dTfM6GyT/JWunBNXWVFlUDJqPCsFB7gdN1GBGW7uv4c6Lq0h7g +Xqd6R2hcthmH8vRasrYisZdfaODZtdUM16Sk6MIl2ALoA6tyAJNGlRKHJutLnY7l +dsD81VfU9Q8ovZ+kb4EHYJx53enW7CUswvKyN2VPKYH3qNoiWW2fGdrEsjdbX575 +2bRn7f2BEDTuQgKSTdFjVMZ/d7ljddwNcPS7TS24X2i6lWFAAQpCarHzSE0uwzhZ +ikqhOEKdYwrmzYKv6QFszq2ALiWk1lrasB4zkMl1RY2nwGuh7OfsrXlaehDYZLOe +M9Ib7MfqXpdBFN5oHGXRKFc+1Bz7ZlOhC/OYiwqhSR9uZPEEg/YSMFsnAgMBAAGj +WTBXMA4GA1UdDwEB/wQEAwIApDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMB +Af8EBTADAQH/MB8GA1UdEQQYMBaCFHJlc2VlZC5pMnAudnphd3MuY29tMAsGCSqG +SIb3DQEBCwOCAgEASxpWtby7DBoSlHfJFwoQhp4n8WQTK9xt8HZ7vrmrq5XDkXef +QftjxEEhchGb/QPSt8RippKZqnFAGsoVeWb+tjQH1ijFHanifiuYz77C/08bCcfR +T+fNPhgCixnnGY9ZN+fKE0bQSrZAtGGl/q4rpRcZMQJ5TfhxJA6dC5ZiGAsFZwRQ +ziNUKRGxrLf7Wj2/J4vuHEezPA0XyNJMbG7MLRDWBS4Q9yHtmeVdduxn81WdgnlZ +ToYEEgh68i2sehDUQ+1ro/oLCISDP+hZF3OIUDmz13x7peFFpMb4lKbyoc1siOlV +7/e+XboYKDsTb6fb/mTVL4GjnRvdmXx4cOAkGM2LHbGSIZKGkIEvQWrXwRol3WUn +AcEMWY8KGaee23Syg4fG/4ejVuRZYz8fbk8es6Z6W1vw6gnra434dnYmCrEO6hQl +/77LntLODSgAkus6polZ5O1c7Aj0USMNDW/EFP98APVokT1RGK1wStZVxSUDqBDF +RRPSpEsOGJ6qA7GJuAWi9I3Msy2lBlKMK6Xgk3l/e7ZPU0he95JfxySldl0JzR2N +EGvUCRPDXAMVnp3eP/41MrODdyGo2wBf/0IutfkpJf+Xmbu4ZbgkdPDEwG1+4VZH +MMsGAo3fOR4sI0Wu9W92rXEbzkxwekfnG6D7QQI64AAr0p4w2yO1ALbqW2A= +-----END CERTIFICATE----- diff --git a/installer/resources/certificates/ssl/user.mx24.eu.crt b/installer/resources/certificates/ssl/user.mx24.eu.crt new file mode 100644 index 000000000..38c68ab5b --- /dev/null +++ b/installer/resources/certificates/ssl/user.mx24.eu.crt @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICwDCCAkagAwIBAgIJAKXCoCBjd/C0MAoGCCqGSM49BAMEMIGdMQswCQYDVQQG +EwJERTEVMBMGA1UECAwMdXNlci5teDI0LmV1MRUwEwYDVQQHDAx1c2VyLm14MjQu +ZXUxFTATBgNVBAoMDHVzZXIubXgyNC5ldTEVMBMGA1UECwwMdXNlci5teDI0LmV1 +MRUwEwYDVQQDDAx1c2VyLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDHVzZXIubXgy +NC5ldTAeFw0xNTA5MDMxNjMyNDVaFw0yMTAyMjMxNjMyNDVaMIGdMQswCQYDVQQG +EwJERTEVMBMGA1UECAwMdXNlci5teDI0LmV1MRUwEwYDVQQHDAx1c2VyLm14MjQu +ZXUxFTATBgNVBAoMDHVzZXIubXgyNC5ldTEVMBMGA1UECwwMdXNlci5teDI0LmV1 +MRUwEwYDVQQDDAx1c2VyLm14MjQuZXUxGzAZBgkqhkiG9w0BCQEWDHVzZXIubXgy +NC5ldTB2MBAGByqGSM49AgEGBSuBBAAiA2IABPlKs5fYTqVhIOMiR6U9U4TimxS3 +P5NBDVzeeIAgbw5KBC8UImScZVt9g4V1wQe5kPs7TxA2BfanAPZ+ekQiRRvMVQxD +bSlRYupEWhq5BrJI6Lq/HDc7VJe9UUWffWKUoKNQME4wHQYDVR0OBBYEFBGJ0Yr+ +PZXnrk5RafQEALUpAU6ZMB8GA1UdIwQYMBaAFBGJ0Yr+PZXnrk5RafQEALUpAU6Z +MAwGA1UdEwQFMAMBAf8wCgYIKoZIzj0EAwQDaAAwZQIxAPcovePHMCosrAQNzS5i +VDUiyPNLOxHyRBm79yKXGl13LxysB6OK+2M7t8j8E/udBwIwXVVjxN6aSgXYTJ7d +p+Hg/2CuBMwf41/ENRcYQA+oGS9bU6A+7U9KJ1xTWWoqsUEs +-----END CERTIFICATE----- diff --git a/installer/resources/checklist.md b/installer/resources/checklist.md new file mode 100644 index 000000000..3a36f232a --- /dev/null +++ b/installer/resources/checklist.md @@ -0,0 +1,207 @@ +# Release checklist + +## One week before + +- Make announcement on Transifex with checkin deadline + + +## A day or two before + +1. Write the release announcement and push to Transifex: + + - Checkout i2p.newsxml branch + - See README for setup + - `./create_new_entry.sh` + - Entry href should be the in-net link to the release blog post + - `tx push -s` + - `mtn ci` + +2. Write the draft blog post and push to Transifex: + + - Checkout i2p.www branch + - Write draft release announcement - see i2p2www/blog/README for instructions + - Top content should be the same as the news entry + - `tx push -s` + - `mtn ci` + +3. Make announcement on Transifex asking for news translation + + +## On release day + +### Preparation + +1. Ensure all translation updates are imported from Transifex + +2. Sync with mtn.i2p2.i2p + +3. Start with a clean checkout: + + ``` + mtn -d i2p.mtn co --branch=i2p.i2p /path/to/releasedir + ``` + + - You may build with Java 7 or higher, but ensure you have the Java 6 JRE installed for the bootclasspath + +4. Create override.properties with (adjust as necessary): + + ``` + release.privkey.su3=/path/to/su3keystore.ks + release.gpg.keyid=0xnnnnnnnn + release.signer.su3=xxx@mail.i2p + build.built-by=xxx + javac.compilerargs=-bootclasspath /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/rt.jar:/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/jce.jar + ``` + +5. Copy latest trust list _MTN/monotonerc from website or some other workspace + +6. Change revision in: + - `history.txt` + - `installer/install.xml` + - `core/java/src/net/i2p/CoreVersion.java` + - `router/java/src/net/i2p/router/RouterVersion.java` + - (change to BUILD = 0 and EXTRA = "") + +7. `mtn ci` + +8. Review the complete diff from the last release: + + ``` + mtn diff -r t:i2p-0.9.(xx-1) > out.diff + vi out.diff + ``` + +9. Verify that no untrusted revisions were inadvertently blessed by a trusted party: + + ``` + mtn log --brief --no-graph --to t:i2p-0.9.(xx-1) | cut -d ' ' -f 2 | sort | uniq -c + ``` + +### Build and test + +1. `ant release` + + > NOTE: These tasks are now automated by `ant release` + > + > Build and tag: + > + > ant pkg + > + > Create signed update files with: + > + > export I2P=~/i2p + > java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate.zip i2pupdate.sud /path/to/private.key 0.x.xx + > java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate200.zip i2pupdate.su2 /path/to/private.key 0.x.xx + > + > Verify signed update files with: + > + > java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate showversion i2pupdate.sud + > java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate verifysig i2pupdate.sud + > + > Make the source tarball: + > + > Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p i2p-0.x.xx + > Double-check trust list + > tar cjf i2psource-0.x.xx.tar.bz2 --exclude i2p-0.x.xx/_MTN i2p-0.x.xx + > mv i2p-0.x.xx.tar.bz2 i2p.i2p + > + > Rename some files: + > + > mv i2pinstall.exe i2pinstall-0.x.xx.exe + > mv i2pupdate.zip i2pupdate-0.x.xx.zip + > + > Generate hashes: + > + > sha256sum i2p*0.x.xx.* + > sha256sum i2pupdate.sud + > sha256sum i2pupdate.su2 + > + > Generate PGP signatures: + > + > gpg -b i2pinstall-0.x xx.exe + > gpg -b i2psource-0.x.xx.tar.bz2 + > gpg -b i2pupdate-0.x.xx.zip + > gpg -b i2pupdate.sud + > gpg -b i2pupdate.su2 + > + > (end of tasks automated by 'ant release') + +2. Now test: + - Save the output about checksums, sizes, and torrents to a file + (traditionally `shasums.txt`) + - (edit timestamps to UTC if you care) + - Copy all the release files somewhere, make sure you have the same ones as last release + - Verify sha256sums for release files + - Check file sizes vs. previous release, shouldn't be smaller + - If the update includes GeoIP, it will be about 1MB bigger + - Unzip or list files from `i2pupdate.zip`, see if it looks right + - For either windows or linux installer: (probably should do both the first time) + - Rename any existing config dir (e.g. mv .i2p .i2p-save) + - Run installer, install to temp dir + - Look in temp dir, see if all the files are there + - Unplug ethernet / turn off wifi so RI doesn't leak + - `i2prouter start` + - Verify release number in console + - Verify welcome news + - Click through all the app, status, eepsite, and config pages, see if they look right + - Click through each of the translations, see if /console looks right + - Look for errors in /log (other than can't reseed errors) + - Look in config dir, see if all the files are there + - Shutdown + - Delete config dir + - Move saved config dir back + - Reconnect ethernet / turn wifi back on + - Load torrents in i2psnark on your production router, verify infohashes + +3. If all goes well, tag and sync the release: + + ``` + mtn tag h: i2p-0.x.xx + mtn cert t:i2p-0.x.xx branch i2p.i2p.release + mtn sync (with e.g. mtn.killyourtv.i2p) + ``` + +### Distribute updates + +1. Update news with new version: + - Add magnet links, change release dates and release number in to old-format + news.xml, and distribute to news hosts + - In the i2p.newsxml branch, edit magnet links, release dates and release + number in data/releases.json, and check in + +2. Add update torrents to tracker2.postman.i2p and start seeding (su2 and su3) + +3. Notify the following people: + - All in-network update hosts + - PPA maintainer + - news.xml maintainer + - backup news.xml maintainer + - website files maintainer + +4. Update Trac: + - Add milestone and version dates + - Increment milestone and version defaults + +5. Wait for a few update hosts to be ready + +6. Tell news hosts to flip the switch + +### Notify release + +1. Wait for files to be updated on download server + +2. Website files to change: + - Sync with mtn.i2p-projekt.i2p + - `i2p2www/static/hosts.txt` if it changed (copy from i2p.i2p mtn branch) + - `i2p2www/__init__.py` (release number) + - `i2p2www/pages/downloads/list.html` (release signer) + - `i2p2www/pages/downloads/macros` (checksums) + - `i2p2www/static/news/news.xml` + - Sync with mtn.i2p-projekt.i2p + +3. Wait for debian packages to be ready + +4. Announce on: + - #i2p, #i2p-dev (also on Freenode side) + - forum.i2p + - Twitter diff --git a/installer/resources/checklist.txt b/installer/resources/checklist.txt deleted file mode 100644 index 80f4c8336..000000000 --- a/installer/resources/checklist.txt +++ /dev/null @@ -1,98 +0,0 @@ -Release checklist ------------------ - -Ensure all translation updates are imported from Transifex -Sync with mtn.i2p2.i2p -Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p -Copy over override.properties to set build.built-by -Double-check trust list - -Change revision in: - history.txt - installer/install.xml - core/java/src/net/i2p/CoreVersion.java - router/java/src/net/i2p/router/RouterVersion.java - (change to BUILD = 0 and EXTRA = "") - -Review the complete diff from the last release: - mtn diff -r t:i2p-0.9.(xx-1) > out.diff - vi out.diff - -Verify that no untrusted revisions were inadvertently -blessed by a trusted party: - mtn log --brief --no-graph --to t:i2p-0.9.(xx-1) | cut -d ' ' -f 2 | sort | uniq -c - -========================================= -NOTE: These tasks are now automated by 'ant release' - -Build and tag: - ant pkg - mtn ci - mtn tag h: i2p-0.x.xx - mtn cert t:i2p-0.x.xx branch i2p.i2p.release - Sync with mtn.i2p2.i2p - -Create signed update files with: - export I2P=~/i2p - java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate.zip i2pupdate.sud /path/to/private.key 0.x.xx - java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate sign i2pupdate200.zip i2pupdate.su2 /path/to/private.key 0.x.xx - -Verify signed update files with: - java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate showversion i2pupdate.sud - java -cp $I2P/lib/i2p.jar net.i2p.crypto.TrustedUpdate verifysig i2pupdate.sud - -Make the source tarball: - Start with a clean checkout mtn -d i2p.mtn co --branch=i2p.i2p i2p-0.x.xx - Double-check trust list - tar cjf i2psource-0.x.xx.tar.bz2 --exclude i2p-0.x.xx/_MTN i2p-0.x.xx - mv i2p-0.x.xx.tar.bz2 i2p.i2p - -Rename some files: - mv i2pinstall.exe i2pinstall-0.x.xx.exe - mv i2pupdate.zip i2pupdate-0.x.xx.zip - -Generate hashes: - sha256sum i2p*0.x.xx.* - sha256sum i2pupdate.sud - sha256sum i2pupdate.su2 - -Generate PGP signatures: - gpg -b i2pinstall-0.x xx.exe - gpg -b i2psource-0.x.xx.tar.bz2 - gpg -b i2pupdate-0.x.xx.zip - gpg -b i2pupdate.sud - gpg -b i2pupdate.su2 - -(end of tasks automated by 'ant release') -========================================= - -Add magnet links to news.xml - -Seed update torrents - -Notify the following people: - All in-network update hosts - PPA maintainer - news.xml maintainer - backup news.xml maintainer - -Website files to change: - Sync with mtn.i2p-projekt.i2p - hosts.txt if it changed (copy from i2p.i2p mtn branch) - i2p2www/__init__.py (release number) - i2p2www/pages/downloads/list.html (checksums) - i2p2www/static/news/news.xml - New release announcement - see i2p2www/blog/README for instructions - Sync with mtn.i2p-projekt.i2p - -Announce on: - #i2p, #i2p-dev (also on freenode side) - forum.i2p - twitter - freshmeat.net - launchpad.net - alt.privacy.anon-server - -Update Trac: - Add milestone and version dates - Increment milestone and version defaults diff --git a/installer/resources/countries.txt b/installer/resources/countries.txt index 5707af567..9702197ef 100644 --- a/installer/resources/countries.txt +++ b/installer/resources/countries.txt @@ -16,6 +16,7 @@ AL,Albania AM,Armenia AN,Netherlands Antilles AO,Angola +AP,Asia/Pacific Region AQ,Antarctica AR,Argentina AS,American Samoa @@ -33,9 +34,11 @@ BG,Bulgaria BH,Bahrain BI,Burundi BJ,Benin +BL,Saint Barthélemy BM,Bermuda BN,Brunei Darussalam BO,Bolivia +BQ,Bonaire BR,Brazil BS,Bahamas BT,Bhutan @@ -45,7 +48,7 @@ BY,Belarus BZ,Belize CA,Canada CC,Cocos (Keeling) Islands -CD,The Democratic Republic of the Congo +CD,Congo CF,Central African Republic CG,Congo CH,Switzerland @@ -80,7 +83,7 @@ EU,European Union FI,Finland FJ,Fiji FK,Falkland Islands (Malvinas) -FM,Federated States of Micronesia +FM,Micronesia FO,Faroe Islands FR,France GA,Gabon @@ -114,7 +117,7 @@ IM,Isle of Man IN,India IO,British Indian Ocean Territory IQ,Iraq -IR,Islamic Republic of Iran +IR,Iran IS,Iceland IT,Italy JE,Jersey @@ -127,7 +130,7 @@ KH,Cambodia KI,Kiribati KM,Comoros KN,Saint Kitts and Nevis -KP,The Democratic People's Republic of Korea +KP,North Korea KR,Republic of Korea KW,Kuwait KY,Cayman Islands @@ -142,19 +145,19 @@ LS,Lesotho LT,Lithuania LU,Luxembourg LV,Latvia -LY,Libyan Arab Jamahiriya +LY,Libya MA,Morocco MC,Monaco -MD,Republic of Moldova +MD,Moldova ME,Montenegro MF,Saint Martin MG,Madagascar MH,Marshall Islands -MK,The Former Yugoslav Republic of Macedonia +MK,Macedonia ML,Mali MM,Myanmar MN,Mongolia -MO,Macao +MO,Macau MP,Northern Mariana Islands MQ,Martinique MR,Mauritania @@ -214,9 +217,11 @@ SM,San Marino SN,Senegal SO,Somalia SR,Suriname +SS,South Sudan ST,Sao Tome and Principe SV,El Salvador -SY,Syrian Arab Republic +SX,Sint Maarten +SY,Syria SZ,Swaziland TC,Turks and Caicos Islands TD,Chad @@ -233,19 +238,19 @@ TR,Turkey TT,Trinidad and Tobago TV,Tuvalu TW,Taiwan -TZ,United Republic of Tanzania +TZ,Tanzania UA,Ukraine UG,Uganda UM,United States Minor Outlying Islands US,United States UY,Uruguay UZ,Uzbekistan -VA,Holy See (Vatican City State) +VA,Vatican VC,Saint Vincent and the Grenadines VE,Venezuela VG,Virgin Islands VI,Virgin Islands -VN,Viet Nam +VN,Vietnam VU,Vanuatu WF,Wallis and Futuna WS,Samoa diff --git a/installer/resources/deletelist.txt b/installer/resources/deletelist.txt index 7f22f3548..43212a8e3 100644 --- a/installer/resources/deletelist.txt +++ b/installer/resources/deletelist.txt @@ -95,3 +95,4 @@ certificates/ssl/i2p-netdb.innovatio.no.crt certificates/ssl/jp.reseed.i2p2.no.crt certificates/ssl/ieb9oopo.mooo.com2.crt certificates/ssl/netdb.i2p2.no2.crt +certificates/ssl/i2p.mooo.com2.crt diff --git a/installer/resources/eepsite/jetty-ssl.xml b/installer/resources/eepsite/jetty-ssl.xml index 7562828cc..b14ca0976 100644 --- a/installer/resources/eepsite/jetty-ssl.xml +++ b/installer/resources/eepsite/jetty-ssl.xml @@ -248,6 +248,8 @@ TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + TLS_DHE_DSS_WITH_AES_128_CBC_SHA + diff --git a/installer/resources/geoip.txt b/installer/resources/geoip.txt index a75c49871..f01d533ee 100644 --- a/installer/resources/geoip.txt +++ b/installer/resources/geoip.txt @@ -1,5 +1,5 @@ # Last updated based on Maxmind GeoLite Country -# dated 2015-04-07 +# dated 2015-11-03 # Script borrowed from Tor # # wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip @@ -76,7 +76,7 @@ 29949952,30015487,KR 30015488,30408703,CN 30408704,33554431,KR -33554432,33554432,RU +33554432,33554432,SG 33554433,34603007,FR 34603008,34604543,EU 34604544,34605055,DE @@ -169,7 +169,11 @@ 36700160,36962303,AE 36962304,37224447,IL 37486592,37748735,RU -37748736,38273023,SE +37748736,38064639,SE +38064640,38064895,DK +38064896,38134783,SE +38134784,38135039,DK +38135040,38273023,SE 38273024,38797311,KZ 38797312,39059455,PT 39059456,39321599,GR @@ -194,46 +198,16 @@ 48234496,49283071,IT 49283072,49807359,DE 49807360,50331647,SE -50331648,57083940,US -57083941,57083941,BE -57083942,68305407,US +50331648,68305407,US 68305408,68305919,MX -68305920,68973055,US -68973056,68973311,CA -68973312,71020543,US -71020544,71020799,CA -71020800,71571339,US -71571340,71571340,DE -71571341,71571389,US -71571390,71571390,DE -71571391,71571713,US -71571714,71571715,DE -71571716,71595007,US -71595008,71595519,GB -71595520,71665077,US -71665078,71665078,DE -71665079,71666464,US -71666465,71666465,DE -71666466,71666529,US -71666530,71666530,GB -71666531,71666711,US -71666712,71666719,DE -71666720,71667092,US -71667093,71667093,DE -71667094,71667113,US -71667114,71667114,NL -71667115,71667529,US -71667530,71667530,GB -71667531,71667625,US -71667626,71667626,DE -71667627,71667633,US -71667634,71667634,DE -71667635,71667656,US -71667657,71667657,NL -71667658,71670208,US +68305920,68980223,US +68980224,68980479,CA +68980480,70620927,US +70620928,70621183,CA +70621184,71670208,US 71670209,71670209,NL -71670210,83886079,US -83886080,83951615,SY +71670210,83886080,US +83886081,83951615,SY 83951616,83959807,UA 83959808,83961855,ES 83961856,83963903,CY @@ -261,7 +235,8 @@ 84148224,84410367,DE 84410368,84418559,RU 84418560,84419583,BZ -84419584,84421631,RU +84419584,84420607,RU +84420608,84421631,NL 84421632,84421759,MX 84421760,84421887,PA 84421888,84422015,BR @@ -277,7 +252,9 @@ 84457472,84459519,ES 84459520,84471807,RU 84471808,84473855,IQ -84475904,84545535,DE +84475904,84498681,DE +84498682,84498682,NL +84498683,84545535,DE 84545536,84549631,GB 84549632,84551679,GE 84551680,84557823,DE @@ -377,7 +354,9 @@ 86177280,86177791,US 86177792,86179839,LI 86179840,86220799,RU -86220800,86222847,JE +86220800,86222607,JE +86222608,86222615,GB +86222616,86222847,JE 86222848,86226943,NL 86226944,86228991,SE 86228992,86231039,BE @@ -459,7 +438,8 @@ 86446680,86446683,ES 86446684,86446719,FR 86446720,86446727,NL -86446728,86446931,FR +86446728,86446731,DE +86446732,86446931,FR 86446932,86446935,CZ 86446936,86446983,FR 86446984,86446991,IT @@ -480,7 +460,9 @@ 86448808,86448851,FR 86448852,86448855,IT 86448856,86448859,PT -86448860,86449311,FR +86448860,86448951,FR +86448952,86448955,DE +86448956,86449311,FR 86449312,86449343,ES 86449344,86449363,FR 86449364,86449367,DE @@ -488,9 +470,7 @@ 86449500,86449503,ES 86449504,86449883,FR 86449884,86449884,DE -86449885,86450235,FR -86450236,86450239,GB -86450240,86451167,FR +86449885,86451167,FR 86451168,86451175,NL 86451176,86452067,FR 86452068,86452071,ES @@ -506,7 +486,9 @@ 86453312,86453315,ES 86453316,86453836,FR 86453837,86453838,PT -86453839,86454187,FR +86453839,86453947,FR +86453948,86453951,IE +86453952,86454187,FR 86454188,86454191,IT 86454192,86454279,FR 86454280,86454287,ES @@ -529,7 +511,11 @@ 86456352,86456367,CH 86456368,86456371,FR 86456372,86456375,ES -86456376,86457059,FR +86456376,86456655,FR +86456656,86456671,IE +86456672,86456943,FR +86456944,86456947,GR +86456948,86457059,FR 86457060,86457060,DE 86457061,86457087,FR 86457088,86457091,DE @@ -543,7 +529,9 @@ 86457456,86457456,DE 86457457,86457799,FR 86457800,86457803,ES -86457804,86466839,FR +86457804,86458303,FR +86458304,86458335,DE +86458336,86466839,FR 86466840,86466847,NL 86466848,86466943,FR 86466944,86466959,DE @@ -553,7 +541,9 @@ 86468000,86468003,PL 86468004,86468055,FR 86468056,86468056,DE -86468057,86468447,FR +86468057,86468199,FR +86468200,86468200,ES +86468201,86468447,FR 86468448,86468479,CZ 86468480,86468587,FR 86468588,86468591,ES @@ -563,13 +553,25 @@ 86469692,86469695,DE 86469696,86469779,FR 86469780,86469783,IT -86469784,86470007,FR -86470008,86470008,ES -86470009,86470731,FR +86469784,86469974,FR +86469975,86469982,ES +86469983,86469983,FR +86469984,86469986,ES +86469987,86469988,FR +86469989,86469991,ES +86469992,86469993,FR +86469994,86469995,ES +86469996,86470002,FR +86470003,86470008,ES +86470009,86470015,FR +86470016,86470047,ES +86470048,86470731,FR 86470732,86470735,BE 86470736,86471083,FR 86471084,86471087,DE -86471088,86471179,FR +86471088,86471123,FR +86471124,86471127,GB +86471128,86471179,FR 86471180,86471180,DE 86471181,86473087,FR 86473088,86473151,PT @@ -601,9 +603,7 @@ 86507520,86573055,ES 86573056,86638591,SA 86638592,86671359,RU -86671360,86672895,JE -86672896,86673151,GB -86673152,86673407,JE +86671360,86673407,JE 86673408,86675455,DE 86675456,86677503,IT 86677504,86687743,FR @@ -620,7 +620,9 @@ 86767616,86769663,IT 86769664,86773759,RU 86773760,86777855,GB -86777856,86779903,AZ +86777856,86778879,AZ +86778880,86779135,RU +86779136,86779903,AZ 86779904,86786047,RU 86786048,86788095,NO 86788096,86790143,NL @@ -648,7 +650,9 @@ 86837248,86839295,ES 86839296,86843391,GB 86847488,86849535,GB -86849536,86851583,CZ +86849536,86850559,CZ +86850560,86851327,NL +86851328,86851583,CZ 86851584,86855679,NL 86855680,86859775,RU 86859776,86863871,DE @@ -684,8 +688,7 @@ 87568384,87570431,GB 87570432,87572479,ES 87572480,87588863,MD -87588864,87589887,IR -87589888,87590143,GB +87588864,87590143,IR 87590144,87590399,US 87590400,87590911,GB 87590912,87592959,RU @@ -706,15 +709,21 @@ 87638016,87640063,UA 87640064,87642111,RS 87642112,87646207,GB -87646208,87647999,FR -87648000,87648255,RE -87648256,87651839,FR -87651840,87652095,RE -87652096,87652351,FR -87652352,87652863,RE -87652864,87653375,FR -87653376,87653887,RE -87653888,87654399,FR +87646208,87646463,FR +87646464,87646975,RE +87646976,87647487,FR +87647488,87647743,RE +87647744,87647999,FR +87648000,87648511,RE +87648512,87648767,FR +87648768,87649535,RE +87649536,87650559,FR +87650560,87650815,RE +87650816,87651327,FR +87651328,87651583,RE +87651584,87652607,FR +87652608,87652863,RE +87652864,87654399,FR 87654400,87670783,PL 87670784,87672831,DE 87672832,87674879,CH @@ -750,14 +759,24 @@ 87945216,87947263,HU 87947264,87949311,NL 87949312,87950847,GB -87950848,87952383,A1 -87952384,87954687,GB -87954688,87955455,A1 +87950848,87950992,A1 +87950993,87950993,GB +87950994,87951016,A1 +87951017,87951017,GB +87951018,87951059,A1 +87951060,87951060,GB +87951061,87952383,A1 +87952384,87954431,GB +87954432,87954823,A1 +87954824,87954824,GB +87954825,87955455,A1 87955456,87957503,GB 87957504,87965695,A1 87965696,87967743,DE 87967744,87969791,IT -87969792,87973887,IM +87969792,87972863,IM +87972864,87973375,GI +87973376,87973887,IM 87973888,87982079,DE 87982080,88014847,RU 88014848,88016895,LY @@ -820,7 +839,10 @@ 90499072,90501119,IT 90503168,90505215,IL 90505216,90529791,RU -90529792,90533887,NL +90529792,90533119,NL +90533120,90533375,DE +90533376,90533631,NL +90533632,90533887,GB 90533888,90537983,EE 90537984,90540031,RU 90540032,90544127,GB @@ -828,14 +850,27 @@ 90546176,90548223,DE 90548224,90550271,GB 90550272,90554367,EE -90554368,90570751,RU +90554368,90560767,RU +90560768,90560895,UZ +90560896,90561023,BG +90561024,90561151,RU +90561152,90561279,NI +90561280,90561407,TH +90561408,90561535,GR +90561536,90561663,GE +90561664,90561791,LV +90561792,90561919,CY +90561920,90562047,CU +90562048,90562175,AM +90562176,90562303,QA +90562304,90570751,RU 90570752,90578943,IT 90578944,90583039,IR 90583040,90587135,CZ 90587136,90589183,PL -90589184,90589439,FR -90589440,90589695,RE -90589696,90591231,FR +90589184,90590207,FR +90590208,90590463,GP +90590464,90591231,FR 90591232,90595327,GB 90595328,90603519,PS 90603520,90605567,ES @@ -887,7 +922,8 @@ 90963968,91226111,SA 91226112,92274687,IR 92274688,92536831,RU -92536832,92585983,NL +92536832,92569599,NL +92569600,92585983,AT 92585984,92602367,SA 92602368,92604415,BA 92604416,92606463,PL @@ -1029,7 +1065,11 @@ 92739200,92739215,DE 92739216,92740447,FR 92740448,92740455,IT -92740456,92741203,FR +92740456,92740611,FR +92740612,92740615,CZ +92740616,92740915,FR +92740916,92740923,DE +92740924,92741203,FR 92741204,92741207,IT 92741208,92741387,FR 92741388,92741395,IT @@ -1074,7 +1114,9 @@ 92746416,92746431,ES 92746432,92747711,FR 92747712,92747775,GB -92747776,92748773,FR +92747776,92748751,FR +92748752,92748752,PT +92748753,92748773,FR 92748774,92748774,PT 92748775,92749067,FR 92749068,92749071,GB @@ -1090,7 +1132,11 @@ 92754580,92754583,ES 92754584,92757311,FR 92757312,92757375,ES -92757376,92761215,FR +92757376,92760159,FR +92760160,92760191,DE +92760192,92760323,FR +92760324,92760327,DE +92760328,92761215,FR 92761216,92761343,DE 92761344,92762127,FR 92762128,92762135,ES @@ -1118,7 +1164,9 @@ 92786828,92786831,IT 92786832,92789499,FR 92789500,92789503,IT -92789504,92790271,FR +92789504,92789703,FR +92789704,92789707,DE +92789708,92790271,FR 92790272,92790275,DE 92790276,92790671,FR 92790672,92790679,ES @@ -1136,7 +1184,9 @@ 92796688,92796691,DE 92796692,92797355,FR 92797356,92797359,DE -92797360,92798975,FR +92797360,92798231,FR +92798232,92798239,NL +92798240,92798975,FR 92798976,93323263,RU 93323264,93335551,CH 93335552,93339647,IL @@ -1159,7 +1209,9 @@ 93425664,93426687,GI 93426688,93427085,DE 93427086,93427086,A2 -93427087,93427711,DE +93427087,93427199,DE +93427200,93427455,US +93427456,93427711,DE 93427712,93429759,NO 93429760,93431807,RU 93431808,93433855,ES @@ -1195,8 +1247,8 @@ 93749248,93753343,IT 93753344,93765631,GB 93765632,93774847,SE -93774848,93776127,NO -93776128,93782015,SE +93774848,93775871,NO +93775872,93782015,SE 93782016,93836287,GB 93836288,93836799,NL 93836800,93842351,GB @@ -1211,9 +1263,7 @@ 93893120,93893375,NL 93893376,93893631,US 93893632,93893887,AU -93893888,93894399,US -93894400,93894655,GB -93894656,93896703,US +93893888,93896703,US 93896704,93904895,GB 93904896,93906943,LV 93906944,93908991,BA @@ -1229,17 +1279,20 @@ 93974528,93976575,CH 93976576,93978623,GB 93978624,94011391,ES -94011392,94027775,RO +94011392,94019583,GB +94019584,94021631,DE +94021632,94027263,RO +94027264,94027775,MD 94027776,94035967,IT 94035968,94044159,RO 94044160,94109695,SY 94109696,94175231,SA -94175232,94178303,SE -94178304,94178559,NO -94178560,94179071,SE -94179072,94179839,NL +94175232,94179071,SE +94179072,94179327,NL +94179328,94179583,SE +94179584,94179839,NL 94179840,94180351,DK -94180352,94180607,SE +94180352,94180607,TR 94180608,94180863,DK 94180864,94181887,FI 94181888,94182911,BE @@ -1334,7 +1387,9 @@ 95393536,95393663,DE 95393664,95393791,QA 95393792,95394047,GB -95394048,95395327,AU +95394048,95394175,AU +95394176,95394303,DE +95394304,95395327,AU 95395328,95395455,GB 95395456,95395583,DE 95395584,95395839,GB @@ -1394,7 +1449,11 @@ 95410560,95410943,GB 95410944,95411199,DE 95411200,95411215,NL -95411216,95420415,DE +95411216,95416831,DE +95416832,95417087,GB +95417088,95420173,DE +95420174,95420174,US +95420175,95420415,DE 95420416,95551487,TR 95551488,95555583,AZ 95555584,95557631,GB @@ -1432,13 +1491,7 @@ 96153600,96155647,PL 96155648,96157695,CH 96157696,96165887,RU -96165888,96168703,GP -96168704,96168959,MQ -96168960,96171775,GP -96171776,96172031,GF -96172032,96173055,GP -96173056,96173311,MQ -96173312,96174079,GP +96165888,96174079,GP 96174080,96206847,HU 96206848,96305151,RU 96305152,96321535,DE @@ -1463,11 +1516,15 @@ 96337920,96403455,IR 96403456,96468991,AZ 96468992,96731135,AE -96731136,96739479,FR +96731136,96736399,FR +96736400,96736400,ES +96736401,96739479,FR 96739480,96739483,DE 96739484,96739583,FR 96739584,96739587,PT -96739588,96740111,FR +96739588,96739887,FR +96739888,96739903,IT +96739904,96740111,FR 96740112,96740127,IT 96740128,96740223,FR 96740224,96740351,IT @@ -1502,17 +1559,24 @@ 96756744,96756751,NL 96756752,96757639,FR 96757640,96757643,CH -96757644,96757883,FR +96757644,96757647,SE +96757648,96757663,FR +96757664,96757667,SE +96757668,96757883,FR 96757884,96757887,ES 96757888,96758247,FR 96758248,96758251,DE -96758252,96759767,FR +96758252,96759735,FR +96759736,96759739,ES +96759740,96759767,FR 96759768,96759775,IT 96759776,96760403,FR 96760404,96760407,IT 96760408,96761855,FR 96761856,96761871,BE -96761872,96762863,FR +96761872,96762799,FR +96762800,96762815,BE +96762816,96762863,FR 96762864,96762879,NL 96762880,96762943,FR 96762944,96763007,ES @@ -1539,15 +1603,21 @@ 96768604,96768607,DE 96768608,96769279,FR 96769280,96769295,ES -96769296,96770651,FR +96769296,96770159,FR +96770160,96770175,ES +96770176,96770651,FR 96770652,96770655,PL 96770656,96772215,FR 96772216,96772223,PT 96772224,96772407,FR 96772408,96772408,GB -96772409,96773119,FR +96772409,96772943,FR +96772944,96772959,DE +96772960,96773119,FR 96773120,96773375,ES -96773376,96775599,FR +96773376,96774719,FR +96774720,96774751,ES +96774752,96775599,FR 96775600,96775615,DE 96775616,96776319,FR 96776320,96776323,ES @@ -1555,27 +1625,46 @@ 96776512,96776543,ES 96776544,96777023,FR 96777024,96777087,ES -96777088,96778171,FR +96777088,96778015,FR +96778016,96778031,ES +96778032,96778167,FR +96778168,96778171,LU 96778172,96778175,PT -96778176,96778247,FR +96778176,96778239,FR +96778240,96778243,NL +96778244,96778247,FR 96778248,96778255,IT -96778256,96778867,FR +96778256,96778259,NL +96778260,96778859,FR +96778860,96778863,NL +96778864,96778867,CZ 96778868,96778871,BE 96778872,96778991,FR 96778992,96779007,DE -96779008,96779167,FR +96779008,96779011,PT +96779012,96779167,FR 96779168,96779199,PT 96779200,96779247,FR 96779248,96779255,CZ -96779256,96779839,FR +96779256,96779519,FR +96779520,96779523,NL +96779524,96779839,FR 96779840,96779903,NL -96779904,96783299,FR +96779904,96780355,FR +96780356,96780359,BE +96780360,96782199,FR +96782200,96782207,CZ +96782208,96782911,FR +96782912,96782915,LT +96782916,96783299,FR 96783300,96783303,ES 96783304,96783311,BE 96783312,96783327,DE 96783328,96783519,FR 96783520,96783551,ES -96783552,96783887,FR +96783552,96783771,FR +96783772,96783775,DE +96783776,96783887,FR 96783888,96783903,DE 96783904,96785135,FR 96785136,96785151,NL @@ -1585,13 +1674,21 @@ 96785416,96785423,NL 96785424,96786431,FR 96786432,96786495,GB -96786496,96792751,FR +96786496,96788143,FR +96788144,96788159,ES +96788160,96792751,FR 96792752,96792767,DE 96792768,96793583,FR 96793584,96793599,DE -96793600,96794471,FR +96793600,96793687,FR +96793688,96793688,ES +96793689,96793715,FR +96793716,96793716,ES +96793717,96794471,FR 96794472,96794479,ES -96794480,96796671,FR +96794480,96794707,FR +96794708,96794711,IT +96794712,96796671,FR 96796672,96862207,AZ 96862208,96894975,GB 96894976,96897023,CZ @@ -1628,7 +1725,7 @@ 97447936,97452031,PL 97452032,97517567,UA 97517568,98566143,IR -98566144,98697215,NL +98566144,98697215,ES 98697216,98701311,FR 98701312,98705407,ES 98705408,98707455,SE @@ -1640,7 +1737,7 @@ 98734080,98736127,CH 98736128,98738175,RU 98738176,98740223,NO -98740224,98740479,DE +98740224,98740479,ES 98740480,98740735,US 98740736,98741503,DE 98741504,98741759,US @@ -1650,12 +1747,29 @@ 98746368,98762751,TR 98762752,98893823,RU 98893824,98959359,TR -98959360,99024895,DE +98959360,98959615,DE +98959616,98959679,US +98959680,98960639,DE +98960640,98960799,US +98960800,98961407,DE +98961408,98961919,FR +98961920,98992383,DE +98992384,98992423,US +98992424,98992431,DE +98992432,98992639,US +98992640,98993151,DE +98993152,98993175,US +98993176,98997759,DE +98997760,98998271,FR +98998272,98998527,DE +98998528,98998783,GB +98998784,98999551,DE +98999552,99000319,GB +99000320,99024895,DE 99024896,99025167,GB 99025168,99025279,DE 99025280,99025407,US -99025408,99025663,NL -99025664,99025919,DE +99025408,99025919,DE 99025920,99025935,FI 99025936,99026047,DE 99026048,99026175,US @@ -1699,7 +1813,11 @@ 99044616,99044863,DE 99044864,99045119,GB 99045120,99045375,NL -99045376,99090431,DE +99045376,99049471,DE +99049472,99049983,GB +99049984,99053055,DE +99053056,99053567,GB +99053568,99090431,DE 99090432,99614719,IR 99614720,99876863,SE 99876864,100139007,SA @@ -1726,7 +1844,11 @@ 100329472,100331519,RU 100331520,100335615,TR 100335616,100401151,KZ -100532224,100559255,RO +100532224,100548863,RO +100548864,100548875,TR +100548876,100548876,RO +100548877,100549119,TR +100549120,100559255,RO 100559256,100559263,EG 100559264,100559551,RO 100559552,100559615,GB @@ -1736,24 +1858,21 @@ 100559936,100560127,RO 100560128,100560383,US 100560384,100560895,RO -100560896,100560959,GB -100560960,100561023,RO -100561024,100561151,GB +100560896,100561151,GB 100561152,100561599,RO 100561600,100561663,US 100561664,100564799,RO 100564800,100564863,US 100564864,100564991,RO -100564992,100569087,SE -100569088,100569343,FR -100569344,100573183,SE +100564992,100573183,SE 100573184,100575231,GB 100575232,100577279,DK 100577280,100579327,RU 100579328,100581375,AT 100581376,100589567,SE 100589568,100597759,RU -100597760,100614143,TR +100597760,100598783,TR +100598784,100614143,US 100614144,100630527,NL 100630528,100632575,BE 100632576,100634623,GB @@ -1763,11 +1882,19 @@ 100646912,100647679,RU 100647680,100647711,TR 100647712,100663295,RU -100663296,134738943,US +100663296,134221823,US +134221824,134221824,DE +134221825,134222335,US +134222336,134222336,DE +134222337,134223871,US +134223872,134223872,GB +134223873,134224383,US +134224384,134224384,GB +134224385,134247423,US +134247424,134247424,DE +134247425,134738943,US 134738944,134739199,CA -134739200,134874866,US -134874867,134874867,DO -134874868,135192575,US +134739200,135192575,US 135192576,135200767,MX 135200768,135430143,US 135430144,135430399,CA @@ -1785,12 +1912,12 @@ 135607040,135607295,CA 135607296,135776255,US 135776256,135776511,GU -135776512,135791103,US -135791104,135791615,CA +135776512,135791359,US +135791360,135791615,CA 135791616,135792383,US 135792384,135794687,CA -135794688,135926527,US -135926528,135926783,VI +135794688,135926271,US +135926272,135926783,VI 135926784,135945727,US 135945728,135945983,CA 135945984,136175615,US @@ -1803,9 +1930,7 @@ 136413184,136415665,CA 136415666,136415666,FR 136415667,136415743,CA -136415744,136699903,US -136699904,136701951,A1 -136701952,139954241,US +136415744,139954241,US 139954242,139954242,ES 139954243,152305663,US 152305664,152338431,GB @@ -1816,45 +1941,39 @@ 202385408,202385919,PR 202385920,202706431,US 202706432,202706943,PR -202706944,202935551,US -202935552,202935807,PR -202935808,203272959,US +202706944,203272959,US 203272960,203273215,GB 203273216,203658975,US 203658976,203658991,VI -203658992,204047359,US -204047360,204047615,VI -204047616,204047871,US +203658992,203659007,US +203659008,203659263,VI +203659264,204047871,US 204047872,204047999,PR 204048000,204048031,US 204048032,204048047,PR -204048048,209867103,US -209867104,209867111,CA -209867112,211263999,US -211264000,211264255,SA -211264256,211597719,US +204048048,205884415,US +205884416,205884671,MX +205884672,206010367,US +206010368,206010623,MX +206010624,211597719,US 211597720,211597727,VI 211597728,212787199,US 212787200,212788223,PR -212788224,212788479,US -212788480,212788735,VI -212788736,212791831,US +212788224,212791831,US 212791832,212791839,VI -212791840,212793087,US -212793088,212793343,PR -212793344,212794575,US -212794576,212794583,VI -212794584,213799167,US -213799168,213799423,CA -213799424,214617343,US -214617344,214617599,CA -214617600,214698239,US +212791840,212794623,US +212794624,212794879,PR +212794880,214698239,US 214698240,214698255,VI 214698256,214698303,US 214698304,214698311,VI 214698312,214779135,US -214779136,214779391,PR -214779392,219187465,US +214779136,214779263,PR +214779264,214783487,US +214783488,214783743,PR +214783744,214786047,US +214786048,214786431,PR +214786432,219187465,US 219187466,219187467,EU 219187468,219249919,US 219249920,219250175,GB @@ -1890,7 +2009,9 @@ 235929600,236978175,CN 236978176,241172479,KR 241172480,241434623,IN -241434624,241500159,SG +241434624,241469039,SG +241469040,241469047,MY +241469048,241500159,SG 241500160,241565695,JP 241565696,241598463,IN 241598464,241599487,CN @@ -1914,16 +2035,14 @@ 243400704,243531775,CN 243531776,243662847,JP 243662848,243793919,CN -243793920,243858687,HK -243858688,243858943,GB -243858944,243859455,HK +243793920,243859455,HK 243859456,243916799,AU 243916800,243924991,JP 243924992,243990527,KR 243990528,244318207,IN 244318208,245366783,CN 245366784,247463935,VN -247472128,247479295,JP +247472128,247476223,JP 247479296,247480319,CN 247480320,247482367,MY 247482368,247483391,PG @@ -1968,7 +2087,9 @@ 265023488,265027583,GB 265027584,265060351,US 265060352,265093119,FR -265093120,265525503,US +265093120,265523711,US +265523712,265523967,AU +265523968,265525503,US 265525504,265525759,AP 265525760,265529599,US 265529600,265529855,AP @@ -1978,15 +2099,9 @@ 266062080,266062335,IN 266062336,266070271,US 266070272,266070527,AU -266070528,266578175,US -266578176,266578431,CA -266578432,266586367,US -266586368,266586623,CA -266586624,266598655,US +266070528,266598655,US 266598656,266598911,BR -266598912,288130047,US -288130048,288131071,CA -288131072,288153599,US +266598912,288153599,US 288153600,288157695,CA 288157696,288167423,US 288167424,288167935,CA @@ -1999,31 +2114,39 @@ 288197120,288197631,US 288197632,288198143,CA 288198144,288198655,CL -288198656,288212991,US +288198656,288199679,US +288199680,288200703,CO +288200704,288205422,US +288205423,288205423,CO +288205424,288205424,BR +288205425,288205425,MX +288205426,288205426,CL +288205427,288212991,US 288212992,288215039,CA 288215040,288223231,US 288223232,288227327,CA -288227328,289406975,US -289406976,289603583,IE -289603584,289628415,GB -289628416,289628671,US -289628672,289652735,GB +288227328,289652735,US 289652736,289653759,NL 289653760,289654271,DE -289654272,289657855,GB +289654272,289655807,US +289655808,289656831,DE +289656832,289657855,BE 289657856,289658879,AE -289658880,289660927,GB +289658880,289659903,GB +289659904,289660927,US 289660928,289665023,ES -289665024,289669119,GB -289669120,289734655,FR -289734656,289746943,GB -289746944,289748991,US -289748992,289752063,ES -289752064,289760255,US -289760256,289763327,DE -289763328,289948927,US +289665024,289667071,US +289667072,289669119,GB +289669120,289783807,US +289783808,289783935,GB +289783936,289791999,US +289792000,289794047,AE +289794048,289796095,US +289796096,289798143,TR +289798144,289948927,US 289948928,289949055,AT -289949056,289949695,US +289949056,289949183,US +289949184,289949695,RU 289949696,289950207,NL 289950208,289950463,PL 289950464,289950719,PT @@ -2032,8 +2155,7 @@ 289951232,289951487,RU 289951488,289951743,US 289951744,289952255,DE -289952256,289952767,US -289952768,289953791,GB +289952256,289953791,GB 289953792,289954303,US 289954304,289954559,ES 289954560,289955839,US @@ -2060,52 +2182,36 @@ 289960960,289961471,BE 289961472,289963007,US 289963008,289964031,FR -289964032,290264063,US -290264064,290264575,AT -290264576,290267135,US -290267136,290269183,NL +289964032,290265087,US +290265088,290267135,RU +290267136,290269183,US 290269184,290270207,PL 290270208,290271231,PT -290271232,290272255,CH -290272256,290273279,US -290273280,290275327,RU -290275328,290277375,DE -290277376,290279423,US -290279424,290281471,GB -290281472,290287615,US -290287616,290291711,GB -290291712,290292223,FI -290292224,290292735,US -290292736,290293247,NO -290293248,290293759,US -290293760,290294271,DK -290294272,290294783,US -290294784,290295295,NL +290271232,290277375,US +290277376,290279423,GB +290279424,290280447,US +290280448,290280703,GB +290280704,290295295,US 290295296,290295807,IN -290295808,290296831,ES -290296832,290297855,US -290297856,290298879,SE -290298880,290299903,US +290295808,290299903,US 290299904,290300927,LU 290300928,290301951,TR 290301952,290302463,IN 290302464,290302975,US 290302976,290303999,IN -290304000,290305023,IT -290305024,290306047,US +290304000,290306047,US 290306048,290308095,DK -290308096,290310143,DE +290308096,290310143,US 290310144,290312191,IN -290312192,290314239,BE -290314240,290320383,US -290320384,290324479,FR -290324480,290357247,US +290312192,290357247,US 290357248,290365439,IL -290365440,290423807,US +290365440,290377727,US +290377728,290379775,GB +290379776,290423807,US 290423808,290424831,SE -290424832,290513663,US -290513664,290513919,MY -290513920,344260607,US +290424832,344195839,US +344195840,344196095,CA +344196096,344260607,US 344260608,344260863,GB 344260864,344261119,EU 344261120,344261778,US @@ -2114,87 +2220,179 @@ 344262656,344262911,GB 344262912,344268817,US 344268818,344268818,EU -344268819,344270847,US -344270848,344270911,GB -344270912,344588543,US -344588544,344589055,GB +344268819,344270860,US +344270861,344270861,GB +344270862,344588799,US +344588800,344589055,GB 344589056,344592895,US 344592896,344592945,GB 344592946,344592946,EU 344592947,344593151,GB -344593152,344593638,US -344593639,344593639,SE -344593640,344651263,US -344651264,344651519,GB -344651520,344653823,US -344653824,344659519,AU -344659520,344659520,SG -344659521,344662783,AU +344593152,344662783,US 344662784,344663039,MY -344663040,344670719,AU +344663040,344670719,US 344670720,344671231,IN -344671232,344674815,AU +344671232,344674815,US 344674816,344675071,IN -344675072,344675121,AU -344675122,344676145,IN -344676146,344719359,AU -344719360,344880127,US +344675072,344712447,US +344712448,344712703,AU +344712704,344880127,US 344880128,344880383,EU 344880384,344881151,US 344881152,344881407,IN 344881408,344977407,US 344977408,344977663,IN -344977664,386035711,US +344977664,372398271,US +372398272,372398303,AU +372398304,385884159,US +385884160,385888255,NL +385888256,385917183,US +385917184,385917439,NL +385917440,385920511,US +385920512,385920767,NL +385920768,385930239,US +385930240,385931263,NL +385931264,385934335,US +385934336,385934847,NL +385934848,385939967,US +385939968,385940479,NL +385940480,385942527,US +385942528,385943551,NL +385943552,385950719,US +385950720,385951743,NL +385951744,385957887,US +385957888,385961983,NL +385961984,386002431,US +386002432,386002943,NL +386002944,386006015,US +386006016,386007039,NL +386007040,386010623,US +386010624,386011135,NL +386011136,386012159,US +386012160,386012671,NL +386012672,386013183,US +386013184,386013695,NL +386013696,386015231,US +386015232,386015487,NL +386015488,386020351,US +386020352,386021375,NL +386021376,386025471,US +386025472,386026495,NL +386026496,386035711,US 386035712,386039807,NL 386039808,386060287,US 386060288,386068479,NL -386068480,386109439,US +386068480,386073343,US +386073344,386073599,NL +386073600,386074111,US +386074112,386074623,NL +386074624,386076415,US +386076416,386076671,NL +386076672,386088959,US +386088960,386089983,NL +386089984,386095615,US +386095616,386096127,NL +386096128,386100735,US +386100736,386101247,NL +386101248,386109439,US 386109440,386113535,NL 386113536,386125823,US 386125824,386134015,NL -386134016,386519039,US +386134016,386228223,US +386228224,386232319,NL +386232320,386244607,US +386244608,386244863,NL +386244864,386245119,US +386245120,386245631,NL +386245632,386297855,US +386297856,386310143,NL +386310144,386383871,US +386383872,386387967,NL +386387968,386408447,US +386408448,386412543,NL +386412544,386453503,US +386453504,386457599,NL +386457600,386465791,US +386465792,386469887,NL +386469888,386482175,US +386482176,386486271,NL +386486272,386519039,US 386519040,386523135,NL -386523136,386613247,US +386523136,386593279,US +386593280,386594815,NL +386594816,386595327,US +386595328,386596095,NL +386596096,386613247,US 386613248,386617343,NL -386617344,386662399,US +386617344,386656255,US +386656256,386656511,NL +386656512,386662399,US 386662400,386670591,NL -386670592,386736127,US +386670592,386682879,US +386682880,386691071,NL +386691072,386736127,US 386736128,386740223,NL -386740224,386842623,US +386740224,386774527,US +386774528,386775039,NL +386775040,386816511,US +386816512,386818047,NL +386818048,386826751,US +386826752,386827263,NL +386827264,386828287,US +386828288,386829311,NL +386829312,386842623,US 386842624,386846719,NL 386846720,386862079,US 386862080,386862335,JP 386862336,386862591,KR -386862592,386875391,US +386862592,386862847,US +386862848,386863103,NL +386863104,386875391,US 386875392,386879487,NL 386879488,386887679,US 386887680,386891775,NL -386891776,386924543,US +386891776,386892799,US +386892800,386893311,NL +386893312,386904063,US +386904064,386905087,NL +386905088,386924543,US 386924544,387055615,CA 387055616,387121151,PR -387121152,387802879,US -387802880,387803135,PR -387803136,387825663,US +387121152,387825663,US 387825664,387833855,CA -387833856,387985407,US -387985408,387993599,NL -387993600,387997695,US +387833856,387975167,US +387975168,387976191,NL +387976192,387976703,US +387976704,387978751,NL +387978752,387980287,US +387980288,387980799,NL +387980800,387985407,US +387985408,387996159,NL +387996160,387997695,US 387997696,388001791,NL -388001792,388038655,US +388001792,388029439,US +388029440,388030463,NL +388030464,388035071,US +388035072,388036607,NL +388036608,388038655,US 388038656,388042751,NL -388042752,388055039,US +388042752,388050943,US +388050944,388051967,NL +388051968,388055039,US 388055040,388059135,NL -388059136,388091903,US -388091904,388100095,NL -388100096,388149247,US +388059136,388084735,US +388084736,388085759,NL +388085760,388086783,US +388086784,388087807,NL +388087808,388091903,US +388091904,388101119,NL +388101120,388149247,US 388149248,388153343,NL 388153344,388198399,US 388198400,388202495,NL 388202496,388222975,US 388222976,388227071,NL -388227072,388251647,US -388251648,388255743,NL -388255744,388272127,US +388227072,388272127,US 388272128,388284415,NL 388284416,388288511,US 388288512,388300799,NL @@ -2207,18 +2405,28 @@ 388345856,388354047,US 388354048,388358143,NL 388358144,388362239,US -388362240,388390911,NL -388390912,388440063,US -388440064,388444159,NL -388444160,388472831,US +388362240,388392447,NL +388392448,388397055,US +388397056,388399103,NL +388399104,388419583,US +388419584,388423679,NL +388423680,388448255,US +388448256,388464639,NL +388464640,388472831,US 388472832,388476927,NL -388476928,388513791,US +388476928,388481023,US +388481024,388485119,NL +388485120,388493311,US +388493312,388501503,NL +388501504,388513791,US 388513792,388517887,NL 388517888,388526079,US 388526080,388530175,NL 388530176,388538367,US 388538368,388542463,NL -388542464,388567039,US +388542464,388550655,US +388550656,388554751,NL +388554752,388567039,US 388567040,388571135,NL 388571136,388632575,US 388632576,388636671,NL @@ -2226,23 +2434,39 @@ 388677632,388681727,NL 388681728,388698111,US 388698112,388702207,NL -388702208,388710399,US -388710400,388730879,NL +388702208,388706303,US +388706304,388714495,NL +388714496,388726783,US +388726784,388730879,NL 388730880,388812799,US 388812800,388816895,NL -388816896,388849663,US +388816896,388842239,US +388842240,388842495,NL +388842496,388843519,US +388843520,388844543,NL +388844544,388849663,US 388849664,388853759,NL 388853760,388857855,US -388857856,388861951,NL -388861952,388866047,US -388866048,388878335,NL -388878336,388919295,US +388857856,388878335,NL +388878336,388885503,US +388885504,388886527,NL +388886528,388894207,US +388894208,388894719,NL +388894720,388896767,US +388896768,388897279,NL +388897280,388897791,US +388897792,388898815,NL +388898816,388919295,US 388919296,388923391,NL -388923392,389066751,US -389066752,389074943,NL -389074944,389079039,US +388923392,389044223,US +389044224,389045247,NL +389045248,389070847,US +389070848,389078015,NL +389078016,389079039,US 389079040,389083135,NL -389083136,389136383,US +389083136,389090303,US +389090304,389091327,NL +389091328,389136383,US 389136384,389140479,NL 389140480,389177343,US 389177344,389181439,NL @@ -2250,22 +2474,22 @@ 389185536,389201919,NL 389201920,389206015,US 389206016,389210111,NL -389210112,389234687,US -389234688,389238783,NL -389238784,389242879,US +389210112,389242879,US 389242880,389251071,NL 389251072,389259263,US 389259264,389292031,NL 389292032,389296127,US 389296128,389300223,NL 389300224,389328895,US -389328896,389365759,NL +389328896,389341183,NL +389341184,389349375,US +389349376,389365759,NL 389365760,389390335,US 389390336,389398527,NL 389398528,389402623,US -389402624,389427199,NL -389427200,389431295,US -389431296,389451775,NL +389402624,389423103,NL +389423104,389435391,US +389435392,389451775,NL 389451776,389480447,US 389480448,389484543,NL 389484544,389509119,US @@ -2274,53 +2498,140 @@ 389515264,389521407,NL 389521408,389537791,US 389537792,389541887,NL -389541888,389607423,US -389607424,389611519,NL -389611520,389619711,US -389619712,389627903,NL -389627904,389631999,US -389632000,389640191,NL -389640192,389730303,US +389541888,389599743,US +389599744,389600767,NL +389600768,389602303,US +389602304,389603327,NL +389603328,389611519,US +389611520,389615615,NL +389615616,389619711,US +389619712,389628927,NL +389628928,389631999,US +389632000,389641215,NL +389641216,389701119,US +389701120,389701631,NL +389701632,389730303,US 389730304,389734399,NL 389734400,389754879,US -389754880,389763071,NL -389763072,389767167,US +389754880,389765631,NL +389765632,389767167,US 389767168,389775359,NL 389775360,389812223,US -389812224,389824511,NL -389824512,389926911,US -389926912,389935103,NL -389935104,389967871,US -389967872,389976063,NL -389976064,389988351,US +389812224,389825535,NL +389825536,389825791,US +389825792,389826559,NL +389826560,389861375,US +389861376,389865471,NL +389865472,389902335,US +389902336,389903359,NL +389903360,389923839,US +389923840,389924351,NL +389924352,389924607,US +389924608,389925375,NL +389925376,389926911,US +389926912,389936127,NL +389936128,389937151,US +389937152,389937407,NL +389937408,389937919,US +389937920,389938175,NL +389938176,389938687,US +389938688,389940223,NL +389940224,389941247,US +389941248,389941503,AU +389941504,389941759,NL +389941760,389942271,US +389942272,389942783,NL +389942784,389952767,US +389952768,389953023,NL +389953024,389954815,US +389954816,389955071,NL +389955072,389964287,US +389964288,389965055,NL +389965056,389965311,US +389965312,389966335,NL +389966336,389967871,US +389967872,389977087,NL +389977088,389977599,US +389977600,389978111,NL +389978112,389979135,US +389979136,389979391,AU +389979392,389988351,US 389988352,389992447,NL -389992448,390021119,US -390021120,390029311,NL -390029312,390033407,US -390033408,390041599,NL -390041600,390123519,US +389992448,389999871,US +389999872,390000127,NL +390000128,390011903,US +390011904,390012927,NL +390012928,390021119,US +390021120,390030847,NL +390030848,390033407,US +390033408,390043135,NL +390043136,390063615,US +390063616,390066175,NL +390066176,390074111,US +390074112,390074367,NL +390074368,390085631,US +390085632,390086655,NL +390086656,390106623,US +390106624,390107135,NL +390107136,390123519,US 390123520,390131711,NL -390131712,390143999,US -390144000,390148095,NL -390148096,390184959,US +390131712,390141439,US +390141440,390141695,NL +390141696,390143231,US +390143232,390148095,NL +390148096,390165503,US +390165504,390166527,NL +390166528,390181887,US +390181888,390182399,NL +390182400,390184959,US 390184960,390193151,NL 390193152,390205439,US 390205440,390209535,NL -390209536,390262783,US -390262784,390270975,NL -390270976,390287359,US -390287360,390295551,NL +390209536,390261247,US +390261248,390270975,NL +390270976,390276863,US +390276864,390277375,NL +390277376,390277631,US +390277632,390278143,NL +390278144,390278911,US +390278912,390279167,NL +390279168,390281727,US +390281728,390281983,NL +390281984,390284799,US +390284800,390285311,NL +390285312,390286847,US +390286848,390295551,NL 390295552,390299647,US -390299648,390303743,NL -390303744,390733823,US +390299648,390304767,NL +390304768,390332159,US +390332160,390332415,NL +390332416,390694655,US +390694656,390694911,NL +390694912,390731775,US +390731776,390732031,NL +390732032,390732287,US +390732288,390732799,NL +390732800,390733823,US 390733824,390737919,NL 390737920,390746111,US 390746112,390758399,NL -390758400,390770687,US +390758400,390767615,US +390767616,390768639,NL +390768640,390770687,US 390770688,390778879,NL -390778880,390946815,US +390778880,390896639,US +390896640,390897151,NL +390897152,390943743,US +390943744,390944767,NL +390944768,390946815,US 390946816,390955007,NL -390955008,390995967,US +390955008,390972159,US +390972160,390972415,NL +390972416,390972927,US +390972928,390973951,NL +390973952,390985727,US +390985728,390987775,NL +390987776,390995967,US 390995968,391020543,NL 391020544,391081983,US 391081984,391086079,NL @@ -2329,17 +2640,25 @@ 391110912,391111167,GB 391111168,391111679,NL 391111680,391111935,US -391111936,391112063,AU -391112064,391113471,NL +391111936,391112191,AU +391112192,391112447,NL +391112448,391112703,US +391112704,391113471,NL 391113472,391113983,US 391113984,391114751,NL -391114752,391872511,US +391114752,391116543,US +391116544,391116799,NL +391116800,391872511,US 391872512,391888895,CA 391888896,391897087,US 391897088,391905279,CA 391905280,391938047,US 391938048,391946239,CA -391946240,392257535,US +391946240,391961711,US +391961712,391961719,RO +391961720,392250367,US +392250368,392250623,HK +392250624,392257535,US 392257536,392261631,BR 392261632,392390538,US 392390539,392390539,HK @@ -2360,79 +2679,152 @@ 392515584,392523775,JP 392523776,392548351,US 392548352,392556543,AU -392556544,392765439,US +392556544,392579345,US +392579346,392579346,JP +392579347,392659871,US +392659872,392659903,NL +392659904,392765439,US 392765440,392765695,GB 392765696,394264575,US 394264576,394264831,CA 394270720,394271231,NL 394296320,394296831,NL -398458880,398635007,US -398635008,398643199,NL -398643200,398647295,US -398647296,398655487,NL -398655488,398659583,US -398659584,398675967,NL +395313152,395313407,US +396361728,396361983,US +397410304,397410559,CA +398458880,398500351,US +398500352,398500863,NL +398500864,398617599,US +398617600,398618623,NL +398618624,398635007,US +398635008,398644223,NL +398644224,398644735,US +398644736,398645247,NL +398645248,398647295,US +398647296,398656511,NL +398656512,398657535,US +398657536,398658559,NL +398658560,398667775,US +398667776,398675967,NL 398675968,398684159,US 398684160,398692351,NL -398692352,398782463,US +398692352,398779903,US +398779904,398781439,NL +398781440,398782463,US 398782464,398790655,NL -398790656,398856191,US -398856192,398876671,NL -398876672,398970879,US +398790656,398802431,US +398802432,398802943,NL +398802944,398850047,US +398850048,398852095,NL +398852096,398856191,US +398856192,398877183,NL +398877184,398970879,US 398970880,398974975,NL 398974976,399004671,US 399004672,399006207,FR 399006208,399007743,US 399007744,399011839,NL -399011840,399020031,US +399011840,399016959,US +399016960,399017983,NL +399017984,399020031,US 399020032,399028223,NL -399028224,399097855,US +399028224,399032319,US +399032320,399036415,NL +399036416,399076351,US +399076352,399076863,NL +399076864,399087615,US +399087616,399088639,NL +399088640,399097855,US 399097856,399106047,NL -399106048,399147007,US -399147008,399155199,NL -399155200,399331327,US +399106048,399125759,US +399125760,399126015,NL +399126016,399143935,US +399143936,399145471,NL +399145472,399147007,US +399147008,399159295,NL +399159296,399331327,US 399331328,399339519,NL -399339520,399368191,US -399368192,399376383,NL -399376384,399380479,US -399380480,399405055,NL -399405056,399458303,US +399339520,399340543,US +399340544,399341055,AU +399341056,399353855,US +399353856,399354879,NL +399354880,399355391,US +399355392,399355903,NL +399355904,399365119,US +399365120,399366143,NL +399366144,399367167,US +399367168,399406591,NL +399406592,399458303,US 399458304,399466495,NL -399466496,399601663,US -399601664,399618047,NL -399618048,399619839,US +399466496,399591935,US +399591936,399593471,NL +399593472,399601663,US +399601664,399619583,NL +399619584,399619839,US 399619840,399620095,AU -399620096,399630335,US -399630336,399638527,NL -399638528,399818751,US +399620096,399621631,US +399621632,399639551,NL +399639552,399719679,US +399719680,399719935,NL +399719936,399737855,US +399737856,399738367,NL +399738368,399797247,US +399797248,399797759,NL +399797760,399815679,US +399815680,399817215,NL +399817216,399818751,US 399818752,399831039,NL -399831040,399908863,US -399908864,399917055,NL -399917056,399921151,US -399921152,399929343,NL -399929344,399933439,US -399933440,399958015,NL +399831040,399870975,US +399870976,399871999,NL +399872000,399908863,US +399908864,399919615,NL +399919616,399921151,US +399921152,399958015,NL 399958016,399970303,US -399970304,399978495,NL -399978496,399990783,US -399990784,399998975,NL -399998976,400154623,US +399970304,399980031,NL +399980032,399981567,US +399981568,399982079,NL +399982080,399990783,US +399990784,400000511,NL +400000512,400021247,US +400021248,400021503,NL +400021504,400033279,US +400033280,400033791,NL +400033792,400034815,US +400034816,400035327,NL +400035328,400056319,US +400056320,400064511,NL +400064512,400130559,US +400130560,400131071,NL +400131072,400131583,US +400131584,400132095,NL +400132096,400134143,US +400134144,400143359,NL +400143360,400144383,US +400144384,400145407,NL +400145408,400154623,US 400154624,400162815,NL -400162816,400232447,US -400232448,400248831,NL -400248832,400252927,US -400252928,400269311,NL -400269312,400273407,US -400273408,400281599,NL -400281600,400293887,US +400162816,400201215,US +400201216,400202751,NL +400202752,400203775,US +400203776,400211967,NL +400211968,400240639,US +400240640,400250367,NL +400250368,400270847,US +400270848,400271359,NL +400271360,400283647,US +400283648,400284671,NL +400284672,400293887,US 400293888,400302079,NL -400302080,400412671,US -400412672,400429055,NL -400429056,400433151,US -400433152,400441343,NL -400441344,400519167,US -400519168,400527359,NL -400527360,400760831,US +400302080,400400383,US +400400384,400430079,NL +400430080,400431103,US +400431104,400442367,NL +400442368,400482303,US +400482304,400527359,NL +400527360,400543743,US +400543744,400551935,NL +400551936,400760831,US 400760832,400769023,CA 400769024,400805887,US 400805888,400809983,CA @@ -2449,7 +2841,9 @@ 400911616,400911871,CR 400911872,400912127,US 400912128,400912383,SG -400912384,401130495,US +400912384,401129727,US +401129728,401129983,FR +401129984,401130495,US 401130496,401130751,DE 401130752,401137151,US 401137152,401137663,GB @@ -2467,7 +2861,11 @@ 401145344,401145599,SC 401145600,401145855,YE 401145856,401211391,CA -401211392,401293311,US +401211392,401232375,US +401232376,401232383,GB +401232384,401236447,US +401236448,401236479,GB +401236480,401293311,US 401293312,401297407,CA 401297408,401342463,US 401342464,401346559,BB @@ -2499,8 +2897,9 @@ 402128896,402169855,CA 402169856,402223103,US 402223104,402227199,CA -402227200,402231295,PR -402231296,402239301,US +402227200,402227455,PR +402227456,402231295,US +402235392,402239301,US 402239302,402239302,CA 402239303,402239473,US 402239474,402239474,CA @@ -2514,12 +2913,22 @@ 402399232,402403327,CA 402403328,402415615,US 402415616,402416639,CA -402416640,402416895,US -402416896,402417663,CA +402416640,402417151,US +402417152,402417663,CA 402417664,402550015,US 402550016,402550271,CA 402550272,402550783,GB -402550784,405012479,US +402550784,402614087,US +402614088,402614095,GB +402614096,402614303,US +402614304,402614311,AU +402614312,402615055,US +402615056,402615063,GB +402615064,402615415,US +402615416,402615423,AU +402615424,402653183,US +402653184,402653184,MX +402653185,405012479,US 405012480,405143551,CA 405143552,405180415,US 405180416,405184511,CA @@ -2552,7 +2961,11 @@ 406216704,406241279,US 406241280,406257663,PR 406257664,406274047,US -406274048,406290431,PR +406274048,406284031,PR +406284032,406284287,US +406284288,406284543,PR +406284544,406284799,US +406284800,406290431,PR 406290432,406298623,US 406298624,406306815,PR 406306816,406323199,CA @@ -2597,9 +3010,7 @@ 411639808,411664383,CA 411664384,411680767,US 411680768,411688959,CA -411688960,411691519,PR -411691520,411692031,US -411692032,411697151,PR +411688960,411697151,PR 411697152,411746303,CA 411746304,411762687,PR 411762688,411770879,CA @@ -2647,15 +3058,13 @@ 416743424,416776191,CA 416776192,417202175,US 417202176,417267711,CA -417267712,417335807,US -417335808,417335935,VI -417335936,417366015,US +417267712,417366015,US 417366016,417398783,CA 417398784,417431551,US 417431552,417529855,CA 417529856,417538047,PR 417538048,417726463,US -417726464,417734655,JP +417726464,417734655,HK 417734656,417775615,US 417775616,417796095,CA 417796096,417800191,US @@ -2663,7 +3072,8 @@ 417808384,417816575,CA 417820672,417857535,US 417857536,417923071,AR -417923072,418062335,US +417923072,418060287,US +418060288,418062335,HK 418062336,418070527,CA 418070528,418078719,US 418078720,418119679,CA @@ -2686,7 +3096,13 @@ 452985856,452986879,MY 452986880,452987903,SG 452987904,452988927,VN -452988928,452993023,US +452988928,452989183,US +452989184,452989439,JP +452989440,452990719,US +452990720,452991231,JP +452991232,452991487,US +452991488,452992255,JP +452992256,452993023,US 452993024,452997119,JP 452997120,453001215,IN 453001216,453009407,AU @@ -2696,7 +3112,9 @@ 453246976,453509119,IN 453509120,455081983,CN 455081984,455213055,AU -455213056,455245823,NP +455213056,455215359,NP +455215360,455215615,RU +455215616,455245823,NP 455245824,455258111,JP 455258112,455262207,SG 455262208,455270399,JP @@ -2708,7 +3126,6 @@ 456130560,456261631,IN 456261632,456262655,PH 456262656,456263679,IN -456263680,456264703,NP 456264704,456265727,JP 456265728,456269823,ID 456269824,456271871,HK @@ -2737,6 +3154,7 @@ 459292672,459293695,NZ 459293696,459297791,JP 459297792,459298815,IN +459299840,459300863,PK 459300864,459309055,SG 459309056,459325439,KR 459325440,459333631,AU @@ -2844,9 +3262,7 @@ 460939264,460940287,NZ 460940288,460941311,IN 460941312,460942335,AU -460942336,460942847,SG -460942848,460943103,MY -460943104,460943359,ID +460942336,460943359,MY 460943360,460945407,AU 460945408,460947455,CN 460947456,460980223,JP @@ -2869,16 +3285,13 @@ 461056000,461058047,AU 461058048,461062143,HK 461062144,461078527,IN -461078528,461088767,FJ -461088768,461089023,AU -461089024,461094911,FJ +461078528,461094911,FJ 461094912,461096959,HK 461096960,461099007,TW 461099008,461100031,JP 461100032,461101055,MN 461101056,461102079,IN 461102080,461103103,ID -461103104,461111295,PH 461111296,461127679,IN 461127680,461131775,PH 461131776,461135871,ID @@ -2980,9 +3393,10 @@ 520492032,520493055,GB 520493056,520493311,BE 520493312,520493567,GB -520493568,520493823,IT +520493568,520493695,DE +520493696,520493823,PT 520493824,520494079,FI -520494080,520494335,FR +520494080,520494335,IT 520494336,520494591,CZ 520494592,520494847,CH 520494848,520495103,DK @@ -2999,7 +3413,8 @@ 520497920,520498175,FR 520498176,520498431,CH 520498432,520498687,SE -520498688,520499711,FR +520498688,520498943,IT +520498944,520499711,FR 520499712,520500223,DK 520500224,520500479,LU 520500480,520500735,DE @@ -3008,7 +3423,8 @@ 520501248,520501503,LU 520501504,520501759,NO 520501760,520502271,GB -520502272,520502783,IT +520502272,520502527,IE +520502528,520502783,IT 520502784,520503295,GB 520503296,520505343,PL 520505344,520507391,GB @@ -3060,7 +3476,11 @@ 520953856,520962047,RU 520962048,520963407,IE 520963408,520963408,US -520963409,520978431,IE +520963409,520963583,IE +520963584,520963839,US +520963840,520965119,IE +520965120,520965631,US +520965632,520978431,IE 520978432,520980479,RU 520980480,520982527,IT 520982528,520984575,RU @@ -3069,17 +3489,45 @@ 520988672,520990719,DE 520990720,520992767,RU 520994816,521011199,BG -521011200,521027839,RO +521011200,521014015,RO +521014016,521014271,NL +521014272,521019391,RO +521019392,521019647,NL +521019648,521022463,RO +521022464,521022719,NL +521022720,521022975,RO +521022976,521023487,DE +521023488,521023743,NL +521023744,521026559,RO +521026560,521027583,ES +521027584,521027839,RO 521027840,521028607,GB -521028608,521031679,RO +521028608,521028863,RU +521028864,521029119,RO +521029120,521029375,ES +521029376,521029631,US +521029632,521031679,RO 521031680,521035775,IR -521035776,521039871,RO +521035776,521037567,RO +521037568,521037823,TH +521037824,521039871,RO 521039872,521043967,IR 521043968,521048063,RO 521048064,521052159,IR 521052160,521056255,RO 521056256,521057279,LT -521057280,521076735,RO +521057280,521058303,MD +521058304,521060351,IT +521060352,521064063,RO +521064064,521064191,ES +521064192,521074687,RO +521074688,521074943,EG +521074944,521075199,RO +521075200,521075327,FR +521075328,521075455,RO +521075456,521075711,EG +521075712,521076479,RO +521076480,521076735,IN 521076736,521078783,ES 521078784,521080831,CZ 521080832,521082879,RU @@ -3147,8 +3595,7 @@ 521717760,521718783,IQ 521718784,521719807,IR 521719808,521721855,UA -521721856,521723903,GB -521723904,521725951,SA +521721856,521725951,GB 521725952,521727999,IR 521728000,521732095,FR 521732096,521736191,GB @@ -3217,9 +3664,7 @@ 522719232,522721279,UA 522721280,522741759,RU 522741760,522743807,UA -522743808,522763263,RU -522763264,522763519,UA -522763520,522764287,RU +522743808,522764287,RU 522780672,522782719,RU 522782720,522784767,UA 522784768,522786815,BG @@ -3340,8 +3785,7 @@ 528687104,528689151,UA 528689152,528691199,RO 528691200,528695295,PL -528695296,528695551,UA -528695552,528703487,RU +528695296,528703487,RU 528703488,528715775,UA 528715776,528719871,RU 528719872,528721919,RO @@ -3414,20 +3858,18 @@ 529799424,529799679,UA 529799680,529800191,RU 529800192,529800703,UA -529800704,529801215,CZ +529800704,529800959,CZ +529800960,529801215,BY 529801216,529817599,RU 529817600,529818623,CZ 529818624,529826303,RU 529826304,529826815,CZ 529826816,529827839,RU 529827840,529828863,CZ -529828864,529835007,RU -529835008,529836031,KG -529836032,529837055,CZ -529837056,529839103,RU -529839104,529840127,CZ -529840128,529841151,RU -529841152,529842175,UA +529828864,529829887,RU +529829888,529830911,CZ +529830912,529838079,RU +529838080,529842175,UA 529842176,529843199,IN 529843200,529844223,RU 529844224,529845247,CZ @@ -3529,31 +3971,37 @@ 531427704,531427711,IT 531427712,531428191,GB 531428192,531428199,IT -531428200,531428351,GB +531428200,531428207,GB +531428208,531428215,IT +531428216,531428351,GB 531428352,531428359,IT 531428360,531428495,GB 531428496,531428503,IT -531428504,531428847,GB -531428848,531428855,IT -531428856,531429135,GB +531428504,531429135,GB 531429136,531429143,IT -531429144,531429207,GB +531429144,531429167,GB +531429168,531429175,IT +531429176,531429207,GB 531429208,531429215,IT 531429216,531429239,GB 531429240,531429247,IT -531429248,531429391,GB +531429248,531429319,GB +531429320,531429327,IT +531429328,531429391,GB 531429392,531429399,IT 531429400,531429407,GB 531429408,531429415,IT 531429416,531429599,GB 531429600,531429607,IT -531429608,531429967,GB -531429968,531429975,IT -531429976,531430319,GB +531429608,531430191,GB +531430192,531430199,IT +531430200,531430319,GB 531430320,531430327,IT 531430328,531430407,GB 531430408,531430415,IT -531430416,531430791,GB +531430416,531430583,GB +531430584,531430591,IT +531430592,531430791,GB 531430792,531430799,IT 531430800,531430823,GB 531430824,531430831,IT @@ -3593,7 +4041,7 @@ 532209664,532210687,DE 532210688,532211711,RU 532211712,532212223,LU -532212224,532212479,KZ +532212224,532212479,ME 532212480,532212735,NL 532212736,532213759,RU 532213760,532214015,GB @@ -3607,9 +4055,7 @@ 532246528,532250623,BA 532250624,532283391,GB 532283392,532291583,TR -532291584,532292351,IE -532292352,532292607,GB -532292608,532293631,IE +532291584,532293631,IE 532293632,532295679,IT 532295680,532297727,KG 532297728,532303871,RU @@ -3631,7 +4077,9 @@ 532341760,532343967,GB 532343968,532343983,US 532343984,532344319,GB -532344320,532344575,FR +532344320,532344371,FR +532344372,532344372,GB +532344373,532344575,FR 532344576,532347391,GB 532347392,532347903,DE 532347904,532348671,GB @@ -3642,7 +4090,9 @@ 532366080,532366207,NL 532366208,532366239,AR 532366240,532366271,PA -532366272,532367359,DE +532366272,532366893,DE +532366894,532366894,GB +532366895,532367359,DE 532367360,532368383,US 532368384,532368639,NL 532368640,532371455,DE @@ -3666,7 +4116,9 @@ 532381696,532414463,NL 532414464,532676607,IT 532676608,532692991,GE -532692992,532701183,CZ +532692992,532701153,CZ +532701154,532701154,SK +532701155,532701183,CZ 532701184,532703231,GB 532703232,532705279,RU 532705280,532709375,NL @@ -3741,7 +4193,9 @@ 533682176,533684223,ES 533684224,533692415,IT 533692416,533725183,RU -533725184,533807103,SE +533725184,533734393,SE +533734394,533734394,DK +533734395,533807103,SE 533807104,533811199,LT 533811200,533815295,DE 533815296,533815296,TR @@ -3760,11 +4214,15 @@ 533856256,533858303,FR 533858304,533858751,TR 533858752,533858815,AT -533858816,533859647,TR +533858816,533858895,TR +533858896,533858903,AT +533858904,533859647,TR 533859648,533859663,AT 533859664,533860351,TR 533862400,533864447,GB -533864448,533889023,TR +533864448,533886719,TR +533886720,533886975,JP +533886976,533889023,TR 533889024,533891071,GB 533891072,533893119,RU 533893120,533895167,ES @@ -3784,10 +4242,17 @@ 533968896,533970943,ES 533970944,533987327,SE 533987328,534118399,DE -534118400,534151167,KW -534151168,534163455,DE +534118400,534141695,KW +534141696,534141759,US +534141760,534141823,KW +534141824,534141951,US +534141952,534151167,KW +534151168,534158591,DE +534158592,534158847,NL +534158848,534163455,DE 534163456,534167551,ES -534167552,534183935,DE +534167552,534181887,DE +534181888,534183935,IR 534183936,534249471,AE 534249472,534253567,GB 534253568,534257663,FR @@ -3849,16 +4314,13 @@ 534519552,534519807,NL 534519808,534521855,US 534521856,534522367,DE -534522368,534522879,NL -534522880,534523034,DE -534523035,534523035,NL -534523036,534523135,DE -534523136,534523391,NL +534522368,534523391,NL 534523392,534523903,DE -534523904,534527999,US -534528000,534530047,DE +534523904,534530047,US 534530048,534538239,ES -534538240,534540287,US +534538240,534538751,US +534538752,534539007,GB +534539008,534540287,US 534540288,534542335,NL 534542336,534544383,DE 534544384,534546431,RO @@ -3897,7 +4359,9 @@ 539623424,539624577,NL 539624578,539624578,EU 539624579,539627519,NL -539627520,539629975,GB +539627520,539629455,GB +539629456,539629463,BE +539629464,539629975,GB 539629976,539629983,DE 539629984,539630975,GB 539630976,539630983,PT @@ -3929,8 +4393,8 @@ 540737758,540737758,BR 540737759,540803071,BZ 540803072,540811263,US -540811264,540814085,SG -540814086,540814086,TH +540811264,540814084,SG +540814085,540814086,TH 540814087,540814327,SG 540814328,540814328,IN 540814329,540814335,SG @@ -3944,113 +4408,44 @@ 540826384,540826399,CA 540826400,543690751,US 543690752,543691007,AR -543691008,543752191,US -543752192,543752447,BM -543752448,543755007,BR -543755008,543755263,CW -543755264,543760383,US -543760384,543760639,CO -543760640,543760895,US -543760896,543761151,VE -543761152,543761407,US -543761408,543761663,CL -543761664,543761919,US -543761920,543763455,BR -543763456,543763711,US -543763712,543764223,MX -543764224,543766783,US -543766784,543767039,AR -543767040,543767295,US -543767296,543767551,EC -543767552,543768063,VE -543768064,543768319,US -543768320,543768575,AR -543768576,543817727,US -543817728,543818239,DE -543818240,543819263,NL -543819264,543820287,DE -543820288,543821311,NL -543821312,543821567,DE +543691008,543821567,US 543821568,543821823,NL -543821824,543824639,DE -543824640,543825663,GB -543825664,543826687,DE -543826688,543827711,GB -543827712,543827967,US -543827968,543833087,GB -543833088,543833599,IT -543833600,543834111,US -543834112,543835135,GB -543835136,543835647,FR -543835648,543836159,US -543836160,543836671,FR -543836672,543837183,US -543837184,543838207,FR -543838208,543840255,US -543840256,543841279,BE -543841280,543842303,US -543842304,543842559,AT -543842560,543843071,GB -543843072,543843583,US -543843584,543843839,DK -543843840,543844095,AT -543844096,543844351,US -543844352,543845119,CH -543845120,543846143,DE -543846144,543846655,HR -543846656,543846911,BG -543846912,543847167,SI -543847168,543847423,HU -543847424,543848447,US -543848448,543850751,ES -543850752,543851775,IE -543851776,543852031,DK -543852032,543852543,US -543852544,543854079,ES -543854080,543855615,CH +543821824,543830527,US +543830528,543830783,NL +543830784,543844863,US +543844864,543845119,CH +543845120,543849983,US +543849984,543850239,ES +543850240,543850495,US +543850496,543850751,ES +543850752,543851263,TR +543851264,543855615,US 543855616,543855871,FI -543855872,543856127,IT -543856128,543856639,US -543856640,543857151,ZA -543857152,543857407,US -543857408,543857663,CZ +543855872,543857663,US 543857664,543857919,NO -543857920,543858943,DE -543858944,543859455,DK -543859456,543859967,US +543857920,543859967,US 543859968,543860223,DK 543860224,543860479,GR -543860480,543860735,US -543860736,543861247,SE -543861248,543864063,US -543864064,543864575,FI -543864576,543864831,US -543864832,543865343,PK +543860480,543864319,US +543864320,543864575,IE +543864576,543865343,US 543865344,543865599,CZ -543865600,543865855,US -543865856,543866879,GB -543866880,543870975,NL -543870976,543872511,ES +543865600,543866623,US +543866624,543866879,NL +543866880,543872511,US 543872512,543872767,BE 543872768,543873023,NL -543873024,543874047,US -543874048,543875583,FR -543875584,543877119,DE -543877120,543878655,BE -543878656,543880191,IT -543880192,543881727,NL -543881728,543883263,GB -543883264,544436771,US +543873024,544436771,US 544436772,544436775,CA -544436776,545858303,US -545858304,545858559,PR -545858560,586972927,US +544436776,548441343,US +548441344,548441599,PR +548441600,586972927,US 586972928,586973183,CA 586973184,586975999,US 586976000,586976255,AP -586976256,586977023,US -586977024,586977279,AU -586977280,587006719,US +586976256,586978047,US +586978048,586978303,BN +586978304,587006719,US 587006720,587006975,GB 587006976,603979775,US 603979776,603980799,CN @@ -4136,7 +4531,9 @@ 621391872,621392127,IT 621392128,621392383,CY 621392384,621392639,GE -621392640,621393919,CY +621392640,621392895,CY +621392896,621393151,IT +621393152,621393919,CY 621393920,621395967,DE 621395968,621398015,CZ 621398016,621400063,TR @@ -4146,7 +4543,9 @@ 621408256,621410303,RU 621410304,621412351,IR 621412352,621428735,NL -621428736,621430783,DE +621428736,621429759,IR +621429760,621430527,DE +621430528,621430783,GB 621430784,621432831,ES 621432832,621436927,IT 621436928,621445119,DE @@ -4177,9 +4576,9 @@ 621939712,621940479,RU 621940480,621942527,GB 621942528,621969407,RU -621971456,621972991,IM -621972992,621973247,GB -621973248,621973503,IM +621971456,621971711,GB +621971712,621973247,IM +621973248,621973503,GB 621973504,621975551,IE 621975552,621977599,RU 621977600,621981695,FR @@ -4234,7 +4633,9 @@ 622512128,622514175,DE 622514176,622518271,NO 622518272,622518527,GB -622518528,622520319,NL +622518528,622519281,NL +622519282,622519282,GB +622519283,622520319,NL 622520320,622522367,RU 622522368,622524415,FR 622524416,622526463,ES @@ -4253,7 +4654,6 @@ 622868480,622870527,FR 622870528,622874623,AZ 622874624,622878719,IT -622878720,622878975,FR 622880768,622882815,IT 622882816,622886911,IR 622886912,622919679,GR @@ -4326,9 +4726,7 @@ 623801088,623801855,US 623801856,623802367,NL 623802368,623802879,SE -623802880,623804148,NL -623804149,623804159,SE -623804160,623804415,NL +623802880,623804415,NL 623804416,623806463,RU 623806464,623808511,NL 623810560,623812607,ES @@ -4370,31 +4768,51 @@ 624574464,624590847,NL 624590848,624625848,FR 624625849,624625849,CA -624625850,624640527,FR +624625850,624640255,FR +624640256,624640259,GB +624640260,624640527,FR 624640528,624640543,GB 624640544,624640759,FR 624640760,624640767,NL 624640768,624640951,FR 624640952,624640959,PT -624640960,624643019,FR +624640960,624641743,FR +624641744,624641759,NL +624641760,624641791,IT +624641792,624643019,FR 624643020,624643023,IT -624643024,624645147,FR +624643024,624643231,FR +624643232,624643235,DE +624643236,624643311,FR +624643312,624643315,IT +624643316,624644667,FR +624644668,624644671,DK +624644672,624645147,FR 624645148,624645151,IT -624645152,624646239,FR +624645152,624645479,FR +624645480,624645487,CZ +624645488,624646235,FR +624646236,624646239,IT 624646240,624646255,DE 624646256,624646343,FR 624646344,624646347,NL -624646348,624646583,FR +624646348,624646399,FR +624646400,624646431,BE +624646432,624646583,FR 624646584,624646591,NL 624646592,624647171,FR 624647172,624647183,ES -624647184,624648139,FR +624647184,624647459,FR +624647460,624647463,GB +624647464,624648139,FR 624648140,624648143,ES 624648144,624653311,FR 624653312,624653823,GB 624653824,624656975,FR 624656976,624656979,PT -624656980,624657607,FR +624656980,624657543,FR +624657544,624657547,ES +624657548,624657607,FR 624657608,624657615,BE 624657616,624657711,FR 624657712,624657715,ES @@ -4422,7 +4840,9 @@ 624661788,624661788,RO 624661789,624661955,FR 624661956,624661959,PL -624661960,624663951,FR +624661960,624663863,FR +624663864,624663867,DE +624663868,624663951,FR 624663952,624663955,ES 624663956,624664527,FR 624664528,624664531,ES @@ -4436,7 +4856,13 @@ 624665804,624665807,NL 624665808,624665951,FR 624665952,624665955,NL -624665956,624666695,FR +624665956,624666167,FR +624666168,624666168,GB +624666169,624666172,FR +624666173,624666173,GB +624666174,624666219,FR +624666220,624666223,DE +624666224,624666695,FR 624666696,624666703,DE 624666704,624667471,FR 624667472,624667475,IT @@ -4454,7 +4880,9 @@ 624670916,624670919,ES 624670920,624671455,FR 624671456,624671471,ES -624671472,624672547,FR +624671472,624671855,FR +624671856,624671871,DE +624671872,624672547,FR 624672548,624672551,ES 624672552,624672559,FR 624672560,624672563,IT @@ -4540,7 +4968,9 @@ 624686668,624686671,ES 624686672,624686711,FR 624686712,624686715,ES -624686716,624687343,FR +624686716,624686783,FR +624686784,624686815,ES +624686816,624687343,FR 624687344,624687346,CZ 624687347,624687347,ES 624687348,624687827,FR @@ -4583,7 +5013,7 @@ 624738304,624740351,NL 624740352,624742399,DE 624742400,624746495,RU -624746496,624754687,BG +624746496,624754687,US 624754688,624787455,AZ 624787456,624791551,DE 624791552,624795647,ES @@ -4610,10 +5040,12 @@ 625506304,625508351,PL 625508352,625512447,AZ 625512448,625514495,DE -625514496,625514751,GG -625514752,625515263,GB -625515264,625516031,GG -625516032,625516543,GB +625514496,625515007,GG +625515008,625515519,GB +625515520,625515775,GG +625515776,625516031,GB +625516032,625516287,GG +625516288,625516543,GB 625516544,625518591,BE 625518592,625518847,NL 625518848,625519103,US @@ -4743,9 +5175,7 @@ 628847360,628847615,FR 628847616,628848639,GB 628848640,628850687,DE -628850688,628850943,SE -628850944,628851199,NO -628851200,628851455,SE +628850688,628851455,SE 628851456,628852479,NO 628852480,628867071,SE 628867072,628869119,IR @@ -4824,7 +5254,9 @@ 629989376,629991423,FR 629991424,629991935,US 629991936,629992447,NL -629992448,629993471,US +629992448,629993215,US +629993216,629993231,NL +629993232,629993471,US 629993472,629997567,JO 629997568,630063103,SA 630063104,630128639,IL @@ -4854,7 +5286,9 @@ 630495232,630497279,DE 630497280,630499327,NL 630499328,630501375,LV -630501376,630509567,NL +630501376,630503679,NL +630503680,630504447,IT +630504448,630509567,NL 630509568,630511615,TR 630511616,630513663,GB 630513664,630515711,IT @@ -4891,7 +5325,11 @@ 630818432,630818559,KR 630818560,630819327,RO 630819328,630819839,SE -630819840,630828031,RO +630819840,630820095,GR +630820096,630820351,RO +630820352,630820607,ES +630820608,630820863,US +630820864,630828031,RO 630828032,630828543,SE 630828544,630829055,RO 630829056,630833151,IR @@ -4909,13 +5347,21 @@ 630990848,630992895,RO 630992896,630996991,IR 630996992,630997503,GB -630997504,630998271,RO +630997504,630997759,MD +630997760,630998271,RO 630998272,630998783,MD -630998784,631001087,RO +630998784,630999039,RO +630999040,630999295,CN +630999296,630999551,RO +630999552,630999679,GB +630999680,631001087,RO 631001088,631005183,MD 631005184,631006207,IT 631006208,631007231,MD -631007232,631009279,RO +631007232,631007487,KR +631007488,631007743,RO +631007744,631007871,GB +631007872,631009279,RO 631009280,631017471,IR 631017472,631018495,MD 631018496,631019519,IT @@ -4923,13 +5369,21 @@ 631023616,631024639,IT 631024640,631024895,RO 631024896,631025151,GB -631025152,631029759,RO +631025152,631027711,RO +631027712,631027967,KR +631027968,631028223,RO +631028224,631028351,GB +631028352,631029759,RO 631029760,631033855,SE 631033856,631034879,IT -631034880,631039999,RO +631034880,631035903,RO +631035904,631036159,JP +631036160,631036415,RO +631036416,631036543,GB +631036544,631039999,RO 631040000,631043071,MD -631043072,631044095,RO -631044096,631045119,MD +631043072,631043839,RO +631043840,631045119,MD 631045120,631046143,RO 631046144,631048191,DK 631048192,631050239,FR @@ -4972,7 +5426,9 @@ 633066240,633066495,ES 633066496,633066751,FR 633066752,633067007,IT -633067008,633077759,FR +633067008,633074760,FR +633074761,633074761,ES +633074762,633077759,FR 633077760,633094143,RU 633094144,633098239,NL 633098240,633100287,HU @@ -5013,7 +5469,9 @@ 634075136,634077183,NL 634077184,634093567,BA 634093568,634109951,GB -634109952,634111999,IE +634109952,634110975,IE +634110976,634111231,GB +634111232,634111999,IE 634112000,634114047,RU 634114048,634116095,SE 634116096,634118143,NL @@ -5090,21 +5548,15 @@ 635200264,635200271,IT 635200272,635200335,GB 635200336,635200343,IT -635200344,635200415,GB -635200416,635200423,IT -635200424,635200431,GB +635200344,635200431,GB 635200432,635200439,IT 635200440,635200631,GB 635200632,635200639,IT 635200640,635200727,GB 635200728,635200735,IT -635200736,635200959,GB -635200960,635200967,IT -635200968,635200991,GB +635200736,635200991,GB 635200992,635200999,IT -635201000,635201087,GB -635201088,635201095,IT -635201096,635201159,GB +635201000,635201159,GB 635201160,635201167,IT 635201168,635201455,GB 635201456,635201463,IT @@ -5135,7 +5587,7 @@ 635297792,635299839,SE 635299840,635301887,ES 635301888,635305983,CZ -635305984,635437055,NL +635305984,635437055,ES 635437056,635502591,SA 635502592,635568127,PL 635568128,635699199,IT @@ -5156,7 +5608,11 @@ 635856896,635858943,TR 635858944,635860991,RU 635860992,635863039,BE -635863040,635895807,RU +635863040,635893503,RU +635893504,635893759,AZ +635893760,635894527,RU +635894528,635894783,KZ +635894784,635895807,RU 635895808,635961343,KW 635961344,635994111,GE 635994112,636026879,RU @@ -5204,13 +5660,15 @@ 636952576,636956671,NL 636956672,636958719,IT 636958720,636960767,PL -636960768,636966655,DE +636960768,636965631,DE +636965632,636965887,BE +636965888,636966655,DE 636966656,636966911,IT 636966912,636967167,DE 636967168,636967935,FR -636967936,636968447,DE -636968448,636968703,BE -636968704,636968959,DE +636967936,636968191,DE +636968192,636968447,ES +636968448,636968959,DE 636968960,636974079,TR 636974080,636974591,GB 636974592,636974847,NL @@ -5237,8 +5695,12 @@ 637319168,637321215,AT 637321216,637323263,GB 637323264,637325311,FR -637325312,637325567,US -637325568,637327359,NO +637325312,637325823,US +637325824,637326079,GB +637326080,637326335,DE +637326336,637326591,HK +637326592,637326847,AU +637326848,637327359,NO 637329408,637329663,SI 637329664,637330175,FR 637330176,637330431,DE @@ -5266,191 +5728,277 @@ 637337088,637337599,RU 637337600,637403135,NO 637403136,637534207,IR -637534208,641761535,US +637534208,641738239,US +641738240,641738495,CA +641738496,641761535,US 641761536,641761791,CA 641761792,641763071,US -641763072,641763327,CA -641763328,641765375,US +641763072,641763839,CA +641763840,641765375,US 641765376,641765887,CA -641765888,641766399,US -641766400,641767423,CA -641767424,641768447,US -641768448,641768959,CA -641768960,641769727,US -641769728,641769983,CA -641769984,641771519,US -641771520,641772287,CA -641772288,641773055,US -641773056,641773311,CA -641773312,641828351,US +641765888,641766911,US +641766912,641767167,CA +641767168,641771519,US +641771520,641772543,CA +641772544,641773055,US +641773056,641773567,CA +641773568,641775615,US +641775616,641775871,CA +641775872,641776639,US +641776640,641777407,CA +641777408,641777663,US +641777664,641777919,CA +641777920,641779199,US +641779200,641779327,CA +641779328,641828351,US 641828352,641828607,MX 641828608,641829057,US 641829058,641829058,MX -641829059,642089215,US +641829059,641829119,US +641829120,641829375,MX +641829376,641830143,US +641830144,641830399,MX +641830400,642089215,US 642089216,642089471,CA -642089472,642093055,US -642093056,642093311,CA -642093312,642093567,US -642093568,642094079,CA -642094080,642094335,US -642094336,642094591,CA -642094592,642387967,US +642089472,642092543,US +642092544,642092799,CA +642092800,642093311,US +642093312,642093823,CA +642093824,642094079,US +642094080,642094591,CA +642094592,642097919,US +642097920,642098175,CA +642098176,642113535,US +642113536,642115583,AU +642115584,642387967,US 642387968,642388223,CA -642388224,642388479,US -642388480,642388735,CA -642388736,642793471,US +642388224,642390015,US +642390016,642390527,CA +642390528,642391039,US +642391040,642391295,CA +642391296,642395135,US +642395136,642395391,CA +642395392,642793471,US 642793472,642793983,CA -642793984,642926335,US -642926336,642926591,MX -642926592,643219519,US +642793984,643219519,US 643219520,643219523,CA 643219524,643219526,US 643219527,643219527,CA 643219528,643295231,US 643295232,643295487,PR -643295488,643295743,US -643295744,643296383,PR -643296384,643296767,US +643295488,643296767,US 643296768,643297023,PR 643297024,643302911,US -643302912,643303167,CA -643303168,643317759,US +643302912,643303039,CA +643303040,643303167,US +643303168,643303423,CA +643303424,643317759,US 643317760,643318015,CA 643318016,643318271,US -643318272,643318527,CA -643318528,643318847,US -643318848,643318911,CA -643318912,643346431,US +643318272,643319039,CA +643319040,643346431,US 643346432,643346943,CA 643346944,644055039,US -644055040,644055295,CA -644055296,644056063,US +644055040,644055807,CA +644055808,644056063,US 644056064,644056319,CA 644056320,644056575,US 644056576,644056831,CA -644056832,644057343,US -644057344,644057599,CA +644056832,644057087,US +644057088,644057599,CA 644057600,644058367,US 644058368,644058879,CA -644058880,644060671,US -644060672,644060927,CA -644060928,644060989,US -644060990,644060990,CA -644060991,644061439,US -644061440,644061631,CA -644061632,644061663,US -644061664,644061695,CA -644061696,644063231,US -644063232,644063487,CA -644063488,644064511,US -644064512,644064767,CA +644058880,644059135,US +644059136,644059391,CA +644059392,644060927,US +644060928,644061183,CA +644061184,644063231,US +644063232,644063743,CA +644063744,644063999,US +644064000,644064767,CA 644064768,644065055,US 644065056,644065279,CA -644065280,644067327,US -644067328,644067583,CA -644067584,644069631,US +644065280,644066303,US +644066304,644066815,CA +644066816,644067071,US +644067072,644067327,CA +644067328,644067583,US +644067584,644067839,CA +644067840,644069631,US 644069632,644069887,CA 644069888,644070143,US 644070144,644070399,CA -644070400,644082687,US -644082688,644082943,PR -644082944,644268543,US +644070400,644070655,US +644070656,644071167,CA +644071168,644084479,US +644084480,644084735,GU +644084736,644236031,US +644236032,644236287,CA +644236288,644239615,US +644239616,644239871,CA +644239872,644247551,US +644247552,644247807,CA +644247808,644248831,US +644248832,644249087,CA +644249088,644268543,US 644268544,644268569,CA 644268570,644268570,US 644268571,644268613,CA 644268614,644268614,US 644268615,644268799,CA -644268800,644323391,US -644323392,644323407,CA -644323408,644389887,US -644389888,644390399,CA -644390400,644403199,US -644403200,644403455,CA -644403456,644414207,US +644268800,644323327,US +644323328,644323583,CA +644323584,644324095,US +644324096,644324351,CA +644324352,644389375,US +644389376,644389631,CA +644389632,644389887,US +644389888,644390911,CA +644390912,644399103,US +644399104,644399359,CA +644399360,644403199,US +644403200,644403711,CA +644403712,644413439,US +644413440,644413695,MX +644413696,644414207,US 644414208,644414463,CA 644414464,644422911,US 644422912,644423423,JP -644423424,644569087,US -644569088,644569343,PR -644569344,644570111,US -644570112,644570367,PR +644423424,644524607,US +644524608,644524671,CA +644524672,644569087,US +644569088,644569599,PR +644569600,644569855,US +644569856,644570367,PR 644570368,644570879,US 644570880,644571135,PR 644571136,644628735,US 644628736,644628991,CA -644628992,644634367,US +644628992,644630271,US +644630272,644630527,CA +644630528,644631039,US +644631040,644631295,CA +644631296,644634367,US 644634368,644634623,CA -644634624,644718847,US -644718848,644719103,CA -644719104,644760575,US +644634624,644718591,US +644718592,644718911,CA +644718912,644759551,US +644759552,644759807,CA +644759808,644760575,US 644760576,644760831,CA -644760832,644761439,US -644761440,644761455,CA -644761456,644763903,US +644760832,644761343,US +644761344,644761599,CA +644761600,644762879,US +644762880,644763135,CA +644763136,644763903,US 644763904,644764159,CA 644764160,644765439,US 644765440,644765695,CA -644765696,644767743,US -644767744,644768767,CA -644768768,644834815,US +644765696,644767878,US +644767879,644767879,CA +644767880,644768511,US +644768512,644768767,CA +644768768,644775679,US +644775680,644775935,CA +644775936,644834047,US +644834048,644834303,CA +644834304,644834815,US 644834816,644835327,CA -644835328,644836351,US -644836352,644836607,CA -644836608,644838655,US -644838656,644840959,CA -644840960,644898815,US +644835328,644838655,US +644838656,644839423,CA +644839424,644840447,US +644840448,644840703,CA +644840704,644875007,US +644875008,644875263,CA +644875264,644894975,US +644894976,644895231,CA +644895232,644897023,US +644897024,644897279,CA +644897280,644897791,US +644897792,644898047,CA +644898048,644898815,US 644898816,644899071,CA 644899072,644899839,US 644899840,644900095,CA 644900096,644901631,US 644901632,644901887,CA -644901888,644981759,US -644981760,644982015,CA -644982016,645185535,US +644901888,644903167,US +644903168,644903679,CA +644903680,644904959,US +644904960,644905215,CA +644905216,644906239,US +644906240,644906495,CA +644906496,644987135,US +644987136,644987391,CA +644987392,644987647,US +644987648,644987903,CA +644987904,645185535,US 645185536,645185791,CA -645185792,645187071,US +645185792,645186559,US +645186560,645186815,CA +645186816,645187071,US 645187072,645187583,CA 645187584,645221375,US 645221376,645222399,CA -645222400,645225471,US +645222400,645223423,US +645223424,645223679,CA +645223680,645225471,US 645225472,645225727,CA -645225728,645227519,US -645227520,645228287,CA -645228288,645482511,US -645482512,645482519,CA -645482520,645526783,US -645526784,645527039,CA -645527040,645527807,US -645527808,645528319,CA -645528320,645540351,US +645225728,645229311,US +645229312,645229823,CA +645229824,645483263,US +645483264,645483519,CA +645483520,645484543,US +645484544,645485055,CA +645485056,645526527,US +645526528,645526783,CA +645526784,645527295,US +645527296,645527551,CA +645527552,645528319,US +645528320,645528575,CA +645528576,645529343,US +645529344,645529599,CA +645529600,645540351,US 645540352,645540607,CA -645540608,645576703,US +645540608,645547007,US +645547008,645547519,CA +645547520,645576703,US 645576704,645576997,CA 645576998,645576998,US 645576999,645577215,CA -645577216,645644351,US +645577216,645612031,US +645612032,645612543,MX +645612544,645644351,US 645644352,645644415,MX 645644416,645644927,US 645644928,645645055,MX -645645056,645646591,US -645646592,645646847,MX -645646848,645704447,US -645704448,645704959,MX -645704960,645705215,US +645645056,645647103,US +645647104,645647359,MX +645647360,645704447,US +645704448,645704703,MX +645704704,645705215,US 645705216,645705471,MX -645705472,645737983,US +645705472,645710079,US +645710080,645710335,MX +645710336,645737983,US 645737984,645738239,PR 645738240,645873663,US -645873664,645874431,CA -645874432,645875967,US -645875968,645876735,CA +645873664,645873919,CA +645873920,645874175,US +645874176,645874431,CA +645874432,645876479,US +645876480,645876735,CA 645876736,645984255,US 645984256,645988351,CA 645988352,645989450,US 645989451,645989451,CA 645989452,646160383,US 646160384,646164479,CA -646164480,654311423,US +646164480,646711807,US +646711808,646712319,CA +646712320,646734847,US +646734848,646735103,CA +646735104,654311423,US 654311424,654311679,CN 654311680,654311935,AU 654311936,654376959,CN @@ -5460,9 +6008,7 @@ 654835712,655359999,TW 655360000,656408575,KR 656408576,658505727,PK -658505728,660602879,CN -660602880,660602880,HK -660602881,661454847,CN +658505728,661454847,CN 661454848,661487615,HK 661487616,661520383,SG 661520384,661651455,JP @@ -5471,7 +6017,19 @@ 666894336,671088639,ID 671088640,671113215,US 671113216,671113471,EU -671113472,687618147,US +671113472,675807231,US +675807232,675938303,SG +675938304,678517576,US +678517577,678517577,IE +678517578,679313407,US +679313408,679346175,SG +679346176,679362559,US +679362560,679378943,SG +679378944,679453668,US +679453669,679453669,IE +679453670,679455449,US +679455450,679455450,IE +679455451,687618147,US 687618148,687618151,EU 687618152,687865855,US 687865856,689963007,ZA @@ -5488,7 +6046,21 @@ 691650560,691666943,GH 691666944,691732479,NG 691732480,691798015,TZ -691798016,691863551,ZM +691798016,691814399,ZM +691814400,691814655,ZW +691814656,691815167,ZM +691815168,691815423,ZW +691815424,691816191,ZM +691816192,691816703,ZW +691816704,691816959,ZM +691816960,691817215,ZW +691817216,691819007,ZM +691819008,691819263,ZW +691819264,691820799,ZM +691820800,691821311,ZW +691821312,691821567,ZM +691821568,691821823,ZW +691821824,691863551,ZM 691863552,691929087,ZA 691994624,692011007,ZM 692011008,692027391,ZA @@ -5514,16 +6086,15 @@ 692608768,692609023,EG 692609024,692617215,ZM 692617216,692625407,ZA -692625408,692626687,A2 +692625408,692626687,KE 692626688,692626943,AO -692626944,692633599,A2 -692633600,692634623,MU -692634624,692635135,KE -692635136,692636415,MU -692636416,692636671,KE -692636672,692637439,MU -692637440,692637695,KE -692637696,692641791,MU +692626944,692627455,KE +692627456,692633599,A2 +692633600,692635903,MU +692635904,692636159,KE +692636160,692639743,MU +692639744,692639999,KE +692640000,692641791,MU 692641792,692649983,GA 692649984,692658175,NG 692658176,692666367,ZA @@ -5755,9 +6326,7 @@ 693567488,693575679,MW 693575680,693583871,KE 693583872,693592063,NG -693592064,693594367,MU -693594368,693594623,KE -693594624,693600255,MU +693592064,693600255,MU 693600256,693608447,MA 693608448,693616639,BW 693616640,693633023,ZA @@ -5795,7 +6364,9 @@ 696974336,696975359,LU 696975360,696991743,GH 696991744,697008127,NG -697008128,697040895,KE +697008128,697015295,KE +697015296,697015551,US +697015552,697040895,KE 697040896,697303039,MA 697303040,697827327,ZA 697827328,697958399,EG @@ -5826,7 +6397,11 @@ 700284928,700301311,GH 700301312,700309503,CD 700309504,700313599,DJ -700313600,700317695,US +700313600,700315584,US +700315585,700315585,DJ +700315586,700317478,US +700317479,700317479,DJ +700317480,700317695,US 700317696,700325887,NG 700325888,700334079,ZW 700334080,700335103,BJ @@ -5863,6 +6438,7 @@ 700407808,700408831,GH 700408832,700409855,CM 700409856,700410879,LR +700411392,700411647,NG 700412928,700413951,ZM 700413952,700414975,SC 700414976,700432383,ZA @@ -5872,9 +6448,7 @@ 700437504,700438527,MU 700438528,700439551,BW 700439552,700440575,GN -700440576,700440831,MU -700440832,700441087,KE -700441088,700442247,MU +700440576,700442247,MU 700442248,700442251,KE 700442252,700442623,MU 700442624,700444671,ZW @@ -5890,7 +6464,9 @@ 700593152,700594175,NG 700594176,700595199,A2 700595200,700596223,CD -700596224,700645375,A2 +700596224,700598783,A2 +700598784,700599039,CG +700599040,700645375,A2 700645376,700710911,ZA 700710912,700776447,EG 700776448,700841983,RW @@ -5903,11 +6479,9 @@ 700866816,700867327,MU 700867328,700867583,NG 700867584,700893439,MU -700893440,700893695,NG -700893696,700895231,MU -700895232,700897023,NG -700897024,700897279,AO -700897280,700899327,NG +700893440,700893951,NG +700893952,700895231,MU +700895232,700899327,NG 700899328,700907519,MU 700907520,700973055,EG 700973056,701104127,DZ @@ -5940,7 +6514,9 @@ 701308928,701317119,AO 701317120,701325311,CM 701325312,701333503,EG -701333504,701341695,NA +701333504,701338111,NA +701338112,701338367,ZM +701338368,701341695,NA 701341696,701349887,NG 701349888,701358079,MA 701358080,701366271,SL @@ -5958,11 +6534,7 @@ 701440000,701448191,MG 701448192,701462783,KE 701462784,701463039,CG -701463040,701463394,KE -701463395,701463395,NG -701463396,701463528,KE -701463529,701463529,NG -701463530,701463807,KE +701463040,701463807,KE 701463808,701464063,CG 701464064,701464575,KE 701464576,701472767,MU @@ -6000,9 +6572,7 @@ 701890560,701923327,SN 701923328,701956095,MA 701956096,701992959,KE -701992960,701994495,SZ -701994496,701994751,ZA -701994752,701997055,SZ +701992960,701997055,SZ 701997056,702001151,GH 702001152,702005247,ZM 702005248,702009343,KE @@ -6012,9 +6582,7 @@ 702017536,702018559,EG 702018560,702019583,NG 702019584,702020607,RW -702020608,702021119,CD -702021120,702021375,ZA -702021376,702021631,CD +702020608,702021631,CD 702021632,702029823,ZM 702029824,702038015,BJ 702038016,702046207,ZM @@ -6068,12 +6636,11 @@ 702328832,702332927,TZ 702332928,702337023,MZ 702337024,702341119,UG -702341120,702342143,MU -702342144,702342399,KE -702342400,702344191,MU -702344192,702344971,KE -702344972,702345215,MU -702345216,702349311,KE +702341120,702342259,MU +702342260,702342263,KE +702342264,702344199,MU +702344200,702345215,KE +702345216,702349311,MU 702349312,702353407,ZA 702353408,702357503,DZ 702357504,702365695,TZ @@ -6102,11 +6669,7 @@ 702435328,702437375,SL 702437376,702439423,TZ 702439424,702441471,MU -702441472,702441727,ZA -702441728,702441983,GB -702441984,702442495,ZA -702442496,702442751,GB -702442752,702443519,ZA +702441472,702443519,ZA 702443520,702445567,GQ 702445568,702447615,ZA 702447616,702449663,EG @@ -6212,7 +6775,9 @@ 703759360,703760383,ZA 703760384,703761407,GH 703761408,703762431,RW -703762432,703764479,ZA +703762432,703764095,MU +703764096,703764223,ZA +703764224,703764479,MU 703764480,703766527,LY 703766528,703770623,ZA 703770624,703774719,BJ @@ -6266,7 +6831,9 @@ 711166592,711169311,JP 711169312,711169327,IN 711169328,711173119,JP -711173120,711173375,SG +711173120,711173210,SG +711173211,711173211,ID +711173212,711173375,SG 711173376,711196671,JP 711196672,711458815,CN 711458816,711983103,IN @@ -6377,7 +6944,6 @@ 736202752,736203775,AU 736203776,736204799,BD 736204800,736205823,SG -736205824,736206847,JP 736206848,736209919,IN 736209920,736210943,CN 736210944,736211967,AU @@ -6447,11 +7013,17 @@ 736396288,736398335,CN 736398336,736400383,IN 736400384,736402431,CN -736402432,736403455,PK +736402432,736402559,NZ +736402560,736402687,PK +736402688,736402943,SG +736402944,736403071,MY +736403072,736403199,BN +736403200,736403327,AU +736403328,736403455,PK 736403456,736404479,KR 736405504,736408575,IN 736408576,736409599,CN -736409600,736410623,NZ +736409600,736410623,US 736410624,736411647,CN 736411648,736412671,NP 736412672,736413695,TH @@ -6464,7 +7036,6 @@ 736421888,736422911,SG 736422912,736423935,IN 736423936,736424959,CN -736424960,736425983,JP 736425984,736428031,MY 736428032,736429055,IN 736429056,736430079,HK @@ -6482,7 +7053,6 @@ 736441344,736442367,HK 736442368,736443391,CN 736443392,736445439,AU -736445440,736446463,JP 736446464,736447487,IN 736447488,736448511,TH 736448512,736449535,IN @@ -6501,7 +7071,6 @@ 736466944,736467967,HK 736467968,736468991,SG 736468992,736470015,IN -736470016,736471039,JP 736471040,736479231,CN 736479232,736480255,IN 736480256,736481279,ID @@ -6589,7 +7158,6 @@ 736608256,736609279,NZ 736609280,736610303,HK 736610304,736611327,AU -736611328,736612351,JP 736612352,736613375,NP 736613376,736615423,IN 736615424,736616447,JP @@ -6599,7 +7167,38 @@ 736621568,736622591,JP 736622592,736624639,IN 736624640,736886783,JP -736886784,737149951,CN +736886784,737096703,CN +737096704,737099775,IN +737099776,737100799,HK +737100800,737101823,IN +737101824,737102847,BD +737102848,737104895,IN +737104896,737106943,HK +737106944,737108991,NZ +737108992,737110015,SG +737110016,737111039,JP +737111040,737113087,IN +737113088,737115135,CN +737115136,737118207,IN +737118208,737119231,AU +737119232,737120255,NL +737120256,737121279,IN +737121280,737122303,VN +737122304,737123327,IN +737123328,737126399,HK +737126400,737127423,IN +737127424,737129471,CN +737129472,737130495,NZ +737130496,737132543,VN +737132544,737139711,IN +737139712,737141759,VN +737141760,737142783,IN +737142784,737143039,HK +737143040,737143807,MY +737143808,737146879,IN +737146880,737147903,NZ +737147904,737148927,MY +737148928,737149951,CN 737149952,737151999,IN 737152000,737154047,HK 737154048,737155071,MY @@ -6663,7 +7262,6 @@ 737267712,737276927,CN 737276928,737277951,IN 737277952,737279999,CN -737280000,737281023,HK 737281024,737282047,SG 737282048,737288191,CN 737288192,737289215,HK @@ -6678,7 +7276,7 @@ 737308672,737309695,KR 737309696,737312767,IN 737312768,737313791,HK -737313792,737315839,JP +737314816,737315839,JP 737315840,737316863,HK 737316864,737324031,CN 737324032,737325055,HK @@ -6803,7 +7401,31 @@ 737539072,737540095,BD 737540096,737541119,ID 737541120,737542143,SG -737542144,737574911,CN +737542144,737567743,CN +737567744,737570815,IN +737570816,737571839,SG +737571840,737572863,HK +737572864,737574911,IN +737574912,737575935,JP +737575936,737576959,HK +737576960,737581055,IN +737581056,737582079,KR +737582080,737584127,IN +737584128,737585151,MY +737585152,737587199,HK +737587200,737588223,MY +737588224,737589247,KR +737589248,737590271,TH +737590272,737591295,TW +737591296,737593343,JP +737593344,737594367,BD +737594368,737596415,HK +737596416,737597439,CN +737597440,737598463,TW +737598464,737600511,PK +737600512,737601535,CN +737601536,737602559,AU +737602560,737607679,IN 737607680,737608703,HK 737608704,737610751,CN 737610752,737611775,ID @@ -6827,8 +7449,7 @@ 737635328,737637375,CN 737637376,737638399,AU 737638400,737639423,PK -737639424,737640447,NZ -737640448,737641471,AU +737639424,737641471,AU 737641472,737642495,HK 737642496,737645567,IN 737645568,737647615,CN @@ -6873,7 +7494,8 @@ 737744896,737745919,CN 737745920,737746943,HK 737746944,737747967,TH -737747968,737748991,SG +737747968,737748479,HK +737748480,737748991,SG 737748992,737750015,AF 737750016,737751039,JP 737751040,737753087,IN @@ -6990,11 +7612,9 @@ 737905664,737906687,HK 737906688,737908735,IN 737908736,737909759,AU -737909760,737910271,HK -737910272,737910783,MY -737910784,737911807,HK -737911808,737912063,SG -737912064,737912831,AU +737909760,737911807,HK +737911808,737912703,SG +737912704,737912831,MY 737912832,737915903,IN 737915904,737916927,TW 737916928,737917951,JP @@ -7107,8 +7727,8 @@ 738135040,738136063,TW 738136064,738137087,CN 738137088,738138111,BD -738138112,738139135,NZ -738139136,738140159,SG +738138112,738138367,US +738138368,738139135,NZ 738140160,738141183,AU 738141184,738142207,HK 738142208,738143231,JP @@ -7116,8 +7736,13 @@ 738144256,738145279,CN 738145280,738146303,HK 738146304,738147327,IN -738147328,738152447,CN -738152448,738153471,HK +738147328,738148095,CN +738148096,738148351,AU +738148352,738152447,CN +738152448,738152703,JP +738152704,738152959,AU +738152960,738153215,JP +738153216,738153471,AU 738153472,738154495,CN 738154496,738156543,TW 738156544,738157567,CN @@ -7134,7 +7759,6 @@ 738168832,738169855,CN 738169856,738170879,TO 738170880,738171903,SG -738171904,738172927,HK 738172928,738173951,NZ 738173952,738174975,IN 738174976,738175999,CN @@ -7153,25 +7777,59 @@ 738193408,738194431,TH 738194432,738195455,CN 738195456,738197503,KR -738197504,746717183,US -746717184,746782719,DE -746782720,747175935,US +738197504,747175935,US 747175936,747241471,NL -747241472,757186559,US +747241472,755105791,US +755105792,755179519,CA +755179520,755236863,US +756023296,757071871,US +757071872,757088255,NL +757088256,757090303,US +757090304,757104639,NL +757104640,757106687,US +757106688,757121535,NL +757121536,757121791,US +757121792,757122047,NL +757122048,757122303,US +757122304,757125631,NL +757125632,757126655,US +757126656,757133311,NL +757133312,757135359,AU +757135360,757137407,JP +757137408,757186559,US 757186560,757190655,CA -757194752,757600255,US +757190656,757600255,US 757600256,757604351,CA 757604352,757612543,US 757612544,757616639,CA -757616640,757686271,US +757616640,757645311,US +757645312,757645567,NZ +757645568,757661695,US +757661696,757661951,NZ +757661952,757662719,US +757662720,757662975,IN +757662976,757686271,US 757686272,757694463,CA -757694464,757729279,US +757694464,757696255,US +757696256,757696511,JP +757696512,757697535,DE +757697536,757711871,US +757711872,757712127,AU +757712128,757714175,US +757714176,757714431,JP +757714432,757716735,US +757716736,757716991,NZ +757716992,757721599,US +757721600,757721855,PH +757721856,757727231,US +757727232,757727743,VI +757727744,757729279,US 757729280,757731327,CA 757731328,757733375,US 757733376,757734399,CA 757734400,757736447,US 757736448,757737471,CA -757737472,757744639,US +757737472,757745663,US 757745664,757747711,CA 757747712,757751807,US 757751808,757759999,CA @@ -7179,73 +7837,181 @@ 757760256,757760511,ML 757760512,757761535,US 757761536,757761791,MW -757761792,757762815,US +757761792,757762047,US +757762048,757762303,MV +757762304,757762559,JP +757762560,757762815,PH 757762816,757763071,CD -757763072,757764095,US +757763072,757763327,US +757763328,757763583,PA +757763584,757763839,MN +757763840,757764095,VA 757764096,757764351,ZW 757764352,757765375,US 757765376,757765631,SD -757765632,757766655,US +757765632,757765887,US +757765888,757766143,KP +757766144,757766655,US 757766656,757766911,BI -757766912,757767935,US +757766912,757767167,US +757767168,757767423,CC +757767424,757767935,US 757767936,757768191,MU -757768192,757769215,US +757768192,757768447,US +757768448,757768703,AD +757768704,757769215,US 757769216,757769471,SL -757769472,757770495,US +757769472,757769727,US +757769728,757769983,NZ +757769984,757770239,GU +757770240,757770495,US 757770496,757770751,TG -757770752,757771775,US +757770752,757771007,US +757771008,757771263,FJ +757771264,757771519,CW +757771520,757771775,SB 757771776,757772031,ER -757772032,757773055,US +757772032,757772287,US +757772288,757772543,NR +757772544,757773055,US 757773056,757773311,MR 757773312,757774335,US 757774336,757774591,LR -757774592,757858303,US +757774592,757774847,US +757774848,757775103,MC +757775104,757776639,US +757776640,757776767,GQ +757776768,757777919,US +757777920,757778047,LS +757778048,757779199,US +757779200,757779327,CV +757779328,757780479,US +757780480,757780607,CF +757780608,757780991,US +757780992,757781247,SM +757781248,757781503,US +757781504,757781759,TO +757781760,757781887,GW +757781888,757783039,US +757783040,757783167,GM +757783168,757783551,US +757783552,757783807,TV +757783808,757784319,US +757784320,757784447,KM +757784448,757784831,US +757784832,757785087,CG +757785088,757785599,US +757785600,757785727,ST +757785728,757786111,US +757786112,757786367,AR +757786368,757786879,US +757786880,757787007,SO +757787008,757788159,US +757788160,757788287,LK +757788288,757789439,US +757789440,757789567,NP +757789568,757790975,US +757790976,757791231,WS +757791232,757858303,US 757858304,757956607,CA -757956608,758683647,US +757956608,757956863,HK +757956864,757957119,DE +757957120,757957631,US +757957632,757957887,JP +757957888,757958143,GB +757958144,757958399,US +757958400,757958655,DE +757958656,757959679,US +757959680,757959935,IT +757959936,757960191,GB +757960192,757961471,US +757961472,757961727,HK +757961728,757962239,US +757962240,757962495,GB +757962496,757964031,US +757964032,757964287,GB +757964288,757965311,US +757965312,757965567,IN +757965568,757967103,US +757967104,757967359,FR +757967360,757968127,US +757968128,757968383,FR +757968384,757969151,US +757969152,757969407,FR +757969408,757971199,US +757971200,757971455,FR +757971456,758682111,US +758682112,758682367,PH +758682368,758683647,US 758683648,758683903,HK 758683904,758684159,SG -758684160,758779903,US +758684160,758684671,US +758684672,758684927,BR +758684928,758685183,IN +758685184,758685439,AU +758685440,758685695,JP +758685696,758691839,US +758691840,758693887,DE +758693888,758779903,US 758779904,758783999,CA -758784000,758796287,US +758784000,758785023,US +758785024,758785535,CA +758785536,758796287,US 758796288,758804479,CA 758804480,758824959,US 758824960,758841343,CA -758841344,758874367,US +758841344,758847487,US +758847488,758847743,NL +758847744,758847999,US +758848000,758848255,CA +758848256,758874367,US 758874368,758874623,AM 758874624,758875391,US 758875392,758875647,AO -758875648,758875903,US +758875648,758875903,BT 758875904,758876159,AZ -758876160,758876671,US +758876160,758876415,AU +758876416,758876671,US 758876672,758876927,SD -758876928,758877439,US +758876928,758877183,MH +758877184,758877439,US 758877440,758877695,KZ -758877696,758878207,US +758877696,758877951,IR +758877952,758878207,PG 758878208,758878463,ET -758878464,758878975,US +758878464,758878719,TO +758878720,758878975,KH 758878976,758879231,KG -758879232,758879743,US +758879232,758879487,US +758879488,758879743,GG 758879744,758879999,CD -758880000,758880511,US +758880000,758880255,SJ +758880256,758880511,AS 758880512,758880767,UZ -758880768,758881535,US +758880768,758881023,GN +758881024,758881535,US 758881536,758881791,PH -758881792,758882047,US +758881792,758882047,CG 758882048,758882303,TM -758882304,758882815,US +758882304,758882559,US +758882560,758882815,CV 758882816,758883071,ZM 758883072,758883583,US 758883584,758883839,TJ -758883840,758884351,US +758883840,758884095,LI +758884096,758884351,MQ 758884352,758884607,MZ -758884608,758885119,US +758884608,758884863,GP +758884864,758885119,RE 758885120,758885375,CN -758885376,758885887,US +758885376,758885631,WF +758885632,758885887,KM 758885888,758886143,SN -758886144,758886655,US +758886144,758886399,TF +758886400,758886655,PA 758886656,758886911,DZ 758886912,758887167,NE -758887168,758887423,US +758887168,758887423,GI 758887424,758887679,TD 758887680,758888191,US 758888192,758888447,LY @@ -7253,13 +8019,18 @@ 758888704,758888959,TZ 758888960,758889215,US 758889216,758889471,MG -758889472,758889727,US +758889472,758889727,LA 758889728,758889983,TN 758889984,758972415,US 758972416,758976511,CA 758976512,758984703,US 758984704,758988799,CA -758988800,759047423,US +758988800,758994943,US +758994944,758996991,IN +758996992,758998015,DE +758998016,759001087,US +759001088,759005183,CN +759005184,759047423,US 759047424,759047679,IN 759047680,759048191,US 759048192,759048447,PK @@ -7338,10 +8109,63 @@ 759235584,759236607,NZ 759236608,759237631,IN 759237632,759238655,AU +759693312,759726079,US +759726080,759791615,CA +759791616,759824639,US +759824640,759824895,SA +759824896,759825151,CR +759825152,759825407,NO +759825408,759825663,BE +759825664,759828735,US +759828736,759828863,GT +759828864,759828991,SV +759828992,759829119,HN +759829120,759829247,NI +759829248,759829375,BO +759829376,759829503,PY +759829504,759829631,SR +759829632,759829759,GY +759829760,759829887,TT +759829888,759830015,GD +759830016,759830143,DM +759830144,759830271,BB +759830272,759830399,LC +759830400,759830527,DO +759830528,759830655,HT +759830656,759830783,TC +759830784,759830911,CV +759830912,759831039,KY +759831040,759831167,BM +759831168,759831295,MS +759831296,759831423,AG +759831424,759831551,BY +759831552,759831679,CM +759831680,759831807,CF +759831808,759831935,US +759831936,759832063,ZW +759832064,759832191,ZM +759832192,759832319,GA +759832320,759832447,RW +759832448,759832575,BW +759832576,759832703,MZ +759832704,759832831,SZ +759832832,759832959,MW +759832960,759833087,BI +759833088,759833215,ER +759833216,759833343,LS +759833344,759840767,US +759840768,759844863,CA +759844864,759848959,US +759848960,759885823,CA +759885824,759889919,US +759889920,759955455,CA +759955456,760111103,US +760111104,760119295,CA +760119296,760127487,US +760127488,760152063,CA +760152064,760217599,US 761266176,761790463,EG -762314752,762315775,IN -762315776,762316799,JP -762316800,762320895,IN +762314752,762320895,IN 762320896,762321919,HK 762321920,762323967,IN 762323968,762324991,SG @@ -7399,7 +8223,9 @@ 762407936,762408959,CN 762408960,762409983,HK 762409984,762411007,JP -762411008,762412031,IN +762411008,762411263,IN +762411264,762411519,HK +762411520,762412031,IN 762412032,762413055,PK 762413056,762414079,HK 762414080,762415103,JP @@ -7426,7 +8252,7 @@ 762441728,762442751,CN 762442752,762443775,AU 762443776,762444799,IN -762444800,762447871,CN +762444800,762446847,CN 762447872,762448895,HK 762448896,762449919,CN 762449920,762450943,JP @@ -7446,14 +8272,529 @@ 762471424,762472447,MY 762472448,762473471,CN 762473472,762475519,JP -762475520,762476543,ID +762475520,762475775,AU +762475776,762476031,HK +762476032,762476543,ID 762476544,762478591,PK 762478592,762479615,KR 762479616,762480639,PK 762480640,762481663,CN 762481664,762486783,IN +762486784,762487807,KH +762487808,762490879,HK +762490880,762491903,IN +762491904,762492927,BD +762492928,762493951,JP +762493952,762494975,AU +762494976,762495999,IN +762496000,762498047,CN +762498048,762499071,HK +762499072,762500095,JP +762500096,762502143,IN +762502144,762503167,AU +762503168,762504191,IN +762504192,762505215,CN +762505216,762506239,BD +762506240,762507263,CN +762507264,762510335,IN +762510336,762511359,CN +762511360,762514431,IN +762514432,762515455,BD +762515456,762516479,IN +762516480,762517503,AU +762517504,762517759,US +762517760,762518015,KR +762518016,762518079,VN +762518080,762518111,ID +762518112,762519551,HK +762519552,762520575,JP +762520576,762522623,HK +762522624,762523647,CN +762523648,762523903,AU +762523904,762524159,PK +762524160,762524671,TH +762524672,762527743,IN +762527744,762528767,ID +762528768,762529791,AU +762529792,762530815,TL +762530816,762532863,IN +762532864,762533887,PK +762533888,762536959,IN +762536960,762537983,CN +762537984,762540031,IN +762540032,762541055,BD +762541056,762541567,AU +762541568,762541823,TH +762541824,762542079,IN +762542080,762543103,CN +762543104,762544127,HK +762544128,762545151,AU +762545152,762546175,CN +762546176,762547199,ID +762547200,762548223,IN +762548224,762549247,CN +762549248,762550271,IN +762550272,762551295,KR +762551296,762552319,CN +762552320,762553343,HK +762553344,762554367,CN +762554368,762560511,IN +762560512,762561535,JP +762561536,762562559,AU +762562560,762563583,CN +762563584,762564607,AU +762564608,762565631,IN +762565632,762567679,CN +762567680,762568703,IN +762568704,762569727,BD +762569728,762570751,CN +762570752,762571775,AU +762571776,762572799,CN +762572800,762573823,HK +762573824,762575871,CN +762575872,762578943,IN +762578944,762580479,HK +762580480,762580991,JP +762580992,762584063,CN +762584064,762585087,IN +762585088,762587135,CN +762587136,762588159,HK +762588160,762589183,IN +762589184,762590207,JP +762590208,762591231,CN +762591232,762592255,IN +762592256,762594303,CN +762594304,762595327,IN +762595328,762596351,JP +762596352,762598399,HK +762598400,762599423,IN +762599424,762600447,SG +762600448,762601471,JP +762601472,762603519,CN +762603520,762604543,IN +762604544,762605567,AU +762605568,762609663,IN +762609664,762610175,AF +762610176,762610431,HK +762610432,762610687,AU +762610688,762611711,JP +762611712,762612735,SG +762612736,762613759,CN +762613760,762614783,HK +762614784,762615807,IN +762615808,762616831,CN +762616832,762617855,ID +762617856,762619903,IN +762619904,762620927,HK +762620928,762622975,MY +762622976,762630143,IN +762630144,762631167,CN +762631168,762632191,HK +762632192,762633215,TH +762633216,762634239,AU +762634240,762635263,JP +762635264,762636287,IN +762636288,762637311,PK +762637312,762640383,MY +762640384,762641407,BD +762641408,762644479,IN +762644480,762645503,CN +762645504,762646527,KR +762646528,762647551,JP +762647552,762648575,CN +762648576,762649599,AU +762649600,762650623,IN +762650624,762651647,MN +762651648,762652671,NZ +762652672,762653695,CN +762653696,762656767,IN +762656768,762658815,BD +762658816,762659839,IN +762659840,762660863,CN +762660864,762661887,IN +762661888,762663935,VN +762663936,762664959,AU +762664960,762665983,PK +762665984,762667007,IN +762667008,762669055,HK +762669056,762670079,PK +762670080,762673151,IN +762673152,762674175,MY +762674176,762675199,CN +762675200,762678271,IN +762678272,762679295,JP +762679296,762680319,HK +762680320,762681343,IN +762681344,762682367,NP +762682368,762688511,VN +762688512,762690559,IN +762690560,762691583,SG +762691584,762692607,HK +762692608,762693631,MP +762693632,762700799,IN +762700800,762701823,MY +762701824,762702847,IN +762702848,762703871,MY +762703872,762705919,FJ +762705920,762706943,IN +762706944,762707967,CN +762707968,762717183,IN +762717184,762718207,PH +762718208,762719231,JP +762719232,762723327,IN +762723328,762724351,BD +762724352,762725375,AU +762725376,762726399,BD +762726400,762736639,IN +762736640,762737663,ID +762737664,762739711,IN +762739712,762740735,HK +762740736,762741759,IN +762741760,762742783,JP +762742784,762746879,VN +762746880,762754047,IN +762754048,762755071,SG +762755072,762756095,AU +762756096,762757119,NZ +762757120,762770431,IN +762770432,762771455,BD +762771456,762775551,HK +762775552,762783743,IN +762783744,762784767,KR +762784768,762786815,IN +762786816,762787839,CN +762787840,762788863,IN +762788864,762792959,CN +762792960,762796031,VN +762796032,762797055,IN +762797056,762799103,HK +762799104,762800127,NZ +762800128,762801151,CN +762801152,762802175,VN +762802176,762803199,IN +762803200,762804223,CN +762804224,762805247,BD +762805248,762806271,HK +762806272,762810367,IN +762810368,762811391,KR +762811392,762812415,IN +762812416,762814463,SG +762814464,762815487,CN +762815488,762816511,JP +762816512,762824703,IN +762824704,762825727,SG +762825728,762827775,JP +762827776,762829823,VN +762829824,762830847,AU +762830848,762832895,IN +762832896,762833919,CN +762833920,762834943,IN +762834944,762835967,VN +762835968,762838015,IN +762838016,762841087,HK +762841088,762846207,IN +762846208,762847231,HK +762847232,762848255,IN +762848256,762848511,AU +762848512,762848767,IN +762848768,762849279,BD +762849280,762850303,IN +762850304,762851327,JP +762851328,762852351,IN +762852352,762853375,HK +762853376,762855423,IN +762855424,762857471,KR +762857472,762858495,IN +762858496,762860543,HK +762860544,762861567,MM +762861568,762863615,IN +762863616,762864639,BD +762864640,762865663,CN +762865664,762866687,AU +762866688,762867711,PH +762867712,762868735,BD +762868736,762869759,NZ +762869760,762871807,IN +762871808,762872831,MY +762872832,762873855,JP +762873856,762874879,NZ +762874880,762875903,CN +762875904,762876927,IN +762876928,762877951,SG +762877952,762879231,HK +762879232,762879487,JP +762879488,762879743,HK +762879744,762879999,CN +762880000,762881023,IN +762881024,762882047,CN +762882048,762883071,HK +762883072,762884095,IN +762884096,762885119,JP +762885120,762887167,HK +762887168,762888191,IN +762888192,762890239,JP +762890240,762890495,KR +762890496,762890751,TW +762890752,762891007,HK +762891008,762891263,MY +762891264,762893311,HK +762893312,762894335,IN +762894336,762895359,HK +762895360,762896383,CN +762896384,762898431,VN +762898432,762900479,IN +762900480,762901503,CN +762901504,762902527,ID +762902528,762909695,IN +762909696,762910719,CN +762910720,762911743,VN +762911744,762912767,IN +762912768,762913791,HK +762913792,762914815,MY +762914816,762915839,ID +762915840,762916863,IN +762916864,762917887,TW +762917888,762918911,CN +762918912,762919935,HK +762919936,762920959,TH +762920960,762924031,CN +762924032,762925055,IN +762925056,762927103,HK +762927104,762928127,LK +762928128,762930175,CN +762930176,762931199,IN +762931200,762932223,CN +762932224,762938367,IN +762938368,762939391,AU +762939392,762941439,HK +762941440,762942463,MY +762942464,762943487,JP +762943488,762944511,VN +762944512,762945535,IN +762945536,762946559,VN +762946560,762947583,KR +762947584,762948607,IN +762948608,762950655,CN +762950656,762951679,AU +762951680,762952703,JP +762952704,762953727,IN +762953728,762957823,HK +762957824,762958847,AU +762958848,762959871,CN +762959872,762960895,ID +762960896,762964991,IN +762964992,762966015,KH +762966016,762981375,CN +762981376,762982399,IN +762982400,762983423,TH +762983424,762984447,HK +762984448,762985471,ID +762985472,763000831,CN +763000832,763003903,IN +763003904,763005951,HK +763005952,763010047,IN +763010048,763011071,HK +763011072,763026431,CN +763026432,763027455,VN +763027456,763028479,JP +763028480,763029503,AU +763029504,763035647,VN +763035648,763040767,IN +763040768,763041791,HK +763041792,763042815,IN +763042816,763045887,CN +763045888,763046911,BD +763046912,763059199,CN +763059200,763060223,IN +763060224,763061247,VN +763061248,763062271,MY +763062272,763063295,AU +763063296,763064319,IN +763064320,763065343,HK +763065344,763066367,TR +763066368,763067391,CN +763067392,763068415,MY +763068416,763071487,CN +763071488,763073535,IN +763073536,763076607,CN +763076608,763077631,IN +763077632,763083775,CN +763083776,763086847,HK +763086848,763087871,MO +763087872,763088895,CN +763088896,763089919,JP +763089920,763090943,CN +763090944,763091967,IN +763091968,763092991,NP +763092992,763102207,CN +763102208,763103231,IN +763103232,763104255,HK +763104256,763105279,BD +763105280,763106303,PH +763106304,763107327,CN +763107328,763108351,HK +763108352,763111423,CN +763111424,763112447,AU +763112448,763113471,CN +763113472,763114495,IN +763114496,763115519,AU +763115520,763116543,PH +763116544,763117567,JP +763117568,763118591,HK +763118592,763119615,CN +763119616,763120639,HK +763120640,763122687,CN +763122688,763125759,VN +763125760,763126783,IN +763126784,763127807,CN +763127808,763129343,IN +763129344,763129855,AU +763129856,763130879,HK +763130880,763132927,IN +763132928,763133951,CN +763133952,763134975,IN +763134976,763135999,HK +763136000,763137023,JP +763137024,763142143,IN +763142144,763143167,HK +763143168,763144191,AU +763144192,763145215,BD +763145216,763147263,CN +763147264,763152383,IN +763152384,763153407,AU +763153408,763154431,JP +763154432,763155455,CN +763155456,763156479,AU +763156480,763158527,JP +763158528,763164671,IN +763164672,763166719,CN +763166720,763169791,HK +763169792,763171839,CN +763171840,763172863,SG +763172864,763175935,CN +763175936,763177983,IN +763177984,763179007,CN +763179008,763180031,HK +763180032,763182079,CN +763182080,763183103,IN +763183104,763184127,HK +763184128,763185151,IN +763185152,763186175,HK +763186176,763194367,CN +763194368,763196415,HK +763196416,763197439,IN +763197440,763199487,AU +763199488,763201535,IN +763201536,763202559,CN +763202560,763207679,IN +763207680,763209727,HK +763209728,763210751,NZ +763210752,763214847,IN +763214848,763215871,JP +763215872,763217919,SG +763217920,763220991,VN +763220992,763222015,IN +763222016,763223039,HK +763223040,763224063,BD +763224064,763225087,AF +763225088,763226111,TH +763226112,763227135,KR +763227136,763228159,VN +763228160,763229183,JP +763229184,763229695,NZ +763229696,763230207,IN +763230208,763231231,PH +763231232,763232255,IN +763232256,763234303,HK +763234304,763235327,IN +763235328,763236351,HK +763236352,763238399,IN +763238400,763239423,AU +763239424,763243519,IN +763243520,763244543,AU +763244544,763246591,CN +763246592,763247615,ID +763247616,763248639,SG +763248640,763250687,IN +763250688,763251711,AU +763251712,763252735,HK +763252736,763253759,ID +763253760,763254783,JP +763254784,763255807,MY +763255808,763257855,VN +763257856,763258879,CN +763258880,763259903,IN +763259904,763263999,CN +763264000,763265023,AU +763265024,763266047,NZ +763266048,763267071,ID +763267072,763268095,IN +763268096,763269119,BN +763269120,763270143,IN +763270144,763271167,KR +763271168,763272191,ID +763272192,763273215,JP +763273216,763274239,IN +763274240,763275263,SG +763275264,763278335,IN +763278336,763279359,HK +763279360,763280383,ID +763280384,763281407,IN +763281408,763282431,AU +763282432,763285503,IN +763285504,763286527,SG +763286528,763287551,CN +763287552,763288575,HK +763288576,763289599,CN +763289600,763290623,TH +763290624,763291647,HK +763291648,763293695,IN +763293696,763294719,HK +763294720,763297023,IN +763297024,763297279,AF +763297280,763297791,IN +763297792,763298815,HK +763298816,763299839,MY +763299840,763301887,CN +763301888,763304959,IN +763304960,763305983,JP +763305984,763307007,SG +763307008,763308031,CN +763308032,763310079,IN +763310080,763311103,BD +763311104,763321343,IN +763321344,763322367,HK +763322368,763323391,CN +763323392,763326463,IN +763326464,763327487,US +763327488,763328511,CN +763328512,763329535,IN +763329536,763331583,CN +763331584,763332607,ID +763332608,763333631,IN +763333632,763334655,AU +763334656,763336703,CN +763336704,763337727,KH +763337728,763338751,CN +763338752,763339775,HK +763339776,763340799,PH +763340800,763341823,SG +763341824,763342847,AU +763342848,763343871,HK +763343872,763344895,AU +763344896,763345919,HK +763345920,763350015,IN +763350016,763351039,HK +763351040,763353087,IN +763353088,763354111,CN +763354112,763360255,IN +763360256,763362303,BD +763362304,763363327,VN 767557632,768606207,ZA +768606208,768868351,GH +768868352,769130495,ZM 769130496,769392639,MA +770703360,771227647,EG 771751936,771817471,RU 771817472,771948543,TR 771948544,772014079,RU @@ -7466,7 +8807,9 @@ 772285184,772285439,UZ 772285440,772285695,RU 772285696,772285951,GR -772285952,772296703,RU +772285952,772286719,RU +772286720,772286975,LB +772286976,772296703,RU 772296704,772300799,UA 772300800,772341759,RU 772341760,772407295,NO @@ -7475,9 +8818,7 @@ 772538368,772603903,GR 772603904,772669439,CZ 772669440,772734975,CH -772734976,772753663,NO -772753664,772753919,RU -772753920,772800511,NO +772734976,772800511,NO 772800512,772802559,GB 772802560,772804607,RU 772804608,772806655,GL @@ -7536,7 +8877,9 @@ 772917248,772919295,RU 772919296,772923391,GB 772923392,772925439,AT -772925440,772927487,GB +772925440,772926975,GB +772926976,772927231,ZW +772927232,772927487,GB 772927488,772929535,UA 772929536,772931583,RU 772931584,772933631,UA @@ -7601,8 +8944,10 @@ 773054464,773055231,AL 773055232,773055487,RS 773055488,773055871,AL -773055872,773056255,RS -773056256,773056511,AL +773055872,773055999,RS +773056000,773056007,AL +773056008,773056009,RS +773056010,773056511,AL 773056512,773058559,IT 773058560,773060607,BE 773060608,773062655,DK @@ -7621,9 +8966,15 @@ 773111808,773115903,TJ 773115904,773119999,PS 773120000,773124095,GB -773124096,773124607,DE -773124608,773124863,CH -773124864,773132287,DE +773124096,773125247,CH +773125248,773125375,GB +773125376,773125503,CH +773125504,773125567,GB +773125568,773125855,CH +773125856,773125887,RU +773125888,773126143,FR +773126144,773128191,CH +773128192,773132287,DE 773132288,773134335,IT 773134336,773135359,CH 773135360,773136383,IT @@ -7810,18 +9161,18 @@ 773828608,773830655,HU 773830656,773832703,NO 773832704,773834751,FR -773834752,773835519,GB -773835520,773835775,IM -773835776,773836031,GB -773836032,773836543,IM -773836544,773836799,GB +773834752,773835007,GB +773835008,773835263,IM +773835264,773835775,GB +773835776,773836031,IM +773836032,773836543,GB +773836544,773836799,IM 773836800,773838847,FR 773838848,773840895,DE 773840896,773842943,GB 773842944,773844991,EU -773844992,773845247,GB -773845248,773845503,GG -773845504,773846015,GB +773844992,773845759,GB +773845760,773846015,JE 773846016,773846527,GG 773846528,773847039,GB 773847040,773849087,IT @@ -7837,7 +9188,13 @@ 773931008,773934591,DE 773934592,773935352,FR 773935353,773935353,US -773935354,773938231,FR +773935354,773935728,FR +773935729,773935729,GB +773935730,773937663,FR +773937664,773937664,DE +773937665,773937673,FR +773937674,773937674,IE +773937675,773938231,FR 773938232,773938239,GB 773938240,773939199,FR 773939200,773947391,CZ @@ -7846,9 +9203,13 @@ 773963776,773971967,ME 773971968,773980159,UA 773980160,773988351,GB -773988352,774000823,ES +773988352,773997823,ES +773997824,773998079,NL +773998080,774000639,ES +774000640,774000823,NL 774000824,774000824,GB -774000825,774001663,ES +774000825,774000895,NL +774000896,774001663,ES 774001664,774002687,NL 774002688,774002815,ES 774002816,774002842,NL @@ -7876,163 +9237,8 @@ 774135808,774143999,IR 774144000,774152191,KZ 774152192,774160383,BA -774160384,774160415,VA -774160416,774160448,LI -774160449,774160458,IM -774160459,774160468,CA -774160469,774160480,MX -774160481,774160514,IS -774160515,774160547,MX -774160548,774160580,AE -774160581,774160612,MX -774160613,774160639,AT -774160640,774160671,GI -774160672,774160702,CY -774160703,774160735,CH -774160736,774160768,GR -774160769,774160801,IL -774160802,774160802,A1 -774160803,774160832,BG -774160833,774160864,NO -774160865,774160869,BR -774160870,774160873,CA -774160874,774160895,CR -774160896,774160927,PA -774160928,774160935,MW -774160936,774160946,BS -774160947,774160956,KY -774160957,774160966,JM -774160967,774160976,PR -774160977,774160986,VG -774160987,774160996,CO -774160997,774161006,GT -774161007,774161016,CN -774161017,774161026,EG -774161027,774161036,FJ -774161037,774161046,IN -774161047,774161056,MH -774161057,774161066,JP -774161067,774161076,MX -774161077,774161086,NZ -774161087,774161096,MY -774161097,774161106,PE -774161107,774161116,PH -774161117,774161126,SA -774161127,774161136,SC -774161137,774161146,SG -774161147,774161149,BY -774161150,774161151,A1 -774161152,774161162,AQ -774161163,774161172,KR -774161173,774161182,TH -774161183,774161192,QA -774161193,774161202,VI -774161203,774161212,BM -774161213,774161222,BB -774161223,774161232,AW -774161233,774161242,BZ -774161243,774161252,MC -774161253,774161262,GB -774161263,774161272,TR -774161273,774161282,MT -774161283,774161292,SE -774161293,774161302,HK -774161303,774161312,A1 -774161313,774161322,IE -774161323,774161332,PK -774161333,774161337,KW -774161338,774161342,JO -774161343,774161347,OM -774161348,774161352,ID -774161353,774161357,TW -774161358,774161362,AI -774161363,774161367,KN -774161368,774161372,GD -774161373,774161377,DO -774161378,774161382,PY -774161383,774161387,EE -774161388,774161392,LU -774161393,774161397,SK -774161398,774161402,A1 -774161403,774161405,LC -774161406,774161408,A1 -774161409,774161418,US -774161419,774161428,GL -774161429,774161438,HU -774161439,774161448,MK -774161449,774161458,PS -774161459,774161468,UZ -774161469,774161478,MS -774161479,774161488,US -774161489,774161498,MN -774161499,774161518,US -774161519,774161528,TW -774161529,774161538,DO -774161539,774161548,PY -774161549,774161558,EE -774161559,774161566,BR -774161567,774161568,SK -774161569,774161578,LC -774161579,774161588,VE -774161589,774161598,TC -774161599,774161618,US -774161619,774161628,A1 -774161629,774161638,PA -774161639,774161648,RU -774161649,774161658,HK -774161659,774161664,A1 -774161665,774161674,US -774161675,774161675,CL -774161676,774161684,A1 -774161685,774161694,GR -774161695,774161704,AG -774161705,774161714,AM -774161715,774161724,GB -774161725,774161734,RO -774161735,774161744,UA -774161745,774161754,AU -774161755,774161764,PG -774161765,774161774,ZA -774161775,774161784,SN -774161785,774161794,MA -774161795,774161804,BH -774161805,774161814,US -774161815,774161824,TV -774161825,774161834,US -774161835,774161844,SB -774161845,774161854,VU -774161855,774161864,MX -774161865,774161865,AR -774161866,774161869,A1 -774161870,774161874,ES -774161875,774161899,A1 -774161900,774161904,FR -774161905,774162060,A1 -774162061,774162065,US -774162066,774162105,A1 -774162106,774162110,GB -774162111,774162125,A1 -774162126,774162130,MO -774162131,774162170,A1 -774162171,774162173,GB -774162174,774162225,A1 -774162226,774162236,GB -774162237,774162246,A1 -774162247,774162256,US -774162257,774162296,A1 -774162297,774162306,GB -774162307,774162336,A1 -774162337,774162346,AZ -774162347,774162366,US -774162367,774162376,MX -774162377,774162386,GB -774162387,774162387,ZW -774162388,774162395,DE -774162396,774162396,ZW -774162397,774162406,SZ -774162407,774162416,SD -774162417,774162426,BF -774162427,774162432,A1 +774160384,774162431,GB +774162432,774162432,A1 774162433,774162442,GB 774162443,774162452,BA 774162453,774162462,BO @@ -8188,9 +9394,7 @@ 774504448,774520831,RU 774520832,774537215,BH 774537216,774553599,RU -774553600,774558719,KZ -774558720,774558975,RO -774558976,774569983,KZ +774553600,774569983,KZ 774569984,774586367,GB 774586368,774602751,PS 774602752,774619135,GB @@ -8210,7 +9414,7 @@ 774864896,774881279,CZ 774881280,774963199,RU 774963200,774995967,GE -774995968,775028735,RO +774995968,775028735,SA 775028736,775061503,PT 775061504,775094271,RU 775094272,775127039,RO @@ -8254,40 +9458,39 @@ 778043392,778108927,UA 778108928,778174463,RO 778174464,778239999,UA -778240000,778242815,AL -778242816,778243327,RS -778243328,778244095,AL -778244096,778244351,RS -778244352,778245119,AL -778245120,778245375,RS -778245376,778249727,AL -778249728,778249983,RS -778249984,778304305,AL +778240000,778304305,AL 778304306,778304306,SI 778304307,778305535,AL 778305536,778371071,IR 778371072,778403839,GB 778403840,778436607,DE 778436608,778461183,RO -778461184,778463231,EE +778461184,778461439,TR +778461440,778462207,EE +778462208,778462463,TR +778462464,778463231,EE 778463232,778467327,RO 778467328,778473471,IR 778473472,778475519,RO 778475520,778475775,CH 778475776,778476031,RO 778476032,778476287,MD -778476288,778481919,RO +778476288,778477567,RO +778477568,778477695,NL +778477696,778480639,RO +778480640,778480895,MD +778480896,778481663,RO +778481664,778481919,MD 778481920,778482943,GB -778482944,778484735,RO +778482944,778483199,MD +778483200,778484735,RO 778484736,778485247,IT 778485248,778485759,RO 778485760,778493951,GB 778493952,778495999,NL 778496000,778497791,RO 778497792,778498047,NL -778498048,778499049,RO -778499050,778499050,NL -778499051,778500863,RO +778498048,778500863,RO 778500864,778500991,CN 778500992,778501119,HK 778501120,778502143,RO @@ -8326,11 +9529,17 @@ 778673208,778673211,ES 778673212,778673383,FR 778673384,778673387,IT -778673388,778673751,FR +778673388,778673631,FR +778673632,778673647,DE +778673648,778673751,FR 778673752,778673759,DE 778673760,778673883,FR 778673884,778673887,ES -778673888,778675795,FR +778673888,778674767,FR +778674768,778674783,BE +778674784,778675695,FR +778675696,778675711,BE +778675712,778675795,FR 778675796,778675799,ES 778675800,778675891,FR 778675892,778675895,ES @@ -8357,17 +9566,25 @@ 778681504,778681507,DE 778681508,778681519,FR 778681520,778681523,ES -778681524,778681823,FR +778681524,778681535,FR +778681536,778681543,NL +778681544,778681823,FR 778681824,778681827,IT 778681828,778682103,FR 778682104,778682111,DE -778682112,778688627,FR +778682112,778688447,FR +778688448,778688451,CZ +778688452,778688627,FR 778688628,778688631,NL -778688632,778691619,FR +778688632,778689923,FR +778689924,778689927,DE +778689928,778691619,FR 778691620,778691623,IT 778691624,778691711,FR 778691712,778691727,GB -778691728,778692499,FR +778691728,778692143,FR +778692144,778692159,DE +778692160,778692499,FR 778692500,778692503,ES 778692504,778692519,FR 778692520,778692527,NL @@ -8383,7 +9600,9 @@ 778693428,778693431,ES 778693432,778693759,FR 778693760,778693763,ES -778693764,778695471,FR +778693764,778695135,FR +778695136,778695167,DE +778695168,778695471,FR 778695472,778695475,ES 778695476,778695839,FR 778695840,778695871,DE @@ -8391,13 +9610,17 @@ 778696440,778696447,IT 778696448,778696495,FR 778696496,778696499,ES -778696500,778696991,FR +778696500,778696811,FR +778696812,778696815,DE +778696816,778696991,FR 778696992,778696995,ES 778696996,778697067,FR 778697068,778697071,ES 778697072,778697175,FR 778697176,778697179,ES -778697180,778697815,FR +778697180,778697471,FR +778697472,778697479,CZ +778697480,778697815,FR 778697816,778697819,ES 778697820,778697955,FR 778697956,778697959,ES @@ -8409,9 +9632,7 @@ 778698704,778698707,ES 778698708,778698751,FR 778698752,778764287,TR -778764288,778823167,HU -778823168,778823423,UA -778823424,778829823,HU +778764288,778829823,HU 778829824,778895359,RO 778895360,778960895,LV 778960896,779026431,DE @@ -8432,7 +9653,7 @@ 780468224,780533759,UA 780533760,780599295,PL 780599296,780664831,CZ -780664832,780730367,FR +780664832,780730367,ES 780730368,780756170,IE 780756171,780756171,EU 780756172,780756724,IE @@ -8448,7 +9669,7 @@ 781189120,781320191,NL 781320192,781451263,RU 781451264,781455359,PL -781455360,781459455,LT +781455360,781459455,UA 781459456,781463551,IR 781463552,781467647,RU 781467648,781475839,PL @@ -8456,8 +9677,9 @@ 781479936,781484031,UA 781484032,781488127,RU 781488128,781496319,PL -781496320,781516799,RU -781516800,781520895,RO +781496320,781500415,UA +781500416,781516799,RU +781516800,781520895,SA 781520896,781524991,IS 781524992,781529087,RU 781529088,781533183,UA @@ -8523,7 +9745,7 @@ 782318592,782318719,ES 782318720,782318847,RU 782318848,782318975,IS -782318976,782319103,RU +782318976,782319103,BE 782319104,782319231,KZ 782319232,782319359,RU 782319360,782319487,MD @@ -8565,9 +9787,7 @@ 782673024,782673927,LT 782673928,782673935,RU 782673936,782675967,LT -782675968,782676735,NL -782676736,782676991,DE -782676992,782680063,NL +782675968,782680063,NL 782680064,782696447,RU 782696448,782712831,DE 782712832,782729215,RU @@ -8578,9 +9798,7 @@ 783040512,783048703,UA 783048704,783056895,RU 783056896,783065087,UA -783065088,783077887,RU -783077888,783078143,UA -783078144,783081471,RU +783065088,783081471,RU 783081472,783089663,UA 783089664,783106047,RU 783106048,783134719,UA @@ -8647,7 +9865,9 @@ 783681536,783683583,IE 783683584,783685631,DE 783685632,783687679,RU -783687680,783689727,PT +783687680,783688447,PT +783688448,783688703,ES +783688704,783689727,PT 783689728,783691775,FR 783691776,783693823,BY 783693824,783694367,GB @@ -8694,9 +9914,7 @@ 783775744,783777791,AL 783777792,783779839,RU 783779840,783781887,DK -783781888,783782655,NL -783782656,783782911,RU -783782912,783783935,NL +783781888,783783935,NL 783783936,783785983,DE 783785984,783788031,RU 783788032,783790079,NO @@ -8717,19 +9935,7 @@ 784039936,784072703,PL 784072704,784105471,RU 784105472,784138239,HR -784138240,784155487,DE -784155488,784155491,NL -784155492,784155495,BE -784155496,784155503,AT -784155504,784155511,GB -784155512,784155519,CZ -784155520,784155615,DE -784155616,784155619,NL -784155620,784155623,BE -784155624,784155631,AT -784155632,784155639,GB -784155640,784155640,CZ -784155641,784169215,DE +784138240,784169215,DE 784169216,784169231,AL 784169232,784169247,BG 784169248,784169263,CZ @@ -8761,7 +9967,11 @@ 785842176,785907711,PL 785907712,785973247,BY 785973248,786038783,MK -786038784,786104319,FR +786038784,786085119,FR +786085120,786085233,US +786085234,786085234,FR +786085235,786085375,US +786085376,786104319,FR 786104320,786169855,UA 786169856,786235391,AT 786235392,786300927,TR @@ -8773,9 +9983,11 @@ 786567168,786569215,CZ 786569216,786571263,NO 786571264,786575359,ES -786575360,786576098,GB +786575360,786575871,GB +786575872,786576098,NO 786576099,786576099,SE -786576100,786577407,GB +786576100,786576127,NO +786576128,786577407,GB 786577408,786579455,NL 786579456,786581503,RU 786581504,786583551,GB @@ -8977,7 +10189,9 @@ 787189760,787191807,CH 787191808,787192063,GB 787192064,787192319,FR -787192320,787192575,DE +787192320,787192383,EU +787192384,787192447,DE +787192448,787192575,EU 787192576,787192831,SE 787192832,787193087,EU 787193088,787193343,FI @@ -9005,14 +10219,7 @@ 787333120,787349503,DE 787349504,787365887,BG 787365888,787382271,PL -787382272,787389951,GP -787389952,787390207,MQ -787390208,787394559,GP -787394560,787394815,GF -787394816,787396095,GP -787396096,787396351,GF -787396352,787398399,GP -787398400,787398655,MQ +787382272,787398655,GP 787398656,787415039,PL 787415040,787431423,BA 787431424,787447807,SE @@ -9061,7 +10268,10 @@ 787750912,787755007,GB 787755008,787759103,NL 787759104,787767295,PS -787767296,787775487,NL +787767296,787768319,IT +787768320,787771135,NL +787771136,787771391,IT +787771392,787775487,NL 787775488,787808255,DE 787808256,787841023,IR 787841024,787843071,RU @@ -9081,12 +10291,8 @@ 787873792,787881745,SE 787881746,787881747,FR 787881748,787881983,SE -787881984,787883391,A1 -787883392,787883519,GB -787883520,787890175,A1 -787890176,787891247,SE -787891248,787891251,ES -787891252,787906559,SE +787881984,787890175,A1 +787890176,787906559,SE 787906560,787939327,GR 787939328,787972095,GB 787972096,788004863,UA @@ -9121,7 +10327,9 @@ 788234240,788242431,SA 788242432,788250623,IR 788250624,788258815,KG -788258816,788267007,DE +788258816,788261375,DE +788261376,788261631,GB +788261632,788267007,DE 788267008,788271103,SE 788271104,788275199,DE 788275200,788279295,AL @@ -9178,8 +10386,10 @@ 788455424,788457471,FR 788457472,788459519,IT 788459520,788461567,RU -788461568,788462847,JE -788462848,788465663,GB +788461568,788462335,JE +788462336,788462591,GB +788462592,788463103,JE +788463104,788465663,GB 788465664,788467711,CZ 788467712,788469759,NO 788469760,788471807,NL @@ -9207,8 +10417,8 @@ 788504576,788506623,FR 788506624,788508671,CH 788508672,788509439,AT -788509440,788510207,FR -788510208,788510719,AT +788509440,788509695,FR +788509696,788510719,AT 788510720,788512767,ES 788512768,788514815,FI 788514816,788516863,FR @@ -9220,7 +10430,9 @@ 788527104,788529151,GB 788529152,789577727,CA 789577728,790102015,US -790102016,792002559,CA +790102016,790626303,CA +790626304,791937023,US +791937024,792002559,CA 792002560,792068095,IT 792068096,792330239,CA 792330240,792723455,ES @@ -9228,18 +10440,10 @@ 793247744,793313279,NZ 793313280,793378815,DE 793378816,794558463,CA -794558464,794951679,CN -794951680,795231487,CA -795231488,795231743,US -795231744,795233023,CA -795233024,795233279,US -795233280,797873663,CA +794558464,796917759,CN +796917760,797873663,CA 797873664,797873919,US -797873920,803602431,CA -803602432,803602687,US -803602688,803864575,CA -803864576,803864831,US -803864832,805306367,CA +797873920,805306367,CA 805306368,822083583,US 822083584,822084607,ID 822085632,822087679,AU @@ -9282,8 +10486,7 @@ 830475264,830476287,AU 830476288,830480383,JP 830480384,830488575,SG -830488576,830492671,HK -830492672,830496767,TW +830488576,830496767,HK 830496768,830498815,JP 830498816,830499839,GU 830499840,830500863,IN @@ -9310,8 +10513,7 @@ 831519744,831520767,IN 831520768,832045055,PH 832045056,832307199,CN -832307456,832307711,MN -832308224,832311295,JP +832307200,832311295,JP 832311296,832315391,AU 832315392,832319487,KH 832319488,832320511,NU @@ -9362,39 +10564,28 @@ 838467584,838729727,JP 838729728,838795263,KR 838795264,838860799,AU -838860800,838995711,US -838995712,838995967,CA -838995968,838996991,US +838860800,838996991,US 838996992,838997247,CA 838997248,839016191,US 839016192,839016447,CA -839016448,839027967,US -839027968,839030015,IN -839030016,839056447,US +839016448,839056447,US 839056448,839056455,CN -839056456,839061503,US -839061504,839061759,CA -839061760,839062271,US -839062272,839064063,CA -839064064,839069183,US -839069184,839071231,CA -839071232,839095807,US -839095808,839096063,CA -839096064,839104255,US -839104256,839104511,CA -839104512,839112191,US -839112192,839112703,CA -839112704,839339607,US +839056456,839112191,US +839112192,839112447,CA +839112448,839339607,US 839339608,839339609,A1 -839339610,839348223,US +839339610,839340031,US +839340032,839341055,ES +839341056,839342079,US +839342080,839343103,DE +839343104,839348223,US 839348224,839348479,DE 839348480,839348735,AT 839348736,839348991,GB 839348992,839349247,AT 839349248,839350271,DE 839350272,839351295,NL -839351296,839351807,US -839351808,839352063,DE +839351296,839352063,DE 839352064,839352319,US 839352320,839357439,NL 839357440,839358463,FR @@ -9411,37 +10602,33 @@ 840278016,840282111,CA 840282112,840294399,US 840294400,840298495,CA -840298496,840838508,US +840298496,840836121,US +840836122,840836124,BZ +840836125,840838428,US +840838429,840838429,UA +840838430,840838453,US +840838454,840838454,UA +840838455,840838508,US 840838509,840838509,UA 840838510,840838510,US 840838511,840838512,UA 840838513,840865791,US 840865792,840866047,CA -840866048,840898047,US -840898048,840898559,CA -840898560,840909055,US -840909056,840909311,CA -840909312,840953855,US +840866048,840953855,US 840953856,840954367,JP 840954368,840956927,US 840956928,840957951,JP -840957952,842019071,US -842019072,842019199,AS -842019200,843055103,US +840957952,843055103,US 843055104,843644927,CA 843644928,844890111,US 844890112,844988415,CA -844988416,845089407,US -845089408,845089535,PR -845089536,845283327,US +844988416,845283327,US 845283328,845545471,CA 845545472,846442495,US 846442496,846446591,CA 846446592,846537727,US 846537728,846537983,A1 -846537984,846540031,US -846540032,846540287,A1 -846540288,846544127,US +846537984,846544127,US 846544128,846544383,A1 846544384,846546943,US 846546944,846547199,A1 @@ -9452,20 +10639,101 @@ 846627072,855638015,US 855638016,860905167,GB 860905168,860905171,FR -860905172,872415231,GB +860905172,867041279,GB +867041280,867172351,NO +867172352,867368959,GB +867368960,867401727,IT +867401728,869466111,GB +869466112,869531647,SA +869531648,869924863,GB +869924864,869990399,SA +869990400,870252543,GB +870252544,870318079,SA +870318080,871038975,GB +871038976,871104511,SA +871104512,872153087,GB +872153088,872284159,SA +872284160,872288871,FR +872288872,872288875,DE +872288876,872290111,FR +872290112,872290143,ES +872290144,872300031,FR +872300032,872300063,ES +872300064,872306183,FR +872306184,872306191,GB +872306192,872316797,FR +872316798,872316798,PT +872316799,872327807,FR +872327808,872327811,FI +872327812,872327815,IE +872327816,872327831,FR +872327832,872327835,IT +872327836,872330279,FR +872330280,872330283,GB +872330284,872342335,FR +872342336,872342367,ES +872342368,872415231,FR 872415232,873463807,US -873463808,873594879,IE -873594880,874250239,US -874250240,874315775,DE -874315776,876609535,US -876609536,876642303,AU -876642304,876871679,US +873463808,873725951,IE +873725952,874250239,US +874250240,874381311,DE +874381312,874512383,IE +874512384,875560959,US +875560960,875823103,IE +875823104,876478463,US +876478464,876740607,AU +876740608,876871679,US 876871680,877002751,JP 877002752,877264895,US 877264896,877330431,SG -877330432,878510079,US -878510080,878518271,DE -878518272,880877567,US +877330432,877395967,US +877395968,877527039,SG +877527040,878454527,US +878454528,878454783,BR +878454784,878456831,IE +878456832,878457855,US +878457856,878458879,AU +878458880,878459903,SG +878459904,878460927,JP +878460928,878461951,BR +878461952,878462975,DE +878462976,878463999,BR +878464000,878576895,US +878576896,878577151,IE +878577152,878577663,US +878577664,878577919,BR +878577920,878578175,JP +878578176,878578687,US +878578688,878578943,SG +878578944,878579199,AU +878579200,878649855,US +878649856,878650111,JP +878650112,878650367,SG +878650368,878651391,AU +878651392,878655487,US +878655488,878656511,JP +878656512,878657023,IE +878657024,878695423,US +878695424,878696447,SG +878696448,878702591,US +878702592,878702847,BR +878702848,878703103,AU +878703104,878703359,SG +878703360,878703615,JP +878703616,878703871,IE +878703872,878704639,US +878704640,878704895,DE +878704896,878705151,CN +878705152,878706431,US +878706432,878706447,BR +878706448,878706463,AU +878706464,878706479,SG +878706480,878706495,JP +878706496,878706511,IE +878706512,878706559,US +878706560,878706575,DE +878706576,878706591,CN +878706592,880877567,US 880877568,880878079,EU 880878080,882843337,US 882843338,882843339,EU @@ -9473,7 +10741,9 @@ 882843752,882843753,EU 882843754,882851942,US 882851943,882851943,EU -882851944,889192447,US +882851944,884998143,US +884998144,885129215,JP +885129216,889192447,US 889192448,897238054,DE 897238055,897238055,EU 897238056,905969663,DE @@ -9499,7 +10769,9 @@ 916029440,916062207,AU 916062208,916156392,IE 916156393,916156393,GB -916156394,916193279,IE +916156394,916191009,IE +916191010,916191010,GB +916191011,916193279,IE 916193280,916979711,US 916979712,917045247,JP 917045248,917110783,SG @@ -9530,8 +10802,8 @@ 921165824,921167871,JP 921167872,921169919,US 921169920,921170943,SG -921170944,921172991,US -921172992,921173247,AU +921170944,921171967,US +921171968,921173247,AU 921173248,921173503,BR 921173504,921174015,US 921174016,921305087,BR @@ -9548,7 +10820,9 @@ 921657344,921657599,JP 921657600,921658111,US 921658112,921658879,IE -921658880,921747455,US +921658880,921661951,US +921661952,921662207,IE +921662208,921747455,US 921747456,921748479,AU 921748480,921748735,US 921748736,921748991,IE @@ -9572,13 +10846,7 @@ 922189568,922205775,IE 922205776,922205776,DE 922205777,922222591,IE -922222592,922289836,JP -922289837,922289837,DE -922289838,922289844,JP -922289845,922289845,DE -922289846,922289852,JP -922289853,922289853,DE -922289854,922419199,JP +922222592,922419199,JP 922419200,922427633,SG 922427634,922427634,US 922427635,922427703,SG @@ -9732,11 +11000,18 @@ 961716224,961720319,CF 961720320,961724415,TD 961724416,961740799,ZA -961740800,961806335,BE +961740800,961781759,BE +961781760,961785855,LS +961785856,961806335,BE 961806336,961810431,MR -961810432,961826815,BE +961810432,961818623,BE +961818624,961822719,MZ +961822720,961826815,NA 961826816,961830911,NE -961830912,961892351,BE +961830912,961835007,NG +961835008,961867775,BE +961867776,961871871,TZ +961871872,961892351,BE 961892352,961896447,ZW 961896448,961900543,NG 961900544,961937407,BE @@ -9746,9 +11021,9 @@ 961950720,961953791,FI 961953792,961961983,DK 961961984,961970175,NO -961970176,961971455,BE +961970176,961971455,SE 961971456,961971711,EU -961971712,962002943,BE +961971712,962002943,SE 962002944,962035711,RU 962035712,962039807,EE 962039808,962043903,LV @@ -9759,7 +11034,9 @@ 962084864,962088959,GE 962088960,962097151,BE 962097152,962101247,IL -962101248,962134015,BE +962101248,962117631,BE +962117632,962121727,QA +962121728,962134015,BE 962134016,962138111,AE 962138112,962203647,BE 962203648,962207999,AT @@ -9781,11 +11058,11 @@ 962281472,962285567,DO 962285568,962359295,BE 962359296,962363391,IN -962363392,962364416,BE -962364417,962364417,ID -962364418,962392063,BE +962363392,962367487,ID +962367488,962392063,BE 962392064,962396159,PK -962396160,962408447,BE +962396160,962400255,PH +962400256,962408447,BE 962408448,962412543,TH 962412544,962416639,UZ 962416640,962461695,BE @@ -9815,13 +11092,7 @@ 968818688,968819711,DE 968819712,968851455,BE 968851456,968852479,US -968852480,972743935,BE -972743936,972744191,GB -972744192,972744447,BE -972744448,972744703,IN -972744704,972747263,BE -972747264,972747519,US -972747520,972748031,BE +968852480,972748031,BE 972748032,972748287,EU 972748288,973078527,BE 973078528,973209599,JP @@ -9859,6 +11130,19 @@ 978485248,978501631,TH 978501632,978518015,HK 978518016,978583551,CN +978583552,978584575,VN +978584576,978585599,HK +978585600,978587647,IN +978587648,978588671,MY +978588672,978590719,IN +978590720,978591743,PK +978591744,978592767,BD +978592768,978593791,NZ +978593792,978594815,MY +978594816,978595839,KR +978595840,978596863,NZ +978596864,978597887,HK +978597888,978599935,IN 978599936,978640895,AU 978640896,978644991,NZ 978644992,978714623,JP @@ -9958,6 +11242,46 @@ 999866368,999873941,HK 999873942,999873943,AP 999873944,999882751,HK +999882752,999883775,IN +999883776,999884799,CN +999884800,999885823,AU +999885824,999886847,IN +999886848,999887871,BD +999887872,999888895,NZ +999888896,999889407,ID +999889408,999889919,MY +999889920,999890943,BD +999890944,999891967,CN +999891968,999892991,IN +999892992,999895039,JP +999895040,999898111,HK +999898112,999902207,CN +999902208,999903231,SG +999903232,999904255,ID +999904256,999905279,MN +999905280,999906303,MM +999906304,999907327,CN +999907328,999908351,IN +999908352,999909375,BD +999909376,999910399,SG +999910400,999911423,MM +999911424,999912447,MN +999912448,999913471,CN +999913472,999914495,IN +999914496,999915519,AF +999915520,999916543,ID +999916544,999917567,TL +999917568,999918591,CN +999918592,999919615,JP +999919616,999921663,HK +999921664,999923711,CN +999923712,999924735,HK +999924736,999932927,CN +999932928,999933951,HK +999933952,999934975,BD +999934976,999935999,JP +999936000,999937023,TH +999937024,999948287,VN 999948288,1000013823,AU 1000013824,1000079359,CN 1000079360,1000341503,JP @@ -10006,10 +11330,10 @@ 1023238144,1023246335,ID 1023246336,1023279103,CN 1023279104,1023311871,IN -1023311872,1023316991,US -1023316992,1023317247,AU -1023317248,1023317759,US -1023317760,1023318015,IN +1023311872,1023315711,US +1023315712,1023315967,AU +1023315968,1023317503,US +1023317504,1023318015,IN 1023318016,1023328255,US 1023328256,1023344639,JP 1023344640,1023410175,CN @@ -10044,7 +11368,9 @@ 1023979520,1023983615,AU 1023983616,1023991551,SG 1023991552,1023991807,AP -1023991808,1023999999,SG +1023991808,1023996927,SG +1023996928,1023997183,AU +1023997184,1023999999,SG 1024000000,1024032767,PH 1024032768,1024065535,AU 1024065536,1024131071,HK @@ -10055,32 +11381,30 @@ 1024196608,1024229375,IN 1024229376,1024262143,JP 1024262144,1024327679,SG -1024327680,1024344063,US +1024327680,1024327935,US +1024327936,1024327943,AU +1024327944,1024344063,US 1024344064,1024352255,SG 1024352256,1024360447,AU 1024360448,1024361167,JP 1024361168,1024361183,HK -1024361184,1024362911,JP -1024362912,1024362943,SG -1024362944,1024363519,JP -1024363520,1024364031,AU -1024364032,1024364063,JP +1024361184,1024363519,JP +1024363520,1024363775,AU +1024363776,1024364063,JP 1024364064,1024364079,AU 1024364080,1024365055,JP 1024365056,1024365311,AP -1024365312,1024365567,JP -1024365568,1024365823,SG -1024365824,1024368639,JP -1024368640,1024369407,MY -1024369408,1024371199,JP +1024365312,1024365727,JP +1024365728,1024365759,SG +1024365760,1024371199,JP 1024371200,1024371455,PH 1024371456,1024372543,JP -1024372544,1024372607,HK -1024372608,1024373263,JP +1024372544,1024372639,HK +1024372640,1024373263,JP 1024373264,1024373279,HK -1024373280,1024375295,JP -1024375296,1024375551,AU -1024375552,1024376831,JP +1024373280,1024375551,JP +1024375552,1024375807,AU +1024375808,1024376831,JP 1024376832,1024378879,PH 1024393216,1024458751,HK 1024458752,1024491519,SG @@ -10092,10 +11416,10 @@ 1025245184,1025277951,CN 1025277952,1025294335,PH 1025294336,1025294591,JP -1025294592,1025294847,HK +1025294592,1025294847,SG 1025294848,1025295103,TH 1025295104,1025295615,CN -1025295616,1025295871,MY +1025295616,1025295871,PH 1025295872,1025296127,GB 1025296128,1025296639,FR 1025296640,1025296895,MY @@ -10104,11 +11428,14 @@ 1025297920,1025298175,NZ 1025298176,1025298943,AU 1025298944,1025299199,AE -1025299200,1025300223,AU +1025299200,1025299455,AU +1025299456,1025299711,CN +1025299712,1025300223,AU 1025300224,1025300479,SA 1025300480,1025300735,AE 1025300736,1025301247,US -1025301248,1025302527,AU +1025301248,1025301503,GB +1025301504,1025302527,AU 1025302528,1025310719,VN 1025310720,1025343487,AU 1025343488,1025376255,CN @@ -10177,9 +11504,7 @@ 1040187392,1040252927,IL 1040252928,1040318463,GR 1040318464,1040383999,CH -1040384000,1040390853,SA -1040390854,1040390854,ZA -1040390855,1040392191,SA +1040384000,1040392191,SA 1040392192,1040392447,GB 1040392448,1040400383,SA 1040400384,1040416767,GB @@ -10188,9 +11513,7 @@ 1040433152,1040449535,GB 1040449536,1040457727,FR 1040457728,1040465919,ME -1040465920,1040467071,EU -1040467072,1040467087,FR -1040467088,1040473343,EU +1040465920,1040473343,EU 1040473344,1040473599,DE 1040473600,1040474111,EU 1040474112,1040482303,CZ @@ -10206,11 +11529,11 @@ 1040777216,1040842751,IE 1040842752,1040973823,IT 1040973824,1040982015,NL -1040982016,1040982527,DK +1040982016,1040982527,A2 1040982528,1040982783,FI -1040982784,1040983551,DK +1040982784,1040983551,A2 1040983552,1040983807,EU -1040983808,1040990207,DK +1040983808,1040990207,A2 1040990208,1040998399,CY 1040998400,1041006591,EG 1041006592,1041039359,CH @@ -10224,15 +11547,15 @@ 1041268736,1041301503,NO 1041301504,1041310975,IE 1041310976,1041311231,GB -1041311232,1041335295,IE -1041335296,1041335551,GB -1041335552,1041336319,IE +1041311232,1041336319,IE 1041336320,1041336575,EU 1041336576,1041338879,IE 1041338880,1041339135,GB 1041339136,1041367039,IE 1041367040,1041498111,IT -1041498112,1041563647,SE +1041498112,1041523967,SE +1041523968,1041524223,DK +1041524224,1041563647,SE 1041563648,1041596415,PL 1041596416,1041629183,NL 1041629184,1041638655,ES @@ -10249,7 +11572,11 @@ 1041784832,1041793023,KE 1041793024,1041825791,GB 1041825792,1041842175,NL -1041842176,1041891327,GB +1041842176,1041858559,GB +1041858560,1041862655,HK +1041862656,1041866751,SG +1041866752,1041870847,JP +1041870848,1041891327,GB 1041891328,1042022399,DE 1042022400,1042087935,PT 1042087936,1042120703,TR @@ -10285,8 +11612,10 @@ 1042875392,1042879487,NL 1042879488,1042879743,US 1042879744,1042879999,NL -1042880000,1042880255,GB -1042880256,1042892863,NL +1042880000,1042880007,GB +1042880008,1042881023,NL +1042881024,1042881535,DE +1042881536,1042892863,NL 1042892864,1042893055,EU 1042893056,1042939903,NL 1042939904,1043070975,ES @@ -10315,13 +11644,9 @@ 1043476384,1043476399,DE 1043476400,1043476431,GB 1043476432,1043476447,DE -1043476448,1043483406,GB -1043483407,1043483407,CH -1043483408,1043488767,GB +1043476448,1043488767,GB 1043488768,1043496959,DE -1043496960,1043497857,GB -1043497858,1043497858,FR -1043497859,1043505151,GB +1043496960,1043505151,GB 1043505152,1043513343,NO 1043513344,1043529727,GB 1043529728,1043595263,NL @@ -10329,14 +11654,14 @@ 1043661568,1043661823,GB 1043661824,1043857407,DE 1043857408,1043890175,GB -1043890176,1043919442,A2 +1043890176,1043897343,A2 +1043897344,1043897855,NG +1043897856,1043919442,A2 1043919443,1043919443,SS 1043919444,1043921919,A2 1043921920,1043922943,IL 1043922944,1043988479,ES -1043988480,1044020223,NL -1044020224,1044020479,BE -1044020480,1044118295,NL +1043988480,1044118295,NL 1044118296,1044118303,BE 1044118304,1044118423,NL 1044118424,1044118431,BE @@ -10376,7 +11701,11 @@ 1044578624,1044578639,DE 1044578640,1044589055,GB 1044589056,1044589311,DE -1044589312,1044636671,GB +1044589312,1044592895,GB +1044592896,1044593151,DE +1044593152,1044625631,GB +1044625632,1044625647,RS +1044625648,1044636671,GB 1044636672,1044637695,DE 1044637696,1044638463,GB 1044638464,1044638719,DE @@ -10422,7 +11751,9 @@ 1044931232,1044931239,BE 1044931240,1044933499,GB 1044933500,1044933503,BE -1044933504,1044935439,GB +1044933504,1044933887,GB +1044933888,1044934143,BE +1044934144,1044935439,GB 1044935440,1044935455,BE 1044935456,1044935663,GB 1044935664,1044935671,BE @@ -10453,7 +11784,9 @@ 1045018788,1045018799,ES 1045018800,1045020671,GB 1045020672,1045037055,NO -1045037056,1045118975,GR +1045037056,1045038271,GR +1045038272,1045038335,AU +1045038336,1045118975,GR 1045118976,1045119231,US 1045119232,1045135359,GR 1045135360,1045152603,DE @@ -10463,7 +11796,9 @@ 1045154631,1045158306,DE 1045158307,1045158307,SG 1045158308,1045168127,DE -1045168128,1045233663,RU +1045168128,1045171199,RU +1045171200,1045171455,UA +1045171456,1045233663,RU 1045233664,1045241855,GB 1045241856,1045250047,IT 1045250048,1045266431,CZ @@ -10493,9 +11828,9 @@ 1045708800,1045716991,LB 1045716992,1045725183,RU 1045725184,1045733375,CZ -1045733376,1045745420,GB -1045745421,1045745421,SE -1045745422,1045748319,GB +1045733376,1045745407,GB +1045745408,1045745663,SE +1045745664,1045748319,GB 1045748320,1045748351,SE 1045748352,1045749759,GB 1045749760,1045753855,SI @@ -10514,9 +11849,7 @@ 1046052864,1046061055,GB 1046061056,1046069247,DE 1046069248,1046085631,RU -1046085632,1046150353,IL -1046150354,1046150609,LR -1046150610,1046151167,IL +1046085632,1046151167,IL 1046151168,1046216703,DE 1046216704,1046225647,NO 1046225648,1046225655,SE @@ -10551,15 +11884,15 @@ 1046485904,1046485911,DE 1046485912,1046487289,GB 1046487290,1046487290,DE -1046487291,1046487551,GB -1046487552,1046487807,DE -1046487808,1046488063,GB -1046488064,1046488319,DE -1046488320,1046489087,GB -1046489088,1046489119,DE -1046489120,1046489311,GB +1046487291,1046488319,GB +1046488320,1046488575,DE +1046488576,1046489087,GB +1046489088,1046489218,DE +1046489219,1046489219,GB +1046489220,1046489311,DE 1046489312,1046489327,ES -1046489328,1046489391,GB +1046489328,1046489343,DE +1046489344,1046489391,GB 1046489392,1046489407,IT 1046489408,1046489471,GB 1046489472,1046489487,ES @@ -10631,18 +11964,26 @@ 1046529024,1046530047,DE 1046530048,1046530973,GB 1046530974,1046530974,DE -1046530975,1046531839,GB +1046530975,1046531071,GB +1046531072,1046531327,DE +1046531328,1046531839,GB 1046531840,1046532095,DE 1046532096,1046533375,GB 1046533376,1046533383,DE -1046533384,1046535295,GB +1046533384,1046533537,GB +1046533538,1046533538,DE +1046533539,1046533887,GB +1046533888,1046534143,DE +1046534144,1046535295,GB 1046535296,1046535311,DE 1046535312,1046535439,GB 1046535440,1046535447,DE 1046535448,1046537023,GB 1046537024,1046537039,DE -1046537040,1046543103,GB -1046543104,1046543359,DE +1046537040,1046543209,GB +1046543210,1046543210,DE +1046543211,1046543343,GB +1046543344,1046543359,DE 1046543360,1046544383,GB 1046544384,1046560767,IT 1046560768,1046585343,ES @@ -10654,7 +11995,9 @@ 1046757376,1046765567,IT 1046765568,1046773759,ES 1046773760,1046781951,FR -1046781952,1046798335,GB +1046781952,1046790143,GB +1046790144,1046792191,CN +1046792192,1046798335,GB 1046798336,1046806527,HU 1046806528,1046814719,IT 1046814720,1046822911,SE @@ -10662,7 +12005,9 @@ 1046839296,1046847487,BA 1046847488,1046855679,ES 1046855680,1046872063,NO -1046872064,1046904831,EU +1046872064,1046898943,EU +1046898944,1046899199,GB +1046899200,1046904831,EU 1046904832,1046908927,IR 1046908928,1046910975,SE 1046910976,1046913023,IT @@ -10746,7 +12091,8 @@ 1048051712,1048117247,SA 1048117248,1048125439,GB 1048125440,1048133631,FI -1048133632,1048158207,PL +1048133632,1048150015,RO +1048150016,1048158207,PL 1048158208,1048166399,DK 1048166400,1048182783,CH 1048182784,1048184831,UA @@ -10759,9 +12105,7 @@ 1048205312,1048209407,RU 1048209408,1048211455,UA 1048211456,1048215551,PL -1048215552,1048217599,RU -1048217600,1048219647,TJ -1048219648,1048221695,RU +1048215552,1048221695,RU 1048221696,1048223743,UA 1048223744,1048225791,DK 1048225792,1048227839,CZ @@ -10773,7 +12117,9 @@ 1048246272,1048248319,NO 1048248320,1048313855,IT 1048313856,1048510463,GB -1048510464,1048575999,SE +1048510464,1048536319,SE +1048536320,1048536575,FI +1048536576,1048575999,SE 1048576000,1048584191,DE 1048584192,1048592383,IL 1048592384,1048600575,IT @@ -10814,16 +12160,18 @@ 1049009152,1049016319,EU 1049016320,1049018367,DE 1049018368,1049018623,EU -1049018624,1049021439,DE -1049021440,1049021695,GB -1049021696,1049022463,DE +1049018624,1049020671,DE +1049020672,1049020927,GB +1049020928,1049022463,DE 1049022464,1049026815,EU 1049026816,1049029375,DE 1049029376,1049030655,EU 1049030656,1049031679,DE 1049031680,1049031743,EU 1049031744,1049031871,DE -1049031872,1049034751,EU +1049031872,1049032093,EU +1049032094,1049032094,DE +1049032095,1049034751,EU 1049034752,1049067519,EG 1049067520,1049100287,DK 1049100288,1049231359,GB @@ -10831,7 +12179,9 @@ 1049296896,1049362431,EG 1049362432,1049366527,GB 1049366528,1049368575,DE -1049368576,1049369983,GB +1049368576,1049368656,GB +1049368657,1049368657,DE +1049368658,1049369983,GB 1049369984,1049370047,DE 1049370048,1049370623,GB 1049370624,1049378815,AT @@ -10854,11 +12204,7 @@ 1049699840,1049700351,NL 1049700352,1049702399,DE 1049702400,1049706495,NL -1049706496,1049709823,GB -1049709824,1049710079,A2 -1049710080,1049710335,GB -1049710336,1049710591,A2 -1049710592,1049716735,GB +1049706496,1049716735,GB 1049716736,1049717759,IQ 1049717760,1049722879,GB 1049722880,1049731071,IS @@ -10897,14 +12243,14 @@ 1050206208,1050214399,SK 1050214400,1050272511,DE 1050272512,1050272767,EU -1050272768,1050332441,DE -1050332442,1050332442,GB -1050332443,1050470911,DE +1050272768,1050470911,DE 1050470912,1050471031,GB 1050471032,1050471039,DE 1050471040,1050471167,GB 1050471168,1050627327,DE -1050627328,1050627583,EU +1050627328,1050627401,EU +1050627402,1050627402,DE +1050627403,1050627583,EU 1050627584,1050673151,DE 1050673152,1050804223,FR 1050804224,1050869759,MK @@ -10961,7 +12307,8 @@ 1051922432,1051924479,CH 1051924480,1051948031,AT 1051948032,1051949055,CH -1051949056,1051983871,AT +1051949056,1051951103,AT +1051951104,1051983871,NL 1051983872,1051990015,EU 1051990016,1051991039,DE 1051991040,1052001279,EU @@ -10972,9 +12319,7 @@ 1052011264,1052012031,DE 1052012032,1052017535,EU 1052017536,1052017567,DE -1052017568,1052019711,EU -1052019712,1052019967,GB -1052019968,1052045311,EU +1052017568,1052045311,EU 1052045312,1052046079,DE 1052046080,1052049407,EU 1052049408,1052057599,PL @@ -10987,7 +12332,7 @@ 1052090368,1052098559,PL 1052098560,1052116991,SE 1052116992,1052119039,RU -1052119040,1052121087,RO +1052119040,1052121087,GB 1052121088,1052125183,RU 1052127232,1052129279,RU 1052129280,1052131327,BE @@ -11092,9 +12437,9 @@ 1052494592,1052498431,EU 1052498432,1052498463,RO 1052498464,1052508159,EU -1052508160,1052593663,GB -1052593664,1052593919,US -1052593920,1052641930,GB +1052508160,1052596479,GB +1052596480,1052596735,NL +1052596736,1052641930,GB 1052641931,1052641931,EU 1052641932,1052704767,GB 1052704768,1052712959,NL @@ -11103,10 +12448,9 @@ 1052778496,1052786687,RU 1052786688,1052789759,GR 1052789760,1052803071,NL -1052803072,1052803327,A2 +1052803072,1052803327,DE 1052803328,1052803583,EU -1052803584,1052809215,A2 -1052809216,1052810495,DE +1052803584,1052810495,DE 1052810496,1052810751,US 1052810752,1052811263,DE 1052811264,1052819455,RU @@ -11167,7 +12511,9 @@ 1053349376,1053349631,NL 1053349632,1053349951,EU 1053349952,1053349967,IE -1053349968,1053353407,EU +1053349968,1053352959,EU +1053352960,1053353215,IE +1053353216,1053353407,EU 1053353408,1053353423,GB 1053353424,1053353983,EU 1053353984,1053354239,IL @@ -11347,8 +12693,8 @@ 1053900800,1053917183,NO 1053917184,1053925375,UZ 1053925376,1053927159,SE -1053927160,1053927167,FI -1053927168,1053933567,SE +1053927160,1053927199,FI +1053927200,1053933567,SE 1053933568,1053949951,CZ 1053949952,1053968188,FR 1053968189,1053968189,PT @@ -11382,7 +12728,11 @@ 1054359552,1054367743,RO 1054367744,1054375935,FI 1054375936,1054381567,GB -1054381568,1054381823,US +1054381568,1054381571,CA +1054381572,1054381572,SG +1054381573,1054381587,CA +1054381588,1054381588,HK +1054381589,1054381823,CA 1054381824,1054384127,GB 1054384128,1054400511,DE 1054400512,1054408703,GB @@ -11494,9 +12844,7 @@ 1055916032,1055924223,RS 1055924224,1055932415,LY 1055932416,1055940607,FI -1055940608,1055941119,EG -1055941120,1055941375,US -1055941376,1055948799,EG +1055940608,1055948799,EG 1055948800,1055956991,DE 1055956992,1055965183,CZ 1055965184,1055973375,CH @@ -11551,27 +12899,19 @@ 1062219520,1062219775,IN 1062219776,1062262783,US 1062262784,1062263039,PH -1062263040,1062473731,US -1062473732,1062473732,IN -1062473733,1062486271,US +1062263040,1062486271,US 1062486272,1062486527,MX 1062486528,1062530047,US 1062530048,1062531071,EC 1062531072,1062545919,US 1062545920,1062546431,BM -1062546432,1062587135,US -1062587136,1062587391,CA -1062587392,1062597375,US +1062546432,1062597375,US 1062597376,1062597631,PR 1062597632,1062871551,US 1062871552,1062872063,PR -1062872064,1063053567,US -1063053568,1063053647,CA -1063053648,1063053663,US -1063053664,1063053743,CA -1063053744,1063053759,US -1063053760,1063053823,CA -1063053824,1063057432,US +1062872064,1063052351,US +1063052352,1063052367,CA +1063052368,1063057432,US 1063057433,1063057433,CA 1063057434,1063305727,US 1063305728,1063305983,CA @@ -11614,18 +12954,21 @@ 1064445184,1064445439,PK 1064445440,1065372927,US 1065372928,1065373183,PR -1065373184,1065519871,US +1065373184,1065519247,US +1065519248,1065519263,IN +1065519264,1065519303,US +1065519304,1065519311,IN +1065519312,1065519871,US 1065519872,1065520127,GB -1065520128,1065525791,US +1065520128,1065521407,US +1065521408,1065525247,GB +1065525248,1065525791,US 1065525792,1065525807,IN -1065525808,1065530879,US -1065530880,1065533439,TC +1065525808,1065533439,US 1065533440,1065537535,GB -1065537536,1065541631,TC -1065541632,1065547775,US -1065547776,1065548031,FK -1065548032,1065548543,TC -1065548544,1065611263,US +1065537536,1065539583,US +1065539584,1065539839,GB +1065539840,1065611263,US 1065611264,1065615359,PR 1065615360,1065811967,US 1065811968,1065820159,CA @@ -11635,14 +12978,17 @@ 1065906176,1065908223,KY 1065908224,1066254975,US 1066254976,1066255103,GB -1066255104,1066255871,US -1066255872,1066256383,A1 -1066256384,1066311679,US +1066255104,1066311679,US 1066311680,1066315775,CA 1066315776,1066352639,US 1066352640,1066355711,JM 1066355712,1066355967,BB -1066355968,1066369023,JM +1066355968,1066356479,JM +1066356480,1066356735,VG +1066356736,1066358271,JM +1066358272,1066358495,VG +1066358496,1066358527,AG +1066358528,1066369023,JM 1066369024,1066830303,US 1066830304,1066830311,SG 1066830312,1066831183,US @@ -11682,12 +13028,10 @@ 1068004608,1068017663,US 1068017664,1068018175,YE 1068018176,1068123135,US -1068123136,1068123391,BB -1068123392,1068175871,US +1068123136,1068123647,BB +1068123648,1068175871,US 1068175872,1068176383,YE -1068176384,1068179455,US -1068179456,1068179711,PR -1068179712,1068199935,US +1068176384,1068199935,US 1068199936,1068204031,CA 1068204032,1068230655,US 1068230656,1068230911,CO @@ -11705,170 +13049,45 @@ 1068481024,1068481535,PR 1068481536,1068491263,US 1068491264,1068491519,HN -1068491520,1069622866,US -1069622867,1069622867,MX -1069622868,1070701055,US +1068491520,1070701055,US 1070701056,1070701311,DO -1070701312,1070701567,HT -1070701568,1070729471,US +1070701312,1070729471,US 1070729472,1070729727,CA 1070729728,1071100927,US 1071100928,1071101951,PR 1071101952,1071106559,US 1071106560,1071106815,NL -1071106816,1071134719,US -1071134720,1071136767,HK -1071136768,1071141887,US -1071141888,1071142911,HK -1071142912,1071144959,US +1071106816,1071144959,US 1071144960,1071153151,LB -1071153152,1071157247,US -1071157248,1071158271,SG -1071158272,1071159295,US -1071159296,1071160319,SG -1071160320,1071162367,US -1071162368,1071163391,KR -1071163392,1071165439,HK -1071165440,1071166463,US -1071166464,1071167487,A2 -1071167488,1071169535,US -1071169536,1071171583,TW -1071171584,1071206911,US +1071153152,1071170815,US +1071170816,1071171071,PH +1071171072,1071206911,US 1071206912,1071207167,HK -1071207168,1071251711,US -1071251712,1071252479,HK -1071252480,1071254783,US -1071254784,1071255039,GB -1071255040,1071255295,US -1071255296,1071255525,LB +1071207168,1071255525,US 1071255526,1071255526,DE -1071255527,1071255551,LB -1071255552,1071255839,US +1071255527,1071255839,US 1071255840,1071255847,TW -1071255848,1071256319,US -1071256320,1071256575,HK -1071256576,1071258879,US -1071258880,1071259135,HK -1071259136,1071260159,US -1071260160,1071260671,GB -1071260672,1071260927,US -1071260928,1071261695,IT -1071261696,1071264767,US -1071264768,1071265791,GB -1071265792,1071267071,US -1071267072,1071267839,HK -1071267840,1071268095,US -1071268096,1071268863,NL -1071268864,1071270655,US +1071255848,1071270655,US 1071270656,1071270911,AP 1071270912,1071271167,US 1071271168,1071271263,AP 1071271264,1071271279,US 1071271280,1071271359,AP -1071271360,1071271679,US -1071271680,1071271935,TW -1071271936,1071272191,US -1071272192,1071272447,SE -1071272448,1071274239,US -1071274240,1071274495,FR -1071274496,1071278959,US +1071271360,1071278959,US 1071278960,1071278963,SG -1071278964,1071280895,US -1071280896,1071281151,HK -1071281152,1071281407,US -1071281408,1071281663,AU -1071281664,1071282943,US -1071282944,1071283199,PH -1071283200,1071283967,US -1071283968,1071284223,A2 -1071284224,1071286527,US -1071286528,1071287295,LB -1071287296,1071287551,US -1071287552,1071287807,A2 -1071287808,1071288063,US -1071288064,1071288319,FR -1071288320,1071288575,US -1071288576,1071288831,HK -1071288832,1071289087,US -1071289088,1071289343,JP -1071289344,1071289599,US -1071289600,1071289855,KR -1071289856,1071290111,US -1071290112,1071290367,KW -1071290368,1071291647,US +1071278964,1071291647,US 1071291648,1071291903,AU -1071291904,1071292159,US -1071292160,1071292415,HK -1071292416,1071293183,US -1071293184,1071293439,SG -1071293440,1071293695,US -1071293696,1071293951,SG -1071293952,1071294207,US -1071294208,1071294463,MY -1071294464,1071294719,US -1071294720,1071294975,A2 -1071294976,1071295231,US -1071295232,1071295487,TH -1071295488,1071295743,US -1071295744,1071295999,GR -1071296000,1071296255,US -1071296256,1071296511,HK -1071296512,1071296767,US -1071296768,1071297023,AE -1071297024,1071297791,US -1071297792,1071298047,IN -1071298048,1071298303,US -1071298304,1071298559,JP -1071298560,1071298815,US -1071298816,1071299071,VN -1071299072,1071299327,US -1071299328,1071299583,VN -1071299584,1071299839,US -1071299840,1071300607,FR -1071300608,1071301119,US -1071301120,1071301631,FR -1071301632,1071301887,US -1071301888,1071302143,VN -1071302144,1071306495,US -1071306496,1071306751,HK -1071306752,1071310079,US -1071310080,1071310335,SG -1071310336,1071313919,US -1071313920,1071314175,TW -1071314176,1071314687,US -1071314688,1071314943,TW -1071314944,1071315199,US -1071315200,1071315455,SG -1071315456,1071315711,US -1071315712,1071315967,JP -1071315968,1071318783,US +1071291904,1071318783,US 1071318784,1071319039,IN -1071319040,1071321087,US -1071321088,1071322111,HK -1071322112,1071415295,US -1071415296,1071417343,TW -1071417344,1071446015,US -1071446016,1071448063,NL -1071448064,1071468543,US -1071468544,1071470591,TW -1071470592,1071482879,US -1071482880,1071483119,HK -1071483120,1071483135,US -1071483136,1071484927,HK -1071484928,1071486975,US -1071486976,1071487551,HK -1071487552,1071487615,JP -1071487616,1071487647,MY -1071487648,1071487679,HK -1071487680,1071487711,SG -1071487712,1071489023,HK -1071489024,1071517695,US -1071517696,1071519743,HK -1071519744,1071522817,US +1071319040,1071472639,US +1071472640,1071476735,CA +1071476736,1071477247,US +1071477248,1071480831,CA +1071480832,1071522817,US 1071522818,1071522818,MW -1071522819,1071579391,US -1071579392,1071579647,CA -1071579648,1071727023,US +1071522819,1071726951,US +1071726952,1071726955,IE +1071726956,1071727023,US 1071727024,1071727027,GB 1071727028,1071954223,US 1071954224,1071954231,GB @@ -11888,9 +13107,7 @@ 1072157632,1072157663,DE 1072157664,1072228863,US 1072228864,1072229375,CA -1072229376,1072360703,US -1072360704,1072360959,HK -1072360960,1072361471,US +1072229376,1072361471,US 1072361472,1072361727,GB 1072361728,1072405457,US 1072405458,1072405458,A1 @@ -11907,9 +13124,7 @@ 1072926464,1072926719,CA 1072926720,1072926975,PH 1072926976,1072927487,CA -1072927488,1072927743,US -1072927744,1072927999,CA -1072928000,1072928511,US +1072927488,1072928511,US 1072928512,1072928767,CA 1072928768,1072929023,US 1072929024,1072929535,CA @@ -11918,7 +13133,9 @@ 1072931072,1072931327,US 1072931328,1072931583,CA 1072931584,1072931839,SY -1072931840,1072932607,CA +1072931840,1072932095,CA +1072932096,1072932351,US +1072932352,1072932607,CA 1072932608,1072932863,NG 1072932864,1072933887,US 1072933888,1072934399,CA @@ -11953,9 +13170,9 @@ 1073028608,1073029119,GD 1073029120,1073031423,US 1073031424,1073031935,CW -1073031936,1073034239,US -1073034240,1073034495,BB -1073034496,1073035263,US +1073031936,1073034751,US +1073034752,1073035007,BB +1073035008,1073035263,US 1073035264,1073036032,GD 1073036033,1073036543,US 1073036544,1073037055,MX @@ -11973,15 +13190,11 @@ 1073045504,1073047551,CO 1073047552,1073049599,US 1073049600,1073052671,BS -1073052672,1073075460,US -1073075461,1073075716,NL -1073075717,1073373183,US +1073052672,1073373183,US 1073373184,1073381375,CA 1073381376,1073381631,US 1073381632,1073381887,EU -1073381888,1073438207,US -1073438208,1073438463,A2 -1073438464,1073454591,US +1073381888,1073454591,US 1073454592,1073454847,KY 1073454848,1074020351,US 1074020352,1074028543,CA @@ -12108,32 +13321,29 @@ 1074937856,1074946047,CA 1074946048,1074962431,US 1074962432,1074970623,CA -1074970624,1075062936,US -1075062937,1075062937,SA -1075062938,1075147266,US -1075147267,1075147267,PK -1075147268,1075265535,US +1074970624,1075265535,US 1075265536,1075269631,KR 1075269632,1075421183,US 1075421184,1075429375,CA 1075429376,1075478527,US 1075478528,1075494911,CA -1075494912,1075558143,US -1075558144,1075558911,VI +1075494912,1075558399,US +1075558400,1075558911,VI 1075558912,1075576831,US -1075576832,1075576895,NO +1075576832,1075576895,GB 1075576896,1075576896,SE -1075576897,1075579391,NO +1075576897,1075577087,GB +1075577088,1075579391,NO 1075579392,1075579903,GB -1075579904,1075580927,NO -1075580928,1075581183,NL -1075581184,1075581439,NO -1075581440,1075581695,NL -1075581696,1075582463,NO +1075579904,1075580415,NO +1075580416,1075580671,GB +1075580672,1075580927,NO +1075580928,1075581951,NL +1075581952,1075582463,NO 1075582464,1075582719,NL 1075582720,1075583231,NO -1075583232,1075584255,NL -1075584256,1075584767,NO +1075583232,1075584511,NL +1075584512,1075584767,NO 1075584768,1075585023,NL 1075585024,1075609599,US 1075609600,1075613695,TT @@ -12165,8 +13375,10 @@ 1075988224,1075988319,US 1075988320,1075988351,CA 1075988352,1075988479,US -1075988480,1075989247,CA -1075989248,1075989503,US +1075988480,1075988991,CA +1075988992,1075989231,US +1075989232,1075989239,CA +1075989240,1075989503,US 1075989504,1075989759,CA 1075989760,1075990015,US 1075990016,1075990527,CA @@ -12232,9 +13444,7 @@ 1076174848,1076178943,BM 1076178944,1076183807,US 1076183808,1076184063,CA -1076184064,1076193279,US -1076193280,1076193535,PK -1076193536,1076194559,US +1076184064,1076194559,US 1076194560,1076194815,CA 1076194816,1076195071,US 1076195072,1076195327,IN @@ -12244,9 +13454,7 @@ 1076197120,1076197375,CA 1076197376,1076198655,US 1076198656,1076198911,AE -1076198912,1076233177,US -1076233178,1076233178,TC -1076233179,1076283903,US +1076198912,1076283903,US 1076283904,1076284159,NO 1076284160,1076307967,US 1076307968,1076308223,DE @@ -12262,19 +13470,22 @@ 1076404224,1076408063,A2 1076408064,1076408319,US 1076408320,1076412415,CA -1076412416,1076422192,US +1076412416,1076422143,US +1076422144,1076422192,GB 1076422193,1076422193,EU -1076422194,1076424703,US +1076422194,1076422399,GB +1076422400,1076424703,US 1076424704,1076428799,CA 1076428800,1076543487,US 1076543488,1076559871,CA -1076559872,1076628991,US -1076628992,1076629247,VI -1076629248,1076756479,US +1076559872,1076625407,US +1076690944,1076756479,US 1076756480,1076772863,CA 1076772864,1076850687,US 1076850688,1076850943,CA -1076850944,1076880383,US +1076850944,1076851199,US +1076851200,1076851455,CA +1076851456,1076880383,US 1076880384,1076880639,CH 1076880640,1076880895,GB 1076880896,1077055487,US @@ -12294,11 +13505,15 @@ 1077841152,1077841407,GB 1077841408,1077848575,US 1077848576,1077848831,GR -1077848832,1077852671,US -1077852672,1077852927,CA -1077852928,1077865983,US +1077848832,1077865983,US 1077865984,1077866239,CA -1077866240,1077977087,US +1077866240,1077963775,US +1077963776,1077964031,JP +1077964032,1077967103,US +1077967104,1077967359,CA +1077967360,1077967615,US +1077967616,1077967871,GB +1077967872,1077977087,US 1077977088,1077985279,CA 1077985280,1077993471,US 1077993472,1078001663,CA @@ -12353,11 +13568,7 @@ 1078287808,1078287839,CA 1078287840,1078287871,US 1078287872,1078288383,CA -1078288384,1078306559,US -1078306560,1078306815,GB -1078306816,1078312260,US -1078312261,1078312261,GB -1078312262,1078349311,US +1078288384,1078349311,US 1078349312,1078349823,PH 1078349824,1078429695,US 1078429696,1078429951,GR @@ -12390,7 +13601,9 @@ 1078738944,1078739455,VE 1078739456,1078739967,US 1078739968,1078743039,PE -1078743040,1078746111,CO +1078743040,1078743551,CO +1078743552,1078743807,US +1078743808,1078746111,CO 1078746112,1078747135,PE 1078747136,1078749183,CL 1078749184,1078751231,PE @@ -12416,9 +13629,7 @@ 1078957056,1079320575,US 1079320576,1079322831,CA 1079322832,1079322839,US -1079322840,1079327616,CA -1079327617,1079327617,US -1079327618,1079328767,CA +1079322840,1079328767,CA 1079328768,1079377919,US 1079377920,1079378943,CA 1079378944,1079379199,US @@ -12466,8 +13677,8 @@ 1079413760,1079414271,CA 1079414272,1079415039,US 1079415040,1079415295,HN -1079415296,1079416831,US -1079416832,1079418879,CA +1079415296,1079417087,US +1079417088,1079418879,CA 1079418880,1079422975,US 1079422976,1079423999,CA 1079424000,1079425791,US @@ -12475,7 +13686,9 @@ 1079426048,1079427327,US 1079427328,1079427583,CA 1079427584,1079428095,PW -1079428096,1079431679,US +1079428096,1079429295,US +1079429296,1079429311,FR +1079429312,1079431679,US 1079431680,1079432191,ZM 1079432192,1079432959,US 1079432960,1079433215,CA @@ -12506,38 +13719,30 @@ 1080024320,1080024575,CA 1080024576,1080033279,US 1080033280,1080164351,KY -1080164352,1080295423,CA -1080295424,1080498431,US -1080498432,1080498664,GB +1080164352,1080225791,CA +1080225792,1080229887,US +1080229888,1080295423,CA +1080295424,1080498664,US 1080498665,1080498665,EU -1080498666,1080498687,GB -1080498688,1080501503,US +1080498666,1080501503,US 1080501504,1080501759,EU 1080501760,1080512511,US 1080512512,1080512767,GB -1080512768,1080513535,US -1080513536,1080513791,GB -1080513792,1080552447,US -1080552448,1080552703,IN -1080552704,1080569343,US +1080512768,1080514559,US +1080514560,1080514815,GB +1080514816,1080568831,US +1080568832,1080569087,JP +1080569088,1080569343,US 1080569344,1080569599,JP -1080569600,1080569730,US -1080569731,1080569731,JP -1080569732,1080581887,US +1080569600,1080581887,US 1080581888,1080582143,AP 1080582144,1080589567,US 1080589568,1080589823,CN 1080589824,1080610559,US 1080610560,1080610815,AU -1080610816,1080613631,US -1080613632,1080613887,AU -1080613888,1080621055,US +1080610816,1080621055,US 1080621056,1080621567,AU -1080621568,1080622079,US -1080622080,1080622335,AU -1080622336,1080956773,US -1080956774,1080956774,GB -1080956775,1080957951,US +1080621568,1080957951,US 1080957952,1080958207,DE 1080958208,1080958463,BH 1080958464,1080958719,DE @@ -12550,16 +13755,9 @@ 1080968192,1080968447,BH 1080968448,1080969471,DE 1080969472,1080969727,BH -1080969728,1080970751,DE -1080970752,1080971263,A2 -1080971264,1080975039,DE -1080975040,1080975103,BJ -1080975104,1080977701,DE -1080977702,1080977702,A2 -1080977703,1080983551,DE +1080969728,1080983551,DE 1080983552,1080987647,US -1080987648,1080987903,IT -1080987904,1080988671,A2 +1080987648,1080988671,A2 1080988672,1080989951,US 1080989952,1080990207,A2 1080990208,1080999935,US @@ -12568,9 +13766,7 @@ 1081037312,1081037567,CA 1081037568,1081038335,US 1081038336,1081040895,CA -1081040896,1081122559,US -1081122560,1081122815,VI -1081122816,1081212927,US +1081040896,1081212927,US 1081212928,1081278463,CA 1081278464,1081369599,US 1081369600,1081370111,CO @@ -12630,31 +13826,25 @@ 1081597952,1081639423,US 1081639424,1081639679,DE 1081639680,1082138623,US -1082138624,1082139409,A2 -1082139410,1082139410,ZA -1082139411,1082140671,A2 +1082138624,1082140671,A2 1082140672,1082314751,US 1082314752,1082318847,CA -1082318848,1082351359,US -1082351360,1082351487,SA -1082351488,1082419455,US +1082318848,1082419455,US 1082419456,1082419711,A2 1082419712,1082683391,US 1082683392,1082687487,CA -1082687488,1082786591,US -1082786592,1082786623,HK -1082786624,1082790143,US -1082790144,1082790399,IN -1082790400,1082790911,US +1082687488,1082753023,US +1082753024,1082785791,CA +1082785792,1082790911,US 1082790912,1082791167,AU 1082791168,1082791423,IN -1082791424,1082819839,US -1082819840,1082820351,IN -1082820352,1082945535,US +1082791424,1082945535,US 1082945536,1082949631,CA -1082966016,1082982399,US +1082949632,1082982399,US 1082982400,1083015167,CA -1083015168,1083396095,US +1083015168,1083267583,US +1083267584,1083268095,JP +1083268096,1083396095,US 1083396096,1083400191,BM 1083400192,1083437055,US 1083437056,1083441151,CA @@ -12686,11 +13876,9 @@ 1085997056,1086013439,CA 1086013440,1086042111,US 1086042112,1086046207,CA -1086046208,1086309887,US -1086309888,1086310143,AU -1086310144,1086317823,US -1086317824,1086318079,CA -1086318080,1086421503,US +1086046208,1086050815,US +1086050816,1086051327,CA +1086051328,1086421503,US 1086421504,1086422015,MP 1086422016,1086922751,US 1086922752,1086930943,CA @@ -12708,113 +13896,91 @@ 1087405408,1087405423,MX 1087405424,1087413895,US 1087413896,1087413903,DE -1087413904,1087414271,US -1087414272,1087414527,GB -1087414528,1087419135,US +1087413904,1087419135,US 1087419136,1087419391,GB 1087419392,1087419903,US 1087419904,1087420159,CA -1087420160,1087432599,US -1087432600,1087432607,FR -1087432608,1087436031,US -1087436032,1087436159,NL -1087436160,1087436167,CH -1087436168,1087436287,NL -1087436288,1087440895,US +1087420160,1087430191,US +1087430192,1087430195,FR +1087430196,1087440895,US 1087440896,1087442943,PR -1087442944,1087443551,US -1087443552,1087443583,DE -1087443584,1087444223,US +1087442944,1087444223,US 1087444224,1087444479,GB -1087444480,1087460863,US -1087460864,1087461119,CA -1087461120,1087464945,US -1087464946,1087464949,GB -1087464950,1087466489,US -1087466490,1087466493,GB -1087466494,1087467291,US -1087467292,1087467295,BR -1087467296,1087496703,US +1087444480,1087466883,US +1087466884,1087466887,GB +1087466888,1087496703,US 1087496704,1087496959,CA -1087496960,1087501567,US +1087496960,1087501471,US +1087501472,1087501479,GB +1087501480,1087501567,US 1087501568,1087501695,HK 1087501696,1087508161,US 1087508162,1087508162,JP -1087508163,1087510271,US -1087510272,1087510463,CA -1087510464,1087510495,US -1087510496,1087510527,CA -1087510528,1087514623,US -1087514624,1087515391,BB -1087515392,1087515647,US -1087515648,1087516159,BB -1087516160,1087516415,US -1087516416,1087516671,BB -1087516672,1087580927,US -1087580928,1087581183,BR -1087581184,1087593983,US +1087508163,1087514623,US +1087514624,1087516671,BB +1087516672,1087593983,US 1087593984,1087594239,MX -1087594240,1087608319,US +1087594240,1087596031,US +1087596032,1087596287,DE +1087596288,1087608319,US 1087608320,1087608575,GB 1087608576,1087626111,US 1087626112,1087626239,VI -1087626240,1087643723,US -1087643724,1087643727,FR -1087643728,1087654143,US -1087654144,1087654399,VE -1087654400,1087678623,US -1087678624,1087678655,GB -1087678656,1087686655,US +1087626240,1087655167,US +1087655168,1087655295,VE +1087655296,1087686655,US 1087686656,1087686911,PR -1087686912,1087695319,US -1087695320,1087695323,GB -1087695324,1087714335,US +1087686912,1087708671,US +1087708672,1087708927,AU +1087708928,1087714335,US 1087714336,1087714367,NL 1087714368,1087715327,US 1087715328,1087717375,PA -1087717376,1087726015,US +1087717376,1087721215,US +1087721216,1087721471,MX +1087721472,1087726015,US 1087726016,1087726047,FR -1087726048,1087726096,US -1087726097,1087726097,GB -1087726098,1087735639,US -1087735640,1087735647,GB -1087735648,1087746079,US -1087746080,1087746083,HK -1087746084,1087758335,US +1087726048,1087735743,US +1087735744,1087735807,CA +1087735808,1087758335,US 1087758336,1087766527,PR -1087766528,1087798943,US +1087766528,1087783423,US +1087783424,1087783679,ZA +1087783680,1087798943,US 1087798944,1087798975,CA 1087798976,1087799295,US -1087799296,1087799372,DE +1087799296,1087799372,BE 1087799373,1087799374,US -1087799375,1087799551,DE -1087799552,1087799787,US -1087799788,1087799791,CH -1087799792,1087825663,US -1087825664,1087825919,SA -1087825920,1087837183,US -1087837184,1087837439,BR -1087837440,1087839231,US -1087839232,1087839359,GB -1087839360,1087862783,US +1087799375,1087799551,BE +1087799552,1087804159,US +1087804160,1087804415,GB +1087804416,1087837359,US +1087837360,1087837367,BR +1087837368,1087837695,US +1087837696,1087837951,BR +1087837952,1087839231,US +1087839232,1087839487,GB +1087839488,1087862783,US 1087862784,1087864831,PA 1087864832,1087873023,US -1087873024,1087873279,CA -1087873280,1087883263,US +1087873024,1087873535,CA +1087873536,1087883263,US 1087883264,1087883519,AR -1087883520,1087950111,US +1087883520,1087918511,US +1087918512,1087918519,PR +1087918520,1087950111,US 1087950112,1087950119,PR 1087950120,1088012767,US 1088012768,1088012775,PR 1088012776,1088684031,US 1088684032,1088946175,CA -1088946176,1089053183,US -1089053184,1089053439,BR -1089053440,1089054343,US -1089054344,1089054344,GB -1089054345,1089057279,US +1088946176,1089055999,US +1089056000,1089056255,AP +1089056256,1089057279,US 1089057280,1089057535,EU -1089057536,1089167359,US +1089057536,1089151231,US +1089151232,1089151487,NL +1089151488,1089167359,US 1089167360,1089171455,CA 1089171456,1089171967,A2 1089171968,1089172735,US @@ -12825,22 +13991,12 @@ 1089183232,1089183487,GB 1089183488,1089191935,US 1089191936,1089200127,CA -1089200128,1089209471,US -1089209472,1089209479,GB -1089209480,1089209487,FR -1089209488,1089209495,DE -1089209496,1089210367,US -1089210368,1089210431,JP -1089210432,1089210623,US +1089200128,1089210623,US 1089210624,1089210879,GB 1089210880,1089211391,BR 1089211392,1089219839,US 1089219840,1089220095,JP -1089220096,1089228799,US -1089228800,1089229311,GB -1089229312,1089231359,US -1089231360,1089231391,DE -1089231392,1089233919,US +1089220096,1089233919,US 1089233920,1089234175,JP 1089234176,1089235455,US 1089235456,1089235967,GB @@ -12848,8 +14004,7 @@ 1089249280,1089249535,IE 1089249536,1089250070,US 1089250071,1089250071,EU -1089250072,1089263359,US -1089263360,1089263615,FR +1089250072,1089263615,US 1089263616,1089263871,GB 1089263872,1089264127,EU 1089264128,1089264639,FR @@ -12873,9 +14028,7 @@ 1089526784,1089527039,VE 1089527040,1089579519,US 1089579520,1089580031,VE -1089580032,1089824767,US -1089824768,1089825023,VI -1089825024,1089881599,US +1089580032,1089881599,US 1089881600,1089882111,GB 1089882112,1089882623,US 1089882624,1089883135,GB @@ -12896,9 +14049,7 @@ 1090427392,1090427647,CA 1090427648,1090445311,US 1090445312,1090453503,CA -1090453504,1091798783,US -1091798784,1091799039,CN -1091799040,1091803135,US +1090453504,1091803135,US 1091803136,1091803391,CN 1091803392,1091807231,US 1091807232,1091807487,CA @@ -12917,14 +14068,12 @@ 1093033984,1093055487,US 1093055488,1093055743,AR 1093055744,1093058559,US -1093058560,1093063167,PR -1093063168,1093063679,DO -1093063680,1093066751,PR +1093058560,1093066751,PR 1093066752,1093074943,US 1093074944,1093091327,CA 1093091328,1093107967,US -1093107968,1093108479,CA -1093108480,1093108991,US +1093107968,1093108223,CA +1093108224,1093108991,US 1093108992,1093109247,CA 1093109248,1093109503,US 1093109504,1093109759,CA @@ -12960,7 +14109,7 @@ 1093120256,1093120415,US 1093120416,1093120431,CA 1093120432,1093120511,US -1093120512,1093120767,CA +1093120512,1093120767,GB 1093120768,1093121023,US 1093121024,1093122047,CA 1093122048,1093122175,US @@ -12978,8 +14127,8 @@ 1093127168,1093128447,US 1093128448,1093129215,CA 1093129216,1093130751,US -1093130752,1093131007,CA -1093131008,1093132543,US +1093130752,1093131263,CA +1093131264,1093132543,US 1093132544,1093133055,CA 1093133056,1093135359,US 1093135360,1093135615,CA @@ -13013,15 +14162,21 @@ 1093723648,1093724415,BB 1093724416,1093725183,VC 1093725184,1093730303,BB -1093730304,1093733887,US -1093733888,1093734143,A1 -1093734144,1093965960,US +1093730304,1093734053,US +1093734054,1093734054,PH +1093734055,1093965960,US 1093965961,1093965961,NL 1093965962,1093966163,US 1093966164,1093966164,NL 1093966165,1093966216,US 1093966217,1093966217,NL -1093966218,1094565887,US +1093966218,1093984294,US +1093984295,1093984295,IE +1093984296,1094074879,US +1094074880,1094075167,BR +1094075168,1094088959,US +1094088960,1094089023,PR +1094089024,1094565887,US 1094565888,1094582271,CA 1094582272,1095450623,US 1095450624,1095467007,BS @@ -13031,12 +14186,7 @@ 1096278016,1096286207,CA 1096286208,1096351231,US 1096351232,1096351743,A2 -1096351744,1096518655,US -1096518656,1096518911,A2 -1096518912,1096519167,US -1096519168,1096519423,CD -1096519424,1096519679,SL -1096519680,1096548351,US +1096351744,1096548351,US 1096548352,1096810495,CA 1096810496,1096884223,US 1096884224,1096888319,CA @@ -13052,19 +14202,27 @@ 1097768960,1097785343,CA 1097785344,1097830399,US 1097830400,1097834495,CA -1097834496,1097837197,US -1097837198,1097837198,AE -1097837199,1097896191,US -1097896192,1097897215,VI +1097834496,1097896191,US +1097896192,1097896519,VI +1097896520,1097896527,US +1097896528,1097897215,VI 1097897216,1097947135,US -1097947136,1097949183,VI +1097947136,1097947151,VI +1097947152,1097947167,US +1097947168,1097947207,VI +1097947208,1097947215,US +1097947216,1097947327,VI +1097947328,1097947391,US +1097947392,1097949183,VI 1097949184,1097951231,US 1097951232,1097953279,VI 1097953280,1098070271,US 1098070272,1098070279,GR 1098070280,1098070295,US 1098070296,1098070303,BE -1098070304,1101121535,US +1098070304,1098891623,US +1098891624,1098891631,AU +1098891632,1101121535,US 1101121536,1101121791,EC 1101121792,1101182975,US 1101182976,1101183487,YE @@ -13096,9 +14254,9 @@ 1101475840,1101479935,CO 1101479936,1101484031,US 1101484032,1101488127,CO -1101488128,1101521663,US -1101521664,1101521919,AS -1101521920,1101542399,US +1101488128,1101521407,US +1101521408,1101521663,AS +1101521664,1101542399,US 1101542400,1101542911,CO 1101542912,1101574655,US 1101574656,1101575167,EC @@ -13177,15 +14335,9 @@ 1104265216,1104265727,PH 1104265728,1104492287,US 1104492288,1104492543,PH -1104492544,1104629247,US -1104629248,1104629759,GH -1104629760,1104753151,US -1104753152,1104753407,SX -1104753408,1104842751,US +1104492544,1104842751,US 1104842752,1104844799,PR -1104844800,1104924415,US -1104924416,1104924671,IN -1104924672,1105099519,US +1104844800,1105099519,US 1105099520,1105099775,EC 1105099776,1105719295,US 1105719296,1105723391,IN @@ -13205,9 +14357,7 @@ 1106768384,1106768895,EC 1106768896,1106769919,CO 1106769920,1107239935,US -1107239936,1107240191,CN -1107240192,1107240447,A2 -1107240448,1107240959,CN +1107239936,1107240959,CN 1107240960,1107243007,US 1107243008,1107247103,TC 1107247104,1107275775,US @@ -13216,9 +14366,7 @@ 1107288064,1107292159,CA 1107292160,1107701759,US 1107701760,1107705855,CA -1107705856,1107812031,US -1107812032,1107812095,CA -1107812096,1107820543,US +1107705856,1107820543,US 1107820544,1107853311,ZA 1107853312,1107895039,US 1107895040,1107895807,GB @@ -13250,25 +14398,21 @@ 1108033536,1108041727,CA 1108041728,1108054015,US 1108054016,1108066303,CA -1108066304,1108443391,US -1108443392,1108443647,CA -1108443648,1108492287,US +1108066304,1108492287,US 1108492288,1108500479,ZA 1108500480,1108525055,US 1108525056,1108541439,CA 1108541440,1109688319,US 1109688320,1109696511,CA -1109696512,1109705928,US -1109705929,1109705929,LB -1109705930,1109707007,US +1109696512,1109705727,US +1109705728,1109705983,CG +1109705984,1109707007,US 1109707008,1109707263,JM 1109707264,1109707519,US 1109707520,1109707775,MW 1109707776,1109709823,US 1109709824,1109710847,ZM -1109710848,1109712767,US -1109712768,1109712895,A2 -1109712896,1109819391,US +1109710848,1109819391,US 1109819392,1109848831,CA 1109848832,1109849087,A1 1109849088,1109852159,CA @@ -13300,15 +14444,15 @@ 1110448640,1110448895,CA 1110448896,1110449151,US 1110449152,1110449663,CA -1110449664,1110450431,US +1110449664,1110449919,US +1110449920,1110450175,CA +1110450176,1110450431,US 1110450432,1110450943,CA 1110450944,1110451455,US 1110451456,1110451711,CA 1110451712,1110451967,US 1110451968,1110453247,CA -1110453248,1110454271,US -1110454272,1110455295,CA -1110455296,1110463999,US +1110453248,1110463999,US 1110464000,1110464767,CA 1110464768,1110465023,US 1110465024,1110465535,CA @@ -13321,26 +14465,16 @@ 1110474240,1110540287,US 1110540288,1110573055,CA 1110573056,1110587391,PR -1110587392,1110587903,US -1110587904,1110588159,PR -1110588160,1110588415,US -1110588416,1110588671,PR -1110588672,1110589439,US -1110589440,1110590207,PR -1110590208,1110590463,US -1110590464,1110590975,PR -1110590976,1110591743,US -1110591744,1110592255,PR -1110592256,1110592511,US -1110592512,1110593023,PR -1110593024,1110593791,US -1110593792,1110594047,PR -1110594048,1110594303,US -1110594304,1110594815,PR -1110594816,1110595776,US +1110587392,1110587647,US +1110587648,1110588159,PR +1110588160,1110592767,US +1110592768,1110593023,PR +1110593024,1110594815,US +1110594816,1110595071,PR +1110595072,1110595776,US 1110595777,1110598655,PR -1110598656,1110598911,US -1110598912,1110638591,PR +1110598656,1110599167,US +1110599168,1110638591,PR 1110638592,1110654463,US 1110654464,1110654719,HT 1110654720,1110663167,US @@ -13349,17 +14483,11 @@ 1110679552,1110683647,CA 1110683648,1110700031,US 1110700032,1110704127,CA -1110704128,1110852863,US -1110852864,1110853119,A2 -1110853120,1110853631,US +1110704128,1110853631,US 1110853632,1110854655,GB -1110854656,1110855679,US -1110855680,1110856703,CN -1110856704,1110857215,IN +1110854656,1110857215,US 1110857216,1110857471,DE -1110857472,1110857727,IN -1110857728,1110858751,SG -1110858752,1110859007,US +1110857472,1110859007,US 1110859008,1110859263,AU 1110859264,1110863871,US 1110863872,1110865919,JM @@ -13369,21 +14497,31 @@ 1110887424,1110887679,IE 1110887680,1110929407,US 1110929408,1110933503,BM -1110933504,1110937599,US -1110937600,1110937855,A1 -1110937856,1111195647,US +1110933504,1111195647,US 1111195648,1111212031,CA 1111212032,1111228415,US 1111228416,1111244799,AR -1111244800,1112432639,US +1111244800,1112424447,US 1112432640,1112440831,CA 1112440832,1112530943,US 1112530944,1112539135,CA -1112539136,1112873215,US +1112539136,1112869887,US +1112869888,1112870143,CA +1112870400,1112870911,US +1112871936,1112873983,US 1112873984,1112875007,CA -1112875008,1112907775,US +1112875008,1112875519,US +1112875520,1112875775,CA +1112875776,1112889855,US +1112890112,1112890367,CA +1112890368,1112907775,US 1112907776,1112907783,CA -1112907784,1113591807,US +1112907784,1112931327,US +1112931328,1112931839,CA +1112931840,1112932095,US +1112932352,1113501695,US +1113501696,1113501951,VI +1113501952,1113591807,US 1113591808,1113595903,CA 1113595904,1113596415,CL 1113596416,1113596927,GT @@ -13399,23 +14537,22 @@ 1113603328,1113603583,GT 1113603584,1113603839,US 1113603840,1113604095,CA -1113604096,1113643202,US -1113643203,1113643237,CH -1113643238,1113657343,US +1113604096,1113636863,US +1113636864,1113645055,SG +1113645056,1113653247,ID +1113653248,1113657343,US 1113657344,1113661439,CA 1113661440,1113669631,US 1113669632,1113677823,CA 1113677824,1113718783,US 1113718784,1113743359,DO -1113743360,1113752332,US -1113752333,1113752333,AE -1113752334,1113854207,US +1113743360,1113854207,US 1113854208,1113854463,CA 1113854464,1113854975,US 1113854976,1113855487,CA -1113855488,1113983999,US -1113984000,1113984255,NL -1113984256,1113997311,US +1113855488,1113984643,US +1113984644,1113984645,DE +1113984646,1113997311,US 1113997312,1114005503,CA 1114005504,1114054655,US 1114054656,1114062847,CA @@ -13430,9 +14567,11 @@ 1114512128,1114513407,US 1114513408,1114513471,SA 1114513472,1114513555,US -1114513556,1114513663,SA -1114513664,1114514175,US -1114514176,1114515455,SA +1114513556,1114513559,SA +1114513560,1114513567,US +1114513568,1114513663,SA +1114513664,1114514431,US +1114514432,1114515455,SA 1114515456,1114515463,US 1114515464,1114515471,CA 1114515472,1114517503,US @@ -13488,13 +14627,13 @@ 1116014592,1116014847,A2 1116014848,1116015871,US 1116015872,1116016127,A2 -1116016128,1116021247,US -1116021248,1116021503,CI -1116021504,1116024063,US +1116016128,1116024063,US 1116024064,1116024319,PG 1116024320,1116027135,US 1116027136,1116027903,A2 -1116027904,1116168191,US +1116027904,1116033023,US +1116033024,1116037119,HK +1116037120,1116168191,US 1116168192,1116176383,CA 1116176384,1116897279,US 1116897280,1116905471,CA @@ -13511,16 +14650,16 @@ 1117415424,1117416191,CW 1117416192,1117416447,CA 1117416448,1117416703,US -1117416704,1117419775,CA -1117419776,1117420031,US -1117420032,1117420415,CA +1117416704,1117420415,CA 1117420416,1117420447,US 1117420448,1117421567,CA 1117421568,1117458911,US 1117458912,1117458943,GB 1117458944,1117460223,US 1117460224,1117460287,GB -1117460288,1117470719,US +1117460288,1117460991,US +1117460992,1117461247,GB +1117461248,1117470719,US 1117470720,1117471231,CA 1117471232,1117480191,US 1117480192,1117480255,CA @@ -13548,8 +14687,8 @@ 1118031872,1118126335,US 1118126336,1118126591,CA 1118126592,1118130687,US -1118130688,1118131455,CA -1118131456,1118131967,US +1118130688,1118131199,CA +1118131200,1118131967,US 1118131968,1118132479,CA 1118132480,1118132991,US 1118132992,1118133247,CA @@ -13567,7 +14706,9 @@ 1118158848,1118167039,CA 1118167040,1118474239,US 1118474240,1118478335,CA -1118478336,1118515199,US +1118478336,1118483455,US +1118483456,1118484479,CA +1118484480,1118515199,US 1118515200,1118519295,CA 1118519296,1118527487,US 1118527488,1118531583,CA @@ -13577,7 +14718,9 @@ 1118543872,1118547967,CA 1118547968,1118790655,US 1118790656,1118790911,IL -1118790912,1118793471,US +1118790912,1118792431,US +1118792432,1118792447,AR +1118792448,1118793471,US 1118793472,1118793727,CO 1118793728,1118796543,US 1118796544,1118796799,GB @@ -13605,9 +14748,7 @@ 1118975488,1118975743,KE 1118975744,1118975999,A2 1118976000,1118976255,GB -1118976256,1118980095,A2 -1118980096,1118980351,GF -1118980352,1118980607,A2 +1118976256,1118980607,A2 1118980608,1118980863,TZ 1118980864,1118983423,A2 1118983424,1118983679,NI @@ -13620,9 +14761,7 @@ 1118988800,1118989055,VE 1118989056,1118989311,A2 1118989312,1118989823,KE -1118989824,1118993151,A2 -1118993152,1118993407,GY -1118993408,1118994175,A2 +1118989824,1118994175,A2 1118994176,1118994431,LR 1118994432,1119109119,US 1119109120,1119111167,CA @@ -13669,15 +14808,19 @@ 1119558144,1119558655,PR 1119558656,1119568383,US 1119568384,1119568639,GB -1119568640,1119570559,US -1119570560,1119570687,GB -1119570688,1119571967,US +1119568640,1119571967,US 1119571968,1119576063,CA 1119576064,1119580159,US 1119580160,1119584255,CA -1119584256,1120149503,US +1119584256,1119611903,US +1119611904,1119612159,BR +1119612160,1119612671,US +1119612672,1119612927,AU +1119617024,1120149503,US 1120149504,1120153599,CA -1120153600,1120274943,US +1120153600,1120159487,US +1120159488,1120159743,GB +1120159744,1120274943,US 1120274944,1120274991,CA 1120274992,1120282367,US 1120282368,1120282623,SY @@ -13695,9 +14838,7 @@ 1120307968,1120308223,PH 1120308224,1120310015,US 1120310016,1120310783,PH -1120310784,1120312063,US -1120312064,1120312319,PH -1120312320,1120312575,US +1120310784,1120312575,US 1120312576,1120312831,PH 1120312832,1120315391,US 1120315392,1120317439,SG @@ -13725,9 +14866,7 @@ 1120376480,1120376494,CA 1120376495,1120376559,US 1120376560,1120376575,CA -1120376576,1120376695,US -1120376696,1120376703,CA -1120376704,1120376831,US +1120376576,1120376831,US 1120376832,1120377087,CA 1120377088,1120377343,US 1120377344,1120377599,CA @@ -13780,9 +14919,7 @@ 1120499200,1120501247,US 1120501248,1120501503,CA 1120501504,1120509951,US -1120509952,1120515583,SV -1120515584,1120515839,GT -1120515840,1120516095,SV +1120509952,1120516095,SV 1120516096,1120517119,US 1120517120,1120517375,CN 1120517376,1120517631,AR @@ -13791,9 +14928,7 @@ 1120518144,1120534527,CA 1120534528,1120641023,US 1120641024,1120657407,CA -1120657408,1120731391,US -1120731392,1120731647,A2 -1120731648,1120737023,US +1120657408,1120737023,US 1120737024,1120737279,BS 1120737280,1120740351,US 1120740352,1120741375,TT @@ -13803,9 +14938,7 @@ 1120743424,1120743679,KN 1120743680,1120744447,US 1120744448,1120744703,KN -1120744704,1120745471,US -1120745472,1120745727,A2 -1120745728,1120854015,US +1120744704,1120854015,US 1120854016,1120862207,CA 1120862208,1120874751,US 1120874752,1120875007,A2 @@ -13817,9 +14950,7 @@ 1120877824,1120878335,US 1120878336,1120878591,A2 1120878592,1120886783,US -1120886784,1120886911,CA -1120886912,1120887039,NG -1120887040,1120894975,CA +1120886784,1120894975,CA 1120894976,1120911359,US 1120911360,1120919551,CA 1120919552,1121005567,US @@ -13836,9 +14967,7 @@ 1121253120,1121253887,CA 1121253888,1121254143,BZ 1121254144,1121255423,CA -1121255424,1121714998,US -1121714999,1121714999,KW -1121715000,1121763327,US +1121255424,1121763327,US 1121763328,1121767423,CA 1121767424,1121878015,US 1121878016,1121910783,CA @@ -13853,9 +14982,11 @@ 1122148352,1122156543,BS 1122156544,1122203135,US 1122203136,1122203391,GB -1122203392,1122412497,US -1122412498,1122412498,LB -1122412499,1122416383,US +1122203392,1122412287,US +1122412288,1122412543,AU +1122412544,1122414335,US +1122414336,1122414591,AU +1122414592,1122416383,US 1122416384,1122416639,DM 1122416640,1122417919,US 1122417920,1122418175,AU @@ -13867,7 +14998,9 @@ 1122476032,1122480127,PR 1122480128,1122497327,US 1122497328,1122497343,BR -1122497344,1122533375,US +1122497344,1122499071,US +1122499072,1122499327,PR +1122499328,1122533375,US 1122533376,1122535423,GB 1122535424,1122538495,KR 1122538496,1122635775,US @@ -13878,25 +15011,32 @@ 1123180544,1123184639,CA 1123184640,1123336191,US 1123336192,1123352575,CA -1123352576,1123534847,US +1123352576,1123394559,US +1123394560,1123394815,CA +1123394816,1123534847,US 1123534848,1123536895,AW 1123536896,1123589631,US 1123589632,1123589887,DE 1123589888,1123590143,US 1123590144,1123598335,VI -1123598336,1123635199,US -1123635200,1123635455,AU +1123598336,1123598591,CA +1123598592,1123635455,US 1123635456,1123635639,EU 1123635640,1123635640,RU -1123635641,1123635670,EU +1123635641,1123635660,EU +1123635661,1123635661,RU +1123635662,1123635670,EU 1123635671,1123635671,RU 1123635672,1123635711,EU -1123635712,1123635967,AP -1123635968,1123651583,US +1123635712,1123635887,AP +1123635888,1123635888,AU +1123635889,1123635967,AP +1123635968,1123638527,US +1123638528,1123638783,EU +1123638784,1123651583,US 1123651584,1123651839,JM 1123651840,1123652095,BB -1123652096,1123652863,JM -1123652864,1123653119,HT +1123652096,1123653119,JM 1123653120,1123653375,BB 1123653376,1123653631,JM 1123653632,1123654655,KY @@ -13938,22 +15078,20 @@ 1125117184,1125117439,MA 1125117440,1125120255,US 1125120256,1125120511,MA -1125120512,1125156304,US +1125120512,1125147624,US +1125147625,1125147625,GB +1125147626,1125156304,US 1125156305,1125156305,DE 1125156306,1125237919,US 1125237920,1125237923,GB -1125237924,1125238553,US -1125238554,1125238554,ES -1125238555,1125290241,US -1125290242,1125290242,AE -1125290243,1125454591,US -1125454592,1125454847,A2 -1125454848,1125474303,US +1125237924,1125251327,US +1125251328,1125251583,VE +1125251584,1125474303,US 1125474304,1125478399,CA 1125478400,1125481215,US 1125481216,1125481727,CA -1125481728,1125489151,US -1125489152,1125490687,CA +1125481728,1125486591,US +1125486592,1125490687,CA 1125490688,1125498879,US 1125498880,1125508095,CA 1125508096,1125508351,PA @@ -13971,9 +15109,7 @@ 1125550336,1125552127,CA 1125552128,1125572607,US 1125572608,1125576703,CA -1125576704,1125593371,US -1125593372,1125593375,GB -1125593376,1125613567,US +1125576704,1125613567,US 1125613568,1125617663,CA 1125617664,1126924287,US 1126924288,1126928383,CA @@ -13981,7 +15117,9 @@ 1126931456,1126931711,A1 1126931712,1126948863,US 1126948864,1126952959,CA -1126952960,1127677951,US +1126952960,1127147263,US +1127147264,1127147519,CA +1127147520,1127677951,US 1127677952,1127694335,CA 1127694336,1127923711,US 1127923712,1127931903,CA @@ -13991,21 +15129,21 @@ 1128641536,1128792063,CA 1128792064,1128817407,US 1128817408,1128817663,NL -1128817664,1130537215,US -1130537216,1130537471,GU -1130537472,1130537727,US -1130537728,1130537983,GU +1128817664,1130535935,US +1130535936,1130536191,FR +1130536192,1130537471,US +1130537472,1130537983,GU 1130537984,1130538751,US 1130538752,1130539007,GU -1130539008,1133226239,US -1133226240,1133226495,AS -1133226496,1133461247,US +1130539008,1133461247,US 1133461248,1133461503,CA 1133461504,1133785351,US 1133785352,1133785359,IE 1133785360,1133785439,US 1133785440,1133785471,GB -1133785472,1133789695,US +1133785472,1133785487,US +1133785488,1133785495,IE +1133785496,1133789695,US 1133789696,1133789823,GB 1133789824,1133789887,US 1133789888,1133789895,NL @@ -14024,9 +15162,7 @@ 1137278976,1137283071,CA 1137283072,1137287167,US 1137287168,1137295359,CA -1137295360,1137369343,US -1137369344,1137369599,CA -1137369600,1137369727,US +1137295360,1137369727,US 1137369728,1137369759,CA 1137369760,1137369855,US 1137369856,1137370111,CA @@ -14061,7 +15197,7 @@ 1137758208,1137758463,GB 1137758464,1137795071,US 1137795072,1137799167,A2 -1137799168,1137840127,US +1137799168,1137836031,US 1137840128,1137840383,CA 1137840384,1137868799,US 1137868800,1137872895,CA @@ -14094,9 +15230,7 @@ 1138163712,1138167807,CA 1138167808,1138175999,US 1138176000,1138180095,CA -1138180096,1138184191,US -1138184192,1138184447,SG -1138184448,1138184959,US +1138180096,1138184959,US 1138184960,1138185215,AU 1138185216,1138185727,CA 1138185728,1138185983,ZA @@ -14106,10 +15240,12 @@ 1138196480,1138204671,CA 1138204672,1138212863,US 1138212864,1138216959,CA -1138216960,1138374143,US -1138374144,1138374399,AS -1138374400,1138375167,US -1138375168,1138375679,AS +1138216960,1138373887,US +1138373888,1138374143,AS +1138374144,1138374399,US +1138374400,1138374911,AS +1138374912,1138375423,US +1138375424,1138375679,AS 1138375680,1138419711,US 1138419712,1138419967,DE 1138419968,1138499583,US @@ -14124,9 +15260,7 @@ 1138544896,1138545151,GB 1138545152,1138593791,US 1138593792,1138597887,CA -1138597888,1138600447,US -1138600448,1138600703,BE -1138600704,1138704383,US +1138597888,1138704383,US 1138704384,1138716671,CA 1138716672,1138720767,US 1138720768,1138728959,CA @@ -14146,21 +15280,23 @@ 1138950144,1139146751,US 1139146752,1139154943,GT 1139154944,1139167231,JM -1139167232,1139167743,US -1139167744,1139168767,PR +1139167232,1139167487,US +1139167488,1139168767,PR 1139168768,1139169279,US -1139169280,1139170175,PR -1139170176,1139170815,US -1139170816,1139170943,PR -1139170944,1139171071,US -1139171072,1139171327,PR -1139171328,1139179519,US +1139169280,1139169791,PR +1139169792,1139170815,US +1139170816,1139171071,PR +1139171072,1139179519,US 1139179520,1139195903,CA 1139195904,1139216383,US 1139216384,1139220479,CA 1139220480,1139265535,US 1139265536,1139269631,CA -1139269632,1145188351,US +1139269632,1145099519,US +1145099520,1145099697,SA +1145099698,1145099699,US +1145099700,1145099775,SA +1145099776,1145188351,US 1145188352,1145192447,CA 1145192448,1145242111,US 1145242112,1145242367,NO @@ -14191,41 +15327,17 @@ 1145475072,1145479167,CA 1145479168,1145503743,US 1145503744,1145520127,CA -1145520128,1145554431,US -1145554432,1145554687,CA -1145554688,1150043135,US +1145520128,1150043135,US 1150043136,1150044159,VA 1150044160,1150287871,US 1150287872,1150812159,CA 1150812160,1151889407,US 1151889408,1151897599,CA -1151897600,1151943680,US -1151943681,1151943808,GB -1151943809,1151943871,NL -1151943872,1151943935,CA -1151943936,1151943999,DE -1151944000,1151944063,HK -1151944064,1151944079,CH -1151944080,1151944095,NO -1151944096,1151944111,KR -1151944112,1151944127,US -1151944128,1151944159,AU -1151944160,1151944175,FR -1151944176,1151944575,US -1151944576,1151944703,ES -1151944704,1151945727,US -1151945728,1151945759,RU -1151945760,1151945791,IR -1151945792,1151945823,IT -1151945824,1151945855,AU -1151945856,1151945887,SE -1151945888,1151945919,US -1151945920,1151945935,JP -1151945936,1151946239,US -1151946240,1151946751,GB -1151946752,1152073727,US +1151897600,1152073727,US 1152073728,1152077823,CA -1152077824,1152114687,US +1152077824,1152085152,US +1152085153,1152085168,KN +1152085169,1152114687,US 1152114688,1152117759,CA 1152117760,1152117952,IL 1152117953,1152117953,CA @@ -14251,9 +15363,7 @@ 1157753088,1157753343,GB 1157753344,1157758207,US 1157758208,1157758463,RU -1157758464,1157912703,US -1157912704,1157912831,CA -1157912832,1157913215,US +1157758464,1157913215,US 1157913216,1157913279,CA 1157913280,1157914194,US 1157914195,1157914202,IN @@ -14274,25 +15384,31 @@ 1158121216,1158148095,US 1158148096,1158152191,CA 1158152192,1158234111,US -1158234112,1158250495,CA -1158250496,1158295807,US +1158234112,1158242047,CA +1158242048,1158242303,US +1158242304,1158249727,CA +1158249728,1158295807,US 1158295808,1158296063,GB 1158296064,1158316031,US 1158316032,1158318847,CA 1158318848,1158319103,A1 -1158319104,1158324223,CA +1158319104,1158322242,CA +1158322243,1158322243,US +1158322244,1158324223,CA 1158324224,1158340607,US 1158340608,1158344703,CA 1158344704,1158348799,US 1158348800,1158381567,CA 1158381568,1158422527,US 1158422528,1158423551,CA -1158423552,1158440959,US +1158423552,1158427647,US +1158427648,1158428159,CA +1158428160,1158440959,US +1158440960,1158441215,CA 1158441216,1158441471,US +1158441472,1158441983,CA 1158441984,1158443007,DM -1158443008,1158724607,US -1158724608,1158724863,NL -1158724864,1158774783,US +1158443008,1158774783,US 1158774784,1158784703,CA 1158784704,1158784767,US 1158784768,1158791167,CA @@ -14302,21 +15418,7 @@ 1158799360,1158807551,CA 1158807552,1158995967,US 1158995968,1159004159,CA -1159004160,1159102719,US -1159102720,1159102975,A1 -1159102976,1159112703,US -1159112704,1159112959,A1 -1159112960,1159113215,US -1159113216,1159113471,A1 -1159113472,1159113727,US -1159113728,1159113983,A1 -1159113984,1159115519,US -1159115520,1159115775,A1 -1159115776,1159117055,US -1159117056,1159117311,A1 -1159117312,1159117567,US -1159117568,1159117823,A1 -1159117824,1159213055,US +1159004160,1159213055,US 1159213056,1159217151,CA 1159217152,1159249919,US 1159249920,1159254015,PR @@ -14358,9 +15460,7 @@ 1159517696,1159517951,CA 1159517952,1159518015,US 1159518016,1159518047,CA -1159518048,1159518191,US -1159518192,1159518199,CA -1159518200,1159519743,US +1159518048,1159519743,US 1159519744,1159520255,CA 1159520256,1159521535,US 1159521536,1159521791,CA @@ -14374,15 +15474,17 @@ 1159525376,1159526399,CA 1159526400,1159527935,US 1159527936,1159528191,CA -1159528192,1159668479,US +1159528192,1159560207,US +1159560208,1159560215,MO +1159560216,1159668479,US 1159668480,1159668735,CA -1159668736,1159672319,US -1159672320,1159672831,A1 -1159672832,1159694591,US +1159668736,1159694591,US 1159694592,1159694847,CA 1159694848,1159700479,US 1159700480,1159725055,CA -1159725056,1160011775,US +1159725056,1159767039,US +1159767040,1159767295,CA +1159767296,1160011775,US 1160011776,1160019967,CA 1160019968,1160364031,US 1160364032,1160368127,CA @@ -14409,9 +15511,7 @@ 1160429568,1160486911,US 1160486912,1160487423,AU 1160487424,1160503295,US -1160503296,1160504063,A2 -1160504064,1160504319,US -1160504320,1160505343,A2 +1160503296,1160505343,A2 1160505344,1160505855,AU 1160505856,1160507391,A2 1160507392,1160547839,US @@ -14474,12 +15574,24 @@ 1161427456,1161428223,AG 1161428224,1161428991,KN 1161428992,1161429247,US -1161429248,1161429503,CA +1161429248,1161429375,CA +1161429376,1161429407,US +1161429408,1161429503,CA 1161429504,1161429951,US 1161429952,1161430015,CA 1161430016,1161430783,US -1161430784,1161431039,CA -1161431040,1161433087,A2 +1161430784,1161430879,CA +1161430880,1161430911,US +1161430912,1161430943,CA +1161430944,1161430975,US +1161430976,1161431039,CA +1161431040,1161431295,US +1161431296,1161431359,CA +1161431360,1161432063,US +1161432064,1161432126,CA +1161432127,1161432319,US +1161432320,1161432575,IN +1161432576,1161433087,US 1161433088,1161437183,CA 1161437184,1161453567,US 1161453568,1161457663,CA @@ -14508,7 +15620,9 @@ 1161831385,1161831385,UA 1161831386,1161832483,US 1161832484,1161832484,UA -1161832485,1161835225,US +1161832485,1161833967,US +1161833968,1161833975,DE +1161833976,1161835225,US 1161835226,1161835226,UA 1161835227,1161835230,US 1161835231,1161835231,PH @@ -14518,8 +15632,7 @@ 1161837568,1161837823,JP 1161837824,1161885695,US 1161885696,1161886207,JP -1161886208,1161886975,US -1161886976,1161887231,DE +1161886208,1161887231,US 1161887232,1161887743,AU 1161887744,1161925631,US 1161925632,1161925887,EC @@ -14579,8 +15692,8 @@ 1162853376,1162854399,PR 1162854400,1162858495,JM 1162858496,1162862591,US -1162862592,1162866687,PR -1162866688,1162870783,US +1162862592,1162862847,PR +1162862848,1162870783,US 1162870784,1162871295,BB 1162871296,1162879999,LC 1162880000,1162882559,DM @@ -14610,7 +15723,9 @@ 1163472896,1163479295,US 1163479296,1163479551,CA 1163479552,1163526143,US -1163526144,1163526911,CA +1163526144,1163526399,CA +1163526400,1163526655,US +1163526656,1163526911,CA 1163526912,1163527167,US 1163527168,1163527679,CA 1163527680,1163527935,US @@ -14629,7 +15744,13 @@ 1163536128,1163536383,CA 1163536384,1163537663,US 1163537664,1163538431,CA -1163538432,1163540351,US +1163538432,1163538463,US +1163538464,1163538479,CA +1163538480,1163538575,US +1163538576,1163538591,CA +1163538592,1163539199,US +1163539200,1163539455,CA +1163539456,1163540351,US 1163540352,1163540479,CA 1163540480,1163540735,US 1163540736,1163541503,CA @@ -14637,9 +15758,7 @@ 1163542016,1163542527,CA 1163542528,1163543295,US 1163543296,1163543551,CA -1163543552,1163544063,US -1163544064,1163544319,CA -1163544320,1163544831,US +1163543552,1163544831,US 1163544832,1163545087,CA 1163545088,1163545343,US 1163545344,1163545599,CA @@ -14693,7 +15812,9 @@ 1163571200,1163571967,CA 1163571968,1163572223,US 1163572224,1163572479,CA -1163572480,1163575039,US +1163572480,1163572991,US +1163572992,1163573247,CA +1163573248,1163575039,US 1163575040,1163575295,IN 1163575296,1163576575,CA 1163576576,1163579903,US @@ -14708,8 +15829,8 @@ 1163582032,1163582039,CA 1163582040,1163582079,US 1163582080,1163582111,CA -1163582112,1163582207,US -1163582208,1163583487,CA +1163582112,1163582463,US +1163582464,1163583487,CA 1163583488,1163587583,US 1163587584,1163587839,CA 1163587840,1163588351,US @@ -14722,9 +15843,7 @@ 1168138240,1168146431,JM 1168146432,1168211967,US 1168211968,1168220159,CA -1168220160,1168318719,US -1168318720,1168318975,CA -1168318976,1168321535,US +1168220160,1168321535,US 1168321536,1168321791,CA 1168321792,1168393215,US 1168393216,1168393471,CA @@ -14733,7 +15852,11 @@ 1168393520,1168393543,US 1168393544,1168393567,CA 1168393568,1168393663,US -1168393664,1168393983,CA +1168393664,1168393791,CA +1168393792,1168393935,US +1168393936,1168393943,CA +1168393944,1168393951,US +1168393952,1168393983,CA 1168393984,1168394143,US 1168394144,1168394151,CA 1168394152,1168394279,US @@ -14782,7 +15905,9 @@ 1168950272,1168951295,CA 1168951296,1168952575,US 1168952576,1168952831,CA -1168952832,1168955647,US +1168952832,1168952887,US +1168952888,1168952895,CA +1168952896,1168955647,US 1168955648,1168956415,CA 1168956416,1168957183,US 1168957184,1168957311,IN @@ -14794,8 +15919,8 @@ 1168958528,1168958559,IN 1168958560,1168960671,US 1168960672,1168960703,CA -1168960704,1168961023,US -1168961024,1168961791,CA +1168960704,1168961535,US +1168961536,1168961791,CA 1168961792,1168961807,US 1168961808,1168961815,CA 1168961816,1168961887,US @@ -14816,7 +15941,8 @@ 1169186304,1169203199,US 1169203200,1169211391,CA 1169211392,1170190335,US -1170190336,1170190847,GB +1170190336,1170190591,GB +1170190592,1170190847,US 1170190848,1170191103,JP 1170191104,1170212351,US 1170212352,1170212607,NL @@ -14824,14 +15950,15 @@ 1170227200,1170231295,NL 1170231296,1170461183,US 1170461184,1170461695,CO -1170461696,1170465791,US +1170461696,1170461951,US +1170461952,1170462719,IL +1170462720,1170465791,US 1170465792,1170466047,CY 1170466048,1170467839,US 1170467840,1170468351,DO 1170468352,1170470911,US 1170470912,1170471167,ES -1170471168,1170472703,US -1170472704,1170472959,VG +1170471168,1170472959,US 1170472960,1170481151,CA 1170481152,1170489343,US 1170489344,1170497535,CA @@ -14859,14 +15986,11 @@ 1176626112,1176626127,CA 1176626128,1176630271,US 1176630272,1176631295,CA -1176631296,1176631423,NL -1176631424,1176702975,US +1176631296,1176702975,US 1176702976,1176707071,CA 1176707072,1176731647,US 1176731648,1176735743,PR -1176735744,1176736767,A2 -1176736768,1176737023,NG -1176737024,1176738047,A2 +1176735744,1176738047,A2 1176738048,1176738303,US 1176738304,1176739071,CO 1176739072,1176739327,US @@ -14884,7 +16008,11 @@ 1176771584,1176771839,GB 1176771840,1176776703,US 1176776704,1176780799,CA -1176780800,1176895487,US +1176780800,1176867583,US +1176867584,1176867839,AU +1176867840,1176868095,US +1176868096,1176868111,AU +1176868112,1176895487,US 1176895488,1176897047,CA 1176897048,1176897055,US 1176897056,1176900735,CA @@ -14899,14 +16027,14 @@ 1176925008,1176925015,NG 1176925016,1176928255,CA 1176928256,1177000703,US -1177000704,1177000711,CA -1177000712,1177000719,US -1177000720,1177000735,CA +1177000704,1177000735,CA 1177000736,1177000751,US 1177000752,1177000759,CA -1177000760,1177008127,US -1177008128,1177009151,A2 -1177009152,1177022975,US +1177000760,1177000791,US +1177000792,1177000799,CA +1177000800,1177000807,US +1177000808,1177000959,CA +1177000960,1177022975,US 1177022976,1177023231,GB 1177023232,1177030655,US 1177030656,1177033727,AG @@ -14914,32 +16042,24 @@ 1177059328,1177061375,CA 1177061376,1177062143,US 1177062144,1177075455,CA -1177075456,1177164863,US +1177075456,1177164415,US +1177164416,1177164543,CA +1177164544,1177164863,US 1177164864,1177164895,CA 1177164896,1177165055,US -1177165056,1177165061,CA -1177165062,1177165062,US -1177165063,1177165311,CA +1177165056,1177165311,CA 1177165312,1177354239,US -1177354240,1177356799,PR -1177356800,1177357055,US -1177357056,1177419775,PR -1177419776,1177505401,US -1177505402,1177505402,BB -1177505403,1177550847,US +1177354240,1177419775,PR +1177419776,1177550847,US 1177550848,1178075135,CA 1178075136,1178599423,US 1178599424,1179910143,CA 1179910144,1180113919,US 1180113920,1180114431,AE -1180114432,1180124865,US -1180124866,1180124866,AE -1180124867,1184829439,US +1180114432,1184829439,US 1184829440,1184829695,A2 1184829696,1189672191,US -1189672192,1189672249,A1 -1189672250,1189672251,A2 -1189672252,1189672447,A1 +1189672192,1189672447,A1 1189672448,1191673855,US 1191673856,1191706623,CA 1191706624,1192232127,US @@ -14969,9 +16089,9 @@ 1208338176,1208590335,US 1208590336,1208598527,CA 1208598528,1208647679,US -1208647680,1208656575,CA -1208656576,1208656583,DO -1208656584,1208659967,CA +1208647680,1208657775,CA +1208657776,1208657783,TR +1208657784,1208659967,CA 1208659968,1208721407,US 1208721408,1208729599,CA 1208729600,1208770559,US @@ -14984,9 +16104,7 @@ 1208918016,1208922111,CA 1208922112,1208926463,US 1208926464,1208926719,EU -1208926720,1208928767,US -1208928768,1208929023,TW -1208929024,1208935935,US +1208926720,1208935935,US 1208935936,1208935943,AU 1208935944,1208935951,IN 1208935952,1208935959,SG @@ -15014,7 +16132,9 @@ 1208936296,1208936299,HK 1208936300,1208936311,US 1208936312,1208936313,ID -1208936314,1208954879,US +1208936314,1208936319,US +1208936320,1208936447,IN +1208936448,1208954879,US 1208954880,1208958975,CA 1208958976,1208975359,US 1208975360,1208983551,CA @@ -15058,17 +16178,15 @@ 1209867264,1209867519,CA 1209867520,1209917439,US 1209917440,1209925631,CA -1209925632,1210254335,US -1210254336,1210254591,CA -1210254592,1210254935,US +1209925632,1210254935,US 1210254936,1210254943,CA -1210254944,1210255103,US -1210255104,1210255359,CA -1210255360,1210257663,US -1210257664,1210257919,CA -1210257920,1210259967,US +1210254944,1210256127,US +1210256128,1210256383,CA +1210256384,1210259967,US 1210259968,1210260223,CA -1210260224,1210420223,US +1210260224,1210316799,US +1210316800,1210317823,ID +1210317824,1210420223,US 1210420224,1210420479,IT 1210420480,1210421503,US 1210421504,1210421551,CA @@ -15076,7 +16194,9 @@ 1210449920,1210580991,CA 1210580992,1210925055,US 1210925056,1210941439,CA -1210941440,1211033087,US +1210941440,1211032271,US +1211032272,1211032287,DO +1211032288,1211033087,US 1211033088,1211033599,CO 1211033600,1211035711,US 1211035712,1211035775,CA @@ -15119,7 +16239,13 @@ 1211334656,1211367935,US 1211367936,1211368191,CA 1211368192,1211368447,EE -1211368448,1211432959,US +1211368448,1211390981,US +1211390982,1211390982,DE +1211390983,1211390989,US +1211390990,1211390990,DE +1211390991,1211391216,US +1211391217,1211391217,IT +1211391218,1211432959,US 1211432960,1211473919,CA 1211473920,1211596799,US 1211596800,1211605999,CA @@ -15129,18 +16255,22 @@ 1216872448,1217396735,CA 1217396736,1218697215,US 1218697216,1218697727,IN -1218697728,1218987263,US +1218697728,1218698239,US +1218698240,1218698495,IN +1218698496,1218987263,US 1218987264,1218987519,CA 1218987520,1219256319,US 1219256320,1219264511,CA 1219264512,1219272703,US 1219272704,1219276799,CA -1219276800,1224093183,US +1219276800,1224091903,US +1224091904,1224092159,NL +1224092160,1224093183,US 1224093184,1224093439,NL 1224093440,1224094463,US 1224094464,1224094719,NL -1224094720,1224095231,US -1224095232,1224095487,NL +1224094720,1224094975,US +1224094976,1224095487,NL 1224095488,1224099327,US 1224099328,1224099839,NL 1224099840,1224106751,US @@ -15163,7 +16293,9 @@ 1224200192,1224200959,NL 1224200960,1224201215,US 1224201216,1224202239,NL -1224202240,1224210431,US +1224202240,1224207359,US +1224207360,1224207871,NL +1224207872,1224210431,US 1224210432,1224212479,NL 1224212480,1224470527,US 1224470528,1224471567,NL @@ -15171,25 +16303,28 @@ 1224471569,1224473599,NL 1224473600,1224474623,US 1224474624,1224475647,GT -1224475648,1224476671,US +1224475648,1224475903,PR +1224475904,1224476671,US 1224476672,1224476927,SX -1224476928,1224477439,US -1224477440,1224477695,SX -1224477696,1224477951,US -1224477952,1224478719,SX +1224476928,1224476975,US +1224476976,1224476977,SX +1224476978,1224477183,US +1224477184,1224477439,SX +1224477440,1224477695,US +1224477696,1224478719,SX 1224478720,1224480767,US 1224480768,1224484863,JM 1224484864,1224493055,GT 1224493056,1224497151,US 1224497152,1224501247,GT -1224501248,1224523520,JM -1224523521,1224523775,US +1224501248,1224523519,JM +1224523520,1224523775,US 1224523776,1224525568,JM 1224525569,1224525823,US 1224525824,1224539904,JM -1224539905,1224701942,US -1224701943,1224701943,CA -1224701944,1241743359,US +1224539905,1238547071,US +1238547072,1238547199,PR +1238547200,1241743359,US 1241743360,1241759743,CA 1241759744,1242300415,US 1242300416,1242562559,CA @@ -15201,45 +16336,33 @@ 1244848128,1244852223,CA 1244852224,1244864511,US 1244864512,1244872703,CA -1244872704,1245050689,US -1245050690,1245050690,SA -1245050691,1245052289,US -1245052290,1245052545,SA -1245052546,1245144575,US +1244872704,1245144575,US 1245144576,1245144831,CH 1245144832,1245183999,US 1245184000,1245446143,CA -1245446144,1246890431,US +1245446144,1245450186,US +1245450187,1245450187,GU +1245450188,1246890431,US 1246890432,1246890463,CA 1246890464,1246890464,A1 1246890465,1246890495,CA 1246890496,1246902783,US 1246902784,1246903039,NL -1246903040,1246904319,US -1246904320,1246905366,CA -1246905367,1246905367,US -1246905368,1246905378,CA -1246905379,1246905379,US -1246905380,1246912511,CA +1246903040,1246904575,US +1246904576,1246905343,CA +1246905344,1246905599,US +1246905600,1246912511,CA 1246912512,1246923519,US 1246923520,1246923775,AU 1246923776,1246937087,US 1246937088,1246945279,CA 1246945280,1247027199,US 1247027200,1247035391,A2 -1247035392,1247060479,US -1247060480,1247060735,CA -1247060736,1247073791,US +1247035392,1247073023,US +1247073024,1247073279,CA +1247073280,1247073791,US 1247073792,1247074303,A2 -1247074304,1247119439,US -1247119440,1247119447,KW -1247119448,1247119967,US -1247119968,1247119975,KW -1247119976,1247123455,US -1247123456,1247123711,GB -1247123712,1247123967,US -1247123968,1247124223,LU -1247124224,1248864255,US +1247074304,1248864255,US 1248864256,1248866303,CA 1248866304,1248885759,US 1248885760,1248886783,CA @@ -15252,7 +16375,7 @@ 1248915456,1248919551,US 1248919552,1248920575,CA 1248920576,1248921599,US -1248921600,1248923647,CA +1248922624,1248923647,CA 1248923648,1248936959,US 1248936960,1248939007,CA 1248939008,1248946175,US @@ -15278,11 +16401,7 @@ 1249040384,1249046527,US 1249046528,1249047551,BM 1249047552,1249050623,US -1249050624,1249051135,A1 -1249051136,1249051391,US -1249051392,1249051647,A1 -1249051648,1249051903,US -1249051904,1249052671,A1 +1249050624,1249052671,A1 1249052672,1249059327,US 1249059328,1249059839,CA 1249059840,1249091583,US @@ -15297,7 +16416,9 @@ 1249107968,1249130495,US 1249130496,1249131519,JM 1249131520,1249139711,US -1249139712,1249140735,MF +1249139712,1249140268,MF +1249140269,1249140269,FR +1249140270,1249140735,MF 1249140736,1249142015,US 1249142016,1249142271,GB 1249142272,1249146879,US @@ -15344,13 +16465,13 @@ 1249359872,1249361919,CA 1249361920,1249379327,US 1249379328,1249380351,CA -1249380352,1249384447,US +1249380352,1249383423,US 1249384448,1249386495,PR 1249386496,1249391615,US 1249391616,1249392639,CA 1249392640,1249396735,US 1249396736,1249397759,CA -1249397760,1249409023,US +1249398784,1249409023,US 1249409024,1249410047,CA 1249410048,1249434623,US 1249434624,1249435647,CA @@ -15369,9 +16490,7 @@ 1249492736,1249492991,CA 1249492992,1249506303,US 1249506304,1249507327,CA -1249507328,1249516031,US -1249516032,1249516287,GB -1249516288,1249522687,US +1249507328,1249522687,US 1249522688,1249523711,CA 1249523712,1249531903,US 1249531904,1249533951,GD @@ -15394,27 +16513,31 @@ 1249710208,1249710271,NL 1249710272,1249710591,BE 1249710592,1249710847,NL -1249710848,1249715711,US -1249715712,1249715967,DE -1249715968,1249716479,US +1249710848,1249716479,US 1249716480,1249716735,TW 1249716736,1249717759,US 1249717760,1249718015,FI 1249718016,1249718271,NL -1249718272,1249720319,US -1249720320,1249720351,AU +1249718272,1249720339,US +1249720340,1249720343,AU +1249720344,1249720351,US 1249720352,1249720367,JP 1249720368,1249720383,SG -1249720384,1249720511,AU +1249720384,1249720511,US 1249720512,1249720527,IN -1249720528,1249720575,AU +1249720528,1249720543,AU +1249720544,1249720575,US 1249720576,1249720591,FR 1249720592,1249720599,GB -1249720600,1249720607,IT +1249720600,1249720607,DE 1249720608,1249720663,GB 1249720664,1249720671,SE -1249720672,1249720831,GB -1249720832,1249721343,US +1249720672,1249720711,GB +1249720712,1249720719,NL +1249720720,1249720831,GB +1249720832,1249721119,US +1249721120,1249721135,CA +1249721136,1249721343,US 1249721344,1249721351,AT 1249721352,1249721359,BE 1249721360,1249721367,CH @@ -15475,17 +16598,9 @@ 1249724695,1249724695,EU 1249724696,1249724927,NL 1249724928,1249725183,FI -1249725184,1249725439,US -1249725440,1249725695,NL -1249725696,1249725951,US -1249725952,1249726207,NL -1249726208,1249727999,US -1249728000,1249728255,HU -1249728256,1249736959,US +1249725184,1249736959,US 1249736960,1249737471,EU -1249737472,1249744895,US -1249744896,1249745151,TW -1249745152,1249752319,US +1249737472,1249752319,US 1249752320,1249752575,NL 1249752576,1249754111,US 1249754112,1249754367,IE @@ -15500,19 +16615,15 @@ 1249852160,1249886207,US 1249886208,1249902591,CA 1249902592,1254490111,US -1254490112,1254555647,CA +1254490112,1254532095,CA +1254532096,1254532223,RU +1254532224,1254555647,CA 1254555648,1254621183,US -1254621184,1254622207,CA -1254622208,1254622463,US -1254622464,1254629375,CA -1254629376,1254704383,US -1254704384,1254704639,PH -1254704640,1254978751,US +1254621184,1254629375,CA +1254629376,1254978751,US 1254978752,1254978767,LB 1254978768,1254989823,US -1254989824,1254990335,CA -1254990336,1254990591,US -1254990592,1254998015,CA +1254989824,1254998015,CA 1254998016,1255002111,US 1255002112,1255006207,CA 1255006208,1255011583,US @@ -15521,9 +16632,7 @@ 1255047168,1255055359,CA 1255055360,1255210495,US 1255210496,1255211007,DE -1255211008,1255245311,US -1255245312,1255245567,BR -1255245568,1255264511,US +1255211008,1255264511,US 1255264512,1255264767,SG 1255264768,1255274495,US 1255274496,1255274751,SG @@ -15555,27 +16664,23 @@ 1256054400,1256054783,CZ 1256054784,1256079359,US 1256079360,1256087551,KY -1256087552,1263271423,US -1263271424,1263271679,CA -1263271680,1264717823,US +1256087552,1264717823,US 1264717824,1264718079,CA 1264718080,1264718591,US 1264718592,1264718847,CA 1264718848,1264719103,US 1264719104,1264719871,CA -1264719872,1264762879,US +1264719872,1264746527,US +1264746528,1264746543,CA +1264746544,1264762879,US 1264762880,1264763391,CA 1264763392,1264763647,IE 1264763648,1264766975,CA -1264766976,1264990975,US -1264990976,1264991231,NL -1264991232,1264991311,US +1264766976,1264991311,US 1264991312,1264991319,JP 1264991320,1266147327,US 1266147328,1266155519,CA -1266155520,1268200732,US -1268200733,1268200733,VI -1268200734,1268252671,US +1266155520,1268252671,US 1268252672,1268776959,CA 1268776960,1275600895,US 1275600896,1275604991,BM @@ -15604,9 +16709,7 @@ 1275912784,1279262719,US 1279262720,1279787007,CA 1279787008,1279848447,US -1279848448,1279851519,PR -1279851520,1279851775,VI -1279851776,1279852543,PR +1279848448,1279852543,PR 1279852544,1279950847,US 1279950848,1279951103,CA 1279951104,1279951231,US @@ -15629,7 +16732,9 @@ 1279967232,1279967487,CA 1279967488,1279968127,US 1279968128,1279968255,CA -1279968256,1279969343,US +1279968256,1279969167,US +1279969168,1279969183,CA +1279969184,1279969343,US 1279969344,1279969407,CA 1279969408,1279969663,US 1279969664,1279969791,CA @@ -15707,7 +16812,9 @@ 1294893056,1294925823,RS 1294925824,1294958591,DE 1294958592,1294991359,UA -1294991360,1295047679,CZ +1294991360,1295024639,CZ +1295024640,1295024895,SK +1295024896,1295047679,CZ 1295047680,1295048191,SK 1295048192,1295056895,CZ 1295056896,1295122431,GR @@ -15723,15 +16830,11 @@ 1296105472,1296171007,PL 1296171008,1296203775,DK 1296203776,1296236543,RU -1296236544,1296236671,FR -1296236672,1296236799,US -1296236800,1296237439,FR +1296236544,1296237439,FR 1296237440,1296237567,IT 1296237568,1296237823,FR -1296237824,1296237824,GB -1296237825,1296237825,FR -1296237826,1296237826,GB -1296237827,1296238591,FR +1296237824,1296238079,GB +1296238080,1296238591,FR 1296238592,1296239103,NL 1296239104,1296239231,FR 1296239232,1296239359,NL @@ -15755,7 +16858,9 @@ 1296249024,1296249087,GB 1296249088,1296249279,FR 1296249280,1296249343,DE -1296249344,1296250367,FR +1296249344,1296249599,FR +1296249600,1296249615,GB +1296249616,1296250367,FR 1296250368,1296250399,CZ 1296250400,1296250431,DE 1296250432,1296250463,PL @@ -15780,7 +16885,8 @@ 1296252600,1296252607,GB 1296252608,1296252615,NL 1296252616,1296252623,ES -1296252624,1296252655,FR +1296252624,1296252647,FR +1296252648,1296252655,GB 1296252656,1296252663,IE 1296252664,1296252667,FR 1296252668,1296252671,GB @@ -15801,13 +16907,13 @@ 1296262400,1296262655,US 1296262656,1296263679,FR 1296263680,1296263935,US -1296263936,1296263943,FR -1296263944,1296263959,US -1296263960,1296264287,FR +1296263936,1296264263,FR +1296264264,1296264271,GB +1296264272,1296264287,FR 1296264288,1296264303,US 1296264304,1296266239,FR -1296266240,1296266751,US -1296266752,1296269055,FR +1296266240,1296266495,US +1296266496,1296269055,FR 1296269056,1296269311,US 1296269312,1296302079,BY 1296302080,1296334847,GB @@ -15816,7 +16922,9 @@ 1296400384,1296433151,BH 1296433152,1296465919,BG 1296465920,1296469759,LU -1296469760,1296479743,FR +1296469760,1296473263,FR +1296473264,1296473279,CD +1296473280,1296479743,FR 1296479744,1296482303,NO 1296482304,1296498687,FR 1296498688,1296531455,BG @@ -15908,7 +17016,9 @@ 1296732160,1296734207,IT 1296734208,1296736255,FR 1296736256,1296738303,NO -1296738304,1296740351,CH +1296738304,1296738815,CH +1296738816,1296739327,FI +1296739328,1296740351,CH 1296740352,1296744447,RU 1296744448,1296746495,GB 1296748544,1296750591,FR @@ -15964,7 +17074,11 @@ 1297072128,1297088511,PL 1297088512,1297121279,AT 1297121280,1297154047,SE -1297154048,1297168383,RO +1297154048,1297154815,RO +1297154816,1297155071,MD +1297155072,1297162239,RO +1297162240,1297166335,IR +1297166336,1297168383,RO 1297168384,1297170431,AZ 1297170432,1297170943,RO 1297170944,1297171455,GB @@ -15975,11 +17089,25 @@ 1297175552,1297176319,GB 1297176320,1297176831,RO 1297176832,1297177599,GB -1297177600,1297178623,RO +1297177600,1297177855,QA +1297177856,1297178111,US +1297178112,1297178367,QA +1297178368,1297178623,RO 1297178624,1297178879,NL -1297178880,1297182719,RO +1297178880,1297181951,RO +1297181952,1297182463,DE +1297182464,1297182719,RO 1297182720,1297184767,ES -1297184768,1297203199,RO +1297184768,1297185279,BZ +1297185280,1297185791,RO +1297185792,1297185919,NL +1297185920,1297190143,RO +1297190144,1297190399,ES +1297190400,1297195007,RO +1297195008,1297195135,NL +1297195136,1297196799,RO +1297196800,1297197055,CN +1297197056,1297203199,RO 1297203200,1297211391,IR 1297211392,1297215487,RO 1297215488,1297217535,NL @@ -16121,10 +17249,13 @@ 1298956288,1298972671,GB 1298972672,1298989055,RU 1298989056,1299005439,UA -1299005440,1299010047,NL +1299005440,1299009023,NL +1299009024,1299009279,BE +1299009280,1299010047,NL 1299010048,1299010815,BE -1299010816,1299011071,RU -1299011072,1299013631,NL +1299010816,1299013119,NL +1299013120,1299013375,BE +1299013376,1299013631,NL 1299013632,1299015679,BE 1299015680,1299017727,NL 1299017728,1299019775,BE @@ -16149,9 +17280,9 @@ 1299709952,1299972095,UA 1299972096,1300234239,IL 1300234240,1302331391,FR -1302331392,1303359999,NL -1303360000,1303360255,DE -1303360256,1303379967,NL +1302331392,1303154431,NL +1303154432,1303154687,RO +1303154688,1303379967,NL 1303379968,1304428543,DE 1304428544,1305477119,FR 1305477120,1305739263,ES @@ -16164,11 +17295,7 @@ 1306230784,1306238975,LT 1306238976,1306263551,SE 1306263552,1306265599,A2 -1306265600,1306266879,KE -1306266880,1306267135,NG -1306267136,1306267522,KE -1306267523,1306267527,NG -1306267528,1306271743,KE +1306265600,1306271743,KE 1306271744,1306279935,RU 1306279936,1306288127,IT 1306288128,1306296319,AT @@ -16389,8 +17516,7 @@ 1307971584,1307979775,GB 1307979776,1307981823,ZW 1307981824,1307983871,GB -1307983872,1307984383,NG -1307984384,1307987967,LB +1307983872,1307987967,LB 1307987968,1307992063,FR 1307992064,1307996159,RU 1307996160,1308000255,DE @@ -16401,9 +17527,7 @@ 1308016640,1308020735,FI 1308020736,1308024831,BG 1308024832,1308033023,RU -1308033024,1308033535,DE -1308033536,1308033791,GB -1308033792,1308037119,DE +1308033024,1308037119,DE 1308037120,1308041215,UA 1308041216,1308049407,RU 1308049408,1308053503,DK @@ -16509,7 +17633,12 @@ 1310707968,1310708223,PL 1310708224,1310708479,RU 1310708480,1310708735,GB -1310708736,1310709247,IE +1310708736,1310708927,IE +1310708928,1310708943,GB +1310708944,1310709199,IE +1310709200,1310709215,DE +1310709216,1310709231,NL +1310709232,1310709247,IE 1310709248,1310709759,PL 1310709760,1310711807,RU 1310711808,1310713855,LT @@ -16542,7 +17671,10 @@ 1311264768,1311266815,RU 1311266816,1311268863,FR 1311268864,1311270911,BE -1311270912,1311272959,RU +1311270912,1311271935,RU +1311271936,1311272447,KZ +1311272448,1311272703,RU +1311272704,1311272959,IE 1311272960,1311275007,GB 1311275008,1311277055,FR 1311277056,1311279103,IT @@ -16560,13 +17692,7 @@ 1311301632,1311303679,TR 1311303680,1311307775,GB 1311307776,1311309823,IS -1311309824,1311310335,GB -1311310336,1311310847,GG -1311310848,1311310857,GB -1311310858,1311310858,GG -1311310859,1311311103,GB -1311311104,1311311359,GG -1311311360,1311311871,GB +1311309824,1311311871,GB 1311311872,1311315967,CZ 1311315968,1311317247,PL 1311317248,1311317503,A2 @@ -16598,12 +17724,14 @@ 1311375360,1311506431,DE 1311506432,1311637503,CZ 1311637504,1312292863,DE -1312292864,1312817151,LT -1312817152,1313144959,SE -1313144960,1313145087,DK -1313145088,1313391615,SE -1313391616,1313391871,DK -1313391872,1313865727,SE +1312292864,1312304383,LT +1312304384,1312304639,GB +1312304640,1312564479,LT +1312564480,1312564735,RU +1312564736,1312817151,LT +1312817152,1313191295,SE +1313191296,1313191423,DK +1313191424,1313865727,SE 1313865728,1313931263,CZ 1313931264,1313996799,RU 1313996800,1314062335,SE @@ -16641,12 +17769,13 @@ 1315741696,1315745791,LB 1315745792,1315749887,CZ 1315749888,1315753983,RU -1315758080,1315760383,FR -1315760384,1315761151,RE -1315761152,1315761407,FR -1315761408,1315761663,RE -1315761664,1315761919,FR -1315761920,1315762175,RE +1315758080,1315758335,FR +1315758336,1315758591,RE +1315758592,1315758847,FR +1315758848,1315759103,RE +1315759104,1315759615,FR +1315759616,1315759871,RE +1315759872,1315762175,FR 1315762176,1315766271,BG 1315766272,1315769087,NL 1315769088,1315769343,EU @@ -16697,8 +17826,8 @@ 1315942400,1315945030,UA 1315945031,1315945031,RU 1315945032,1315946495,UA -1315946496,1315946751,GB -1315946752,1315950591,GG +1315946496,1315947007,GB +1315947008,1315950591,GG 1315950592,1315954687,UA 1315954688,1315958783,DE 1315958784,1315962879,RU @@ -16706,15 +17835,7 @@ 1317011456,1317044223,BG 1317044224,1317076991,CZ 1317076992,1317109759,BE -1317109760,1317111935,GB -1317111936,1317111999,A1 -1317112000,1317117951,GB -1317117952,1317118207,A1 -1317118208,1317119999,GB -1317120000,1317120255,A1 -1317120256,1317120767,GB -1317120768,1317120895,A1 -1317120896,1317126399,GB +1317109760,1317126399,GB 1317126400,1317126655,US 1317126656,1317142527,GB 1317142528,1317175295,PT @@ -16727,7 +17848,9 @@ 1317371904,1317404671,PL 1317404672,1317437439,IT 1317437440,1317470207,HR -1317470208,1317502975,TR +1317470208,1317473535,TR +1317473536,1317473791,GB +1317473792,1317502975,TR 1317502976,1317535743,IE 1317535744,1317552127,GB 1317552128,1317568511,ES @@ -16739,13 +17862,13 @@ 1317627904,1317629951,RU 1317629952,1317636095,GB 1317636096,1317637119,IE -1317637120,1317642239,GB +1317637120,1317640959,GB +1317640960,1317641215,IE +1317641216,1317642239,GB 1317642240,1317642495,IE 1317642496,1317643316,GB 1317643317,1317643317,IE -1317643318,1317646551,GB -1317646552,1317646559,IE -1317646560,1317647015,GB +1317643318,1317647015,GB 1317647016,1317647023,IE 1317647024,1317647026,GB 1317647027,1317647027,IE @@ -16755,7 +17878,9 @@ 1317650432,1317666815,PT 1317666816,1317679727,A2 1317679728,1317679735,CM -1317679736,1317683199,A2 +1317679736,1317681919,A2 +1317681920,1317682175,NG +1317682176,1317683199,A2 1317683200,1317699583,DE 1317699584,1317715967,RU 1317715968,1317732351,SA @@ -16764,9 +17889,7 @@ 1317765120,1317781503,GE 1317781504,1317814271,RU 1317814272,1317830655,DE -1317830656,1317831167,NL -1317831168,1317831423,RU -1317831424,1317847039,NL +1317830656,1317847039,NL 1317847040,1317863423,RU 1317863424,1317879807,GB 1317879808,1317896191,SK @@ -16784,9 +17907,13 @@ 1318593984,1318593991,GB 1318593992,1318594007,NL 1318594008,1318594015,GB -1318594016,1318597343,NL +1318594016,1318596543,NL +1318596544,1318596559,SE +1318596560,1318597343,NL 1318597344,1318597359,US -1318597360,1318600703,NL +1318597360,1318599679,NL +1318599680,1318599687,IE +1318599688,1318600703,NL 1318600704,1318608895,AT 1318608896,1318617087,IT 1318617088,1318625279,FR @@ -16822,16 +17949,13 @@ 1318871040,1318879231,DK 1318879232,1318887423,CZ 1318887424,1318895615,PL -1318895616,1318900735,DK -1318900736,1318900991,SE -1318900992,1318903807,DK +1318895616,1318903807,DK 1318903808,1318911999,RU 1318912000,1318920191,MK 1318920192,1318928383,IR -1318928384,1318936319,LT -1318936320,1318936383,US +1318928384,1318936383,LT 1318936384,1318936447,BR -1318936448,1318936575,US +1318936448,1318936575,LT 1318936576,1318944767,DK 1318944768,1318958079,CZ 1318958080,1318960127,PL @@ -16844,7 +17968,8 @@ 1319002112,1319010303,IE 1319010304,1319018495,CY 1319018496,1319026687,IR -1319026688,1319034879,RU +1319026688,1319026943,RU +1319026944,1319034879,UA 1319034880,1319035903,NO 1319035904,1319036927,DK 1319036928,1319038975,SE @@ -16910,7 +18035,9 @@ 1331902464,1331904511,MK 1331904512,1331908607,GB 1331908608,1331910655,DE -1331912704,1331914751,DE +1331912704,1331912959,DE +1331912960,1331913215,GB +1331913216,1331914751,DE 1331914752,1331916799,RU 1331916800,1331918847,IT 1331918848,1331920895,BE @@ -16926,8 +18053,7 @@ 1331938064,1331938079,GB 1331938080,1331938431,NG 1331938432,1331938559,GB -1331938560,1331939071,NG -1331939072,1331939327,GB +1331938560,1331939327,NG 1331939328,1331941375,BE 1331941376,1331943423,ES 1331943424,1331945471,RU @@ -16944,7 +18070,14 @@ 1332412416,1332477951,GR 1332477952,1332609023,ES 1332609024,1332613119,PL -1332613120,1332617215,UA +1332613120,1332614783,UA +1332614784,1332614911,KZ +1332614912,1332616191,UA +1332616192,1332616319,GB +1332616320,1332616447,US +1332616448,1332616959,UA +1332616960,1332617087,RU +1332617088,1332617215,CA 1332617216,1332621311,CZ 1332625408,1332629503,RU 1332629504,1332633599,DE @@ -16978,16 +18111,16 @@ 1334059008,1334067199,FR 1334067200,1334075391,LV 1334075392,1334083583,RU -1334083584,1334084627,DE -1334084628,1334084631,NL -1334084632,1334091775,DE +1334083584,1334091775,DE 1334091776,1334099967,LT 1334099968,1334108159,IR 1334108160,1334116351,BE 1334116352,1334124543,AX 1334124544,1334125567,DE 1334125568,1334126591,ES -1334126592,1334130687,DE +1334126592,1334127359,DE +1334127360,1334127615,AT +1334127616,1334130687,DE 1334130688,1334131711,NL 1334131712,1334132735,DE 1334132736,1334165503,RU @@ -17013,9 +18146,7 @@ 1334345728,1334378495,RU 1334378496,1334411263,IT 1334411264,1334444031,RU -1334444032,1334476800,SE -1334476801,1334477311,DK -1334477312,1334503935,SE +1334444032,1334503935,SE 1334503936,1334504191,DK 1334504192,1334509567,SE 1334509568,1334542335,PL @@ -17036,18 +18167,14 @@ 1334624256,1334625535,GB 1334625536,1334625791,AP 1334625792,1334626047,AU -1334626048,1334628351,GB +1334626048,1334627071,GB +1334627072,1334627327,AU +1334627328,1334628351,GB 1334628352,1334632447,IE 1334632448,1334636543,KZ 1334636544,1334640639,RU 1334640640,1334644735,FR -1334644736,1334645051,DE -1334645052,1334645052,A2 -1334645053,1334645222,DE -1334645223,1334645223,US -1334645224,1334645226,DE -1334645227,1334645227,US -1334645228,1334647039,DE +1334644736,1334647039,DE 1334647040,1334647807,IQ 1334647808,1334648831,DE 1334648832,1334652927,GB @@ -17091,13 +18218,12 @@ 1334724352,1334724607,SE 1334724608,1334724863,US 1334724864,1334725631,NL -1334725632,1334725887,SE -1334725888,1334725900,NL -1334725901,1334725901,SE -1334725902,1334726143,NL +1334725632,1334726143,SE 1334726144,1334726399,LU 1334726400,1334726655,SE -1334726656,1334734847,RU +1334726656,1334730239,RU +1334730240,1334730495,KZ +1334730496,1334734847,RU 1334734848,1334738943,LT 1334738944,1334743039,CH 1334743040,1334747135,CZ @@ -17110,7 +18236,9 @@ 1334779904,1334783999,UA 1334784000,1334788095,AT 1334788096,1334792191,RU -1334792192,1334794239,GB +1334792192,1334793320,GB +1334793321,1334793321,IR +1334793322,1334794239,GB 1334794240,1334796287,ES 1334796288,1334800383,ME 1334800384,1334804479,IT @@ -17128,9 +18256,7 @@ 1336147968,1336279039,RU 1336279040,1336410111,GR 1336410112,1336541183,PT -1336541184,1336542207,SA -1336542208,1336542463,US -1336542464,1336543231,SA +1336541184,1336543231,SA 1336543232,1336545279,ES 1336545280,1336547327,SE 1336547328,1336549375,RU @@ -17198,7 +18324,9 @@ 1336786944,1336803327,JO 1336811520,1336827903,RU 1336827904,1336836095,AT -1336836096,1336838143,NL +1336836096,1336836889,NL +1336836890,1336836890,BE +1336836891,1336838143,NL 1336838144,1336842239,DE 1336842240,1336844287,DK 1336844288,1336846335,IR @@ -17219,54 +18347,59 @@ 1342628208,1342628223,IE 1342628224,1342701567,GB 1342701568,1342750719,RE -1342750720,1342751999,FR -1342752000,1342752255,RE -1342752256,1342753023,FR -1342753024,1342753279,YT -1342753280,1342754047,FR -1342754048,1342754303,RE -1342754304,1342755583,FR -1342755584,1342756095,RE -1342756096,1342759679,FR -1342759680,1342759935,RE -1342759936,1342760703,FR -1342760704,1342760959,RE -1342760960,1342763007,FR -1342763008,1342763263,YT -1342763264,1342765055,FR -1342765056,1342765311,RE -1342765312,1342988287,FR +1342750720,1342751487,YT +1342751488,1342751743,FR +1342751744,1342752511,YT +1342752512,1342752767,FR +1342752768,1342753023,YT +1342753024,1342753535,FR +1342753536,1342754047,YT +1342754048,1342754303,FR +1342754304,1342754559,YT +1342754560,1342754815,FR +1342754816,1342756095,YT +1342756096,1342758911,FR +1342758912,1342759423,YT +1342759424,1342759935,FR +1342759936,1342760447,YT +1342760448,1342760703,FR +1342760704,1342761727,YT +1342761728,1342761983,FR +1342761984,1342763007,YT +1342763008,1342763263,FR +1342763264,1342764543,YT +1342764544,1342988287,FR 1342988288,1342989055,US -1342989056,1342996991,FR -1342996992,1342997247,GF -1342997248,1342997759,FR -1342997760,1342999551,GF -1342999552,1343000575,FR -1343000576,1343001087,GF +1342989056,1342996479,FR +1342996480,1342997759,GF +1342997760,1342998015,FR +1342998016,1342998783,GF +1342998784,1342999039,FR +1342999040,1342999807,GF +1342999808,1343000063,FR +1343000064,1343000575,GF +1343000576,1343000831,FR +1343000832,1343001087,GF 1343001088,1343001599,FR -1343001600,1343002367,GF -1343002368,1343002879,FR -1343002880,1343003135,GF -1343003136,1343003391,FR -1343003392,1343004159,GF -1343004160,1343004671,FR -1343004672,1343004927,GF -1343004928,1343005439,FR -1343005440,1343007231,GF -1343007232,1343007487,FR -1343007488,1343007999,GF +1343001600,1343001855,GF +1343001856,1343002367,FR +1343002368,1343003391,GF +1343003392,1343004159,FR +1343004160,1343004415,GF +1343004416,1343004671,FR +1343004672,1343005951,GF +1343005952,1343006207,FR +1343006208,1343006975,GF +1343006976,1343007743,FR +1343007744,1343007999,GF 1343008000,1343008255,FR -1343008256,1343008511,GF -1343008512,1343008767,FR -1343008768,1343009023,GF -1343009024,1343010047,FR -1343010048,1343010303,GF -1343010304,1343010815,FR -1343010816,1343011071,GF -1343011072,1343011583,FR -1343011584,1343012095,GF -1343012096,1343012607,FR -1343012608,1343012863,GF +1343008256,1343009791,GF +1343009792,1343010303,FR +1343010304,1343010815,GF +1343010816,1343011071,FR +1343011072,1343011327,GF +1343011328,1343011583,FR +1343011584,1343012863,GF 1343012864,1343017983,FR 1343017984,1343018495,RE 1343018496,1343025151,FR @@ -17284,8 +18417,8 @@ 1343221760,1343222335,GB 1343222336,1343223679,FR 1343223680,1343223687,LB -1343223688,1343224063,FR -1343224064,1343224303,US +1343223688,1343224255,FR +1343224256,1343224303,US 1343224304,1343225855,FR 1343225856,1343750143,IT 1343750144,1344798719,ES @@ -17378,9 +18511,9 @@ 1346740224,1346744319,FI 1346744320,1346748415,RU 1346748416,1346752511,DE -1346752512,1346755583,FR -1346755584,1346756095,RE -1346756096,1346756607,FR +1346752512,1346753791,FR +1346753792,1346754303,RE +1346754304,1346756607,FR 1346756608,1346760703,SE 1346760704,1346764799,IR 1346764800,1346768895,DK @@ -17414,7 +18547,7 @@ 1346904064,1346908159,PL 1346908160,1346912255,LI 1346912256,1346920447,BG -1346920448,1346924543,A2 +1346920448,1346924543,KE 1346924544,1346928639,RU 1346928640,1346932735,DE 1346932736,1346936831,DK @@ -17436,8 +18569,8 @@ 1347010560,1347014655,RU 1347014656,1347018751,GG 1347018752,1347022847,IT -1347022848,1347026943,AT -1347026944,1347035135,GB +1347022848,1347024895,AT +1347024896,1347035135,GB 1347035136,1347039231,CZ 1347039232,1347043327,RO 1347043328,1347047423,FR @@ -17479,7 +18612,11 @@ 1347186688,1347190783,GB 1347190784,1347194879,RU 1347194880,1347198975,SE -1347198976,1347203071,QA +1347198976,1347200561,QA +1347200562,1347200562,US +1347200563,1347200767,QA +1347200768,1347201023,US +1347201024,1347203071,QA 1347203072,1347207167,RU 1347207168,1347215359,GB 1347215360,1347223551,RU @@ -17492,9 +18629,7 @@ 1347231744,1347235839,UA 1347235840,1347239935,GE 1347239936,1347244031,DK -1347244032,1347245055,GB -1347245056,1347245311,RU -1347245312,1347248127,GB +1347244032,1347248127,GB 1347248128,1347252223,SE 1347252224,1347256319,HU 1347256320,1347260415,FO @@ -17648,7 +18783,10 @@ 1347294433,1347294435,A2 1347294436,1347294440,SE 1347294441,1347294447,SO -1347294448,1347294975,US +1347294448,1347294463,US +1347294464,1347294464,A2 +1347294465,1347294496,US +1347294497,1347294975,A2 1347294976,1347294992,CG 1347294993,1347295008,US 1347295009,1347295015,LR @@ -17676,27 +18814,31 @@ 1347295217,1347295223,US 1347295224,1347295224,AO 1347295225,1347295232,NG -1347295233,1347295743,A2 -1347295744,1347295752,US +1347295233,1347295744,A2 +1347295745,1347295745,US +1347295746,1347295748,A2 +1347295749,1347295752,US 1347295753,1347295755,BW -1347295756,1347295759,US +1347295756,1347295759,A2 1347295760,1347295775,BW 1347295776,1347295776,IQ 1347295777,1347295784,HU 1347295785,1347295791,LB -1347295792,1347295816,US +1347295792,1347295816,A2 1347295817,1347295824,OM 1347295825,1347295832,GH 1347295833,1347295840,FR 1347295841,1347295848,NG 1347295849,1347295852,LS -1347295853,1347295856,US +1347295853,1347295856,A2 1347295857,1347295864,NG -1347295865,1347295928,US +1347295865,1347295928,A2 1347295929,1347295936,NG 1347295937,1347295976,US 1347295977,1347295984,LS -1347295985,1347296007,US +1347295985,1347295992,US +1347295993,1347295999,A2 +1347296000,1347296007,US 1347296008,1347296008,A2 1347296009,1347296032,US 1347296033,1347296040,A2 @@ -17775,7 +18917,9 @@ 1347481600,1347485695,AT 1347485696,1347493887,DE 1347493888,1347502079,LV -1347502080,1347505159,ES +1347502080,1347503103,ES +1347503104,1347503359,KR +1347503360,1347505159,ES 1347505160,1347505167,GB 1347505168,1347505215,ES 1347505216,1347505247,GB @@ -17814,17 +18958,15 @@ 1347665920,1347670015,RU 1347670016,1347674111,SE 1347674112,1347682303,RU -1347682304,1347682559,DE -1347682560,1347682815,A2 -1347682816,1347686399,DE +1347682304,1347686399,DE 1347686400,1347690495,EU 1347690496,1347694591,SE 1347694592,1347706879,GB 1347706880,1347710975,IT 1347710976,1347715071,RU -1347715072,1347716351,ES -1347716352,1347716607,BG -1347716608,1347718143,ES +1347715072,1347717375,ES +1347717376,1347717631,BG +1347717632,1347718143,ES 1347718144,1347718399,US 1347718400,1347723263,ES 1347723264,1347727359,GB @@ -17879,8 +19021,7 @@ 1347862528,1347866623,CH 1347866624,1347870719,NO 1347870720,1347874815,AM -1347874816,1347878399,RU -1347878400,1347878911,SK +1347874816,1347878911,SK 1347878912,1347887103,GB 1347887104,1347891199,PL 1347891200,1347895295,SE @@ -17924,7 +19065,11 @@ 1348063232,1348067327,CH 1348067328,1348071423,NL 1348071424,1348075519,DE -1348075520,1348083711,LV +1348075520,1348076287,LV +1348076288,1348076543,RU +1348076544,1348082687,LV +1348082688,1348082943,RU +1348082944,1348083711,LV 1348083712,1348091903,LU 1348091904,1348095999,RU 1348096000,1348100095,AL @@ -17932,9 +19077,7 @@ 1348104192,1348108287,RU 1348108288,1348112383,CZ 1348112384,1348116479,DE -1348116480,1348119039,JO -1348119040,1348119295,US -1348119296,1348120575,JO +1348116480,1348120575,JO 1348120576,1348124671,RU 1348124672,1348128767,GB 1348128768,1348129791,BE @@ -17953,17 +19096,11 @@ 1348177920,1348182015,BE 1348182016,1348190207,UA 1348190208,1348194303,RU -1348194304,1348194815,GR -1348194816,1348195071,US -1348195072,1348198399,GR +1348194304,1348198399,GR 1348198400,1348202495,NO 1348202496,1348206591,EU 1348206592,1348218879,RU -1348218880,1348219135,DE -1348219136,1348219391,US -1348219392,1348219903,DE -1348219904,1348220159,US -1348220160,1348222975,DE +1348218880,1348222975,DE 1348222976,1348231167,LU 1348231168,1348235263,RU 1348235264,1348239359,AT @@ -17997,9 +19134,7 @@ 1348354048,1348358143,NL 1348358144,1348362239,DE 1348362240,1348366335,MC -1348366336,1348368227,IT -1348368228,1348368228,A2 -1348368229,1348370431,IT +1348366336,1348370431,IT 1348370432,1348374527,DE 1348374528,1348378623,CH 1348378624,1348382719,BY @@ -18013,7 +19148,9 @@ 1348411392,1348415487,RU 1348415488,1348419583,GB 1348419584,1348427775,HU -1348427776,1348435967,CZ +1348427776,1348429823,CZ +1348429824,1348430079,AU +1348430080,1348435967,CZ 1348435968,1348440063,FI 1348440064,1348444159,DE 1348444160,1348448255,NL @@ -18031,7 +19168,9 @@ 1349124096,1349255167,GR 1349255168,1349451775,AT 1349451776,1349517311,IE -1349517312,1349763071,NL +1349517312,1349554687,NL +1349554688,1349554943,NO +1349554944,1349763071,NL 1349763072,1349771263,RU 1349771264,1349779455,NL 1349779456,1349910527,IT @@ -18063,33 +19202,45 @@ 1353262296,1353262303,US 1353262304,1353271567,GB 1353271568,1353271575,AT -1353271576,1353272079,GB +1353271576,1353271711,GB +1353271712,1353271719,AT +1353271720,1353271727,GB +1353271728,1353271743,AT +1353271744,1353271775,GB +1353271776,1353271807,AT +1353271808,1353272079,GB 1353272080,1353272095,ES -1353272096,1353275247,GB +1353272096,1353273407,GB +1353273408,1353273423,BE +1353273424,1353275247,GB 1353275248,1353275255,ES 1353275256,1353277439,GB 1353277440,1353279487,CH 1353279488,1353279583,GB 1353279584,1353279591,IT 1353279592,1353286143,GB -1353286144,1353286255,EU -1353286256,1353286271,GB -1353286272,1353286303,EU -1353286304,1353286311,GB -1353286312,1353286335,EU +1353286144,1353286335,EU 1353286336,1353286367,GB -1353286368,1353286397,EU -1353286398,1353286398,GB -1353286399,1353286399,EU +1353286368,1353286399,EU 1353286400,1353287959,GB 1353287960,1353287967,IE -1353287968,1353298687,GB -1353298688,1353299455,SE -1353299456,1353300079,GB +1353287968,1353288191,GB +1353288192,1353288447,IE +1353288448,1353289215,GB +1353289216,1353289471,IE +1353289472,1353298783,GB +1353298784,1353298815,SE +1353298816,1353298895,GB +1353298896,1353298911,SE +1353298912,1353298943,GB +1353298944,1353299455,SE +1353299456,1353300063,GB +1353300064,1353300071,SE +1353300072,1353300079,GB 1353300080,1353300095,SE -1353300096,1353306695,GB -1353306696,1353306703,BE -1353306704,1353308159,GB +1353300096,1353306623,GB +1353306624,1353306879,BE +1353306880,1353308159,GB 1353308160,1353309183,FR 1353309184,1353312447,GB 1353312448,1353312479,CH @@ -18152,25 +19303,33 @@ 1357316096,1357317119,EU 1357317120,1357317375,GB 1357317376,1357317631,A2 -1357317632,1357318399,EU +1357317632,1357318151,EU +1357318152,1357318159,GR +1357318160,1357318207,GB +1357318208,1357318215,IT +1357318216,1357318399,EU 1357318400,1357318655,FR -1357318656,1357321023,EU +1357318656,1357318911,EU +1357318912,1357319167,DE +1357319168,1357321023,EU 1357321024,1357321087,KE 1357321088,1357321983,EU 1357321984,1357322239,GB 1357322240,1357322255,DE -1357322256,1357322495,EU -1357322496,1357322751,DE +1357322256,1357322751,EU 1357322752,1357323007,GB 1357323008,1357323015,CG 1357323016,1357323519,EU 1357323520,1357323775,GB -1357323776,1357323779,FI -1357323780,1357324287,EU -1357324288,1357325311,GB +1357323776,1357323791,FI +1357323792,1357324287,EU +1357324288,1357324295,RU +1357324296,1357325311,GB 1357325312,1357326335,EU 1357326336,1357326337,ES -1357326338,1357327359,EU +1357326338,1357326847,EU +1357326848,1357327103,GB +1357327104,1357327359,EU 1357327360,1357327615,FR 1357327616,1357328383,EU 1357328384,1357328671,GB @@ -18183,8 +19342,8 @@ 1357331200,1357335807,EU 1357335808,1357336063,IT 1357336064,1357337599,EU -1357337600,1357337615,NL -1357337616,1357340671,EU +1357337600,1357337635,NL +1357337636,1357340671,EU 1357340672,1357341695,GB 1357341696,1357342975,EU 1357342976,1357343231,GB @@ -18204,34 +19363,43 @@ 1357347456,1357347583,FR 1357347584,1357347615,EU 1357347616,1357347659,FR -1357347660,1357347839,EU +1357347660,1357347663,EU +1357347664,1357347671,FR +1357347672,1357347679,EU +1357347680,1357347711,FR +1357347712,1357347839,EU 1357347840,1357348095,PL 1357348096,1357348383,EU 1357348384,1357348415,ES 1357348416,1357348479,EU 1357348480,1357348607,ES 1357348608,1357350399,EU -1357350400,1357350527,GB -1357350528,1357351167,EU +1357350400,1357350623,GB +1357350624,1357350655,EU +1357350656,1357350783,GB +1357350784,1357351167,EU 1357351168,1357351423,PL -1357351424,1357359871,EU -1357359872,1357360383,GB +1357351424,1357355519,EU +1357355520,1357355775,FR +1357355776,1357360063,EU +1357360064,1357360383,GB 1357360384,1357361151,EU 1357361152,1357363199,GB 1357363200,1357364223,QA 1357364224,1357365247,ES 1357365248,1357366783,EU -1357366784,1357366959,GB +1357366784,1357366959,NL 1357366960,1357366967,BE -1357366968,1357367039,GB +1357366968,1357366975,NL +1357366976,1357367039,GB 1357367040,1357368351,EU 1357368352,1357368383,NL 1357368384,1357368575,EU 1357368576,1357368831,NL 1357368832,1357371391,EU 1357371392,1357371647,GB -1357371648,1357372159,EU -1357372160,1357372927,GB +1357371648,1357372415,EU +1357372416,1357372927,GB 1357372928,1357373467,EU 1357373468,1357373471,GB 1357373472,1357373479,EU @@ -18239,13 +19407,13 @@ 1357373520,1357373535,FI 1357373536,1357373539,ES 1357373540,1357373543,PT -1357373544,1357373551,GB -1357373552,1357373951,EU -1357373952,1357374975,GB -1357374976,1357377535,EU -1357377536,1357377671,FR -1357377672,1357377791,EU -1357377792,1357378559,FR +1357373544,1357373555,GB +1357373556,1357373567,EU +1357373568,1357375135,GB +1357375136,1357377535,EU +1357377536,1357377679,FR +1357377680,1357377695,EU +1357377696,1357378559,FR 1357378560,1357381631,EU 1357381632,1357414399,NO 1357414400,1357447167,LV @@ -18287,8 +19455,7 @@ 1357879296,1357879423,DE 1357879424,1357879935,EU 1357879936,1357880063,GB -1357880064,1357883391,EU -1357883392,1357883647,FR +1357880064,1357883647,EU 1357883648,1357883903,SE 1357883904,1357884159,EU 1357884160,1357884415,GB @@ -18368,10 +19535,10 @@ 1357979648,1357983743,KZ 1357983744,1357984103,GB 1357984104,1357984119,IT -1357984120,1357984367,GB -1357984368,1357984375,IT -1357984376,1357984527,GB -1357984528,1357984551,IT +1357984120,1357984527,GB +1357984528,1357984535,IT +1357984536,1357984543,GB +1357984544,1357984551,IT 1357984552,1357984591,GB 1357984592,1357984599,IT 1357984600,1357984831,GB @@ -18418,11 +19585,12 @@ 1358147584,1358151679,GB 1358151680,1358155775,DE 1358155776,1358159871,CH -1358163968,1358165503,FR -1358165504,1358165759,MQ -1358165760,1358166015,FR -1358166016,1358166527,MQ -1358166528,1358168063,FR +1358163968,1358164479,FR +1358164480,1358164735,MQ +1358164736,1358164991,FR +1358164992,1358165247,MQ +1358165248,1358167807,FR +1358167808,1358168063,GP 1358168064,1358172159,GB 1358172160,1358176255,CY 1358176256,1358180351,RU @@ -18543,7 +19711,9 @@ 1358670976,1358670991,PT 1358670992,1358671001,GB 1358671002,1358671002,PT -1358671003,1358671935,GB +1358671003,1358671359,GB +1358671360,1358671615,PT +1358671616,1358671935,GB 1358671936,1358671943,PT 1358671944,1358675967,GB 1358675968,1358676991,SE @@ -18607,8 +19777,9 @@ 1358861824,1358862335,FR 1358862336,1358862847,US 1358862848,1358862911,DK -1358862912,1358863103,SE -1358863104,1358863359,EU +1358862912,1358862914,EU +1358862915,1358862915,DK +1358862916,1358863359,EU 1358863360,1358863615,US 1358863616,1358864383,GB 1358864384,1358872575,CH @@ -18622,13 +19793,7 @@ 1358897152,1358899711,A2 1358899712,1358899967,US 1358899968,1358900223,KE -1358900224,1358904703,A2 -1358904704,1358904719,MU -1358904720,1358904735,A2 -1358904736,1358904767,ZA -1358904768,1358905167,A2 -1358905168,1358905183,CD -1358905184,1358905343,A2 +1358900224,1358905343,A2 1358905344,1358909439,UA 1358909440,1358913535,RU 1358913536,1358917631,CH @@ -18649,12 +19814,15 @@ 1359036416,1359052799,GB 1359052800,1359101951,RU 1359101952,1359118335,GB -1359118336,1359119199,DE +1359118336,1359118655,DE +1359118656,1359118719,GR +1359118720,1359119199,DE 1359119200,1359119231,NL 1359119232,1359119359,DE 1359119360,1359120383,NL 1359120384,1359121407,DK -1359121408,1359134719,DE +1359121408,1359122431,ES +1359122432,1359134719,DE 1359134720,1359151103,CZ 1359151104,1359167487,DE 1359167488,1359172095,GB @@ -18679,16 +19847,13 @@ 1359446016,1359462399,DK 1359462400,1359467007,DE 1359467008,1359467263,US -1359467264,1359467775,DE -1359467776,1359468031,US -1359468032,1359470591,DE +1359467264,1359470591,DE 1359470592,1359478783,CH 1359478784,1359511551,TR 1359511552,1359544319,SE 1359544320,1359577087,RU 1359577088,1359609855,ES -1359609856,1359641087,EG -1359641088,1359642623,JO +1359609856,1359642623,EG 1359642624,1359675391,AT 1359675392,1359708159,DE 1359708160,1359740927,BE @@ -18794,7 +19959,9 @@ 1360359424,1360363519,AT 1360363520,1360365567,IT 1360365568,1360367615,NL -1360367616,1360371711,IE +1360367616,1360367771,IE +1360367772,1360367772,DE +1360367773,1360371711,IE 1360371712,1360375807,TR 1360375808,1360379903,NL 1360379904,1360383999,PL @@ -18850,8 +20017,7 @@ 1360613376,1360617471,SE 1360617472,1360621567,IT 1360621568,1360625663,ES -1360625664,1360625919,A2 -1360625920,1360629759,DE +1360625664,1360629759,DE 1360629760,1360633855,SE 1360633856,1360637951,RU 1360637952,1360642047,FO @@ -18864,7 +20030,8 @@ 1360654336,1360658431,EE 1360658432,1360666623,PL 1360666624,1360674815,NO -1360674816,1360678911,DZ +1360674816,1360676863,DZ +1360676864,1360678911,ZA 1360678912,1360683007,RU 1360683008,1360691199,GB 1360691200,1360698879,RU @@ -18878,11 +20045,7 @@ 1360728064,1360732159,FR 1360732160,1360736255,NO 1360736256,1360740351,RU -1360740352,1360748677,GB -1360748678,1360748678,IM -1360748679,1360749759,GB -1360749760,1360749791,IM -1360749792,1360752639,GB +1360740352,1360752639,GB 1360752640,1360756735,DE 1360756736,1360760831,IT 1360760832,1360764927,RU @@ -18927,7 +20090,19 @@ 1360961536,1360965631,UA 1360965632,1360977919,RU 1360977920,1360986111,CZ -1360986112,1360994303,GB +1360986112,1360986269,GB +1360986270,1360986270,US +1360986271,1360986299,GB +1360986300,1360986300,US +1360986301,1360986356,GB +1360986357,1360986358,US +1360986359,1360986367,GB +1360986368,1360986399,US +1360986400,1360986631,GB +1360986632,1360986635,US +1360986636,1360992255,GB +1360992256,1360992511,DE +1360992512,1360994303,GB 1360994304,1360998399,CZ 1360998400,1361002495,FI 1361002496,1361006591,GB @@ -18938,15 +20113,14 @@ 1361027072,1361035263,IR 1361035628,1361035631,DZ 1361039360,1361041407,IE -1361041408,1361042431,NL -1361042432,1361043455,PL +1361041408,1361043455,NL 1361043456,1361051647,IR 1361051648,1362100223,ES 1362100224,1362395647,FR -1362395648,1362396031,US -1362396032,1362396415,FR -1362396416,1362396543,US -1362396544,1362396671,FR +1362395648,1362395775,US +1362395776,1362395807,FR +1362395808,1362395903,US +1362395904,1362396671,FR 1362396672,1362396927,US 1362396928,1362398463,FR 1362398464,1362398719,DE @@ -18958,10 +20132,7 @@ 1362406144,1362407167,SV 1362407168,1362411519,FR 1362411520,1362413273,MQ -1362413274,1362414079,FR -1362414080,1362414143,US -1362414144,1362414207,FR -1362414208,1362414847,US +1362413274,1362414847,FR 1362414848,1362415103,GB 1362415104,1362415359,FR 1362415360,1362415615,DE @@ -18969,10 +20140,7 @@ 1362417664,1362419711,SG 1362419712,1362423807,FR 1362423808,1362425855,SG -1362425856,1362426367,US -1362426368,1362426495,FR -1362426496,1362426559,US -1362426560,1362426879,FR +1362425856,1362426879,FR 1362426880,1362427815,MQ 1362427816,1362755583,FR 1362755584,1362886655,NL @@ -18986,26 +20154,19 @@ 1364262912,1364328447,IT 1364328448,1364459519,BE 1364459520,1364525055,PT -1364525056,1364525311,NL -1364525312,1364525567,A2 -1364525568,1364526591,NL +1364525056,1364526591,NL 1364526592,1364528639,GB 1364528640,1364529663,NL 1364529664,1364530175,GB -1364530176,1364541439,NL +1364530176,1364537343,NL +1364537344,1364537599,IS +1364537600,1364541439,NL 1364541440,1364545535,SE -1364545536,1364579839,NL -1364579840,1364580095,US -1364580096,1364581375,NL +1364545536,1364581375,NL 1364581376,1364582399,LY 1364582400,1364585727,NL 1364585728,1364585983,CA -1364585984,1364586239,LB -1364586240,1364588977,NL -1364588978,1364588978,US -1364588979,1364589567,NL -1364589568,1364589823,A2 -1364589824,1364590591,NL +1364585984,1364590591,NL 1364590592,1364721663,GB 1364721664,1364725759,SE 1364725760,1364733951,DE @@ -19063,12 +20224,8 @@ 1364963328,1364967423,RU 1364967424,1364971519,GB 1364971520,1364975615,CZ -1364975616,1364979199,BJ -1364979200,1364979455,NG -1364979456,1364979711,BJ -1364979712,1364983039,GB -1364983040,1364983295,CH -1364983296,1364983807,GB +1364975616,1364979711,BJ +1364979712,1364983807,GB 1364983808,1364991999,DE 1364992000,1364996095,IT 1364996096,1365000191,GR @@ -19080,18 +20237,17 @@ 1365015920,1365016575,US 1365016576,1365020671,ES 1365020672,1365024767,CZ -1365024768,1365028863,DE +1365024768,1365025151,DE +1365025152,1365025215,AT +1365025216,1365028863,DE 1365028864,1365032959,NL 1365032960,1365041151,PT -1365041152,1365042047,FR -1365042048,1365042055,GB -1365042056,1365044735,FR +1365041152,1365044735,FR 1365044736,1365044799,LU 1365044800,1365044927,FR 1365044928,1365044935,GR 1365044936,1365044943,LU -1365044944,1365044991,FR -1365044992,1365045247,LU +1365044944,1365045247,FR 1365045248,1365047295,AT 1365047296,1365049343,SK 1365049344,1365057535,FR @@ -19136,11 +20292,7 @@ 1365237760,1365241855,UZ 1365241856,1365245951,DK 1365245952,1366294527,GB -1366294528,1366465791,IT -1366465792,1366465873,NL -1366465874,1366465874,IT -1366465875,1366466047,NL -1366466048,1367343103,IT +1366294528,1367343103,IT 1367343104,1369440255,GB 1369440256,1369473023,DE 1369473024,1369505791,HU @@ -19238,7 +20390,9 @@ 1370619904,1370750975,GB 1370750976,1370767359,RO 1370767360,1370771455,MD -1370771456,1370882047,RO +1370771456,1370772479,RO +1370772480,1370772991,MD +1370772992,1370882047,RO 1370882048,1371013119,HU 1371013120,1371078655,ES 1371078656,1371144191,FR @@ -19259,18 +20413,16 @@ 1371930624,1371996159,LV 1371996160,1371996671,A2 1371996672,1371996927,GA -1371996928,1371997183,A2 -1371997184,1371997439,KE -1371997440,1372000255,A2 +1371996928,1372000255,A2 1372000256,1372004351,UG -1372004352,1372006426,A2 -1372006427,1372006427,TZ -1372006428,1372012543,A2 +1372004352,1372012543,A2 1372012544,1372013567,ZM 1372013568,1372020735,A2 -1372020736,1372022783,ZM -1372022784,1372026367,A2 -1372026368,1372026879,KE +1372020736,1372020991,ZM +1372020992,1372021247,CD +1372021248,1372022783,ZM +1372022784,1372026623,A2 +1372026624,1372026879,KE 1372026880,1372027903,IL 1372027904,1372043519,A2 1372043520,1372043775,NG @@ -19315,15 +20467,17 @@ 1372651520,1372684287,FI 1372684288,1372684543,EU 1372684544,1372684799,DE -1372684800,1372688383,EU +1372684800,1372685663,EU +1372685664,1372685679,DE +1372685680,1372688383,EU 1372688384,1372689407,DE -1372689408,1372690431,EU +1372689408,1372689919,EU +1372689920,1372690175,DE +1372690176,1372690431,EU 1372690432,1372691455,DE 1372691456,1372693503,EU 1372693504,1372694015,DE -1372694016,1372695999,EU -1372696000,1372696007,DK -1372696008,1372697343,EU +1372694016,1372697343,EU 1372697344,1372697599,DE 1372697600,1372698879,EU 1372698880,1372699647,DE @@ -19352,133 +20506,125 @@ 1373437952,1373503487,CH 1373503488,1373569023,RU 1373569024,1373634559,AT -1373634560,1373854975,SE -1373854976,1373855180,RU -1373855181,1373855181,SE -1373855182,1373855220,RU -1373855221,1373855221,SE -1373855222,1373855231,RU -1373855232,1374683135,SE +1373634560,1374433279,SE +1374433280,1374433535,DK +1374433536,1374683135,SE 1374683136,1375080959,BE 1375080960,1375081215,EU 1375081216,1375207423,BE -1375207424,1375207679,MQ -1375207680,1375208703,FR -1375208704,1375209215,MQ -1375209216,1375209471,FR -1375209472,1375209983,MQ -1375209984,1375210751,FR -1375210752,1375211519,MQ -1375211520,1375211775,FR -1375211776,1375213311,GP -1375213312,1375213567,FR -1375213568,1375215103,GP -1375215104,1375215359,FR -1375215360,1375215615,GP -1375215616,1375215871,FR -1375215872,1375216127,GF -1375216128,1375217663,FR -1375217664,1375218175,GF -1375218176,1375218431,FR -1375218432,1375219711,GF -1375219712,1375219967,FR -1375219968,1375220479,GF -1375220480,1375220735,FR -1375220736,1375220991,GF -1375220992,1375221247,FR -1375221248,1375221503,GF -1375221504,1375223039,FR -1375223040,1375223551,GF +1375207424,1375207679,FR +1375207680,1375208447,MQ +1375208448,1375208703,GP +1375208704,1375208959,FR +1375208960,1375210239,MQ +1375210240,1375210495,GP +1375210496,1375211263,MQ +1375211264,1375211519,FR +1375211520,1375213055,GP +1375213056,1375213311,FR +1375213312,1375215615,GP +1375215616,1375215871,GF +1375215872,1375216127,FR +1375216128,1375216639,GF +1375216640,1375217663,FR +1375217664,1375217919,GF +1375217920,1375218175,FR +1375218176,1375218687,GF +1375218688,1375218943,FR +1375218944,1375220735,GF +1375220736,1375221759,FR +1375221760,1375222015,GF +1375222016,1375222783,FR +1375222784,1375223039,GF +1375223040,1375223295,FR +1375223296,1375223551,GF 1375223552,1375224831,FR 1375224832,1375225087,MQ -1375225088,1375225599,FR -1375225600,1375225855,MQ -1375225856,1375226111,FR -1375226112,1375227903,MQ -1375227904,1375228671,FR -1375228672,1375228927,MQ -1375228928,1375229439,FR -1375229440,1375230719,MQ -1375230720,1375231231,FR -1375231232,1375231487,MQ -1375231488,1375231999,FR -1375232000,1375232255,MQ -1375232256,1375233023,FR -1375233024,1375233279,MQ -1375233280,1375233791,FR -1375233792,1375234303,MQ -1375234304,1375236351,FR -1375236352,1375236863,MQ -1375236864,1375237631,FR -1375237632,1375237887,MQ -1375237888,1375239679,FR -1375239680,1375239935,MQ -1375239936,1375240191,FR -1375240192,1375240959,GP -1375240960,1375242239,FR -1375242240,1375243263,GP -1375243264,1375243519,FR -1375243520,1375243775,GP -1375243776,1375244031,FR -1375244032,1375244287,GP -1375244288,1375244799,FR -1375244800,1375246591,GP -1375246592,1375246847,FR -1375246848,1375247615,GP -1375247616,1375247871,FR +1375225088,1375226111,FR +1375226112,1375226367,MQ +1375226368,1375226623,FR +1375226624,1375227391,MQ +1375227392,1375227647,FR +1375227648,1375227903,MQ +1375227904,1375228415,FR +1375228416,1375228671,MQ +1375228672,1375229183,FR +1375229184,1375229439,MQ +1375229440,1375230719,FR +1375230720,1375230975,MQ +1375230976,1375231487,FR +1375231488,1375231743,MQ +1375231744,1375234047,FR +1375234048,1375234303,MQ +1375234304,1375234559,FR +1375234560,1375234815,MQ +1375234816,1375235071,FR +1375235072,1375235583,MQ +1375235584,1375236095,FR +1375236096,1375236351,MQ +1375236352,1375237887,FR +1375237888,1375238143,MQ +1375238144,1375238655,FR +1375238656,1375238911,MQ +1375238912,1375239167,FR +1375239168,1375239423,MQ +1375239424,1375242495,FR +1375242496,1375242751,GP +1375242752,1375243007,FR +1375243008,1375243263,GP +1375243264,1375243775,FR +1375243776,1375244031,GP +1375244032,1375246079,FR +1375246080,1375246591,GP +1375246592,1375247871,FR 1375247872,1375248383,GP -1375248384,1375248639,FR -1375248640,1375248895,GP -1375248896,1375249919,FR -1375249920,1375250175,GP -1375250176,1375251967,FR -1375251968,1375252479,GP -1375252480,1375252991,FR -1375252992,1375254015,GP -1375254016,1375254527,FR -1375254528,1375255039,GP -1375255040,1375255295,FR -1375255296,1375255551,GP -1375255552,1375256063,FR -1375256064,1375256575,GP -1375256576,1375257087,RE -1375257088,1375257855,FR -1375257856,1375258111,RE -1375258112,1375259135,FR -1375259136,1375259647,RE -1375259648,1375260062,FR +1375248384,1375250687,FR +1375250688,1375251199,GP +1375251200,1375251711,FR +1375251712,1375252223,GP +1375252224,1375252735,FR +1375252736,1375253247,GP +1375253248,1375253503,FR +1375253504,1375253759,GP +1375253760,1375254015,FR +1375254016,1375254527,GP +1375254528,1375255039,FR +1375255040,1375255295,GP +1375255296,1375255551,FR +1375255552,1375255807,GP +1375255808,1375256575,FR +1375256576,1375257599,RE +1375257600,1375258111,FR +1375258112,1375258623,RE +1375258624,1375260062,FR 1375260063,1375260063,RE -1375260064,1375260671,FR -1375260672,1375260927,RE -1375260928,1375261951,FR -1375261952,1375262463,RE -1375262464,1375262719,FR -1375262720,1375263231,RE -1375263232,1375264511,FR -1375264512,1375265279,RE -1375265280,1375265535,FR -1375265536,1375266047,RE -1375266048,1375266559,FR -1375266560,1375267839,RE -1375267840,1375268095,FR -1375268096,1375268351,RE -1375268352,1375269119,FR -1375269120,1375269631,RE -1375269632,1375270143,FR -1375270144,1375270399,RE -1375270400,1375271167,FR -1375271168,1375272191,RE -1375272192,1375272703,FR -1375272704,1375272959,RE -1375272960,1375552511,FR +1375260064,1375260927,FR +1375260928,1375262463,RE +1375262464,1375262975,FR +1375262976,1375263487,RE +1375263488,1375264255,FR +1375264256,1375264511,RE +1375264512,1375264767,FR +1375264768,1375265791,RE +1375265792,1375266303,FR +1375266304,1375266815,RE +1375266816,1375269119,FR +1375269120,1375269375,RE +1375269376,1375269631,FR +1375269632,1375270143,RE +1375270144,1375270399,FR +1375270400,1375270655,RE +1375270656,1375270911,FR +1375270912,1375271679,RE +1375271680,1375552511,FR 1375552512,1375553535,EU 1375553536,1375705984,FR 1375705985,1375705985,EU 1375705986,1375731711,FR 1375731712,1375844607,GB -1375844608,1375844744,US -1375844745,1375844745,GB -1375844746,1375844863,US +1375844608,1375844735,US +1375844736,1375844767,GB +1375844768,1375844863,US 1375844864,1378719197,GB 1378719198,1378719198,EU 1378719199,1378877439,GB @@ -19521,7 +20667,9 @@ 1382367232,1382383615,BG 1382383616,1382399999,DZ 1382400000,1382416383,NL -1382416384,1382432767,PT +1382416384,1382417663,PT +1382417664,1382418175,SE +1382418176,1382432767,PT 1382432768,1382449151,CY 1382449152,1382465535,IL 1382465536,1382481919,PS @@ -19537,22 +20685,16 @@ 1383088128,1383096319,IS 1383096320,1383098879,GB 1383098880,1383099135,DE -1383099136,1383100159,GB -1383100160,1383100415,FR -1383100416,1383104511,GB +1383099136,1383099163,GB +1383099164,1383099164,NL +1383099165,1383104511,GB 1383104512,1383112703,JE 1383112704,1383114751,LB 1383114752,1383116799,GB 1383116800,1383120895,RU 1383120896,1383129087,IT 1383129088,1383137279,GB -1383137280,1383139583,MC -1383139584,1383139839,A2 -1383139840,1383140095,MC -1383140096,1383140351,A2 -1383140352,1383141119,MC -1383141120,1383141375,US -1383141376,1383145471,MC +1383137280,1383145471,MC 1383145472,1383153663,CZ 1383153664,1383161855,GB 1383161856,1383170047,DE @@ -19561,9 +20703,7 @@ 1383194624,1383202815,GB 1383202816,1383211007,RU 1383211008,1383219199,CY -1383219200,1383223295,AL -1383223296,1383223551,RS -1383223552,1383225983,AL +1383219200,1383225983,AL 1383225984,1383226007,RS 1383226008,1383226207,AL 1383226208,1383226239,RS @@ -19590,19 +20730,11 @@ 1383350272,1383358463,NO 1383358464,1383367679,DE 1383367680,1383368703,GB -1383368704,1383368957,DE -1383368958,1383368958,US -1383368959,1383369727,DE -1383369728,1383369760,SA -1383369761,1383369761,KW -1383369762,1383369768,SA -1383369769,1383369769,KW -1383369770,1383369983,SA +1383368704,1383369727,DE +1383369728,1383369983,SA 1383369984,1383372031,DE 1383372032,1383374335,KW -1383374336,1383374723,DE -1383374724,1383374724,KW -1383374725,1383374847,DE +1383374336,1383374847,DE 1383374848,1383383039,ES 1383383040,1383391231,CY 1383391232,1383399423,FI @@ -19628,7 +20760,9 @@ 1383497728,1383505919,RU 1383505920,1383514111,SA 1383514112,1383522303,FI -1383522304,1383530495,BG +1383522304,1383523839,BG +1383523840,1383524095,GB +1383524096,1383530495,BG 1383530496,1383538687,DE 1383538688,1383546879,IT 1383546880,1383555071,BG @@ -19701,32 +20835,27 @@ 1385218048,1385226239,UA 1385226240,1385234431,GB 1385234432,1385242623,DE -1385242624,1385250431,GB -1385250432,1385250559,A1 -1385250560,1385250815,GB +1385242624,1385250815,GB 1385250816,1385259007,PL 1385259008,1385267199,IT 1385267200,1385275391,SE 1385275392,1385283583,IT 1385283584,1385286143,DE 1385286144,1385287679,GB -1385287680,1385291775,EU +1385287680,1385290631,EU +1385290632,1385290632,IS +1385290633,1385291343,EU +1385291344,1385291344,IS +1385291345,1385291775,EU 1385291776,1385299967,TR 1385299968,1385308159,BG -1385308160,1385308671,BE -1385308672,1385309183,RU -1385309184,1385309439,BE -1385309440,1385309695,RU -1385309696,1385310207,BE -1385310208,1385312255,RU -1385312256,1385314303,US -1385314304,1385316351,RU +1385308160,1385312255,RU +1385312256,1385313279,US +1385313280,1385316351,RU 1385316352,1385324543,NO 1385324544,1385332735,BE 1385332736,1385340927,GB -1385340928,1385341634,LB -1385341635,1385341635,GB -1385341636,1385349119,LB +1385340928,1385349119,LB 1385349120,1385357311,CH 1385357312,1385365503,PL 1385365504,1385373695,GB @@ -19755,9 +20884,7 @@ 1385567232,1385568255,IE 1385568256,1385570303,EU 1385570304,1385578495,HU -1385578496,1385580543,TR -1385580544,1385580799,DK -1385580800,1385586687,TR +1385578496,1385586687,TR 1385586688,1385594879,GB 1385594880,1385603071,NL 1385603072,1385611263,CZ @@ -19777,9 +20904,15 @@ 1386217472,1386283007,PL 1386283008,1386348543,NL 1386348544,1386414079,RU -1386414080,1386479615,GB +1386414080,1386438399,GB +1386438400,1386438655,FR +1386438656,1386448895,GB +1386448896,1386450943,IL +1386450944,1386479615,GB 1386479616,1386545151,NO -1386545152,1386610687,DE +1386545152,1386552319,DE +1386552320,1386553087,GB +1386553088,1386610687,DE 1386610688,1386676223,IL 1386676224,1386741759,SA 1386741760,1387249663,NL @@ -19825,18 +20958,16 @@ 1388568576,1388576767,CH 1388576768,1388580863,NL 1388580864,1388581119,GB -1388581120,1388584959,FR +1388581120,1388583167,FR +1388583168,1388583423,DZ +1388583424,1388584959,FR 1388584960,1388587455,EU 1388587456,1388587471,GB 1388587472,1388587519,EU 1388587520,1388587775,GB -1388587776,1388588287,EU -1388588288,1388588543,GB -1388588544,1388588799,EU -1388588800,1388589823,GB -1388589824,1388590079,EU -1388590080,1388590335,GB -1388590336,1388591103,EU +1388587776,1388589055,EU +1388589056,1388589823,GB +1388589824,1388591103,EU 1388591104,1388591359,AU 1388591360,1388593151,EU 1388593152,1388601343,RU @@ -19848,7 +20979,9 @@ 1388642304,1388650495,FI 1388650496,1388658687,PL 1388658688,1388666879,GB -1388666880,1388671097,FR +1388666880,1388667647,FR +1388667648,1388668159,RE +1388668160,1388671097,FR 1388671098,1388671098,RE 1388671099,1388671763,FR 1388671764,1388671764,RE @@ -19876,16 +21009,19 @@ 1388688160,1388691455,CH 1388691456,1388699647,NL 1388699648,1388707839,SE -1388707840,1388708095,LB -1388708096,1388709631,RU -1388709632,1388709887,LT -1388709888,1388711679,RU -1388711680,1388711935,LB -1388711936,1388714239,RU +1388707840,1388708727,RU +1388708728,1388708743,US +1388708744,1388708859,RU +1388708860,1388708863,US +1388708864,1388709375,RU +1388709376,1388709887,LT +1388709888,1388712063,RU +1388712064,1388712191,LT +1388712192,1388714239,RU 1388714240,1388714495,LB 1388714496,1388714751,RU 1388714752,1388715007,LT -1388715008,1388715263,LB +1388715008,1388715263,RU 1388715264,1388715519,LT 1388715520,1388716031,RU 1388716032,1388724223,ES @@ -19907,9 +21043,7 @@ 1388744760,1388744767,IE 1388744768,1388744831,GB 1388744832,1388744847,IE -1388744848,1388744959,GB -1388744960,1388745215,IE -1388745216,1388745971,GB +1388744848,1388745971,GB 1388745972,1388745975,IE 1388745976,1388746495,GB 1388746496,1388746559,IE @@ -19934,8 +21068,7 @@ 1388806656,1388811775,DE 1388811776,1388812031,A1 1388812032,1388814335,DE -1388814336,1388822015,AX -1388822016,1388822527,SE +1388814336,1388822527,AX 1388822528,1388830719,AM 1388830720,1388838911,FI 1388838912,1388871679,RU @@ -19951,11 +21084,7 @@ 1389166592,1389199359,PS 1389199360,1389199871,AE 1389199872,1389200159,US -1389200160,1389210627,AE -1389210628,1389210631,US -1389210632,1389217279,AE -1389217280,1389217535,US -1389217536,1389218815,AE +1389200160,1389218815,AE 1389218816,1389219839,AF 1389219840,1389223935,AE 1389223936,1389224191,US @@ -19966,19 +21095,20 @@ 1389231616,1389232127,AE 1389232128,1389264895,DE 1389264896,1389265151,TZ -1389265152,1389266957,A2 -1389266958,1389266958,NG -1389266959,1389268863,A2 +1389265152,1389266943,A2 +1389266944,1389267199,KE +1389267200,1389268863,A2 1389268864,1389268871,KE 1389268872,1389275647,A2 1389275648,1389275903,ZA -1389275904,1389288447,A2 -1389288448,1389289471,GN +1389275904,1389289471,A2 1389289472,1389290495,NO 1389290496,1389297663,A2 1389297664,1389330431,UA 1389330432,1389363199,DE -1389363200,1389379583,CZ +1389363200,1389373498,CZ +1389373499,1389373499,ES +1389373500,1389379583,CZ 1389379584,1389395967,RU 1389395968,1389412351,RO 1389412352,1389428735,RS @@ -19988,9 +21118,7 @@ 1389477888,1389494271,BY 1389494272,1389510655,DE 1389510656,1389527039,NL -1389527040,1389528551,RO -1389528552,1389528552,PL -1389528553,1389543423,RO +1389527040,1389543423,RO 1389543424,1389557247,DE 1389557248,1389557375,EU 1389557376,1389557391,DE @@ -20033,10 +21161,9 @@ 1389814784,1389815039,EU 1389815040,1389815295,US 1389815296,1389815551,DE -1389815552,1389815807,US -1389815808,1389817855,DE +1389815552,1389817855,US 1389817856,1389819903,GB -1389819904,1389821951,DE +1389819904,1389821951,US 1389821952,1389838335,NL 1389838336,1389854719,UZ 1389854720,1389871103,IT @@ -20108,28 +21235,8 @@ 1399717888,1399848959,AE 1399848960,1400111103,FR 1400111104,1400373247,NL -1400373248,1400702463,DE -1400702464,1400702975,EU -1400702976,1400705023,DE -1400705024,1400706047,EU -1400706048,1400707071,DE -1400707072,1400709119,EU -1400709120,1400710143,DE -1400710144,1400711167,EU -1400711168,1400712191,DE -1400712192,1400713215,EU -1400713216,1400718335,DE -1400718336,1400719359,EU -1400719360,1400721919,DE -1400721920,1400722687,EU -1400722688,1400727551,DE -1400727552,1400727807,EU -1400727808,1400727935,DE -1400727936,1400729599,EU -1400729600,1400730623,DE -1400730624,1400731647,EU -1400731648,1400733695,DE -1400733696,1400897535,EU +1400373248,1400766463,DE +1400766464,1400897535,EU 1400897536,1400963071,NL 1400963072,1401028607,DE 1401028608,1401094143,IL @@ -20147,8 +21254,7 @@ 1401290752,1401356287,BE 1401356288,1401421823,DE 1401421824,1401423871,GB -1401423872,1401425663,AE -1401425664,1401425919,US +1401423872,1401425919,AE 1401425920,1401427967,NL 1401427968,1401430015,RU 1401430016,1401432063,AT @@ -20206,9 +21312,8 @@ 1401544704,1401546751,GB 1401546752,1401548799,IT 1401548800,1401550847,FR -1401550848,1401551103,GB -1401551104,1401551359,JE -1401551360,1401551615,GB +1401550848,1401551103,JE +1401551104,1401551615,GB 1401551616,1401552639,JE 1401552640,1401552895,GB 1401552896,1401554943,NL @@ -20228,7 +21333,13 @@ 1401708288,1401708543,DE 1401708544,1401712895,SE 1401712896,1401713151,DE -1401713152,1401749503,SE +1401713152,1401727743,SE +1401727744,1401727999,GB +1401728000,1401740543,SE +1401740544,1401740799,DE +1401740800,1401747711,SE +1401747712,1401747967,FR +1401747968,1401749503,SE 1401749504,1401765887,DE 1401765888,1401782271,IE 1401782272,1401815039,FR @@ -20304,15 +21415,11 @@ 1402060800,1402077183,FI 1402077184,1402093567,GB 1402093568,1402109951,RU -1402109952,1402129919,FI -1402129920,1402130175,AX -1402130176,1402142719,FI +1402109952,1402142719,FI 1402142720,1402159103,ES 1402159104,1402175487,IT 1402175488,1402191871,IE -1402191872,1402194943,IR -1402194944,1402195967,PT -1402195968,1402208255,IR +1402191872,1402208255,IR 1402208256,1402224639,CZ 1402224640,1402241023,BG 1402241024,1402257407,GB @@ -20320,9 +21427,9 @@ 1402273792,1402277631,RU 1402277632,1402277887,TJ 1402277888,1402290175,RU -1402290176,1402306204,NL -1402306205,1402306205,DE -1402306206,1402306559,NL +1402290176,1402306047,NL +1402306048,1402306303,DE +1402306304,1402306559,NL 1402306560,1402322943,IT 1402322944,1402339327,RU 1402339328,1402355711,CH @@ -20336,7 +21443,9 @@ 1402421248,1402422271,FR 1402422272,1402429439,GB 1402429440,1402430463,US -1402430464,1402437631,GB +1402430464,1402433600,GB +1402433601,1402433601,FR +1402433602,1402437631,GB 1402437632,1402454015,DK 1402454016,1402470399,GB 1402470400,1402994687,FR @@ -20350,9 +21459,9 @@ 1403420672,1403428863,NL 1403428864,1403437055,GB 1403437056,1403445247,RO -1403445248,1403447811,RU -1403447812,1403447812,MD -1403447813,1403461631,RU +1403445248,1403447295,RU +1403447296,1403448575,MD +1403448576,1403461631,RU 1403461632,1403469823,FR 1403469824,1403486207,RU 1403486208,1403494399,FR @@ -20399,7 +21508,8 @@ 1403895808,1403912191,CH 1403912192,1403928575,PT 1403928576,1403944959,SE -1403944960,1403961343,GR +1403944960,1403953151,GR +1403953152,1403961343,IE 1403961344,1403977727,RU 1403977728,1403994111,IT 1403994112,1404010495,AT @@ -20419,7 +21529,9 @@ 1404112896,1404114943,HR 1404114944,1404116991,SE 1404116992,1404125183,NO -1404125184,1404135423,SE +1404125184,1404130303,SE +1404130304,1404131327,HR +1404131328,1404135423,SE 1404135424,1404137471,NL 1404137472,1404139519,SE 1404139520,1404141567,NL @@ -20479,15 +21591,7 @@ 1404567552,1404583935,HR 1404583936,1404600319,NO 1404600320,1404633087,SE -1404633088,1404633599,HR -1404633600,1404633855,SE -1404633856,1404635647,HR -1404635648,1404635903,SE -1404635904,1404637439,HR -1404637440,1404637695,SE -1404637696,1404638207,HR -1404638208,1404638463,SE -1404638464,1404641279,HR +1404633088,1404641279,HR 1404641280,1404678143,SE 1404678144,1404680191,HR 1404680192,1404731391,SE @@ -20514,43 +21618,9 @@ 1404928000,1404944383,SE 1404944384,1404960767,LT 1404960768,1404977151,SE -1404977152,1404977919,LT -1404977920,1404978175,SE -1404978176,1404980223,LT -1404980224,1404980479,SE -1404980480,1404981247,LT -1404981248,1404981503,SE -1404981504,1404983551,LT -1404983552,1404983807,SE -1404983808,1404985087,LT -1404985088,1404985343,SE -1404985344,1404986623,LT -1404986624,1404986879,SE -1404986880,1404987135,LT -1404987136,1404987311,SE -1404987312,1404987312,LT -1404987313,1404987647,SE -1404987648,1404988415,LT -1404988416,1404988469,SE -1404988470,1404988470,LT -1404988471,1404988671,SE -1404988672,1404989695,LT -1404989696,1404989951,SE -1404989952,1404990463,LT -1404990464,1404990719,SE -1404990720,1404990975,LT -1404990976,1404991231,SE -1404991232,1404992511,LT -1404992512,1404992767,SE -1404992768,1404993535,LT +1404977152,1404993535,LT 1404993536,1405009919,SE -1405009920,1405022207,LT -1405022208,1405022463,SE -1405022464,1405022975,LT -1405022976,1405023231,SE -1405023232,1405025023,LT -1405025024,1405025279,SE -1405025280,1405026303,LT +1405009920,1405026303,LT 1405026304,1405042687,NO 1405042688,1405048831,SE 1405048832,1405050879,HR @@ -20559,133 +21629,109 @@ 1405063168,1405067263,NO 1405067264,1405083647,EE 1405083648,1405091839,SE -1405091840,1405813759,FR -1405813760,1405814015,MQ -1405814016,1405815807,FR -1405815808,1405816063,MQ -1405816064,1405816319,FR -1405816320,1405816575,MQ -1405816576,1405816831,FR -1405816832,1405817087,MQ -1405817088,1405817343,FR -1405817344,1405817599,MQ -1405817600,1405818111,FR -1405818112,1405818367,MQ -1405818368,1405818623,FR -1405818624,1405818879,MQ -1405818880,1405819135,FR -1405819136,1405819391,MQ -1405819392,1405819903,FR -1405819904,1405820159,MQ -1405820160,1405820671,FR -1405820672,1405820927,MQ -1405820928,1405821439,FR -1405821440,1405821695,MQ -1405821696,1405822207,FR -1405822208,1405822719,MQ -1405822720,1405823231,FR -1405823232,1405823743,MQ -1405823744,1405824255,FR -1405824256,1405824511,MQ -1405824512,1405824767,FR -1405824768,1405825279,MQ -1405825280,1405825535,FR -1405825536,1405826303,MQ -1405826304,1405826559,FR -1405826560,1405826815,MQ -1405826816,1405827071,FR -1405827072,1405827583,MQ +1405091840,1405812991,FR +1405812992,1405813759,MQ +1405813760,1405814271,FR +1405814272,1405814527,MQ +1405814528,1405814783,FR +1405814784,1405815295,MQ +1405815296,1405816319,FR +1405816320,1405817343,MQ +1405817344,1405817599,FR +1405817600,1405819903,MQ +1405819904,1405820159,FR +1405820160,1405821439,MQ +1405821440,1405821695,FR +1405821696,1405821951,MQ +1405821952,1405822207,FR +1405822208,1405823231,MQ +1405823232,1405823487,FR +1405823488,1405823743,MQ +1405823744,1405823999,FR +1405824000,1405825535,MQ +1405825536,1405826047,FR +1405826048,1405826559,MQ +1405826560,1405826815,FR +1405826816,1405827583,MQ 1405827584,1405827839,FR -1405827840,1405828095,MQ -1405828096,1405828607,FR -1405828608,1405829119,MQ -1405829120,1405829375,FR -1405829376,1405829631,MQ -1405829632,1405830143,FR -1405830144,1405830399,MQ -1405830400,1405830655,FR -1405830656,1405831167,MQ -1405831168,1405831423,FR -1405831424,1405831679,MQ -1405831680,1405833727,FR -1405833728,1405833983,MQ -1405833984,1405834495,FR -1405834496,1405835263,MQ -1405835264,1405835775,FR +1405827840,1405828351,MQ +1405828352,1405828607,FR +1405828608,1405828863,MQ +1405828864,1405829119,FR +1405829120,1405829375,MQ +1405829376,1405829631,FR +1405829632,1405830143,MQ +1405830144,1405830399,FR +1405830400,1405830911,MQ +1405830912,1405831167,FR +1405831168,1405834495,MQ +1405834496,1405835007,FR +1405835008,1405835519,MQ +1405835520,1405835775,FR 1405835776,1405836031,MQ -1405836032,1405836543,FR -1405836544,1405837055,MQ -1405837056,1405837311,FR +1405836032,1405836287,FR +1405836288,1405836543,MQ +1405836544,1405837311,FR 1405837312,1405837567,MQ -1405837568,1405838079,FR -1405838080,1405838591,MQ -1405838592,1405839103,FR -1405839104,1405839359,MQ -1405839360,1405839615,FR -1405839616,1405839871,MQ -1405839872,1405840127,FR -1405840128,1405840639,MQ -1405840640,1405845503,FR -1405845504,1405845759,MQ -1405845760,1405846015,FR -1405846016,1405846527,MQ -1405846528,1405846783,FR -1405846784,1405847039,MQ -1405847040,1405847551,FR -1405847552,1405847807,MQ -1405847808,1405848063,FR -1405848064,1405848319,MQ -1405848320,1405848575,FR -1405848576,1405848831,MQ -1405848832,1405849087,FR -1405849088,1405849599,MQ -1405849600,1405849855,FR -1405849856,1405850111,MQ -1405850112,1405850623,FR -1405850624,1405850879,MQ -1405850880,1405851135,FR -1405851136,1405851903,MQ -1405851904,1405852159,FR -1405852160,1405853439,MQ -1405853440,1405854463,FR -1405854464,1405854975,MQ -1405854976,1405856255,FR -1405856256,1405856511,MQ -1405856512,1405857791,FR -1405857792,1405858559,MQ -1405858560,1405858815,FR -1405858816,1405859071,MQ -1405859072,1405859327,FR -1405859328,1405860351,MQ -1405860352,1405860607,FR -1405860608,1405861119,MQ -1405861120,1405861375,FR -1405861376,1405861631,MQ -1405861632,1405862143,FR -1405862144,1405862399,MQ -1405862400,1405862911,FR -1405862912,1405863423,MQ -1405863424,1405864447,FR -1405864448,1405864703,MQ -1405864704,1405864959,FR -1405864960,1405865983,MQ -1405865984,1405866239,FR -1405866240,1405866495,MQ -1405866496,1405867519,FR -1405867520,1405867775,MQ -1405867776,1405868287,FR -1405868288,1405868799,MQ -1405868800,1405870335,FR -1405870336,1405870591,MQ -1405870592,1405871359,FR -1405871360,1405871615,MQ -1405871616,1405871871,FR -1405871872,1405872127,MQ -1405872128,1405872383,FR -1405872384,1405872895,MQ -1405872896,1405873663,FR -1405873664,1405873919,MQ -1405873920,1406140415,FR +1405837568,1405837823,FR +1405837824,1405838079,MQ +1405838080,1405838335,FR +1405838336,1405839103,MQ +1405839104,1405839359,FR +1405839360,1405840383,MQ +1405840384,1405840895,FR +1405840896,1405846015,MQ +1405846016,1405846271,FR +1405846272,1405846783,MQ +1405846784,1405847039,FR +1405847040,1405847551,MQ +1405847552,1405847807,FR +1405847808,1405848063,MQ +1405848064,1405849599,FR +1405849600,1405850879,MQ +1405850880,1405851391,FR +1405851392,1405851647,MQ +1405851648,1405851903,FR +1405851904,1405852159,MQ +1405852160,1405852415,FR +1405852416,1405852927,MQ +1405852928,1405853439,FR +1405853440,1405853695,MQ +1405853696,1405853951,FR +1405853952,1405854207,MQ +1405854208,1405854975,FR +1405854976,1405855743,MQ +1405855744,1405855999,FR +1405856000,1405858047,MQ +1405858048,1405858559,FR +1405858560,1405860607,MQ +1405860608,1405860863,FR +1405860864,1405861887,MQ +1405861888,1405862399,FR +1405862400,1405862655,MQ +1405862656,1405863423,FR +1405863424,1405864191,MQ +1405864192,1405866495,FR +1405866496,1405867519,MQ +1405867520,1405868031,FR +1405868032,1405868287,MQ +1405868288,1405868799,FR +1405868800,1405869055,MQ +1405869056,1405869311,FR +1405869312,1405870591,MQ +1405870592,1405870847,FR +1405870848,1405871103,MQ +1405871104,1405871359,FR +1405871360,1405872127,MQ +1405872128,1405872639,FR +1405872640,1405873919,MQ +1405873920,1405874175,FR +1405874176,1405874431,MQ +1405874432,1405874687,FR +1405874688,1405876479,MQ +1405876480,1405876735,FR +1405876736,1405878271,MQ +1405878272,1406140415,FR 1406140416,1406205951,CZ 1406205952,1406271487,SE 1406271488,1406337023,IE @@ -20700,14 +21746,15 @@ 1406689280,1406697471,SE 1406697472,1406705663,GB 1406705664,1406708735,IT -1406708736,1406709759,A2 +1406708736,1406709247,A2 +1406709248,1406709503,IT +1406709504,1406709759,A2 1406709760,1406713855,IT -1406713856,1406719743,AT -1406719744,1406719999,GB -1406720000,1406722047,AT +1406713856,1406722047,AT 1406722048,1406730239,DE 1406730240,1406746623,RU -1406746624,1406754815,BE +1406746624,1406754559,BE +1406754560,1406754815,FR 1406754816,1406763007,GB 1406763008,1406771199,LU 1406771200,1406779391,GB @@ -20720,19 +21767,17 @@ 1406793844,1406793847,GB 1406793848,1406794751,ES 1406794752,1406795775,NL -1406795776,1406796543,GB -1406796544,1406796799,IM -1406796800,1406802175,GB -1406802176,1406802431,IM -1406802432,1406803199,GB -1406803200,1406803455,IM -1406803456,1406803711,GB +1406795776,1406796799,GB +1406796800,1406797311,IM +1406797312,1406803711,GB 1406803712,1406803967,IM 1406803968,1406812159,DE 1406812160,1406820351,SE 1406820352,1406828543,PL 1406828544,1406836735,GB -1406836736,1406844927,AT +1406836736,1406837247,AT +1406837248,1406837503,GB +1406837504,1406844927,AT 1406844928,1406853119,MD 1406853120,1406861311,UA 1406861312,1406869503,RU @@ -20784,13 +21829,7 @@ 1407483904,1407516671,CH 1407516672,1407526231,A2 1407526232,1407526239,CD -1407526240,1407528959,A2 -1407528960,1407529178,US -1407529179,1407529180,NG -1407529181,1407529215,US -1407529216,1407534365,A2 -1407534366,1407534366,NG -1407534367,1407537087,A2 +1407526240,1407537087,A2 1407537088,1407537095,GH 1407537096,1407549439,A2 1407549440,1407582207,RU @@ -20828,7 +21867,9 @@ 1408106496,1408172031,PL 1408172032,1408237567,RU 1408237568,1408270335,CZ -1408270336,1408303103,PT +1408270336,1408283327,PT +1408283328,1408283391,GB +1408283392,1408303103,PT 1408303104,1408335871,LV 1408335872,1408368639,SE 1408368640,1408376831,NO @@ -20866,27 +21907,21 @@ 1408761856,1409286143,SE 1409286144,1409362431,HU 1409362432,1409363967,BG -1409363968,1409378679,HU +1409363968,1409377791,HU +1409377792,1409378047,RO +1409378048,1409378679,HU 1409378680,1409378687,RO 1409378688,1409413119,HU 1409413120,1409415167,BG -1409415168,1409430271,HU -1409430272,1409430783,RO -1409430784,1409548287,HU +1409415168,1409548287,HU 1409548288,1409810431,FR 1409810432,1409941503,GB 1409941504,1410007039,PL -1410007040,1410009855,A2 -1410009856,1410010111,US -1410010112,1410017791,A2 +1410007040,1410017791,A2 1410017792,1410017792,DE -1410017793,1410042367,A2 -1410042368,1410042623,US -1410042624,1410043169,A2 -1410043170,1410043171,US -1410043172,1410043172,A2 -1410043173,1410043173,US -1410043174,1410072575,A2 +1410017793,1410030335,A2 +1410030336,1410030591,US +1410030592,1410072575,A2 1410072576,1410203647,GB 1410203648,1410212863,FR 1410212864,1410213119,GB @@ -20927,7 +21962,9 @@ 1410539520,1410547711,GB 1410547712,1410555903,CZ 1410555904,1410564095,GB -1410564096,1410572287,SE +1410564096,1410568991,SE +1410568992,1410569007,NO +1410569008,1410572287,SE 1410572288,1410588671,DE 1410588672,1410596863,GB 1410596864,1410605055,ES @@ -20939,9 +21976,9 @@ 1410646016,1410654207,GB 1410654208,1410662399,SI 1410662400,1410670591,HU -1410670592,1410672639,DE -1410672640,1410673663,US -1410673664,1410675967,DE +1410670592,1410673151,DE +1410673152,1410673407,US +1410673408,1410675967,DE 1410675968,1410676223,US 1410676224,1410678783,DE 1410678784,1410686975,RU @@ -21059,10 +22096,13 @@ 1412406272,1412408831,RU 1412408832,1412409343,RO 1412409344,1412412159,RU -1412412160,1412412671,RO +1412412160,1412412415,UA +1412412416,1412412671,RO 1412412672,1412413439,RU 1412413440,1412413951,RO -1412413952,1412415487,RU +1412413952,1412414719,RU +1412414720,1412414975,RO +1412414976,1412415487,RU 1412415488,1412419583,AE 1412419584,1412427775,IR 1412427776,1412429823,AE @@ -21089,10 +22129,8 @@ 1412805632,1412806143,EU 1412806144,1412808703,US 1412808704,1412825087,RU -1412825088,1412830463,IQ -1412830464,1412832767,LB +1412825088,1412831231,IQ 1412832768,1412833023,SL -1412833024,1412841471,LB 1412841472,1412857855,UZ 1412857856,1412874239,BG 1412874240,1412890623,RU @@ -21150,14 +22188,11 @@ 1422786560,1422852095,HU 1422852096,1422857087,EU 1422857088,1422857151,FR -1422857152,1422907391,EU -1422907392,1422909439,NL -1422909440,1422910207,EU -1422910208,1422910463,NL -1422910464,1422910975,EU -1422910976,1422911487,NL -1422911488,1422913535,GB -1422913536,1422916607,EU +1422857152,1422905343,EU +1422905344,1422907391,IE +1422907392,1422911487,NL +1422911488,1422915583,GB +1422915584,1422916607,EU 1422916608,1422916863,GB 1422916864,1422917119,EU 1422917120,1422917343,GB @@ -21168,11 +22203,7 @@ 1423704064,1423966207,IT 1423966208,1424097279,HU 1424097280,1424228351,CH -1424228352,1424286719,IL -1424286720,1424286938,BG -1424286939,1424286939,IL -1424286940,1424287743,BG -1424287744,1424359423,IL +1424228352,1424359423,IL 1424359424,1424490495,FI 1424490496,1424503711,ES 1424503712,1424503715,PT @@ -21297,12 +22328,11 @@ 1425467392,1425469439,CH 1425469440,1425471487,DK 1425471488,1425473535,DE -1425473536,1425479679,RO -1425479680,1425480703,MD -1425480704,1425484799,RO +1425473536,1425484799,RO 1425484800,1425485311,MD -1425485312,1425485823,US -1425485824,1425489407,RO +1425485312,1425486847,RO +1425486848,1425487359,MD +1425487360,1425489407,RO 1425489408,1425489663,NL 1425489664,1425506303,RO 1425506304,1425522687,NO @@ -21319,18 +22349,14 @@ 1425915904,1425932287,FI 1425932288,1425948671,GR 1425948672,1425965055,DE -1425965056,1425970175,EU -1425970176,1425970431,FR -1425970432,1425971967,EU -1425971968,1425972223,A2 -1425972224,1425974271,EU +1425965056,1425974271,EU 1425974272,1425974783,GB 1425974784,1425975807,EU 1425975808,1425976063,FR 1425976064,1425977343,EU 1425977344,1425980415,FR 1425980416,1425980671,IQ -1425980672,1425981439,A2 +1425980672,1425981439,EU 1425981440,1425997823,RU 1425997824,1426014207,MT 1426014208,1426030591,DK @@ -21345,13 +22371,17 @@ 1426660659,1426669567,RO 1426669568,1426685951,IR 1426685952,1426702335,TJ -1426702336,1426718719,LV +1426702336,1426702591,LV +1426702592,1426702847,RU +1426702848,1426706687,LV +1426706688,1426706943,GB +1426706944,1426716159,LV +1426716160,1426716415,RU +1426716416,1426718719,LV 1426718720,1426731007,SI 1426731008,1426735103,HR 1426735104,1426743295,BE -1426743296,1426745599,LU -1426745600,1426745855,BE -1426745856,1426751487,LU +1426743296,1426751487,LU 1426751488,1426767871,FR 1426767872,1426784255,DE 1426784256,1426800639,SE @@ -21373,7 +22403,9 @@ 1427032144,1427032159,TW 1427032160,1427032735,DE 1427032736,1427032743,AT -1427032744,1427032959,DE +1427032744,1427032855,DE +1427032856,1427032863,TR +1427032864,1427032959,DE 1427032960,1427032967,NL 1427032968,1427033247,DE 1427033248,1427033263,TW @@ -21382,11 +22414,7 @@ 1427062784,1427095551,RU 1427095552,1427111935,LV 1427111936,1427177471,DE -1427177472,1427220556,NL -1427220557,1427220557,KG -1427220558,1427236631,NL -1427236632,1427236633,US -1427236634,1427243007,NL +1427177472,1427243007,NL 1427243008,1427308543,IT 1427308544,1427374079,NO 1427374080,1427439615,IT @@ -21413,9 +22441,7 @@ 1427728089,1427728100,SG 1427728101,1427728599,DE 1427728600,1427728600,SK -1427728601,1427739889,DE -1427739890,1427739890,RU -1427739891,1427741372,DE +1427728601,1427741372,DE 1427741373,1427741373,AT 1427741374,1427767295,DE 1427767296,1427800063,BE @@ -21456,9 +22482,7 @@ 1428152320,1428160511,PL 1428160512,1428260863,IT 1428260864,1428261119,GB -1428261120,1428536831,IT -1428536832,1428537087,US -1428537088,1429209087,IT +1428261120,1429209087,IT 1429209088,1430257663,ES 1430257664,1430388735,IL 1430388736,1430519807,HU @@ -21495,7 +22519,9 @@ 1431994368,1432002559,AT 1432002560,1432010751,HU 1432010752,1432018943,UA -1432018944,1432027135,GB +1432018944,1432024063,GB +1432024064,1432025087,DE +1432025088,1432027135,GB 1432027136,1432035327,IE 1432035328,1432043519,GB 1432043520,1432051711,ES @@ -21503,10 +22529,7 @@ 1432054016,1432054271,RO 1432054272,1432056831,RU 1432056832,1432057343,RO -1432057344,1432058623,RU -1432058624,1432058879,RO -1432058880,1432059135,RU -1432059136,1432059903,RO +1432057344,1432059903,RU 1432059904,1432068095,BG 1432068096,1432076287,BE 1432076288,1432084479,RU @@ -21518,7 +22541,10 @@ 1432131584,1432133631,US 1432133632,1432150015,GB 1432150016,1432158207,BA -1432158208,1432159487,DE +1432158208,1432158463,RO +1432158464,1432158719,DE +1432158720,1432158975,LB +1432158976,1432159487,DE 1432159488,1432159743,AE 1432159744,1432166399,DE 1432166400,1432174591,RU @@ -21572,11 +22598,14 @@ 1433608704,1433610239,GB 1433610240,1433612287,US 1433612288,1433614335,GB -1433614336,1433615027,DE +1433614336,1433614591,NL +1433614592,1433615027,DE 1433615028,1433615028,EU 1433615029,1433615359,DE 1433615360,1433615615,FR -1433615616,1433616383,GB +1433615616,1433615871,GB +1433615872,1433616127,IT +1433616128,1433616383,GB 1433616384,1433624575,AE 1433624576,1433632767,LV 1433632768,1433640959,GI @@ -21594,7 +22623,7 @@ 1433731072,1433739263,PL 1433739264,1433747455,GE 1433747456,1433755647,RU -1433755648,1433763839,EE +1433755648,1433763839,KZ 1433763840,1433772031,FR 1433772032,1433788415,SE 1433796608,1433804799,GB @@ -21656,8 +22685,8 @@ 1434451968,1434517503,PL 1434517504,1434550271,DK 1434550272,1434583039,SA -1434583040,1434595327,BG -1434595328,1434596351,MK +1434583040,1434595583,BG +1434595584,1434596351,MK 1434596352,1434611711,BG 1434611712,1434613759,MK 1434613760,1434615807,BG @@ -21695,10 +22724,10 @@ 1436444672,1436446719,BE 1436446720,1436450815,FR 1436450816,1436452863,BH -1436452864,1436453314,GB +1436452864,1436453119,GB +1436453120,1436453314,DE 1436453315,1436453315,EU -1436453316,1436453375,GB -1436453376,1436453631,DE +1436453316,1436453631,DE 1436453632,1436453887,EU 1436453888,1436454911,GB 1436454912,1436456959,AZ @@ -21752,19 +22781,23 @@ 1437073408,1437335551,FR 1437335552,1437597695,RU 1437597696,1438121983,DE -1438121984,1438142463,NL -1438142464,1438142719,GB -1438142720,1438187519,NL +1438121984,1438187519,NL 1438187520,1438253055,IR 1438253056,1438318591,RO 1438318592,1438384127,BG 1438384128,1438400511,FI 1438400512,1438433279,SE 1438433280,1438515199,GB -1438515200,1438560255,DE +1438515200,1438553855,DE +1438553856,1438554111,BR +1438554112,1438554623,US +1438554624,1438555135,DE +1438555136,1438555391,US +1438555392,1438560255,DE 1438560256,1438562303,US 1438562304,1438580735,DE -1438580736,1438646271,NL +1438580736,1438613503,NL +1438613504,1438646271,DK 1438646272,1438662655,RU 1438662656,1438679039,ES 1438679040,1438695423,RU @@ -21778,22 +22811,24 @@ 1438777344,1438793727,SE 1438793728,1438810111,SA 1438810112,1438826495,SE -1438826496,1438841855,FI +1438826496,1438827519,FI +1438827520,1438828543,IQ +1438828544,1438829567,EE +1438829568,1438838783,FI +1438838784,1438840831,PL +1438840832,1438841855,IQ 1438841856,1438842367,DE 1438842368,1438842879,DK 1438842880,1438859263,SE 1438859264,1438875647,DE 1438875648,1438876927,RU 1438876928,1438877183,IQ -1438877184,1438877439,A2 -1438877440,1438877951,RU +1438877184,1438877951,RU 1438877952,1438878207,LB 1438878208,1438885887,RU 1438885888,1438889983,LT 1438889984,1438892031,RU -1438892032,1438893823,IS -1438893824,1438894079,CH -1438894080,1438896127,IS +1438892032,1438896127,CH 1438896128,1438900223,AQ 1438900224,1438908415,CH 1438908416,1438924799,GR @@ -21811,13 +22846,9 @@ 1439055872,1439072255,RU 1439072256,1439088639,UA 1439088640,1439105023,PL -1439105024,1439106559,AT -1439106560,1439106815,DE -1439106816,1439121407,AT +1439105024,1439121407,AT 1439121408,1439154175,DE -1439154176,1439156106,GB -1439156107,1439156108,LB -1439156109,1439170559,GB +1439154176,1439170559,GB 1439170560,1439236095,NO 1439236096,1439301631,BE 1439301632,1439305727,RU @@ -21835,9 +22866,17 @@ 1439371520,1439371775,FR 1439371776,1439372031,SE 1439372032,1439372287,TR -1439372288,1439373311,NL +1439372288,1439372543,IT +1439372544,1439372799,JP +1439372800,1439373311,NL 1439373312,1439373567,SE -1439373568,1439383551,NL +1439373568,1439374335,NL +1439374336,1439375359,IT +1439375360,1439375615,ES +1439375616,1439376383,NL +1439376384,1439377407,CN +1439377408,1439378431,IT +1439378432,1439383551,NL 1439383552,1439399935,FR 1439399936,1439432703,DK 1439432704,1439437823,RO @@ -21861,17 +22900,25 @@ 1439459328,1439459839,IR 1439459840,1439460607,RO 1439460608,1439460863,MD -1439460864,1439463423,RO +1439460864,1439462655,RO +1439462656,1439462911,MD +1439462912,1439463423,RO 1439463424,1439463935,DK 1439463936,1439466495,RO 1439466496,1439467007,DK 1439467008,1439467519,RO 1439467520,1439468031,DK -1439468032,1439477759,RO +1439468032,1439468543,RO +1439468544,1439469567,ES +1439469568,1439475711,RO +1439475712,1439475967,IN +1439475968,1439476735,RO +1439476736,1439477759,IN 1439477760,1439479807,MD 1439479808,1439482367,RO 1439482368,1439482879,DK -1439482880,1439485951,RO +1439482880,1439483903,RO +1439483904,1439485951,ES 1439485952,1439490047,IR 1439490048,1439498239,RO 1439498240,1439513599,DE @@ -21881,8 +22928,8 @@ 1439518208,1439518719,IT 1439518720,1439527935,DE 1439527936,1439528959,GB -1439528960,1439529471,DE -1439529472,1439529983,GB +1439528960,1439529599,DE +1439529600,1439529983,GB 1439529984,1439530239,EG 1439530240,1439534079,DE 1439534080,1439535103,GB @@ -21911,9 +22958,7 @@ 1439629312,1439694847,CZ 1439694848,1439825919,SA 1439825920,1439956991,GB -1439956992,1440204799,DE -1440204800,1440215039,EU -1440215040,1440251903,DE +1439956992,1440251903,DE 1440251904,1440284671,SK 1440284672,1440317439,FI 1440317440,1440350207,BG @@ -21926,7 +22971,8 @@ 1440546816,1440579583,NO 1440579584,1440645119,PL 1440645120,1440653311,GB -1440653312,1440669695,RS +1440653312,1440665599,RS +1440665600,1440669695,DE 1440669696,1440671743,NL 1440671744,1440672767,EE 1440672768,1440710655,NL @@ -21954,9 +23000,9 @@ 1441439744,1441447935,LV 1441447936,1441456127,BE 1441456128,1441464319,NL -1441464320,1441470463,SE -1441470464,1441470719,DK -1441470720,1441472511,SE +1441464320,1441469439,SE +1441469440,1441469695,DK +1441469696,1441472511,SE 1441472512,1441480703,RU 1441480704,1441488895,TR 1441488896,1441497087,GB @@ -21969,7 +23015,7 @@ 1441554432,1441556991,GB 1441556992,1441557503,SE 1441557504,1441564671,GB -1441564672,1441566719,IQ +1441564672,1441566719,NL 1441566720,1441568767,GB 1441568768,1441570815,FR 1441570816,1441579007,RU @@ -22081,15 +23127,15 @@ 1449590784,1449656319,DE 1449656320,1449657087,GB 1449657088,1449660159,RO -1449660160,1449660415,NL +1449660160,1449660415,BG 1449660416,1449664511,RO 1449664512,1449668607,IR -1449668608,1449670743,SE -1449670744,1449670744,RO -1449670745,1449672703,SE +1449668608,1449672703,SE 1449672704,1449676799,RO 1449676800,1449684991,IR -1449684992,1449690623,RO +1449684992,1449688575,RO +1449688576,1449688831,GB +1449688832,1449690623,RO 1449690624,1449690879,MD 1449690880,1449695231,RO 1449695232,1449697279,SE @@ -22097,31 +23143,60 @@ 1449699328,1449706495,RO 1449706496,1449707519,MD 1449707520,1449709567,SE -1449709568,1449710591,RO +1449709568,1449709823,GB +1449709824,1449710591,RO 1449710592,1449711103,GB 1449711104,1449713151,RO 1449713152,1449714175,GB 1449714176,1449715711,RO 1449715712,1449719807,IR -1449719808,1449734143,RO +1449719808,1449722111,RO +1449722112,1449722367,IT +1449722368,1449723135,RO +1449723136,1449723391,DE +1449723392,1449724927,RO +1449724928,1449725183,GB +1449725184,1449726463,RO +1449726464,1449726719,NL +1449726720,1449727999,RO +1449728000,1449728255,MD +1449728256,1449734143,RO 1449734144,1449736191,IT -1449736192,1449742335,RO +1449736192,1449736447,RO +1449736448,1449736703,MD +1449736704,1449742335,RO 1449742336,1449744383,MD 1449744384,1449750527,RO 1449750528,1449752575,SE 1449752576,1449754623,RO 1449754624,1449758719,IR -1449758720,1449765887,RO +1449758720,1449759743,RO +1449759744,1449760511,MD +1449760512,1449764863,RO +1449764864,1449765119,MD +1449765120,1449765887,RO 1449765888,1449766911,MD 1449766912,1449768959,RO 1449768960,1449769471,GB -1449769472,1449775103,RO -1449775104,1449776127,MD -1449776128,1449780479,RO +1449769472,1449772031,RO +1449772032,1449772287,GB +1449772288,1449776127,RO +1449776128,1449776639,FR +1449776640,1449778431,RO +1449778432,1449778687,MD +1449778688,1449779455,RO +1449779456,1449779711,GB +1449779712,1449779967,RO +1449779968,1449780223,RU +1449780224,1449780479,RO 1449780480,1449780991,GB -1449780992,1449782015,RO +1449780992,1449781247,RO +1449781248,1449781503,MD +1449781504,1449782015,RO 1449782016,1449782271,GB -1449782272,1449783807,RO +1449782272,1449783295,RO +1449783296,1449783551,DE +1449783552,1449783807,RO 1449783808,1449784319,GB 1449784320,1449789439,RO 1449789440,1449790207,GB @@ -22129,19 +23204,24 @@ 1449790720,1449791487,GB 1449791488,1449793279,RO 1449793280,1449793535,NL -1449793536,1449811199,RO +1449793536,1449794047,IR +1449794048,1449794303,PH +1449794304,1449810943,RO +1449810944,1449811199,MD 1449811200,1449811455,BG 1449811456,1449811967,GB -1449811968,1449812991,RO +1449811968,1449812223,DK +1449812224,1449812991,RO 1449812992,1449813503,GB -1449813504,1449814271,RO +1449813504,1449813759,RU +1449813760,1449814271,RO 1449814272,1449815039,GB 1449815040,1449815295,RO 1449815296,1449816063,GB 1449816064,1449816575,RO 1449816576,1449817855,GB 1449817856,1449820927,RO -1449820928,1449821183,BZ +1449820928,1449821183,DE 1449821184,1449822719,RO 1449822720,1449823743,GB 1449823744,1449824255,RO @@ -22157,7 +23237,9 @@ 1449859584,1449860607,GB 1449860608,1449863679,RO 1449863680,1449863935,GB -1449863936,1449870847,RO +1449863936,1449869311,RO +1449869312,1449870335,MD +1449870336,1449870847,RO 1449870848,1449871615,GB 1449871616,1449871871,RO 1449871872,1449872383,GB @@ -22167,14 +23249,22 @@ 1449878528,1449879039,RO 1449879040,1449879167,PH 1449879168,1449879295,TH -1449879296,1449883647,RO +1449879296,1449880319,RO +1449880320,1449880575,MD +1449880576,1449883647,RO 1449883648,1449885695,BE 1449885696,1449889791,GB 1449889792,1449893887,IR 1449893888,1449895935,MD -1449895936,1449902335,RO +1449895936,1449900543,RO +1449900544,1449901055,MD +1449901056,1449901311,RO +1449901312,1449901823,FR +1449901824,1449902079,DE +1449902080,1449902335,RO 1449902336,1449903103,GB -1449903104,1449906175,RO +1449903104,1449903359,MD +1449903360,1449906175,RO 1449906176,1449910271,IR 1449910272,1449918463,RO 1449918464,1449951231,JO @@ -22190,7 +23280,9 @@ 1450041344,1450049535,DE 1450049536,1450057727,RU 1450057728,1450065919,EE -1450065920,1450074111,DE +1450065920,1450067135,DE +1450067136,1450067199,AT +1450067200,1450074111,DE 1450074112,1450082303,RU 1450082304,1450090495,IT 1450090496,1450106879,RU @@ -22218,11 +23310,7 @@ 1455423488,1459617791,FR 1459617792,1461714943,IT 1461714944,1462763519,IE -1462763520,1463162611,DK -1463162612,1463162612,US -1463162613,1463162613,DK -1463162614,1463162614,US -1463162615,1463812095,DK +1462763520,1463812095,DK 1463812096,1464074239,BE 1464074240,1464336383,IL 1464336384,1464467455,DK @@ -22234,9 +23322,7 @@ 1464664064,1464860671,DE 1464860672,1465384959,GB 1465384960,1465647103,FR -1465647104,1465714687,FI -1465714688,1465714943,AX -1465714944,1465909247,FI +1465647104,1465909247,FI 1465909248,1465942015,PL 1465942016,1465974783,SE 1465974784,1466007551,HU @@ -22265,9 +23351,7 @@ 1466253312,1466257407,PL 1466261504,1466265599,GB 1466265600,1466269695,HU -1466269696,1466284287,SA -1466284288,1466284543,US -1466284544,1466302463,SA +1466269696,1466302463,SA 1466302464,1466335231,GB 1466335232,1466367999,CH 1466368000,1466400767,PT @@ -22288,9 +23372,7 @@ 1466630144,1466695679,IR 1466695680,1466761215,FI 1466761216,1466826751,SA -1466826752,1466886399,LV -1466886400,1466886655,LT -1466886656,1466892287,LV +1466826752,1466892287,LV 1466892288,1466957823,ES 1466957824,1467219967,GB 1467219968,1467236351,DK @@ -22300,9 +23382,7 @@ 1467285504,1467301887,RU 1467301888,1467318271,GB 1467318272,1467334655,RU -1467334656,1467345023,GB -1467345024,1467345151,A1 -1467345152,1467346495,GB +1467334656,1467346495,GB 1467346496,1467346559,A1 1467346560,1467351039,GB 1467351040,1467367423,NO @@ -22387,9 +23467,7 @@ 1475127296,1475129343,FI 1475129344,1475131391,BE 1475131392,1475133439,RU -1475133440,1475134901,CZ -1475134902,1475134902,SA -1475134903,1475135487,CZ +1475133440,1475135487,CZ 1475135488,1475137535,CH 1475137536,1475139583,GB 1475139584,1475141631,ES @@ -22424,9 +23502,8 @@ 1475205888,1475206143,US 1475206144,1475206399,DE 1475206400,1475206655,AP -1475206656,1475207151,DE -1475207152,1475207183,US -1475207184,1475209215,AE +1475206656,1475207167,DE +1475207168,1475209215,AE 1475209216,1475211263,UZ 1475211264,1475213311,DE 1475213312,1475215359,FR @@ -22437,9 +23514,7 @@ 1475237888,1475239935,ES 1475239936,1475241983,RU 1475241984,1475244031,FR -1475244032,1475245055,DE -1475245056,1475245311,US -1475245312,1475245823,DE +1475244032,1475245823,DE 1475245824,1475246079,RU 1475246080,1475248127,CH 1475248128,1475250175,JO @@ -22507,19 +23582,25 @@ 1475575808,1475592191,AT 1475592192,1475608575,GB 1475608576,1475624959,RU -1475624960,1475636287,JE -1475636288,1475636351,GB -1475636352,1475638783,JE +1475624960,1475638783,JE 1475638784,1475639039,GB 1475639040,1475639391,JE 1475639392,1475639399,GB 1475639400,1475639479,JE 1475639480,1475639487,GB -1475639488,1475641343,JE +1475639488,1475639559,JE +1475639560,1475639567,GB +1475639568,1475639583,JE +1475639584,1475639591,GB +1475639592,1475639695,JE +1475639696,1475639703,GB +1475639704,1475641343,JE 1475641344,1475657727,UA 1475657728,1475674111,SK 1475674112,1475690495,DE -1475690496,1475706879,CH +1475690496,1475693055,CH +1475693056,1475693311,DE +1475693312,1475706879,CH 1475706880,1475723263,RU 1475723264,1475723839,GB 1475723840,1475723903,RU @@ -22575,21 +23656,11 @@ 1475895296,1475903487,GB 1475903488,1475911679,IR 1475911680,1475919871,MD -1475919872,1475921983,IT -1475921984,1475922007,NL -1475922008,1475923967,IT -1475923968,1475926015,GB -1475926016,1475927151,IT -1475927152,1475927159,FR -1475927160,1475927631,IT -1475927632,1475927647,FR -1475927648,1475928063,IT +1475919872,1475928063,IT 1475928064,1475952639,RU 1475952640,1475954175,A2 1475954176,1475954687,NO -1475954688,1475954943,A2 -1475954944,1475955199,GB -1475955200,1475955247,A2 +1475954688,1475955247,A2 1475955248,1475955255,NG 1475955256,1475958527,A2 1475958528,1475958783,NO @@ -22655,16 +23726,12 @@ 1478492160,1479898367,IT 1479898368,1479898623,US 1479898624,1480589311,IT -1480589312,1481629951,DE -1481629952,1481630207,US -1481630208,1481637887,DE +1480589312,1481637887,DE 1481637888,1481646079,SE 1481646080,1481654271,RU 1481654272,1481662463,IT 1481662464,1481678847,BG -1481678848,1481680663,SE -1481680664,1481680671,GB -1481680672,1481684991,SE +1481678848,1481684991,SE 1481684992,1481687039,GB 1481687040,1481695231,DE 1481695232,1481703423,SK @@ -22672,13 +23739,10 @@ 1481711616,1481719807,RU 1481719808,1481727999,CZ 1481728000,1481736191,IE -1481736192,1481741311,GG -1481741312,1481741567,GB -1481741568,1481741568,GG -1481741569,1481741823,GB +1481736192,1481741055,GG +1481741056,1481741823,GB 1481741824,1481742079,GG -1481742080,1481744127,GB -1481744128,1481744383,GG +1481742080,1481744383,GB 1481744384,1481752575,IT 1481752576,1481760767,RU 1481760768,1481768959,UA @@ -22710,9 +23774,7 @@ 1481957376,1481965567,SE 1481965568,1481973759,CH 1481973760,1481981951,FO -1481981952,1481982340,NL -1481982341,1481982341,LB -1481982342,1481990143,NL +1481981952,1481990143,NL 1481990144,1481998335,MK 1481998336,1482006527,FI 1482006528,1482022911,RU @@ -22751,8 +23813,8 @@ 1485246464,1485250559,UA 1485250560,1485254655,IR 1485254656,1485259007,RU -1485259008,1485262847,UA -1485262848,1485266943,RU +1485262848,1485263103,UA +1485263104,1485266943,RU 1485266944,1485271039,RO 1485271040,1485275135,UA 1485275136,1485283327,LV @@ -22761,7 +23823,7 @@ 1485307904,1485832191,FR 1485832192,1485963263,GB 1485963264,1486028799,CZ -1486028800,1486061567,BE +1486028800,1486061567,IT 1486061568,1486094335,RU 1486094336,1486127103,ES 1486127104,1486159871,FI @@ -22840,14 +23902,10 @@ 1489644800,1489645055,IT 1489645056,1489645823,EU 1489645824,1489646079,IT -1489646080,1489646335,EU -1489646336,1489646591,US -1489646592,1489647615,EU +1489646080,1489647615,EU 1489647616,1489648383,FR 1489648384,1489648639,GR -1489648640,1489649158,EU -1489649159,1489649159,US -1489649160,1489649663,EU +1489648640,1489649663,EU 1489649664,1489650687,FR 1489650688,1489651199,EU 1489651200,1489653247,FR @@ -22864,7 +23922,11 @@ 1489665024,1489666047,EU 1489666048,1489674239,GB 1489674240,1489676287,NL -1489676288,1489698815,GB +1489676288,1489692415,GB +1489692416,1489692431,AU +1489692432,1489692447,GB +1489692448,1489692463,AU +1489692464,1489698815,GB 1489698816,1489731583,MT 1489731584,1489764351,BG 1489764352,1489797119,RU @@ -22908,7 +23970,7 @@ 1490354176,1490386943,SA 1490386944,1490403327,IT 1490403328,1490419711,BG -1490419712,1490436095,A2 +1490419712,1490436095,DE 1490436096,1490452479,UA 1490452480,1490468863,PT 1490468864,1490478591,GB @@ -22949,33 +24011,29 @@ 1490944000,1491075071,LT 1491075072,1493172223,TR 1493172224,1493303295,DE -1493303296,1493430527,FR -1493430528,1493431039,GP -1493431040,1493431807,FR -1493431808,1493432063,GP -1493432064,1493433087,FR -1493433088,1493433855,MQ -1493433856,1493434111,FR +1493303296,1493431551,FR +1493431552,1493432319,GP +1493432320,1493433087,FR +1493433088,1493433343,MQ +1493433344,1493434111,FR 1493434112,1493434367,MQ 1493434368,1493565439,SA 1493565440,1493696511,ES 1493696512,1493958655,NO 1493958656,1494220799,DE -1494220800,1494222079,FR -1494222080,1494222335,RE +1494220800,1494221823,FR +1494221824,1494222335,RE 1494222336,1494222591,FR 1494222592,1494222847,RE -1494222848,1494223359,FR -1494223360,1494223615,RE -1494223616,1494223871,FR -1494223872,1494224127,RE -1494224128,1494224895,FR -1494224896,1494225151,GP -1494225152,1494225407,FR -1494225408,1494225663,GP -1494225664,1494227711,FR -1494227712,1494227967,GP -1494227968,1494228991,FR +1494222848,1494223103,FR +1494223104,1494223359,RE +1494223360,1494224127,FR +1494224128,1494224383,RE +1494224384,1494224639,FR +1494224640,1494224895,RE +1494224896,1494227199,FR +1494227200,1494227711,GP +1494227712,1494228991,FR 1494228992,1494237183,RU 1494237184,1494245375,IE 1494245376,1494253567,RU @@ -23077,13 +24135,13 @@ 1495153664,1495160239,EU 1495160240,1495160255,FR 1495160256,1495160263,GB -1495160264,1495163551,EU -1495163552,1495163567,FR -1495163568,1495168639,EU +1495160264,1495163391,EU +1495163392,1495163647,FR +1495163648,1495168639,EU 1495168640,1495168655,FR -1495168656,1495168767,EU -1495168768,1495169023,GB -1495169024,1495170759,EU +1495168656,1495169023,EU +1495169024,1495169279,FR +1495169280,1495170759,EU 1495170760,1495170763,DE 1495170764,1495170815,EU 1495170816,1495171071,FR @@ -23126,7 +24184,11 @@ 1495287808,1495289855,SE 1495289856,1495293951,RO 1495293952,1495298047,IR -1495298048,1495304191,RO +1495298048,1495300095,RO +1495300096,1495300351,SE +1495300352,1495300607,US +1495300608,1495300863,SE +1495300864,1495304191,RO 1495304192,1495306239,MD 1495306240,1495306573,GB 1495306574,1495306574,RO @@ -23134,27 +24196,40 @@ 1495308288,1495312383,RO 1495312384,1495312895,IT 1495312896,1495313151,GB -1495313152,1495316991,RO +1495313152,1495313407,MD +1495313408,1495316991,RO 1495316992,1495317503,IT -1495317504,1495319551,RO +1495317504,1495319039,RO +1495319040,1495319167,FR +1495319168,1495319295,RO +1495319296,1495319551,SE 1495319552,1495320063,IR -1495320064,1495327999,RO -1495328000,1495328255,MD -1495328256,1495330815,RO -1495330816,1495332863,MD -1495332864,1495334911,RO -1495334912,1495335167,MD -1495335168,1495336447,RO +1495320064,1495326719,RO +1495326720,1495332863,MD +1495332864,1495333375,RO +1495333376,1495333631,CH +1495333632,1495336447,RO 1495336448,1495336959,NL -1495336960,1495339519,RO +1495336960,1495339007,RO +1495339008,1495339263,DE +1495339264,1495339519,MD 1495339520,1495340031,IR -1495340032,1495346687,RO +1495340032,1495342591,RO +1495342592,1495342847,MD +1495342848,1495345151,RO +1495345152,1495345407,FI +1495345408,1495345663,US +1495345664,1495345919,FI +1495345920,1495346687,RO 1495346688,1495347199,GB 1495347200,1495351295,RO 1495351296,1495351551,GB -1495351552,1495351807,RO +1495351552,1495351807,MD 1495351808,1495352319,IQ -1495352320,1495362559,RO +1495352320,1495352447,FR +1495352448,1495352831,RO +1495352832,1495353087,FI +1495353088,1495362559,RO 1495362560,1495363583,ES 1495363584,1495364607,RO 1495364608,1495364863,GB @@ -23164,7 +24239,9 @@ 1495369216,1495369471,GB 1495369472,1495369727,RO 1495369728,1495371775,SE -1495371776,1495376895,RO +1495371776,1495376383,RO +1495376384,1495376639,GB +1495376640,1495376895,RO 1495376896,1495377407,GB 1495377408,1495385599,RO 1495385600,1495386623,GB @@ -23186,9 +24263,7 @@ 1495406080,1495408639,RO 1495408640,1495416831,IR 1495416832,1495418879,MD -1495418880,1495419391,RO -1495419392,1495419903,EU -1495419904,1495422975,RO +1495418880,1495422975,RO 1495422976,1495423487,IR 1495423488,1495424511,RO 1495424512,1495425023,IR @@ -23196,64 +24271,107 @@ 1495426560,1495426815,GB 1495426816,1495427071,RO 1495427072,1495427583,GB -1495427584,1495428863,RO -1495428864,1495429119,BZ +1495427584,1495428095,RO +1495428096,1495428351,GB +1495428352,1495428863,RO +1495428864,1495429119,DE 1495429120,1495433215,RO 1495433216,1495441407,IR -1495441408,1495443455,RO +1495441408,1495442431,RO +1495442432,1495442559,FR +1495442560,1495442943,RO +1495442944,1495443199,AE +1495443200,1495443455,RO 1495443456,1495443967,IR 1495443968,1495444479,RO 1495444480,1495444607,KR 1495444608,1495444735,IN 1495444736,1495445503,RO 1495445504,1495446015,IR -1495446016,1495447551,RO +1495446016,1495446271,RO +1495446272,1495446527,MD +1495446528,1495447551,RO 1495447552,1495449599,SE 1495449600,1495451647,MD 1495451648,1495452159,IR -1495452160,1495461887,RO +1495452160,1495455743,RO +1495455744,1495456255,MD +1495456256,1495459839,RO +1495459840,1495460863,MD +1495460864,1495461887,RO 1495461888,1495463935,SE -1495463936,1495480831,RO +1495463936,1495466495,RO +1495466496,1495467007,DE +1495467008,1495474687,RO +1495474688,1495474943,MD +1495474944,1495480831,RO 1495480832,1495481343,IR -1495481344,1495487487,RO -1495487488,1495488511,MD -1495488512,1495488767,RO +1495481344,1495485439,RO +1495485440,1495485695,MD +1495485696,1495487487,RO +1495487488,1495488767,MD 1495488768,1495489279,GB 1495489280,1495489535,MD -1495489536,1495492719,RO -1495492720,1495492783,EE -1495492784,1495492863,RO -1495492864,1495493119,EE +1495489536,1495493119,RO 1495493120,1495493375,US 1495493376,1495493631,RO 1495493632,1495494655,AE -1495494656,1495498239,RO +1495494656,1495495167,RO +1495495168,1495495423,MD +1495495424,1495497288,RO +1495497289,1495497289,IR +1495497290,1495498239,RO 1495498240,1495498367,IN 1495498368,1495498495,BD 1495498496,1495499775,RO 1495499776,1495500287,IR -1495500288,1495505919,RO +1495500288,1495502847,RO +1495502848,1495503871,PL +1495503872,1495505151,RO +1495505152,1495505407,GB +1495505408,1495505919,RO 1495505920,1495506431,IR -1495506432,1495508991,RO +1495506432,1495507711,RO +1495507712,1495507967,MD +1495507968,1495508991,RO 1495508992,1495510015,IT -1495510016,1495511039,RO +1495510016,1495510527,RO +1495510528,1495511039,DE 1495511040,1495511551,IR 1495511552,1495511807,LT 1495511808,1495515647,RO 1495515648,1495516159,IR -1495516160,1495517183,RO +1495516160,1495516287,FR +1495516288,1495516671,RO +1495516672,1495516927,GR +1495516928,1495517183,RO 1495517184,1495518207,MD -1495518208,1495535615,RO +1495518208,1495529471,RO +1495529472,1495529727,MD +1495529728,1495535615,RO 1495535616,1495536127,IR -1495536128,1495541247,RO +1495536128,1495540735,RO +1495540736,1495540991,NL +1495540992,1495541247,RO 1495541248,1495541759,GB 1495541760,1495543807,RO 1495543808,1495547903,IR 1495547904,1495548159,US -1495548160,1495548671,EE -1495548672,1495556095,RO +1495548160,1495548671,RO +1495548672,1495548703,RU +1495548704,1495548735,RO +1495548736,1495548927,RU +1495548928,1495549695,RO +1495549696,1495549951,RU +1495549952,1495551999,RO +1495552000,1495554047,ES +1495554048,1495554559,RO +1495554560,1495555071,SE +1495555072,1495556095,RO 1495556096,1495560191,IR -1495560192,1495566847,RO +1495560192,1495566335,RO +1495566336,1495566591,GB +1495566592,1495566847,RO 1495566848,1495567359,GB 1495567360,1495571455,RO 1495571456,1495572479,MD @@ -23265,17 +24383,15 @@ 1495589376,1495589887,IR 1495589888,1495596031,RO 1495596032,1495596543,IR -1495596544,1495597055,RO +1495596544,1495596799,RO +1495596800,1495597055,MD 1495597056,1495601151,IR 1495601152,1495603199,AZ 1495603200,1495604735,RO 1495604736,1495605247,IR -1495605248,1495606271,AZ -1495606272,1495606527,RO -1495606528,1495606783,AZ -1495606784,1495607039,RO -1495607040,1495607295,AZ -1495607296,1495607807,RO +1495605248,1495607295,AZ +1495607296,1495607551,MD +1495607552,1495607807,RO 1495607808,1495608319,IR 1495608320,1495617535,RO 1495617536,1495618559,ES @@ -23283,10 +24399,10 @@ 1495620608,1495621375,GB 1495621376,1495623167,RO 1495623168,1495623679,IR -1495623680,1495623935,MD -1495623936,1495630079,RO -1495630080,1495631359,GB -1495631360,1495632127,RO +1495623680,1495624191,MD +1495624192,1495630079,RO +1495630080,1495631615,GB +1495631616,1495632127,RO 1495632128,1495632639,MD 1495632640,1495642111,RO 1495642112,1495644159,SE @@ -23298,18 +24414,24 @@ 1495658496,1495662591,IR 1495662592,1495668735,RO 1495668736,1495669247,IR -1495669248,1495670783,RO +1495669248,1495669503,GB +1495669504,1495670783,RO 1495670784,1495671807,MD -1495671808,1495672831,RO +1495671808,1495672575,RO +1495672576,1495672831,MD 1495672832,1495674879,ES 1495674880,1495682047,RO 1495682048,1495683071,MD 1495683072,1495687167,IR 1495687168,1495688703,RO 1495688704,1495689215,IR -1495689216,1495724543,RO +1495689216,1495723519,RO +1495723520,1495724031,FR +1495724032,1495724543,RO 1495724544,1495725055,IR -1495725056,1495745791,RO +1495725056,1495732223,RO +1495732224,1495734271,ES +1495734272,1495745791,RO 1495745792,1495746047,GB 1495746048,1495747583,RO 1495747584,1495748607,MD @@ -23317,7 +24439,9 @@ 1495748864,1495749119,GB 1495749120,1495749631,RO 1495749632,1495750655,MD -1495750656,1495759359,RO +1495750656,1495755775,RO +1495755776,1495756031,PL +1495756032,1495759359,RO 1495759360,1495759487,TH 1495759488,1495759615,ID 1495759616,1495759871,RO @@ -23325,9 +24449,14 @@ 1495760128,1495760895,RO 1495760896,1495762943,DE 1495762944,1495763967,GB -1495763968,1495765759,RO +1495763968,1495764735,RO +1495764736,1495764991,AU +1495764992,1495765503,RO +1495765504,1495765759,GB 1495765760,1495766015,NL -1495766016,1495771135,RO +1495766016,1495767039,RO +1495767040,1495769087,ES +1495769088,1495771135,RO 1495771136,1495772159,PL 1495772160,1495775743,RO 1495775744,1495776255,IR @@ -23339,17 +24468,25 @@ 1495789824,1495790079,GB 1495790080,1495790335,MD 1495790336,1495790847,GB -1495790848,1495793663,RO +1495790848,1495791359,RO +1495791360,1495791615,GB +1495791616,1495793663,RO 1495793664,1495794687,DE -1495794688,1495803391,RO +1495794688,1495795199,RO +1495795200,1495795327,FR +1495795328,1495795455,RO +1495795456,1495795711,RU +1495795712,1495803391,RO 1495803392,1495803903,IR -1495803904,1495805951,RO -1495805952,1495809023,KZ -1495809024,1495809279,RO -1495809280,1495810047,KZ +1495803904,1495804927,RO +1495804928,1495805439,GB +1495805440,1495805951,RO +1495805952,1495810047,KZ 1495810048,1495813631,RO 1495813632,1495814143,IR -1495814144,1495816703,RO +1495814144,1495815167,RO +1495815168,1495816191,ES +1495816192,1495816703,RO 1495816704,1495817215,IR 1495817216,1495820799,RO 1495820800,1495821311,IR @@ -23357,20 +24494,27 @@ 1495821824,1495822335,IR 1495822336,1495826431,RO 1495826432,1495826943,IR -1495826944,1495829503,RO +1495826944,1495827967,RO +1495827968,1495828479,DE +1495828480,1495829503,RO 1495829504,1495830015,GB -1495830016,1495837695,RO +1495830016,1495833672,RO +1495833673,1495833673,IR +1495833674,1495837695,RO 1495837696,1495838719,IT 1495838720,1495845631,RO 1495845632,1495845887,GB 1495845888,1495846911,RO 1495846912,1495847423,GB -1495847424,1495855103,RO +1495847424,1495848959,RO +1495848960,1495849471,SE +1495849472,1495855103,RO 1495855104,1495859199,IR 1495859200,1495860223,ES 1495860224,1495861247,AZ 1495861248,1495865343,IR -1495865344,1495866111,RO +1495865344,1495865599,GB +1495865600,1495866111,RO 1495866112,1495866879,GB 1495866880,1495867391,RO 1495867392,1495867903,IR @@ -23378,9 +24522,7 @@ 1495871744,1495872511,GB 1495872512,1495874047,RO 1495874048,1495874559,IR -1495874560,1495891455,RO -1495891456,1495891711,MD -1495891712,1495900159,RO +1495874560,1495900159,RO 1495900160,1495902207,SE 1495902208,1495907583,RO 1495907584,1495908351,GB @@ -23399,17 +24541,26 @@ 1495943168,1495945215,MD 1495945216,1495951359,RO 1495951360,1495952383,MD -1495952384,1495963135,RO +1495952384,1495953919,RO +1495953920,1495954175,GB +1495954176,1495960575,RO +1495960576,1495961087,SE +1495961088,1495963135,RO 1495963136,1495963647,IR -1495963648,1495963903,RO -1495963904,1495964415,GB +1495963648,1495964415,GB 1495964416,1495967743,RO 1495967744,1495968767,NL 1495968768,1495970815,RO 1495970816,1495971839,MD -1495971840,1495983103,RO +1495971840,1495979007,RO +1495979008,1495979263,NL +1495979264,1495983103,RO 1495983104,1495983615,IR -1495983616,1495990271,RO +1495983616,1495985663,RO +1495985664,1495985791,FR +1495985792,1495985919,RO +1495985920,1495986175,JP +1495986176,1495990271,RO 1495990272,1495994367,IR 1495994368,1495998463,RO 1495998464,1495998719,SG @@ -23423,11 +24574,15 @@ 1496012800,1496016895,IR 1496016896,1496018943,RO 1496018944,1496019967,FR -1496019968,1496036863,RO +1496019968,1496020735,RO +1496020736,1496020991,AU +1496020992,1496036863,RO 1496036864,1496037375,IR 1496037376,1496038399,RO 1496038400,1496038911,IR -1496038912,1496042495,RO +1496038912,1496040447,RO +1496040448,1496040959,ES +1496040960,1496042495,RO 1496042496,1496043007,IR 1496043008,1496045567,RO 1496045568,1496049663,IR @@ -23435,27 +24590,41 @@ 1496051712,1496055807,RO 1496055808,1496057855,SE 1496057856,1496058111,DE -1496058112,1496084479,RO +1496058112,1496066815,RO +1496066816,1496067071,QA +1496067072,1496073983,RO +1496073984,1496074239,ES +1496074240,1496082175,RO +1496082176,1496082431,GB +1496082432,1496084479,RO 1496084480,1496084991,IR 1496084992,1496085247,MD 1496085248,1496086015,RO 1496086016,1496086527,IR -1496086528,1496093183,RO +1496086528,1496088063,RO +1496088064,1496088575,MD +1496088576,1496093183,RO 1496093184,1496093695,IR -1496093696,1496104447,RO +1496093696,1496094719,RO +1496094720,1496095743,MD +1496095744,1496104447,RO 1496104448,1496104959,IR 1496104960,1496107519,RO 1496107520,1496108031,IR -1496108032,1496119295,RO +1496108032,1496117309,RO +1496117310,1496117310,IR +1496117311,1496119295,RO 1496119296,1496121343,SE 1496121344,1496122367,MD -1496122368,1496130559,RO +1496122368,1496126725,RO +1496126726,1496126726,US +1496126727,1496130559,RO 1496130560,1496131583,ES 1496131584,1496132607,MD 1496132608,1496133631,RO 1496133632,1496137727,IR 1496137728,1496138495,RO -1496138496,1496138751,NL +1496138496,1496138751,BG 1496138752,1496139263,IR 1496139264,1496141823,RO 1496141824,1496142335,IR @@ -23463,20 +24632,23 @@ 1496150016,1496152063,IR 1496152064,1496153599,RO 1496153600,1496154111,IR -1496154112,1496180223,RO +1496154112,1496179199,RO +1496179200,1496179711,SE +1496179712,1496180223,RO 1496180224,1496180735,IR 1496180736,1496182783,SE -1496182784,1496188927,RO +1496182784,1496183039,ES +1496183040,1496188927,RO 1496188928,1496189951,ES 1496189952,1496190975,RO -1496190976,1496191999,SE -1496192000,1496192255,RO -1496192256,1496193023,SE +1496190976,1496193023,SE 1496193024,1496197119,RO 1496197120,1496197631,MD 1496197632,1496198143,RO 1496198144,1496198655,IR -1496198656,1496202239,RO +1496198656,1496198911,RO +1496198912,1496199167,GB +1496199168,1496202239,RO 1496202240,1496202751,IR 1496202752,1496203263,RO 1496203264,1496205311,IT @@ -23484,20 +24656,24 @@ 1496210944,1496211455,IR 1496211456,1496213503,RO 1496213504,1496215551,IT -1496215552,1496228863,RO +1496215552,1496216319,RO +1496216320,1496216575,MD +1496216576,1496221695,RO +1496221696,1496223743,ES +1496223744,1496228863,RO 1496228864,1496229887,MD 1496229888,1496231935,RO -1496231936,1496232959,PS -1496232960,1496233215,RO -1496233216,1496233983,PS +1496231936,1496233983,PS 1496233984,1496236031,RO 1496236032,1496238079,IT 1496238080,1496240127,IQ -1496240128,1496262911,RO -1496262912,1496263167,US -1496263168,1496268799,RO +1496240128,1496253439,RO +1496253440,1496254463,ES +1496254464,1496268799,RO 1496268800,1496272895,IR -1496272896,1496276735,RO +1496272896,1496275455,RO +1496275456,1496275711,MD +1496275712,1496276735,RO 1496276736,1496276991,MD 1496276992,1496285183,RO 1496285184,1496293375,IR @@ -23515,9 +24691,7 @@ 1499856896,1499987967,CZ 1499987968,1499996159,AT 1499996160,1500004351,GB -1500004352,1500008447,RU -1500008448,1500012543,IR -1500012544,1500020735,RU +1500004352,1500020735,RU 1500020736,1500028927,IS 1500028928,1500037119,NL 1500037120,1500045311,DK @@ -23594,9 +24768,7 @@ 1500643328,1500774399,PT 1500774400,1500905471,LT 1500905472,1501036543,IT -1501036544,1501154047,RO -1501154048,1501154303,US -1501154304,1501298687,RO +1501036544,1501298687,RO 1501298688,1501560831,IE 1501560832,1501822975,ES 1501822976,1502085119,HU @@ -23609,7 +24781,9 @@ 1502609408,1502625791,DE 1502625792,1502642175,SA 1502642176,1502658559,IR -1502658560,1502674943,AT +1502658560,1502665983,AT +1502665984,1502666239,SK +1502666240,1502674943,AT 1502674944,1502691327,DE 1502691328,1502707711,GB 1502707712,1502715903,RU @@ -23657,11 +24831,7 @@ 1502981120,1502981887,FR 1502981888,1502982143,NL 1502982144,1502986239,FR -1502986240,1502999734,DE -1502999735,1502999735,SA -1502999736,1502999737,DE -1502999738,1502999738,SA -1502999739,1503000063,DE +1502986240,1503000063,DE 1503000064,1503000319,PL 1503000320,1503001087,DE 1503001088,1503001343,PL @@ -23810,13 +24980,7 @@ 1503900688,1503900703,IT 1503900704,1503900719,DE 1503900720,1503900727,TW -1503900728,1503901055,DE -1503901056,1503901119,TW -1503901120,1503901143,DE -1503901144,1503901151,IT -1503901152,1503901167,DE -1503901168,1503901175,IT -1503901176,1503901455,DE +1503900728,1503901455,DE 1503901456,1503901463,IT 1503901464,1503901471,CH 1503901472,1503901567,DE @@ -23864,9 +25028,7 @@ 1503905984,1503905991,UA 1503905992,1503906015,DE 1503906016,1503906023,AT -1503906024,1503906031,DE -1503906032,1503906039,SK -1503906040,1503906055,DE +1503906024,1503906055,DE 1503906056,1503906063,CH 1503906064,1503906071,TR 1503906072,1503906111,DE @@ -23877,7 +25039,11 @@ 1503906384,1503906391,GR 1503906392,1503906407,DE 1503906408,1503906415,MX -1503906416,1503920127,DE +1503906416,1503906431,DE +1503906432,1503906439,AT +1503906440,1503906495,DE +1503906496,1503906559,TR +1503906560,1503920127,DE 1503920128,1503985663,HR 1503985664,1504018431,IR 1504018432,1504051199,RO @@ -23886,9 +25052,13 @@ 1504116736,1504149503,PL 1504149504,1504149759,GB 1504149760,1504150015,ES -1504150016,1504151039,GB +1504150016,1504150271,GB +1504150272,1504150527,DE +1504150528,1504151039,GB 1504151040,1504151295,FR -1504151296,1504154623,GB +1504151296,1504152575,GB +1504152576,1504152831,IE +1504152832,1504154623,GB 1504154624,1504155647,IE 1504155648,1504247807,GB 1504247808,1504313343,RU @@ -23914,9 +25084,7 @@ 1505304576,1505312767,FR 1505312768,1505320959,RU 1505320960,1505329151,AT -1505329152,1505336575,IE -1505336576,1505336831,GB -1505336832,1505337343,IE +1505329152,1505337343,IE 1505337344,1505345535,FR 1505345536,1505353727,MK 1505353728,1505361919,CZ @@ -23989,7 +25157,9 @@ 1506410496,1506422063,DE 1506422064,1506422079,GB 1506422080,1506443263,DE -1506443264,1506444757,GB +1506443264,1506444397,GB +1506444398,1506444398,DE +1506444399,1506444757,GB 1506444758,1506444758,DE 1506444759,1506445103,GB 1506445104,1506445119,DE @@ -24013,7 +25183,9 @@ 1506453312,1506453319,SE 1506453320,1506456533,GB 1506456534,1506456534,IT -1506456535,1506458244,GB +1506456535,1506456959,GB +1506456960,1506456975,IT +1506456976,1506458244,GB 1506458245,1506458245,CH 1506458246,1506459177,GB 1506459178,1506459178,EU @@ -24037,26 +25209,32 @@ 1506463680,1506463695,DE 1506463696,1506464895,GB 1506464896,1506464911,NL -1506464912,1506465023,GB +1506464912,1506464999,GB +1506465000,1506465007,NL +1506465008,1506465023,GB 1506465024,1506465187,EU 1506465188,1506465188,NL 1506465189,1506465279,EU 1506465280,1506466383,GB 1506466384,1506466391,DE -1506466392,1506466399,GB -1506466400,1506466559,DE +1506466392,1506466431,GB +1506466432,1506466559,DE 1506466560,1506469663,GB 1506469664,1506469695,IT 1506469696,1506469759,GB 1506469760,1506469775,IT -1506469776,1506471983,GB +1506469776,1506471551,GB +1506471552,1506471679,IT +1506471680,1506471871,GB +1506471872,1506471903,IT +1506471904,1506471983,GB 1506471984,1506471999,NL 1506472000,1506472031,GB 1506472032,1506472047,NL -1506472048,1506476031,GB -1506476032,1506497279,KW -1506497280,1506497535,US -1506497536,1506508799,KW +1506472048,1506475873,GB +1506475874,1506475874,DE +1506475875,1506476031,GB +1506476032,1506508799,KW 1506508800,1506541567,CZ 1506541568,1506574335,RU 1506574336,1506582527,DE @@ -24094,7 +25272,9 @@ 1506803712,1506869247,RU 1506869248,1506934783,UA 1506934784,1507000319,GR -1507000320,1507016191,QA +1507000320,1507015167,QA +1507015168,1507015423,US +1507015424,1507016191,QA 1507016192,1507016447,US 1507016448,1507065855,QA 1507065856,1507131391,SI @@ -24103,14 +25283,19 @@ 1507262464,1507327999,BG 1507328000,1507393535,RS 1507393536,1507459071,CH -1507459072,1507483903,KZ -1507483904,1507484159,NZ -1507484160,1507524607,KZ +1507459072,1507524607,KZ 1507524608,1507525631,EE -1507525632,1507531775,KZ -1507531776,1507540991,EE +1507525632,1507533823,KZ +1507533824,1507540991,AZ 1507540992,1507557375,IR -1507557376,1507573759,EE +1507557376,1507558399,EE +1507558400,1507558911,AZ +1507558912,1507564287,EE +1507564288,1507565823,AZ +1507565824,1507566335,EE +1507566336,1507567615,AZ +1507567616,1507567871,EE +1507567872,1507573759,AZ 1507573760,1507590143,IR 1507590144,1507655679,NL 1507655680,1507659775,DE @@ -24156,9 +25341,7 @@ 1508622336,1508638719,EE 1508638720,1508642175,SE 1508642176,1508642303,DK -1508642304,1508642559,SE -1508642560,1508642815,DK -1508642816,1508647691,SE +1508642304,1508647691,SE 1508647692,1508647692,DK 1508647693,1508655103,SE 1508655104,1508671487,FI @@ -24238,12 +25421,7 @@ 1509683200,1509687295,CH 1509687296,1509703679,UA 1509703680,1509720063,RU -1509720064,1509720319,US -1509720320,1509721087,TR -1509721088,1509723135,US -1509723136,1509724159,TR -1509724160,1509724927,US -1509724928,1509736447,TR +1509720064,1509736447,TR 1509736448,1509752831,BG 1509752832,1509769215,RU 1509769216,1509785599,SE @@ -24255,317 +25433,259 @@ 1509883904,1509900287,NL 1509900288,1509916671,RU 1509916672,1509933055,GB -1509933056,1509941247,NL -1509941248,1509945343,SE -1509945344,1509949439,NL -1509949440,1510605311,FR -1510605312,1510605823,RE -1510605824,1510608383,FR -1510608384,1510608639,RE -1510608640,1510609407,FR -1510609408,1510610175,RE -1510610176,1510614015,FR -1510614016,1510614783,RE -1510614784,1510615039,FR -1510615040,1510615295,RE -1510615296,1510615551,FR -1510615552,1510616319,RE -1510616320,1510616575,FR -1510616576,1510616831,RE -1510616832,1510617087,FR -1510617088,1510617599,RE +1509933056,1509935103,CH +1509935104,1509941247,NL +1509941248,1509947391,SE +1509947392,1509949439,NL +1509949440,1510604799,FR +1510604800,1510605311,RE +1510605312,1510605823,FR +1510605824,1510607615,RE +1510607616,1510607871,FR +1510607872,1510608383,RE +1510608384,1510608639,FR +1510608640,1510609663,RE +1510609664,1510609919,FR +1510609920,1510611199,RE +1510611200,1510611711,FR +1510611712,1510614271,RE +1510614272,1510614783,FR +1510614784,1510615551,RE +1510615552,1510615807,FR +1510615808,1510616063,RE +1510616064,1510616319,FR +1510616320,1510617087,RE +1510617088,1510617343,FR +1510617344,1510617599,RE 1510617600,1510617855,FR -1510617856,1510619135,RE -1510619136,1510619391,FR -1510619392,1510620159,RE -1510620160,1510621695,FR -1510621696,1510621951,RE -1510621952,1510622463,FR -1510622464,1510622719,RE -1510622720,1510624511,FR -1510624512,1510624767,RE -1510624768,1510625791,FR -1510625792,1510626303,RE -1510626304,1510626815,FR -1510626816,1510627071,RE -1510627072,1510628351,FR -1510628352,1510628607,RE -1510628608,1510628863,FR -1510628864,1510629119,RE -1510629120,1510629631,FR -1510629632,1510629887,RE -1510629888,1510630399,FR -1510630400,1510630655,RE -1510630656,1510631167,FR -1510631168,1510631423,RE -1510631424,1510631935,FR -1510631936,1510632703,RE -1510632704,1510632959,FR -1510632960,1510633727,RE -1510633728,1510633983,FR -1510633984,1510635263,RE -1510635264,1510637567,FR -1510637568,1510638079,RE +1510617856,1510619647,RE +1510619648,1510620159,FR +1510620160,1510623743,RE +1510623744,1510623999,FR +1510624000,1510624511,RE +1510624512,1510624767,FR +1510624768,1510625279,RE +1510625280,1510626047,FR +1510626048,1510628351,RE +1510628352,1510628607,FR +1510628608,1510629119,RE +1510629120,1510629375,FR +1510629376,1510630143,RE +1510630144,1510630655,FR +1510630656,1510631167,RE +1510631168,1510631423,FR +1510631424,1510631935,RE +1510631936,1510632447,FR +1510632448,1510633983,RE +1510633984,1510634239,FR +1510634240,1510635263,RE +1510635264,1510637823,FR +1510637824,1510638079,RE 1510638080,1510638335,FR 1510638336,1510638591,RE -1510638592,1510638847,FR -1510638848,1510639359,RE -1510639360,1510639871,FR -1510639872,1510640127,RE -1510640128,1510640383,FR -1510640384,1510641151,RE -1510641152,1510641407,FR -1510641408,1510641919,RE -1510641920,1510642431,FR -1510642432,1510642943,RE -1510642944,1510643455,FR -1510643456,1510643711,RE -1510643712,1510644479,FR -1510644480,1510645759,RE -1510645760,1510646015,FR -1510646016,1510646271,RE -1510646272,1510646783,FR -1510646784,1510647295,RE -1510647296,1510647807,FR -1510647808,1510648319,RE -1510648320,1510649343,FR -1510649344,1510649599,RE -1510649600,1510650623,FR -1510650624,1510650879,RE -1510650880,1510651135,FR -1510651136,1510651391,RE -1510651392,1510651647,FR -1510651648,1510652159,RE -1510652160,1510652927,FR -1510652928,1510653439,RE -1510653440,1510654719,FR +1510638592,1510639103,FR +1510639104,1510642687,RE +1510642688,1510642943,FR +1510642944,1510643455,RE +1510643456,1510643711,FR +1510643712,1510644991,RE +1510644992,1510645247,FR +1510645248,1510646783,RE +1510646784,1510647551,FR +1510647552,1510648063,RE +1510648064,1510648319,FR +1510648320,1510648575,RE +1510648576,1510648831,FR +1510648832,1510649855,RE +1510649856,1510650111,FR +1510650112,1510651135,RE +1510651136,1510651647,FR +1510651648,1510652927,RE +1510652928,1510653183,FR +1510653184,1510654463,RE +1510654464,1510654719,FR 1510654720,1510654975,RE -1510654976,1510655487,FR -1510655488,1510656255,RE +1510654976,1510655999,FR +1510656000,1510656255,RE 1510656256,1510656511,FR -1510656512,1510657023,RE -1510657024,1510658303,FR -1510658304,1510658559,RE -1510658560,1510658815,FR -1510658816,1510659071,RE -1510659072,1510659839,FR +1510656512,1510657535,RE +1510657536,1510658047,FR +1510658048,1510658303,RE +1510658304,1510658559,FR +1510658560,1510658815,RE +1510658816,1510659327,FR +1510659328,1510659583,RE +1510659584,1510659839,FR 1510659840,1510660095,RE -1510660096,1510660863,FR -1510660864,1510661119,RE -1510661120,1510661375,FR -1510661376,1510661631,RE -1510661632,1510662399,FR -1510662400,1510663423,RE -1510663424,1510663679,FR -1510663680,1510663935,RE -1510663936,1510664447,FR -1510664448,1510664703,RE -1510664704,1510664959,FR -1510664960,1510665215,RE -1510665216,1510665983,FR -1510665984,1510667775,RE -1510667776,1511981567,FR -1511981568,1511982079,RE -1511982080,1511982335,FR -1511982336,1511982591,RE -1511982592,1511984383,FR -1511984384,1511984639,RE -1511984640,1511985151,FR -1511985152,1511985407,RE -1511985408,1511987199,FR -1511987200,1511987711,RE -1511987712,1511990271,FR -1511990272,1511990527,RE -1511990528,1511992575,FR -1511992576,1511992831,RE -1511992832,1511995391,FR -1511995392,1511995647,RE -1511995648,1511996415,FR -1511996416,1511996671,RE -1511996672,1511997183,FR -1511997184,1511997439,RE -1511997440,1511997695,FR -1511997696,1511998463,MQ -1511998464,1512001279,FR -1512001280,1512002047,MQ -1512002048,1512002303,FR -1512002304,1512002559,MQ -1512002560,1512006143,FR -1512006144,1512006399,GP -1512006400,1512006655,FR -1512006656,1512008191,GP -1512008192,1512008703,FR +1510660096,1510660607,FR +1510660608,1510664447,RE +1510664448,1510664703,FR +1510664704,1510665983,RE +1510665984,1510666239,FR +1510666240,1510668031,RE +1510668032,1511981055,FR +1511981056,1511981567,GP +1511981568,1511981823,FR +1511981824,1511982335,GP +1511982336,1511982847,FR +1511982848,1511984127,GP +1511984128,1511984639,FR +1511984640,1511985151,GP +1511985152,1511985407,FR +1511985408,1511987199,GP +1511987200,1511987455,FR +1511987456,1511989759,GP +1511989760,1511990015,FR +1511990016,1511990271,GP +1511990272,1511990527,FR +1511990528,1511991039,GP +1511991040,1511991295,FR +1511991296,1511991807,GP +1511991808,1511992063,FR +1511992064,1511994111,GP +1511994112,1511994367,FR +1511994368,1511995135,GP +1511995136,1511995391,FR +1511995392,1511997439,GP +1511997440,1511998207,FR +1511998208,1512001023,GP +1512001024,1512002559,FR +1512002560,1512003583,GP +1512003584,1512003839,FR +1512003840,1512005119,GP +1512005120,1512005375,FR +1512005376,1512005631,GP +1512005632,1512006655,FR +1512006656,1512006911,GP +1512006912,1512007167,FR +1512007168,1512008447,GP +1512008448,1512008703,FR 1512008704,1512008959,GP -1512008960,1512010495,FR -1512010496,1512010751,GP -1512010752,1512011263,FR -1512011264,1512011775,GP -1512011776,1512012287,FR -1512012288,1512012799,GP -1512012800,1512013055,FR -1512013056,1512013311,GP -1512013312,1512013567,FR -1512013568,1512013823,GP -1512013824,1512014335,FR -1512014336,1512015103,GF -1512015104,1512015615,FR -1512015616,1512016127,GF -1512016128,1512016383,FR -1512016384,1512018175,GF -1512018176,1512018431,FR -1512018432,1512018687,GF -1512018688,1512019711,FR -1512019712,1512019967,GF -1512019968,1512020479,FR -1512020480,1512021503,GF -1512021504,1512021759,FR -1512021760,1512023295,GF -1512023296,1512023551,FR -1512023552,1512023807,GF -1512023808,1512024831,FR -1512024832,1512025087,GF -1512025088,1512025599,FR -1512025600,1512026879,GF -1512026880,1512028159,FR -1512028160,1512030207,GF +1512008960,1512009215,FR +1512009216,1512009471,GP +1512009472,1512010239,FR +1512010240,1512010495,GP +1512010496,1512010751,FR +1512010752,1512011263,GP +1512011264,1512011775,FR +1512011776,1512012543,GP +1512012544,1512012799,FR +1512012800,1512013823,GP +1512013824,1512024831,GF +1512024832,1512025087,FR +1512025088,1512026111,GF +1512026112,1512026367,FR +1512026368,1512026879,GF +1512026880,1512027135,FR +1512027136,1512028159,GF +1512028160,1512028927,FR +1512028928,1512029695,GF +1512029696,1512029951,FR +1512029952,1512030207,GF 1512030208,1512046591,MQ -1512046592,1512308991,FR -1512308992,1512309247,GP -1512309248,1512310271,FR -1512310272,1512310527,GP -1512310528,1512310783,FR -1512310784,1512311295,GP -1512311296,1512311551,FR -1512311552,1512312063,GP -1512312064,1512314367,FR -1512314368,1512314623,GP -1512314624,1512314879,FR -1512314880,1512315391,GP -1512315392,1512315647,FR -1512315648,1512316159,GP -1512316160,1512316415,FR -1512316416,1512316927,GP -1512316928,1512317439,FR -1512317440,1512317951,GP -1512317952,1512318207,FR -1512318208,1512318463,GP -1512318464,1512319231,FR -1512319232,1512319487,GP +1512046592,1512309247,FR +1512309248,1512311039,GP +1512311040,1512311295,FR +1512311296,1512311807,GP +1512311808,1512312063,FR +1512312064,1512312575,GP +1512312576,1512312831,FR +1512312832,1512314111,GP +1512314112,1512314623,FR +1512314624,1512315135,GP +1512315136,1512315391,FR +1512315392,1512316415,GP +1512316416,1512316671,FR +1512316672,1512318207,GP +1512318208,1512318463,FR +1512318464,1512319487,GP 1512319488,1512319743,FR -1512319744,1512319999,GP -1512320000,1512320511,FR -1512320512,1512320767,GP -1512320768,1512322047,FR -1512322048,1512322303,GP -1512322304,1512322559,FR -1512322560,1512322815,GP -1512322816,1512323327,FR -1512323328,1512323583,GP -1512323584,1512324095,FR -1512324096,1512324351,GP -1512324352,1512324863,FR -1512324864,1512325119,GP -1512325120,1512325631,FR -1512325632,1512325887,GP -1512325888,1512326399,FR +1512319744,1512320255,GP +1512320256,1512320511,FR +1512320512,1512322559,GP +1512322560,1512322815,FR +1512322816,1512323071,GP +1512323072,1512323839,FR +1512323840,1512324607,GP +1512324608,1512324863,FR +1512324864,1512325631,GP +1512325632,1512325887,FR +1512325888,1512326143,GP +1512326144,1512326399,FR 1512326400,1512326655,GP -1512326656,1512327423,FR -1512327424,1512328191,GP -1512328192,1512329727,FR -1512329728,1512330239,GP -1512330240,1512330495,FR -1512330496,1512332287,GP -1512332288,1512332799,FR -1512332800,1512333311,GP -1512333312,1512334079,FR -1512334080,1512334335,GP -1512334336,1512334847,FR -1512334848,1512335103,GP -1512335104,1512335359,FR -1512335360,1512335871,GP -1512335872,1512336383,FR -1512336384,1512337151,GP -1512337152,1512338175,FR -1512338176,1512338431,GP -1512338432,1512338943,FR -1512338944,1512339199,GP -1512339200,1512339455,FR -1512339456,1512339711,GP -1512339712,1512340735,FR -1512340736,1512341247,GP -1512341248,1512341503,FR -1512341504,1512341759,GP -1512341760,1512342271,FR -1512342272,1512342527,GP -1512342528,1512343295,FR -1512343296,1512343551,GP -1512343552,1512344063,FR -1512344064,1512344575,GP -1512344576,1512344831,FR -1512344832,1512345087,GP -1512345088,1512345855,FR -1512345856,1512346111,GP -1512346112,1512346367,FR -1512346368,1512346623,GP -1512346624,1512347391,FR -1512347392,1512347903,GP -1512347904,1512348159,FR -1512348160,1512348927,GP -1512348928,1512349439,FR -1512349440,1512349951,GP -1512349952,1512350463,FR -1512350464,1512350719,GP -1512350720,1512351231,FR -1512351232,1512351487,GP -1512351488,1512351999,FR -1512352000,1512352767,GP -1512352768,1512353535,FR -1512353536,1512354047,GP +1512326656,1512326911,FR +1512326912,1512327679,GP +1512327680,1512327935,FR +1512327936,1512329727,GP +1512329728,1512330239,FR +1512330240,1512330751,GP +1512330752,1512331007,FR +1512331008,1512331263,GP +1512331264,1512331519,FR +1512331520,1512331775,GP +1512331776,1512332031,FR +1512332032,1512333567,GP +1512333568,1512335615,FR +1512335616,1512338175,GP +1512338176,1512338431,FR +1512338432,1512339967,GP +1512339968,1512340223,FR +1512340224,1512340479,GP +1512340480,1512340991,FR +1512340992,1512341759,GP +1512341760,1512342015,FR +1512342016,1512344319,GP +1512344320,1512344831,FR +1512344832,1512345343,GP +1512345344,1512345855,FR +1512345856,1512346623,GP +1512346624,1512347135,FR +1512347136,1512347647,GP +1512347648,1512347903,FR +1512347904,1512348415,GP +1512348416,1512348671,FR +1512348672,1512350463,GP +1512350464,1512350719,FR +1512350720,1512351999,GP +1512352000,1512352255,FR +1512352256,1512353279,GP +1512353280,1512353791,FR +1512353792,1512354047,GP 1512354048,1512354303,FR -1512354304,1512354559,GP -1512354560,1512354815,FR -1512354816,1512355327,GP -1512355328,1512356095,FR -1512356096,1512356351,GP -1512356352,1512356607,FR -1512356608,1512356863,GP -1512356864,1512357119,FR +1512354304,1512354815,GP +1512354816,1512355327,FR +1512355328,1512356607,GP +1512356608,1512357119,FR 1512357120,1512357375,GP 1512357376,1512357631,FR 1512357632,1512357887,GP -1512357888,1512358655,FR -1512358656,1512359167,GP -1512359168,1512359423,FR -1512359424,1512360191,GP -1512360192,1512360447,FR -1512360448,1512361471,GP -1512361472,1512361727,FR -1512361728,1512361983,GP -1512361984,1512362239,FR -1512362240,1512362495,GP -1512362496,1512363007,FR -1512363008,1512363263,GP -1512363264,1512363519,FR -1512363520,1512363775,GP -1512363776,1512364031,FR -1512364032,1512364287,GP -1512364288,1512364543,FR -1512364544,1512366847,GP -1512366848,1512367359,FR -1512367360,1512367615,GP -1512367616,1512368127,FR -1512368128,1512368383,GP -1512368384,1512368639,FR -1512368640,1512368895,GP -1512368896,1512370431,FR -1512370432,1512370441,GP +1512357888,1512358399,FR +1512358400,1512358655,GP +1512358656,1512359167,FR +1512359168,1512359423,GP +1512359424,1512360191,FR +1512360192,1512360959,GP +1512360960,1512361215,FR +1512361216,1512363007,GP +1512363008,1512363263,FR +1512363264,1512365055,GP +1512365056,1512365311,FR +1512365312,1512365823,GP +1512365824,1512366079,FR +1512366080,1512366335,GP +1512366336,1512366847,FR +1512366848,1512367103,GP +1512367104,1512368639,FR +1512368640,1512369151,GP +1512369152,1512369407,FR +1512369408,1512370441,GP 1512370442,1512370442,FR 1512370443,1512370687,GP 1512370688,1512370943,FR -1512370944,1512372223,GP -1512372224,1512372735,FR -1512372736,1512372991,GP -1512372992,1514143743,FR +1512370944,1512371199,GP +1512371200,1512371455,FR +1512371456,1512374271,GP +1512374272,1514143743,FR 1514143744,1514176511,SK 1514176512,1514471423,FR 1514471424,1514536959,ES @@ -24573,7 +25693,17 @@ 1514602496,1514668031,ES 1514668032,1514799103,FR 1514799104,1514930175,ES -1514930176,1515192639,FR +1514930176,1515002367,FR +1515002368,1515002623,ES +1515002624,1515030783,FR +1515030784,1515031039,ES +1515031040,1515051263,FR +1515051264,1515051519,ES +1515051520,1515057919,FR +1515057920,1515058175,ES +1515058176,1515059621,FR +1515059622,1515059622,ES +1515059623,1515192639,FR 1515192640,1515192655,EU 1515192656,1515467007,FR 1515467008,1515467263,ES @@ -24599,12 +25729,8 @@ 1515491008,1518338047,FR 1518338048,1518370815,DE 1518370816,1518409727,NL -1518409728,1518412031,SE -1518412032,1518413567,NO -1518413568,1518413823,SE -1518413824,1518418943,NO -1518418944,1518419199,SE -1518419200,1518419967,NO +1518409728,1518411775,SE +1518411776,1518419967,NO 1518419968,1518436351,SE 1518436352,1518452735,NO 1518452736,1518460927,AT @@ -24622,13 +25748,9 @@ 1518510080,1518516223,LV 1518516224,1518517247,SE 1518517248,1518518271,LV -1518518272,1518532351,SE -1518532352,1518532607,NO -1518532608,1518532863,SE -1518532864,1518533375,NO -1518533376,1518533887,SE -1518533888,1518534143,NO -1518534144,1518540543,SE +1518518272,1518530559,SE +1518530560,1518534655,NO +1518534656,1518540543,SE 1518540544,1518540799,LT 1518540800,1518541479,SE 1518541480,1518541480,DE @@ -24643,9 +25765,7 @@ 1518635008,1518637055,NL 1518637056,1518641151,SE 1518641152,1518649343,NL -1518649344,1518682879,SE -1518682880,1518683135,RU -1518683136,1518723071,SE +1518649344,1518723071,SE 1518723072,1518727167,EE 1518727168,1518731263,SE 1518731264,1518747647,DE @@ -24654,35 +25774,7 @@ 1518780416,1518796799,HR 1518796800,1518927871,DE 1518927872,1518944255,SE -1518944256,1518945023,NL -1518945024,1518945535,SE -1518945536,1518946303,NL -1518946304,1518946815,SE -1518946816,1518947327,NL -1518947328,1518948095,SE -1518948096,1518948351,NL -1518948352,1518948863,SE -1518948864,1518949119,NL -1518949120,1518949631,SE -1518949632,1518950911,NL -1518950912,1518951167,SE -1518951168,1518951679,NL -1518951680,1518952191,SE -1518952192,1518954751,NL -1518954752,1518955007,SE -1518955008,1518955775,NL -1518955776,1518956031,SE -1518956032,1518956543,NL -1518956544,1518957311,SE -1518957312,1518957823,NL -1518957824,1518958079,SE -1518958080,1518958591,NL -1518958592,1518958847,SE -1518958848,1518959103,NL -1518959104,1518959359,SE -1518959360,1518959871,NL -1518959872,1518960127,SE -1518960128,1518960639,NL +1518944256,1518960639,NL 1518960640,1518961663,LT 1518961664,1518962175,EE 1518962176,1518962687,SE @@ -24690,56 +25782,16 @@ 1518964736,1518966783,HR 1518966784,1518967807,SE 1518967808,1518977023,HR -1518977024,1518977791,SE -1518977792,1518978559,NL -1518978560,1518979071,SE -1518979072,1518980095,NL -1518980096,1518980607,SE -1518980608,1518980863,NL -1518980864,1518981631,SE -1518981632,1518982143,NL -1518982144,1518982399,SE -1518982400,1518982655,NL -1518982656,1518983935,SE -1518983936,1518984191,NL -1518984192,1518989311,SE -1518989312,1518992127,NL -1518992128,1518992383,SE -1518992384,1518992639,NL -1518992640,1518992895,SE -1518992896,1518993152,NL -1518993153,1519190271,SE -1519190272,1519190783,NL -1519190784,1519191551,SE -1519191552,1519192063,NL -1519192064,1519193343,SE -1519193344,1519194111,NL -1519194112,1519194623,SE -1519194624,1519194879,NL -1519194880,1519195135,SE -1519195136,1519196671,NL -1519196672,1519197183,SE -1519197184,1519197951,NL -1519197952,1519200255,SE -1519200256,1519200511,EE -1519200512,1519201023,SE -1519201024,1519201279,EE -1519201280,1519202303,SE -1519202304,1519202815,EE -1519202816,1519203071,SE -1519203072,1519203327,EE -1519203328,1519203583,SE -1519203584,1519204351,EE -1519204352,1519204607,SE -1519204608,1519204863,EE -1519204864,1519205631,SE -1519205632,1519206143,EE -1519206144,1519206399,SE +1518977024,1518985215,NL +1518985216,1518989311,SE +1518989312,1518993152,NL +1518993153,1519190015,SE +1519190016,1519198207,NL +1519198208,1519200255,SE +1519200256,1519206399,EE 1519206400,1519208447,LV 1519208448,1519214591,SE -1519214592,1519219455,LV -1519219456,1519219711,SE -1519219712,1519222783,LV +1519214592,1519222783,LV 1519222784,1519259647,SE 1519259648,1519260671,NL 1519260672,1519263743,SE @@ -24748,17 +25800,15 @@ 1519292416,1519294463,LT 1519294464,1519296511,SE 1519296512,1519304703,LT -1519304704,1519305983,NL -1519305984,1519306239,SE -1519306240,1519307775,NL -1519307776,1519308031,SE -1519308032,1519308287,NL -1519308288,1519308543,SE -1519308544,1519308799,NL +1519304704,1519308799,NL 1519308800,1519312895,SE 1519312896,1519321087,LT 1519321088,1519337471,KZ -1519337472,1519394815,SE +1519337472,1519358975,SE +1519358976,1519359231,KZ +1519359232,1519369215,SE +1519369216,1519369471,KZ +1519369472,1519394815,SE 1519394816,1519398911,HR 1519398912,1519403007,SE 1519403008,1519419391,NL @@ -24769,9 +25819,11 @@ 1519648768,1519714303,SA 1519714304,1519779839,NO 1519779840,1519910911,RU -1519910912,1519928063,GB -1519928064,1519928319,DK -1519928320,1519931391,GB +1519910912,1519927295,GB +1519927296,1519927551,NL +1519927552,1519929855,GB +1519929856,1519930111,SE +1519930112,1519931391,GB 1519931392,1519934463,NL 1519934464,1519936191,GB 1519936192,1519936255,DK @@ -24781,7 +25833,9 @@ 1520009216,1520041983,SY 1520041984,1520074751,RU 1520074752,1520107519,BG -1520107520,1520140287,GB +1520107520,1520139767,GB +1520139768,1520139775,IE +1520139776,1520140287,GB 1520140288,1520173055,RU 1520173056,1520205823,PL 1520205824,1520230399,RU @@ -24875,8 +25929,7 @@ 1533485056,1533486079,GB 1533486080,1533486335,SE 1533486336,1533486591,NO -1533486592,1533486847,DK -1533486848,1533487103,GB +1533486592,1533487103,GB 1533487104,1533489151,FR 1533489152,1533491199,ES 1533491200,1533493247,AM @@ -24926,7 +25979,14 @@ 1533730816,1533732863,NL 1533732864,1533734911,RU 1533734912,1533739007,CZ -1533739008,1533820927,RU +1533739008,1533739263,IR +1533739264,1533771775,RU +1533771776,1533804543,IR +1533804544,1533805567,RU +1533805568,1533806591,NL +1533806592,1533818879,RU +1533818880,1533819903,NL +1533819904,1533820927,RU 1533820928,1533837311,DE 1533837312,1533845503,IR 1533845504,1533847551,GB @@ -24960,7 +26020,9 @@ 1534590976,1534656511,HU 1534656512,1534711807,FR 1534711808,1534712831,BE -1534712832,1534714415,FR +1534712832,1534714207,FR +1534714208,1534714223,NL +1534714224,1534714415,FR 1534714416,1534714431,ES 1534714432,1534714639,FR 1534714640,1534714655,IE @@ -24994,8 +26056,7 @@ 1534719748,1534719751,ES 1534719752,1534719783,FR 1534719784,1534719787,ES -1534719788,1534720003,FR -1534720004,1534720007,ES +1534719788,1534720007,FR 1534720008,1534720011,IT 1534720012,1534720023,FR 1534720024,1534720027,PL @@ -25003,9 +26064,7 @@ 1534720180,1534720183,ES 1534720184,1534720471,FR 1534720472,1534720479,DE -1534720480,1534721619,FR -1534721620,1534721623,ES -1534721624,1534722047,FR +1534720480,1534722047,FR 1534722048,1534787583,RU 1534787584,1534791679,RO 1534791680,1534795775,RU @@ -25063,17 +26122,7 @@ 1535631360,1535635455,GB 1535635456,1535639551,AZ 1535639552,1535672319,GB -1535672320,1535723519,DE -1535723520,1535724287,CH -1535724288,1535725567,DE -1535725568,1535725823,CH -1535725824,1535727615,DE -1535727616,1535727871,CH -1535727872,1535728639,DE -1535728640,1535728895,CH -1535728896,1535729919,DE -1535729920,1535730687,CH -1535730688,1535737855,DE +1535672320,1535737855,DE 1535737856,1535770623,HU 1535770624,1535803391,CH 1535803392,1535836159,GR @@ -25084,17 +26133,13 @@ 1535959552,1535959807,US 1535959808,1535963391,KW 1535963392,1535963647,US -1535963648,1535964415,KW -1535964416,1535964671,US -1535964672,1535967231,KW +1535963648,1535967231,KW 1535967232,1535999999,AT 1536000000,1536032767,NL 1536032768,1536036863,LV 1536036864,1536040959,AT 1536040960,1536045055,GB -1536045056,1536045311,IQ -1536045312,1536045567,LB -1536045568,1536049151,DE +1536045056,1536049151,DE 1536049152,1536051199,IT 1536051200,1536057343,RU 1536057344,1536061439,IE @@ -25151,7 +26196,9 @@ 1536425984,1536442367,SK 1536442368,1536458751,RS 1536458752,1536475135,BG -1536475136,1536479231,NL +1536475136,1536476545,NL +1536476546,1536476546,GB +1536476547,1536479231,NL 1536479232,1536483327,GB 1536483328,1536491519,NL 1536491520,1536499711,NO @@ -25172,11 +26219,7 @@ 1536647168,1536651263,ES 1536651264,1536655359,FR 1536655360,1536659455,GE -1536659456,1536659841,DE -1536659842,1536659843,US -1536659844,1536662271,DE -1536662272,1536662527,IQ -1536662528,1536663551,DE +1536659456,1536663551,DE 1536663552,1536667647,SA 1536667648,1536675839,RU 1536675840,1536679935,GB @@ -25197,7 +26240,7 @@ 1538850816,1538859007,KZ 1538859008,1538875391,RU 1538875392,1538883583,RS -1538883584,1538891775,BE +1538883584,1538891775,IR 1538891776,1538897919,GB 1538897920,1538899967,PL 1538899968,1538908159,SI @@ -25208,8 +26251,7 @@ 1538940928,1538949119,RU 1538949120,1538957311,AT 1538957312,1538964991,DE -1538964992,1538965247,GB -1538965248,1538965503,DE +1538964992,1538965503,GB 1538965504,1538973695,IR 1538973696,1538981887,JO 1538981888,1538990079,BY @@ -25263,12 +26305,8 @@ 1539211264,1539213311,CZ 1539213312,1539215359,SE 1539215360,1539219455,DE -1539219456,1539219967,GG -1539219968,1539220223,GB -1539220224,1539220479,GG -1539220480,1539220991,GB -1539220992,1539221247,GG -1539221248,1539221503,GB +1539219456,1539219967,GB +1539219968,1539221503,GG 1539221504,1539223551,FR 1539223552,1539225599,RU 1539225600,1539227647,HU @@ -25384,7 +26422,6 @@ 1539418112,1539419135,RU 1539419136,1539420159,UA 1539420160,1539421183,RU -1539421184,1539422207,GB 1539422208,1539423231,PL 1539423232,1539424255,IE 1539425280,1539426303,PL @@ -25463,13 +26500,14 @@ 1539482624,1539483135,RU 1539483648,1539484159,UA 1539484672,1539485695,RU -1539485696,1539486207,RO +1539485696,1539485951,LV +1539485952,1539486207,RO 1539486208,1539486719,FR 1539486720,1539487231,DE 1539487744,1539488255,RU 1539488256,1539488767,SE 1539488768,1539489279,PL -1539489280,1539490303,RU +1539489280,1539489791,RU 1539490816,1539491327,CH 1539491328,1539491839,PL 1539491840,1539492351,RU @@ -25573,7 +26611,6 @@ 1539549184,1539549695,GB 1539549696,1539550207,RU 1539550208,1539550719,UA -1539550720,1539551231,ES 1539551232,1539551743,RS 1539551744,1539552255,RU 1539552256,1539552767,RO @@ -25593,7 +26630,6 @@ 1539560960,1539561471,UA 1539561472,1539561983,RO 1539561984,1539563007,DE -1539563008,1539563519,RU 1539563520,1539564031,SE 1539564032,1539564543,KZ 1539564544,1539565055,GB @@ -25604,7 +26640,8 @@ 1539567616,1539568127,DE 1539568128,1539568639,NL 1539568640,1539569151,UA -1539569152,1539569663,EE +1539569152,1539569407,SE +1539569408,1539569663,EE 1539569664,1539570175,UA 1539570176,1539570687,PL 1539570688,1539571711,RU @@ -25633,7 +26670,7 @@ 1539602432,1539603455,UA 1539603456,1539604479,BG 1539604480,1539605503,ES -1539605504,1539606527,UA +1539605504,1539606527,DE 1539606528,1539607551,RU 1539607552,1539609599,DE 1539609600,1539610623,UA @@ -25725,7 +26762,7 @@ 1539707648,1539707903,AE 1539707904,1539708159,PL 1539708160,1539708415,DE -1539708416,1539708671,NL +1539708416,1539708671,GB 1539708672,1539708927,RO 1539708928,1539709183,IE 1539709184,1539709439,AT @@ -25811,7 +26848,6 @@ 1539733504,1539733759,FI 1539733760,1539734015,PL 1539734016,1539734271,FR -1539734272,1539734527,NO 1539734528,1539734783,TR 1539734784,1539735039,FR 1539735040,1539735295,BE @@ -25914,7 +26950,7 @@ 1539763968,1539764223,PT 1539764224,1539764479,AT 1539764480,1539764735,GB -1539764736,1539764991,RO +1539764736,1539764991,DE 1539764992,1539765247,BE 1539765248,1539765503,GB 1539765504,1539766015,PL @@ -25925,7 +26961,6 @@ 1539767040,1539767295,SA 1539767296,1539767551,DK 1539767552,1539767807,DE -1539767808,1539768063,IL 1539768064,1539768319,GB 1539768320,1539768575,FR 1539768576,1539768831,GB @@ -25944,7 +26979,6 @@ 1539772160,1539772415,BE 1539772416,1539772671,RU 1539772672,1539772927,RS -1539772928,1539773183,RU 1539773184,1539773439,GB 1539773440,1539773695,KZ 1539773696,1539773951,DE @@ -26019,7 +27053,6 @@ 1539795200,1539795455,PL 1539795456,1539795711,UA 1539795712,1539795967,SA -1539795968,1539796223,NL 1539796224,1539796479,MC 1539796480,1539796735,GB 1539796736,1539796991,TR @@ -26161,7 +27194,9 @@ 1539851264,1539852287,PL 1539852288,1539853311,UA 1539853312,1539854335,PL -1539854336,1539855359,UA +1539854336,1539855103,UA +1539855104,1539855231,US +1539855232,1539855359,UA 1539855360,1539856383,RU 1539857408,1539858431,PL 1539858432,1539859455,RO @@ -26243,7 +27278,9 @@ 1539954688,1539956735,RO 1539956736,1539957759,UA 1539957760,1539958783,RU -1539958784,1539962879,UA +1539958784,1539960063,UA +1539960064,1539960831,RU +1539960832,1539962879,UA 1539962880,1539964927,RU 1539964928,1539965951,UA 1539965952,1539966975,RU @@ -26375,11 +27412,8 @@ 1540136960,1540137983,PL 1540137984,1540139007,RU 1540139008,1540140031,DE -1540140032,1540140287,GB -1540140288,1540140415,US -1540140416,1540140447,GB -1540140448,1540140543,US -1540140544,1540141055,GB +1540140032,1540140799,GB +1540140800,1540141055,US 1540141056,1540142079,RU 1540142080,1540143103,UA 1540143104,1540144127,RU @@ -26431,8 +27465,8 @@ 1540199424,1540200447,CH 1540200448,1540201471,IL 1540201472,1540202495,UA -1540202496,1540204287,RU -1540204288,1540204543,UA +1540202496,1540203519,RU +1540203520,1540204543,UA 1540204544,1540205567,RU 1540205568,1540206591,DE 1540206592,1540208639,RU @@ -26575,15 +27609,13 @@ 1540299776,1540300287,KG 1540300288,1540300799,RU 1540300800,1540301311,DK -1540301312,1540301568,IL -1540301569,1540301569,A2 -1540301570,1540301823,IL +1540301312,1540301823,IL 1540301824,1540302847,GB 1540302848,1540303871,RU 1540303872,1540304895,UA 1540304896,1540305407,PL -1540305408,1540305929,GB -1540305930,1540306431,PL +1540305408,1540305919,GB +1540305920,1540306431,PL 1540306432,1540306943,UA 1540306944,1540307455,GB 1540307456,1540307967,RU @@ -26918,7 +27950,7 @@ 1540433152,1540433407,GB 1540433408,1540433663,AM 1540433664,1540433919,DK -1540434176,1540434431,CH +1540434176,1540434431,DK 1540434432,1540434687,DE 1540434688,1540434943,GB 1540434944,1540435199,FR @@ -27105,7 +28137,7 @@ 1540501504,1540502527,PL 1540502528,1540503551,RU 1540504576,1540505599,SE -1540505600,1540506623,RO +1540505600,1540506623,EU 1540506624,1540507647,GB 1540507648,1540508671,RU 1540508672,1540509695,UA @@ -27129,12 +28161,11 @@ 1540531200,1540532223,UA 1540532224,1540533247,RU 1540533248,1540534271,KZ -1540534272,1540535295,UA +1540534272,1540534527,UA +1540534528,1540535295,RU 1540535296,1540536319,SK 1540536320,1540537343,RU -1540537344,1540538367,UA -1540538368,1540538879,RU -1540538880,1540539391,UA +1540537344,1540539391,UA 1540539392,1540542463,RU 1540542464,1540543487,PL 1540543488,1540544511,DE @@ -27197,11 +28228,7 @@ 1540621824,1540622335,RU 1540622336,1540622591,KW 1540622592,1540622847,PL -1540622848,1540622848,RU -1540622849,1540622849,GB -1540622850,1540622853,RU -1540622854,1540622854,GB -1540622855,1540623103,RU +1540622848,1540623103,RU 1540623360,1540623615,GB 1540623616,1540623871,BG 1540624128,1540624383,RS @@ -27295,7 +28322,6 @@ 1540651008,1540651263,RO 1540651264,1540651519,CH 1540651520,1540651775,MK -1540651776,1540652031,RU 1540652032,1540652543,UA 1540652544,1540652799,TR 1540652800,1540653055,PL @@ -27311,7 +28337,6 @@ 1540655360,1540655615,RU 1540655616,1540655871,GB 1540655872,1540656383,NL -1540656640,1540656895,RU 1540656896,1540657151,RO 1540657152,1540657407,DE 1540657408,1540657663,CY @@ -27320,14 +28345,14 @@ 1540658176,1540658431,RO 1540658432,1540659199,RU 1540659200,1540659455,FR -1540659456,1540659967,UA +1540659712,1540659967,UA 1540659968,1540660223,PL 1540660224,1540660479,RU 1540660480,1540660735,FR 1540660736,1540660991,RU 1540660992,1540661247,RO 1540661248,1540661503,GB -1540661504,1540662015,RO +1540661760,1540662015,RO 1540662016,1540662271,BG 1540662272,1540662527,RO 1540662528,1540662783,PL @@ -27395,13 +28420,12 @@ 1540680960,1540681215,NL 1540681216,1540681471,FR 1540681472,1540681727,RU -1540681728,1540681983,TR 1540681984,1540682239,IT 1540682240,1540682495,PL 1540682496,1540682751,DE 1540682752,1540683007,EE 1540683008,1540683263,DE -1540683264,1540683775,HR +1540683520,1540683775,HR 1540683776,1540684031,UA 1540684032,1540684287,IT 1540684288,1540684543,HU @@ -27436,7 +28460,6 @@ 1540692224,1540692735,FR 1540692736,1540692991,DE 1540692992,1540693247,GB -1540693248,1540693503,RU 1540693504,1540693759,ES 1540693760,1540694015,UZ 1540694016,1540694271,CH @@ -27494,7 +28517,6 @@ 1540708864,1540709119,FR 1540709120,1540709375,DE 1540709376,1540709631,UA -1540709888,1540710143,UA 1540710144,1540710399,NL 1540710400,1540710655,PL 1540710656,1540710911,FI @@ -27508,14 +28530,12 @@ 1540713216,1540713727,PL 1540713728,1540713983,RU 1540713984,1540714239,GB -1540714240,1540714495,RO 1540714496,1540714751,NL 1540714752,1540715263,RU 1540715264,1540715519,NL 1540715520,1540715775,DE 1540716032,1540716287,PL 1540716288,1540716543,UA -1540716800,1540717055,UA 1540717056,1540717311,CZ 1540717312,1540717823,PL 1540717824,1540718079,UA @@ -27545,7 +28565,6 @@ 1540725248,1540725503,UA 1540725504,1540725759,SE 1540725760,1540726015,PL -1540726016,1540726271,TT 1540726272,1540726527,RU 1540726528,1540726783,CH 1540726784,1540727039,CZ @@ -27554,12 +28573,12 @@ 1540727552,1540727807,RU 1540727808,1540728063,GB 1540728064,1540728319,NL -1540728320,1540729343,RU +1540728320,1540728575,RU +1540728832,1540729343,RU 1540729344,1540729599,PL 1540729600,1540729855,CH 1540729856,1540730111,RU 1540730112,1540730367,GB -1540730368,1540730623,RU 1540730624,1540730879,UA 1540730880,1540731135,IL 1540731136,1540731391,DE @@ -27599,9 +28618,7 @@ 1540740608,1540740863,NL 1540740864,1540741119,RO 1540741120,1540741375,GB -1540741376,1540741631,EU 1540741632,1540742143,NL -1540742144,1540742399,RU 1540742400,1540742655,DE 1540742656,1540742911,AT 1540743168,1540743423,NO @@ -27658,7 +28675,7 @@ 1540780032,1540781055,UA 1540781056,1540783103,RU 1540783104,1540787199,UA -1540787200,1540790271,RU +1540787200,1540789247,RU 1540790272,1540791295,KW 1540791296,1540792319,CZ 1540792320,1540793343,UA @@ -27673,7 +28690,8 @@ 1540802560,1540803583,MD 1540803584,1540804607,RU 1540804608,1540805631,UA -1540805632,1540809727,RU +1540805632,1540806655,RU +1540807680,1540809727,RU 1540809728,1540810751,GB 1540810752,1540811775,UA 1540811776,1540812799,PL @@ -27711,7 +28729,7 @@ 1540851712,1540853759,RU 1540853760,1540854783,UA 1540854784,1540855807,NL -1540855808,1540856831,UA +1540855808,1540856831,BG 1540856832,1540857855,NL 1540857856,1540858879,DK 1540858880,1540859903,GB @@ -27796,7 +28814,6 @@ 1540900352,1540900607,HU 1540900608,1540900863,BG 1540900864,1540901119,RU -1540901120,1540901375,LV 1540901376,1540901631,SI 1540901632,1540901887,RO 1540901888,1540902143,GR @@ -27880,7 +28897,6 @@ 1540924928,1540925183,MD 1540925184,1540925439,RU 1540925440,1540925695,CZ -1540925696,1540925951,AE 1540925952,1540926207,TR 1540926208,1540926463,FR 1540926464,1540926719,SI @@ -27964,7 +28980,6 @@ 1540947968,1540948479,PL 1540948480,1540948991,RU 1540948992,1540949503,UA -1540949504,1540950015,RU 1540950016,1540951551,UA 1540951552,1540952063,RS 1540952064,1540952575,RU @@ -28012,7 +29027,6 @@ 1540977152,1540977663,PL 1540977664,1540978175,FI 1540978176,1540978687,AT -1540978688,1540979199,RU 1540979200,1540979711,SI 1540979712,1540980223,RU 1540980224,1540980735,SI @@ -28047,7 +29061,6 @@ 1540988672,1540988927,RU 1540988928,1540989183,GB 1540989184,1540989439,PL -1540989440,1540989695,UA 1540989696,1540989951,PL 1540989952,1540990207,FR 1540990208,1540990463,DE @@ -28123,10 +29136,9 @@ 1541010944,1541011199,CY 1541011200,1541011455,CH 1541011456,1541011711,FI -1541011712,1541011967,RU 1541012224,1541012479,DE 1541012480,1541012735,FI -1541012736,1541013247,UA +1541012992,1541013247,UA 1541013248,1541013503,SI 1541013504,1541014527,RO 1541014528,1541015551,AM @@ -28185,7 +29197,8 @@ 1541082112,1541083135,RU 1541083136,1541084159,RO 1541084160,1541086207,RU -1541086208,1541088255,UA +1541086208,1541086463,NL +1541086464,1541088255,UA 1541088256,1541089279,RU 1541089280,1541090303,GB 1541090304,1541091327,CZ @@ -28200,7 +29213,7 @@ 1541099520,1541100543,UA 1541100544,1541101567,HU 1541101568,1541102591,RU -1541102592,1541103615,RO +1541102592,1541103615,SA 1541103616,1541105663,RU 1541105664,1541106687,PL 1541106688,1541107711,NL @@ -28504,7 +29517,6 @@ 1541232128,1541232639,RU 1541232640,1541233151,PL 1541233152,1541233663,RU -1541233664,1541234175,SK 1541234176,1541234687,RO 1541234688,1541235199,NL 1541235200,1541235455,RU @@ -28588,7 +29600,8 @@ 1541282816,1541283839,RU 1541283840,1541286911,UA 1541286912,1541287935,DE -1541287936,1541288959,RU +1541287936,1541288191,UA +1541288192,1541288959,RU 1541288960,1541289983,CZ 1541289984,1541291007,PL 1541291008,1541293055,UA @@ -28661,11 +29674,11 @@ 1541348608,1541348863,HR 1541348864,1541349119,UA 1541349120,1541349375,PL -1541349376,1541349631,ES +1541349376,1541349631,RU 1541349632,1541349887,PL 1541349888,1541350143,RU 1541350144,1541350399,FR -1541350400,1541350655,NO +1541350400,1541350655,SE 1541350656,1541350911,RU 1541350912,1541351167,AT 1541351168,1541351423,SI @@ -28746,8 +29759,7 @@ 1541371904,1541372159,RU 1541372160,1541372415,CH 1541372416,1541372671,UA -1541372672,1541372927,US -1541372928,1541373183,NL +1541372672,1541373183,NL 1541373184,1541373439,FR 1541373440,1541373695,GB 1541373696,1541373951,UA @@ -29014,7 +30026,7 @@ 1541519360,1541521407,PL 1541521408,1541522431,RU 1541522432,1541524479,UA -1541524480,1541525503,RO +1541524480,1541525503,SA 1541525504,1541528575,RU 1541528576,1541532671,UA 1541532672,1541533695,RU @@ -29094,7 +30106,6 @@ 1541583872,1541584127,SE 1541584128,1541584383,GB 1541584384,1541584895,NL -1541584896,1541585151,DE 1541585152,1541585663,RU 1541585664,1541585919,UA 1541585920,1541586431,RU @@ -29184,10 +30195,8 @@ 1541635072,1541636095,GB 1541636096,1541636863,AT 1541636864,1541637119,RO -1541637120,1541637631,PL 1541637632,1541638143,CZ 1541638144,1541638399,RU -1541638400,1541638655,FR 1541638656,1541639167,HU 1541639168,1541640191,RU 1541640192,1541641215,KZ @@ -29226,7 +30235,7 @@ 1541660672,1541661695,SK 1541661696,1541661951,RU 1541661952,1541662207,NL -1541662208,1541662719,RO +1541662208,1541662719,AT 1541662720,1541663743,CZ 1541663744,1541664767,RO 1541664768,1541666047,RU @@ -29289,7 +30298,7 @@ 1541700608,1541700863,RU 1541700864,1541701119,PL 1541701120,1541701631,IL -1541701632,1541702655,RO +1541701632,1541702655,SA 1541703424,1541703679,RU 1541703680,1541704703,PL 1541704704,1541706239,RO @@ -29348,7 +30357,6 @@ 1541734912,1541735167,RU 1541735168,1541735423,DE 1541735424,1541735679,GB -1541735680,1541735935,RU 1541735936,1541736447,RO 1541736448,1541737471,RU 1541737472,1541739519,RO @@ -29475,7 +30483,7 @@ 1541805824,1541806079,RU 1541806080,1541806335,PL 1541806336,1541806591,UA -1541806592,1541806847,RU +1541806592,1541807103,RU 1541807104,1541808127,UA 1541808128,1541808383,IR 1541808384,1541809151,NL @@ -29614,7 +30622,7 @@ 1541876736,1541877247,PL 1541877248,1541877503,GB 1541877504,1541877759,RU -1541877760,1541878783,RO +1541877760,1541878783,SA 1541878784,1541879295,PL 1541879296,1541879807,UA 1541879808,1541880831,UZ @@ -29653,7 +30661,6 @@ 1541904384,1541904639,PL 1541904640,1541904895,SE 1541904896,1541905407,GB -1541905408,1541905663,RU 1541905664,1541905919,PL 1541905920,1541906431,RS 1541906432,1541906687,UA @@ -29765,8 +30772,7 @@ 1541974016,1541975551,RU 1541975552,1541975807,TR 1541975808,1541976319,PL -1541976320,1541976575,UA -1541976576,1541977087,RU +1541976320,1541977087,UA 1541977088,1541977343,IT 1541977344,1541977599,GB 1541977600,1541977855,RO @@ -29843,8 +30849,8 @@ 1542017536,1542017791,RU 1542017792,1542018047,GB 1542018048,1542019071,DE -1542019072,1542019327,RU -1542019328,1542020095,UA +1542019072,1542019583,RU +1542019584,1542020095,UA 1542020096,1542021119,RU 1542021120,1542023167,UA 1542023168,1542023423,PL @@ -29933,7 +30939,8 @@ 1542074880,1542075391,NL 1542075392,1542075647,CH 1542075648,1542075903,RU -1542075904,1542077439,RO +1542075904,1542076159,IE +1542076160,1542077439,RO 1542077440,1542078975,RU 1542078976,1542079487,PL 1542079488,1542080511,RU @@ -29971,7 +30978,7 @@ 1542106112,1542107135,RU 1542107136,1542107391,PL 1542107392,1542107903,RU -1542107904,1542108159,SK +1542107904,1542108159,AT 1542108160,1542109183,RU 1542109184,1542109695,GB 1542109696,1542110207,PL @@ -30197,7 +31204,8 @@ 1542237184,1542238207,PL 1542238208,1542239743,RU 1542239744,1542239999,HU -1542240000,1542240767,RU +1542240000,1542240255,RU +1542240256,1542240767,UA 1542240768,1542241023,DK 1542241024,1542241279,GB 1542241280,1542241535,LV @@ -30258,7 +31266,7 @@ 1542273024,1542274047,BG 1542274048,1542275071,PL 1542275072,1542275327,UA -1542275328,1542275583,DE +1542275328,1542275583,AT 1542275584,1542276095,SE 1542276096,1542277631,PL 1542277632,1542278143,GB @@ -30298,7 +31306,6 @@ 1542297088,1542297343,RU 1542297344,1542297599,FI 1542297600,1542297855,UA -1542297856,1542298111,RU 1542298112,1542300159,PL 1542300160,1542300671,RU 1542300672,1542301695,UA @@ -30372,7 +31379,7 @@ 1542343680,1542344447,PL 1542344448,1542345727,RU 1542345984,1542346239,PL -1542346240,1542348287,RU +1542346240,1542347775,RU 1542348288,1542348799,MD 1542348800,1542349823,RU 1542349824,1542350847,UA @@ -30425,8 +31432,7 @@ 1542377984,1542378495,RU 1542378496,1542378751,DK 1542378752,1542379007,RU -1542379008,1542379263,GB -1542379264,1542379519,A1 +1542379008,1542379519,A1 1542379520,1542379775,PL 1542379776,1542380031,RU 1542380032,1542380287,RO @@ -30521,7 +31527,6 @@ 1542426880,1542427135,GB 1542427136,1542427391,PT 1542427392,1542427647,IE -1542427648,1542428159,BG 1542428160,1542428415,UA 1542428416,1542428671,RS 1542428672,1542429695,PL @@ -30580,7 +31585,9 @@ 1542456320,1542456831,RO 1542456832,1542457343,RS 1542457344,1542458367,RO -1542458368,1542459391,UZ +1542458368,1542458623,UZ +1542458624,1542458879,RU +1542458880,1542459391,UZ 1542459392,1542459647,RU 1542459648,1542459903,GB 1542459904,1542460415,UA @@ -30619,8 +31626,7 @@ 1542475776,1542476799,LB 1542476800,1542477823,RU 1542477824,1542478079,DK -1542478336,1542478847,UA -1542478848,1542479103,RU +1542478336,1542479103,RU 1542479104,1542479359,PL 1542479360,1542479615,RO 1542479616,1542479871,RU @@ -30930,8 +31936,8 @@ 1545895936,1545928703,BA 1545928704,1545961471,SI 1545961472,1545994751,RU -1545994752,1545995263,CZ -1545995264,1545995519,RU +1545994752,1545995007,CZ +1545995008,1545995519,RU 1545995520,1545996287,CZ 1545996288,1545998335,RU 1545998336,1546000383,CZ @@ -30941,12 +31947,15 @@ 1546003200,1546003967,RU 1546003968,1546004479,CZ 1546004480,1546004735,UA -1546004736,1546005247,CZ +1546004736,1546004795,CZ +1546004796,1546004796,UA +1546004797,1546005247,CZ 1546005248,1546006527,RU 1546006528,1546008575,UA 1546008576,1546014719,BY 1546014720,1546015743,RU -1546015744,1546027007,CZ +1546015744,1546018815,CZ +1546018816,1546027007,UA 1546027008,1546059775,RU 1546059776,1546063871,SE 1546063872,1546067967,DE @@ -30974,7 +31983,9 @@ 1546122650,1546122650,PT 1546122651,1546122696,FR 1546122697,1546122704,ES -1546122705,1546125311,FR +1546122705,1546124191,FR +1546124192,1546124223,DZ +1546124224,1546125311,FR 1546125312,1546256383,GB 1546256384,1546264575,RU 1546264576,1546266623,TR @@ -31017,7 +32028,9 @@ 1546342400,1546344447,TR 1546344448,1546346495,DK 1546346496,1546348543,AT -1546348544,1546350591,DE +1546348544,1546348607,DE +1546348608,1546348623,CH +1546348624,1546350591,DE 1546350592,1546352639,PL 1546352640,1546354687,DK 1546354688,1546356735,FR @@ -31035,32 +32048,24 @@ 1546381312,1546383359,DK 1546383360,1546385407,IT 1546385408,1546387455,FR -1546387456,1546518527,TR +1546387456,1546491647,TR +1546491648,1546491903,RU +1546491904,1546518527,TR 1546518528,1546649599,KZ 1546649600,1546665983,SA -1546665984,1546679839,GB -1546679840,1546679840,HR -1546679841,1546682367,GB +1546665984,1546682367,GB 1546682368,1546698751,BE 1546698752,1546715135,NL 1546715136,1546731519,LV -1546731520,1546735103,FR -1546735104,1546735359,RE -1546735360,1546735871,FR -1546735872,1546736127,RE -1546736128,1546736639,FR -1546736640,1546736895,RE -1546736896,1546740223,FR -1546740224,1546740479,GP -1546740480,1546741503,FR -1546741504,1546741759,GP -1546741760,1546742527,FR -1546742528,1546743039,GF -1546743040,1546743295,FR -1546743296,1546743551,GF -1546743552,1546745599,FR -1546745600,1546745855,MQ -1546745856,1546746111,FR +1546731520,1546731775,FR +1546731776,1546732543,MQ +1546732544,1546739711,FR +1546739712,1546739967,GP +1546739968,1546740991,FR +1546740992,1546741503,GP +1546741504,1546745343,FR +1546745344,1546745599,MQ +1546745600,1546746111,FR 1546746112,1546746367,MQ 1546746368,1546747903,FR 1546747904,1546764287,RU @@ -31070,7 +32075,9 @@ 1546813440,1546862591,RU 1546862592,1546878975,GE 1546878976,1546895359,DE -1546895360,1546911743,IE +1546895360,1546897919,IE +1546897920,1546898175,US +1546898176,1546911743,IE 1546911744,1546928127,SK 1546928128,1546944511,GB 1546944512,1546960895,UA @@ -31122,12 +32129,14 @@ 1547542528,1547546623,FR 1547546624,1547550719,IR 1547550720,1547554815,IE -1547554816,1547555078,AT +1547554816,1547555071,AT +1547555072,1547555078,NL 1547555079,1547555079,EU -1547555080,1547558911,AT +1547555080,1547555327,NL +1547555328,1547558911,AT 1547558912,1547563007,IL -1547563008,1547565311,NL -1547565312,1547565823,US +1547563008,1547565055,NL +1547565056,1547565823,US 1547565824,1547567103,NL 1547567104,1547571199,GB 1547571200,1547575295,AT @@ -31183,7 +32192,8 @@ 1547644928,1547649023,CZ 1547649024,1547653119,RU 1547653120,1547657215,LV -1547657216,1547661311,RU +1547657216,1547660287,RU +1547660288,1547661311,BE 1547661312,1547665407,ES 1547665408,1547669503,GB 1547669504,1547673599,AT @@ -31199,9 +32209,11 @@ 1548159232,1548159235,ES 1548159236,1548159487,NL 1548159488,1548159999,GB -1548160000,1548160257,NL +1548160000,1548160255,NL +1548160256,1548160257,BE 1548160258,1548160259,EU -1548160260,1548162463,NL +1548160260,1548160511,BE +1548160512,1548162463,NL 1548162464,1548162495,FR 1548162496,1548169215,NL 1548169216,1548171263,DE @@ -31234,55 +32246,48 @@ 1550319616,1550581759,CH 1550581760,1550843903,NL 1550843904,1550974975,UA -1550974976,1550979071,RO +1550974976,1550975999,RO +1550976000,1550976255,EG +1550976256,1550976767,RO +1550976768,1550977023,US +1550977024,1550979071,RO 1550979072,1550983167,IR -1550983168,1550985215,RO -1550985216,1550985727,PS -1550985728,1550985983,RO -1550985984,1550987263,PS -1550987264,1550998527,RO -1550998528,1550998783,NL -1550998784,1551012863,RO -1551012864,1551013119,MD -1551013120,1551014143,RO -1551014144,1551014399,MD -1551014400,1551015167,RO -1551015168,1551015423,MD -1551015424,1551017215,RO -1551017216,1551017471,MD -1551017472,1551032063,RO +1550983168,1550983935,RO +1550983936,1550984191,GB +1550984192,1550984447,KR +1550984448,1550985215,RO +1550985216,1550987263,PS +1550987264,1550988543,RO +1550988544,1550988799,JP +1550988800,1550990335,RO +1550990336,1550991359,AU +1550991360,1550996223,RO +1550996224,1550996479,AU +1550996480,1550998527,RO +1550998528,1550998783,IT +1550998784,1551022847,RO +1551022848,1551023103,MD +1551023104,1551032063,RO 1551032064,1551032319,MD -1551032320,1551034879,RO -1551034880,1551035135,MD -1551035136,1551043071,RO +1551032320,1551043071,RO 1551043072,1551043327,MD -1551043328,1551057663,RO -1551057664,1551057919,MD -1551057920,1551070975,RO -1551070976,1551071231,MD -1551071232,1551076863,RO -1551076864,1551077119,MD -1551077120,1551077375,RO +1551043328,1551052031,RO +1551052032,1551052287,MD +1551052288,1551056639,RO +1551056640,1551056895,MD +1551056896,1551076607,RO +1551076608,1551076863,MD +1551076864,1551077375,RO 1551077376,1551077631,MD -1551077632,1551079167,RO -1551079168,1551079423,MD -1551079424,1551080703,RO -1551080704,1551080959,MD -1551080960,1551082239,RO -1551082240,1551082495,MD -1551082496,1551085823,RO +1551077632,1551085823,RO 1551085824,1551086079,MD -1551086080,1551086335,RO -1551086336,1551086847,MD -1551086848,1551087871,RO -1551087872,1551088127,MD -1551088128,1551088895,RO -1551088896,1551089151,MD -1551089152,1551101951,RO -1551101952,1551102207,MD -1551102208,1551103231,RO -1551103232,1551103487,MD -1551103488,1551106047,RO +1551086080,1551086591,RO +1551086592,1551086847,MD +1551086848,1551094783,RO +1551094784,1551095039,MD +1551095040,1551101183,RO +1551101184,1551101439,MD +1551101440,1551106047,RO 1551106048,1551237119,DE 1551237120,1551368191,GR 1551368192,1551499263,NL @@ -31314,11 +32319,17 @@ 1551604480,1551604735,SE 1551604736,1551630335,EU 1551630336,1551892479,RU -1551892480,1556086783,FR +1551892480,1555696895,FR +1555696896,1555697151,ES +1555697152,1555760639,FR +1555760640,1555760895,ES +1555760896,1556086783,FR 1556086784,1556491204,DE 1556491205,1556491205,EU 1556491206,1557069823,DE -1557069824,1557135359,GB +1557069824,1557076991,GB +1557076992,1557077247,DE +1557077248,1557135359,GB 1557135360,1557921791,DE 1557921792,1558052863,NO 1558052864,1558054399,FR @@ -31328,7 +32339,9 @@ 1558056104,1558079407,FR 1558079408,1558079415,PL 1558079416,1558079423,GB -1558079424,1558081175,FR +1558079424,1558079871,FR +1558079872,1558079887,GB +1558079888,1558081175,FR 1558081176,1558081183,BE 1558081184,1558083775,FR 1558083776,1558083791,DE @@ -31340,17 +32353,33 @@ 1558091352,1558091352,ES 1558091353,1558093531,FR 1558093532,1558093532,HR -1558093533,1558097919,FR +1558093533,1558093609,FR +1558093610,1558093610,ES +1558093611,1558097919,FR 1558097920,1558098175,GB -1558098176,1558103159,FR +1558098176,1558102501,FR +1558102502,1558102502,DE +1558102503,1558102507,FR +1558102508,1558102508,DE +1558102509,1558103159,FR 1558103160,1558103167,GB -1558103168,1558118399,FR +1558103168,1558112095,FR +1558112096,1558112127,ES +1558112128,1558112191,FR +1558112192,1558112192,ES +1558112193,1558112207,FR +1558112208,1558112208,ES +1558112209,1558112209,FR +1558112210,1558112211,ES +1558112212,1558118399,FR 1558118400,1558119423,DE 1558119424,1558122495,RU 1558122496,1558123007,SG 1558123008,1558123519,RU 1558123520,1558125567,LU -1558125568,1558147071,AT +1558125568,1558141439,AT +1558141440,1558141695,CY +1558141696,1558147071,AT 1558147072,1558147327,LU 1558147328,1558147583,AT 1558147584,1558147839,RU @@ -31364,94 +32393,18 @@ 1558151168,1558172927,IT 1558172928,1558173183,US 1558173184,1558179839,IT -1558179840,1558180023,NL +1558179840,1558179955,NL +1558179956,1558179959,IT +1558179960,1558180023,NL 1558180024,1558180039,IT -1558180040,1558180863,NL +1558180040,1558180287,NL +1558180288,1558180351,IT +1558180352,1558180863,NL 1558180864,1558183935,IT 1558183936,1558708223,DE -1558708224,1558906623,GB -1558906624,1558909695,BE -1558909696,1558909951,GB -1558909952,1558911231,BE -1558911232,1558911999,GB -1558912000,1558917119,BE -1558917120,1558918143,GB -1558918144,1558918399,BE -1558918400,1558920191,GB -1558920192,1558921215,BE -1558921216,1558921471,GB -1558921472,1558921727,BE -1558921728,1558923263,GB -1558923264,1558923519,BE -1558923520,1558924287,GB -1558924288,1558924543,BE -1558924544,1558926079,GB -1558926080,1558926335,BE -1558926336,1558927615,GB -1558927616,1558927871,BE -1558927872,1558928383,GB -1558928384,1558928639,BE -1558928640,1558929919,GB -1558929920,1558930175,BE -1558930176,1558930943,GB -1558930944,1558931199,BE -1558931200,1558931711,GB -1558931712,1558931967,BE -1558931968,1558932223,GB -1558932224,1558932735,BE -1558932736,1558934783,GB -1558934784,1558935295,BE -1558935296,1558936575,GB -1558936576,1558936831,BE -1558936832,1558938367,GB -1558938368,1558938623,BE -1558938624,1558939135,GB -1558939136,1558939391,BE -1558939392,1558939647,GB -1558939648,1558939903,BE -1558939904,1558940159,GB -1558940160,1558940415,BE -1558940416,1558940671,GB -1558940672,1558943999,BE -1558944000,1558944255,GB -1558944256,1558944511,BE -1558944512,1558944767,GB -1558944768,1558945791,BE -1558945792,1558946303,GB -1558946304,1558947327,BE -1558947328,1558947839,GB -1558947840,1558948095,BE -1558948096,1558949887,GB -1558949888,1558950911,BE -1558950912,1558951935,GB -1558951936,1558952447,BE -1558952448,1558952703,GB -1558952704,1558952959,BE -1558952960,1558955519,GB -1558955520,1558956031,BE -1558956032,1558956799,GB -1558956800,1558957311,BE -1558957312,1558957567,GB -1558957568,1558957823,BE -1558957824,1558959103,GB -1558959104,1558960255,BE -1558960256,1558960383,GB -1558960384,1558960639,BE -1558960640,1558960895,GB -1558960896,1558961407,BE -1558961408,1558961919,GB -1558961920,1558962431,BE -1558962432,1558963199,GB -1558963200,1558963455,BE -1558963456,1558963711,GB -1558963712,1558964223,BE -1558964224,1558964479,GB -1558964480,1558965247,BE -1558965248,1558965503,GB -1558965504,1558965759,BE -1558965760,1558968319,GB -1558968320,1558969343,BE -1558969344,1559236607,GB +1558708224,1558904831,GB +1558904832,1558970367,BE +1558970368,1559236607,GB 1559236608,1559240703,IL 1559240704,1559248895,BA 1559248896,1559257087,LV @@ -31508,32 +32461,29 @@ 1559838720,1559855103,UA 1559855104,1559887871,HU 1559887872,1559920639,PT -1559920640,1559924693,LU -1559924694,1559924694,GB -1559924695,1559929599,LU -1559929600,1559929855,LV -1559929856,1559932927,LU -1559932928,1559943167,DE +1559920640,1559932927,LU +1559932928,1559939071,DE +1559939072,1559942143,LU +1559942144,1559943167,DE 1559943168,1559944191,LU 1559944192,1559945727,FR 1559945728,1559946751,LU 1559946752,1559950335,DE 1559950336,1559951359,LU 1559951360,1559952383,DE -1559952384,1559952895,LU -1559952896,1559953151,DE -1559953152,1559953407,LU +1559952384,1559953407,LU 1559953408,1559986175,MT 1559986176,1560018943,IE 1560018944,1560051711,DE 1560051712,1560084479,RU 1560084480,1560117247,JO -1560117248,1560133631,CZ -1560133632,1560135679,RU +1560117248,1560125439,CZ +1560125440,1560135679,RU 1560135680,1560135807,UA 1560135808,1560135935,CZ 1560135936,1560137727,RU -1560137728,1560150015,CZ +1560137728,1560137983,DE +1560137984,1560150015,CZ 1560150016,1560182783,NL 1560182784,1560215551,SE 1560215552,1560281087,RU @@ -31588,8 +32538,8 @@ 1566248960,1566257151,GB 1566257152,1566261247,CZ 1566261248,1566265343,TR -1566265344,1566266367,US -1566266368,1566269407,A2 +1566265344,1566265599,DE +1566265600,1566269407,A2 1566269408,1566269439,DE 1566269440,1566273535,NO 1566273536,1566277631,RU @@ -31639,20 +32589,41 @@ 1566388224,1566390271,LU 1566390272,1566392319,LT 1566392320,1566394367,ES -1566394368,1566394528,NO +1566394368,1566394528,GB 1566394529,1566394529,FR -1566394530,1566394530,NO +1566394530,1566394530,GB 1566394531,1566394531,DE 1566394532,1566394532,PL 1566394533,1566394533,NL 1566394534,1566394534,SE 1566394535,1566394535,PT -1566394536,1566394538,NO +1566394536,1566394538,GB 1566394539,1566394539,RU -1566394540,1566396415,NO +1566394540,1566394623,GB +1566394624,1566396415,NO 1566396416,1566398463,GB 1566398464,1566400511,RU -1566400512,1566402559,NO +1566400512,1566400607,NO +1566400608,1566400639,GB +1566400640,1566400671,NO +1566400672,1566400703,DE +1566400704,1566400735,NL +1566400736,1566401023,NO +1566401024,1566401087,US +1566401088,1566401151,NO +1566401152,1566401279,US +1566401280,1566401599,NO +1566401600,1566401631,HK +1566401632,1566401663,NO +1566401664,1566401695,SG +1566401696,1566401727,NO +1566401728,1566401759,AU +1566401760,1566401887,NO +1566401888,1566401919,A2 +1566401920,1566402143,NO +1566402144,1566402175,A2 +1566402176,1566402303,NO +1566402304,1566402559,SG 1566404608,1566406655,ES 1566406656,1566408703,NL 1566408704,1566410751,GB @@ -31670,7 +32641,9 @@ 1566443520,1566445567,NO 1566445568,1566447615,PL 1566447616,1566451711,IT -1566451712,1566453759,IL +1566451712,1566452223,IL +1566452224,1566452479,TR +1566452480,1566453759,IL 1566453760,1566455807,IQ 1566455808,1566457855,PT 1566457856,1566459903,CH @@ -31724,10 +32697,8 @@ 1566556160,1566558207,RU 1566558208,1566560255,JO 1566560256,1566560767,IT -1566560768,1566561015,SM -1566561016,1566561019,IT -1566561020,1566561279,SM -1566561280,1566564351,IT +1566560768,1566561023,SM +1566561024,1566564351,IT 1566564352,1566566399,IS 1566566400,1566568447,FR 1566568448,1566570495,KZ @@ -31748,13 +32719,17 @@ 1567490048,1567555583,IR 1567555584,1567621119,AT 1567621120,1567686655,SA -1567686656,1567696383,RO +1567686656,1567690751,RO +1567690752,1567692799,ES +1567692800,1567696383,RO 1567696384,1567696895,MD 1567696896,1567703039,RO 1567703040,1567707135,MD 1567707136,1567715327,RO 1567715328,1567717375,MD -1567717376,1567727359,RO +1567717376,1567719167,RO +1567719168,1567719423,GB +1567719424,1567727359,RO 1567727360,1567727615,GB 1567727616,1567742975,RO 1567742976,1567743487,MD @@ -31775,17 +32750,36 @@ 1567766272,1567767039,RO 1567767040,1567767551,GB 1567767552,1567768575,ES -1567768576,1567827455,RO +1567768576,1567769343,RO +1567769344,1567769599,MD +1567769600,1567773951,RO +1567773952,1567774207,MD +1567774208,1567785983,RO +1567785984,1567786239,MD +1567786240,1567789055,RO +1567789056,1567793151,ES +1567793152,1567826175,RO +1567826176,1567826431,DE +1567826432,1567827455,RO 1567827456,1567827711,BG -1567827712,1567833599,RO +1567827712,1567832831,RO +1567832832,1567833087,GB +1567833088,1567833599,NL 1567833600,1567834111,IT 1567834112,1567838207,RO 1567838208,1567842303,A1 -1567842304,1567852543,RO +1567842304,1567842815,FR +1567842816,1567852543,RO 1567852544,1567856639,MD 1567856640,1567858687,RO 1567858688,1567860735,SE -1567860736,1567871999,RO +1567860736,1567866879,RO +1567866880,1567867135,IN +1567867136,1567867391,RO +1567867392,1567867519,GB +1567867520,1567869183,RO +1567869184,1567869439,GB +1567869440,1567871999,RO 1567872000,1567873023,ES 1567873024,1567879167,MD 1567879168,1567883263,RO @@ -31806,13 +32800,18 @@ 1567993856,1567997951,IR 1567997952,1568014335,NL 1568014336,1568022527,DE -1568022528,1568024063,RO +1568022528,1568023551,FR +1568023552,1568024063,RO 1568024064,1568024319,SG 1568024320,1568038911,RO 1568038912,1568059391,IR 1568059392,1568060415,RO -1568060416,1568062463,MD -1568062464,1568088063,RO +1568060416,1568063487,MD +1568063488,1568083967,RO +1568083968,1568084223,CN +1568084224,1568084991,RO +1568084992,1568086015,CN +1568086016,1568088063,RO 1568088064,1568104447,IR 1568104448,1568106495,MD 1568106496,1568107519,RO @@ -31820,7 +32819,8 @@ 1568108544,1568109055,GB 1568109056,1568110079,RO 1568110080,1568111103,GB -1568111104,1568111615,RO +1568111104,1568111359,RO +1568111360,1568111615,NL 1568111616,1568112127,GB 1568112128,1568112639,RO 1568112640,1568114687,MD @@ -31837,19 +32837,7 @@ 1568145408,1568178175,RO 1568178176,1568210943,RU 1568210944,1568243711,GB -1568243712,1568247295,GP -1568247296,1568247551,GF -1568247552,1568252927,GP -1568252928,1568253183,GF -1568253184,1568262143,GP -1568262144,1568262399,MQ -1568262400,1568270079,GP -1568270080,1568270335,MQ -1568270336,1568273151,GP -1568273152,1568273407,GF -1568273408,1568275711,GP -1568275712,1568275967,MQ -1568275968,1568276479,GP +1568243712,1568276479,GP 1568276480,1568309247,DE 1568309248,1568342015,RO 1568342016,1568374783,BG @@ -31902,7 +32890,9 @@ 1570645248,1570652159,FR 1570652160,1570660863,SE 1570660864,1570661375,NO -1570661376,1570668543,SE +1570661376,1570662143,SE +1570662144,1570662399,DE +1570662400,1570668543,SE 1570668544,1570686975,RU 1570686976,1570693119,NL 1570693120,1570695167,RU @@ -31923,7 +32913,7 @@ 1571422208,1571422463,CZ 1571422464,1571422719,UA 1571422720,1571423231,RU -1571423232,1571423487,CZ +1571423232,1571423487,UA 1571423488,1571423999,RU 1571424000,1571424255,KZ 1571424256,1571424511,KG @@ -31937,20 +32927,26 @@ 1571425233,1571425279,CZ 1571425280,1571425535,RU 1571425536,1571425791,NL -1571425792,1571426047,CZ +1571425792,1571425871,CZ +1571425872,1571425872,RU +1571425873,1571426047,CZ 1571426048,1571426303,UA 1571426304,1571428607,CZ 1571428608,1571428863,UA 1571428864,1571430399,CZ -1571430400,1571435519,UA +1571430400,1571430911,UA +1571430912,1571431167,BY +1571431168,1571431423,UA +1571431424,1571432447,KZ +1571432448,1571434495,RU +1571434496,1571435519,UA 1571435520,1571436031,RU 1571436032,1571436287,CZ 1571436288,1571436543,UA 1571436544,1571438591,BA 1571438592,1571440639,UA 1571440640,1571440895,RU -1571440896,1571441407,CZ -1571441408,1571441663,UA +1571440896,1571441663,CZ 1571441664,1571441919,RU 1571441920,1571442175,CZ 1571442176,1571442687,NL @@ -31965,39 +32961,48 @@ 1571447296,1571447807,RU 1571447808,1571448063,CZ 1571448064,1571448319,RU -1571448320,1571448831,CZ +1571448320,1571448575,CZ +1571448576,1571448831,RU 1571448832,1571449343,NL 1571449344,1571449855,CZ -1571449856,1571450879,RU -1571450880,1571451647,CZ -1571451648,1571452927,UA -1571452928,1571453183,CZ -1571453184,1571453695,RU +1571449856,1571451391,RU +1571451392,1571452927,UA +1571452928,1571453695,RU 1571453696,1571453951,CZ 1571453952,1571455999,RU 1571456000,1571456511,UA 1571456512,1571456767,CZ 1571456768,1571457023,UA 1571457024,1571457535,CZ -1571457536,1571458047,RU -1571458048,1571459071,CZ +1571457536,1571458559,RU +1571458560,1571458815,CZ +1571458816,1571459071,BY 1571459072,1571463167,UA -1571463168,1571467263,CZ +1571463168,1571466239,CZ +1571466240,1571467007,RU +1571467008,1571467263,CZ 1571467264,1571467775,RU 1571467776,1571468287,CZ 1571468288,1571469311,RU 1571469312,1571469823,BY 1571469824,1571470335,CZ 1571470336,1571470847,UA -1571470848,1571471103,RU -1571471104,1571471359,CZ -1571471360,1571475455,RU +1571470848,1571475455,RU 1571475456,1571476479,CZ 1571476480,1571479551,RU 1571479552,1571483647,CZ 1571483648,1571484159,RU -1571484160,1571487743,CZ -1571487744,1571495935,SK +1571484160,1571485695,CZ +1571485696,1571486719,RU +1571486720,1571486975,CZ +1571486976,1571487231,UA +1571487232,1571487743,CZ +1571487744,1571489023,SK +1571489024,1571489279,UA +1571489280,1571489535,BY +1571489536,1571491071,RU +1571491072,1571491327,CZ +1571491328,1571495935,UA 1571495936,1571496447,RU 1571496448,1571497983,BY 1571497984,1571500031,RU @@ -32007,9 +33012,13 @@ 1571514368,1571520511,BY 1571520512,1571522047,UA 1571522048,1571522815,RU -1571522816,1571524607,CZ +1571522816,1571524095,CZ +1571524096,1571524351,RU +1571524352,1571524607,CZ 1571524608,1571526655,RU -1571526656,1571528703,CZ +1571526656,1571526911,UA +1571526912,1571528191,CZ +1571528192,1571528703,UA 1571528704,1571529215,BY 1571529216,1571529471,CZ 1571529472,1571529727,UA @@ -32025,9 +33034,15 @@ 1571535104,1571535359,UA 1571535360,1571535617,CZ 1571535618,1571535618,RU -1571535619,1571536895,CZ -1571536896,1571538943,RU -1571538944,1571540991,CZ +1571535619,1571535871,CZ +1571535872,1571538943,RU +1571538944,1571539967,CZ +1571539968,1571540223,UA +1571540224,1571540693,CZ +1571540694,1571540695,RU +1571540696,1571540696,CZ +1571540697,1571540697,RU +1571540698,1571540991,CZ 1571540992,1571541247,RU 1571541248,1571541503,UA 1571541504,1571542015,CZ @@ -32036,15 +33051,16 @@ 1571542784,1571543039,CZ 1571543040,1571543551,NL 1571543552,1571543807,UA -1571543808,1571544063,CZ -1571544064,1571545343,RU +1571543808,1571545343,RU 1571545344,1571545599,UA 1571545600,1571545855,CZ 1571545856,1571546111,RU 1571546112,1571546879,CZ 1571546880,1571547135,RU 1571547136,1571549183,CZ -1571549184,1571553279,UA +1571549184,1571550207,UA +1571550208,1571550463,RU +1571550464,1571553279,UA 1571553280,1571684351,IL 1571684352,1571686399,ES 1571686400,1571688447,GB @@ -32092,25 +33108,23 @@ 1571799040,1571815423,UA 1571815424,1571815679,FR 1571815680,1571815935,RE -1571815936,1571816959,FR -1571816960,1571817215,RE -1571817216,1571818495,FR -1571818496,1571818751,RE -1571818752,1571819007,FR -1571819008,1571819263,RE -1571819264,1571819519,FR -1571819520,1571819775,RE -1571819776,1571821055,FR -1571821056,1571821823,RE -1571821824,1571822847,FR -1571822848,1571823615,RE -1571823616,1571825407,FR -1571825408,1571825663,RE -1571825664,1571827455,FR -1571827456,1571827967,RE -1571827968,1571830783,FR -1571830784,1571831039,RE -1571831040,1571831807,FR +1571815936,1571817215,FR +1571817216,1571817471,RE +1571817472,1571817727,FR +1571817728,1571817983,RE +1571817984,1571823615,FR +1571823616,1571823871,RE +1571823872,1571825151,FR +1571825152,1571825407,RE +1571825408,1571826687,FR +1571826688,1571826943,RE +1571826944,1571827711,FR +1571827712,1571827967,RE +1571827968,1571829759,FR +1571829760,1571830015,RE +1571830016,1571830527,FR +1571830528,1571830783,RE +1571830784,1571831807,FR 1571831808,1571848191,DK 1571848192,1571864575,RU 1571864576,1571880959,PL @@ -32128,7 +33142,15 @@ 1572029184,1572030156,GB 1572030157,1572030157,RU 1572030158,1572030463,GB -1572030464,1572042751,RU +1572030464,1572034815,RU +1572034816,1572034943,BY +1572034944,1572035071,US +1572035072,1572035199,CZ +1572035200,1572035327,NG +1572035328,1572035455,US +1572035456,1572035583,RU +1572035584,1572036607,GB +1572036608,1572042751,RU 1572042752,1572043263,GB 1572043264,1572044799,RU 1572044800,1572061183,IT @@ -32172,8 +33194,10 @@ 1572384768,1572388863,DE 1572388864,1572392959,DK 1572392960,1572393471,NL -1572393472,1572393983,GB -1572393984,1572394495,DE +1572393472,1572393727,US +1572393728,1572393983,GB +1572393984,1572394239,DE +1572394240,1572394495,US 1572394496,1572394751,FR 1572394752,1572395263,US 1572395264,1572395519,NL @@ -32213,11 +33237,15 @@ 1572524032,1572528127,GE 1572528128,1572532223,RU 1572532224,1572536319,IT -1572536320,1572538367,GB +1572536320,1572536575,GB +1572536576,1572537087,GG +1572537088,1572538367,GB 1572538368,1572540415,NL 1572540416,1572542463,GB 1572542464,1572544511,IT -1572544512,1572545791,IQ +1572544512,1572545407,IQ +1572545408,1572545439,AU +1572545440,1572545791,IQ 1572545792,1572546047,US 1572546048,1572546559,IQ 1572546560,1572548607,FR @@ -32232,10 +33260,11 @@ 1572564992,1572567039,DE 1572567040,1572569087,RU 1572571136,1572573183,BG -1572573184,1572573951,GG -1572573952,1572574207,GB -1572574208,1572574463,GG -1572574464,1572575231,GB +1572573184,1572573439,GB +1572573440,1572574463,GG +1572574464,1572574719,GB +1572574720,1572574975,GG +1572574976,1572575231,GB 1572575232,1572577279,RU 1572577280,1572579327,AM 1572579328,1572581375,GB @@ -32308,7 +33337,9 @@ 1572712448,1572714495,ES 1572714496,1572714943,NG 1572714944,1572714959,IT -1572714960,1572716543,NG +1572714960,1572715775,NG +1572715776,1572716031,IT +1572716032,1572716543,NG 1572716544,1572718591,SA 1572718592,1572720639,RU 1572720640,1572722687,IT @@ -32349,9 +33380,11 @@ 1572794368,1572796415,RU 1572796416,1572798463,DE 1572798464,1572800511,NL -1572800512,1572800739,RU -1572800740,1572800740,UA -1572800741,1572804607,RU +1572800512,1572800738,RU +1572800739,1572800740,UA +1572800741,1572800741,RU +1572800742,1572800742,UA +1572800743,1572804607,RU 1572804608,1572808703,GB 1572808704,1572810751,FR 1572810752,1572812799,DE @@ -32375,7 +33408,8 @@ 1572843520,1572845567,JO 1572845568,1572847615,FR 1572847616,1572849663,GI -1572849664,1572851711,GB +1572849664,1572850431,JE +1572850432,1572851711,GB 1572851712,1572853759,DE 1572853760,1572855807,BE 1572855808,1572857855,KZ @@ -32401,7 +33435,9 @@ 1578584357,1578584689,FR 1578584690,1578584690,PT 1578584691,1578585087,FR -1578585088,1578586111,PT +1578585088,1578585299,PT +1578585300,1578585300,FR +1578585301,1578586111,PT 1578586112,1578588159,ES 1578588160,1578590207,PL 1578590208,1578590787,FR @@ -32425,7 +33461,9 @@ 1578592200,1578592207,CH 1578592208,1578592295,FR 1578592296,1578592303,NL -1578592304,1578593023,FR +1578592304,1578592783,FR +1578592784,1578592799,BE +1578592800,1578593023,FR 1578593024,1578593279,DE 1578593280,1578593415,FR 1578593416,1578593423,IT @@ -32452,9 +33490,7 @@ 1578596864,1578602495,FR 1578602496,1578604543,NL 1578604544,1578606591,GB -1578606592,1578607725,DE -1578607726,1578607726,FR -1578607727,1578608639,DE +1578606592,1578608639,DE 1578608640,1578610687,CZ 1578610688,1578611167,FR 1578611168,1578611175,DE @@ -32470,9 +33506,23 @@ 1578613736,1578613739,ES 1578613740,1578613931,FR 1578613932,1578613935,NL -1578613936,1578614271,FR -1578614272,1578614527,ES -1578614528,1578631167,FR +1578613936,1578614319,FR +1578614320,1578614323,RU +1578614324,1578614327,HU +1578614328,1578614399,FR +1578614400,1578614403,EE +1578614404,1578614423,FR +1578614424,1578614427,IS +1578614428,1578614431,LV +1578614432,1578614435,BG +1578614436,1578614459,FR +1578614460,1578614463,NO +1578614464,1578614471,FR +1578614472,1578614475,SI +1578614476,1578614479,UA +1578614480,1578614495,FR +1578614496,1578614511,DE +1578614512,1578631167,FR 1578631168,1578659839,RO 1578659840,1578663935,ES 1578663936,1578762239,RU @@ -32497,9 +33547,17 @@ 1580015616,1580048383,UA 1580048384,1580064767,RU 1580064768,1580072959,GB -1580072960,1580109823,PT +1580072960,1580083199,PT +1580083200,1580085247,DE +1580085248,1580089343,US +1580089344,1580097535,PT +1580097536,1580105727,GB +1580105728,1580109567,PT +1580109568,1580109823,SE 1580109824,1580113919,US -1580113920,1580138495,PT +1580113920,1580125695,PT +1580125696,1580125951,TR +1580125952,1580138495,PT 1580138496,1580204031,IT 1580204032,1580335103,SA 1580335104,1580466175,RU @@ -32523,9 +33581,7 @@ 1581973504,1581989887,RU 1581989888,1582006271,PL 1582006272,1582022655,RU -1582022656,1582029900,NL -1582029901,1582029901,SE -1582029902,1582039039,NL +1582022656,1582039039,NL 1582039040,1582055423,BH 1582055424,1582071807,UA 1582071808,1582088191,ES @@ -32557,9 +33613,7 @@ 1583656960,1583665151,RU 1583665152,1583669247,UA 1583669248,1583673343,GE -1583673344,1583675647,DE -1583675648,1583675903,US -1583675904,1583677439,DE +1583673344,1583677439,DE 1583677440,1583681535,FI 1583681536,1583685631,PL 1583685632,1583689727,DE @@ -32605,7 +33659,9 @@ 1583782704,1583782711,IT 1583782712,1583782975,GB 1583782976,1583782983,IT -1583782984,1583783495,GB +1583782984,1583783095,GB +1583783096,1583783103,IT +1583783104,1583783495,GB 1583783496,1583783503,IT 1583783504,1583783935,GB 1583783936,1583788031,EU @@ -32651,9 +33707,10 @@ 1585217536,1585219583,FR 1585219584,1585221631,NL 1585221632,1585223679,SK -1585223680,1585224959,FR -1585224960,1585225471,RE -1585225472,1585225727,FR +1585223680,1585223935,MQ +1585223936,1585224063,RE +1585224064,1585225471,FR +1585225472,1585225727,YT 1585225728,1585227007,UA 1585227008,1585227263,RU 1585227264,1585227775,UA @@ -32661,11 +33718,9 @@ 1585231872,1585233919,CZ 1585233920,1585238015,RU 1585238016,1585240063,DE -1585240064,1585240319,FR -1585240320,1585240575,GP -1585240576,1585240831,MQ -1585240832,1585241087,FR -1585241088,1585242111,MQ +1585240064,1585241087,FR +1585241088,1585241343,GP +1585241344,1585242111,MQ 1585242112,1585244159,RU 1585244160,1585246207,FR 1585246208,1585248255,RU @@ -32740,10 +33795,7 @@ 1585393664,1585395711,DK 1585395712,1585397759,NO 1585397760,1585399807,RU -1585399808,1585400063,NL -1585400064,1585400319,IL -1585400320,1585400575,GB -1585400576,1585400831,FR +1585399808,1585400831,EU 1585400832,1585401087,DE 1585401088,1585401343,EU 1585401344,1585401599,DE @@ -32897,7 +33949,8 @@ 1587478528,1587511295,RU 1587511296,1587544063,IL 1587544064,1588068351,IT -1588068352,1588592639,GB +1588068352,1588133887,NL +1588133888,1588592639,GB 1588592640,1588593663,RO 1588593664,1588593919,MD 1588593920,1588594687,RO @@ -32907,18 +33960,33 @@ 1588609024,1588613119,MD 1588613120,1588617215,IR 1588617216,1588619775,RO -1588619776,1588620031,SG -1588620032,1588642815,RO -1588642816,1588643327,ES -1588643328,1588649983,RO +1588619776,1588620287,SG +1588620288,1588637695,RO +1588637696,1588638719,ES +1588638720,1588641535,RO +1588641536,1588641791,GB +1588641792,1588643839,ES +1588643840,1588649983,RO 1588649984,1588652031,SE -1588652032,1588659199,RO +1588652032,1588652159,NL +1588652160,1588654079,RO +1588654080,1588658175,DE +1588658176,1588659199,RO 1588659200,1588659711,NL -1588659712,1588673535,RO +1588659712,1588661247,RO +1588661248,1588661503,NL +1588661504,1588664319,RO +1588664320,1588664575,TH +1588664576,1588664831,VG +1588664832,1588673535,RO 1588673536,1588674559,MD 1588674560,1588676607,RO 1588676608,1588678655,IR -1588678656,1588689919,RO +1588678656,1588684799,RO +1588684800,1588685055,TH +1588685056,1588685311,VG +1588685312,1588689663,RO +1588689664,1588689919,RU 1588689920,1588690687,GB 1588690688,1588723711,RO 1588723712,1588854783,UA @@ -32945,20 +34013,8 @@ 1589510144,1589542911,RU 1589542912,1589575679,BG 1589575680,1589608447,RU -1589608448,1589608703,SE -1589608704,1589608959,DK -1589608960,1589609215,SE -1589609216,1589609983,DK -1589609984,1589610239,SE -1589610240,1589610495,DK -1589610496,1589611263,SE -1589611264,1589611519,DK -1589611520,1589611775,SE -1589611776,1589612031,DK -1589612032,1589620991,SE -1589620992,1589621247,DK -1589621248,1589621503,SE -1589621504,1589641215,DK +1589608448,1589622783,SE +1589622784,1589641215,DK 1589641216,1590034431,GB 1590034432,1590036479,RU 1590036480,1590038527,GB @@ -32980,7 +34036,8 @@ 1590073344,1590075391,NL 1590075392,1590077439,BE 1590077440,1590079487,GB -1590079488,1590080511,GP +1590079488,1590079743,MQ +1590079744,1590080511,GP 1590080512,1590081535,MQ 1590081536,1590083583,GB 1590083584,1590085631,RU @@ -33018,9 +34075,7 @@ 1590157312,1590161407,GB 1590161408,1590163455,DE 1590163456,1590165503,NL -1590165504,1590176643,AE -1590176644,1590176644,US -1590176645,1590689791,AE +1590165504,1590689791,AE 1590689792,1591214079,NL 1591214080,1591738367,DE 1591738368,1592000511,BE @@ -33084,7 +34139,7 @@ 1592221696,1592225791,DK 1592225792,1592242175,RU 1592242176,1592246271,UA -1592246272,1592254463,RU +1592246272,1592250367,RU 1592254464,1592258559,PL 1592258560,1592262655,NL 1592262656,1592270847,RU @@ -33114,7 +34169,9 @@ 1592459264,1592524799,TR 1592524800,1592557567,GB 1592557568,1592590335,BG -1592590336,1592623103,FI +1592590336,1592594431,FI +1592594432,1592598527,DE +1592598528,1592623103,FI 1592623104,1592655871,RU 1592655872,1592786943,FR 1592786944,1592803327,PL @@ -33127,7 +34184,9 @@ 1592901632,1592934399,RU 1592934400,1592950783,CZ 1592950784,1592967167,RU -1592967168,1592983551,LU +1592967168,1592980351,LU +1592980352,1592980479,DE +1592980480,1592983551,LU 1592983552,1592999935,RU 1592999936,1593016319,MD 1593016320,1593049087,RU @@ -33135,10 +34194,19 @@ 1593065472,1593081855,LT 1593081856,1593098239,UA 1593098240,1593114623,CH -1593114624,1593118719,SE -1593118720,1593122815,DK -1593122816,1593131007,SE -1593131008,1593136895,GB +1593114624,1593131007,SE +1593131008,1593131023,CH +1593131024,1593131519,GB +1593131520,1593131775,CH +1593131776,1593133055,GB +1593133056,1593133311,FR +1593133312,1593134335,GB +1593134336,1593134351,AT +1593134352,1593134591,GB +1593134592,1593134863,SE +1593134864,1593135615,GB +1593135616,1593135743,RU +1593135744,1593136895,GB 1593136896,1593137151,EU 1593137152,1593143295,GB 1593143296,1593143551,IE @@ -33149,7 +34217,9 @@ 1593180160,1593196543,NO 1593196544,1593203103,SE 1593203104,1593203135,FI -1593203136,1593212927,SE +1593203136,1593206783,SE +1593206784,1593207039,FI +1593207040,1593212927,SE 1593212928,1593229311,PL 1593229312,1593245695,EE 1593245696,1593247743,NL @@ -33186,7 +34256,9 @@ 1593311232,1593343999,UA 1593344000,1593376767,HU 1593376768,1593409535,JO -1593409536,1593421055,DE +1593409536,1593412095,DE +1593412096,1593412351,GB +1593412352,1593421055,DE 1593421056,1593421311,GB 1593421312,1593421567,FR 1593421568,1593421823,GB @@ -33202,7 +34274,9 @@ 1593438720,1593438847,US 1593438848,1593438863,DE 1593438864,1593438975,US -1593438976,1593442303,DE +1593438976,1593441023,DE +1593441024,1593441279,RU +1593441280,1593442303,DE 1593442304,1593475071,BA 1593475072,1593491455,HR 1593491456,1593499647,DE @@ -33231,9 +34305,18 @@ 1596456960,1596588031,PL 1596588032,1596719103,BG 1596719104,1596850175,IE -1596850176,1596866559,CZ -1596866560,1596876799,RU -1596876800,1596881919,CZ +1596850176,1596852223,CZ +1596852224,1596854271,UA +1596854272,1596858367,BY +1596858368,1596858879,CZ +1596858880,1596859391,RU +1596859392,1596862463,CZ +1596862464,1596876799,RU +1596876800,1596877055,CZ +1596877056,1596877311,RU +1596877312,1596878079,CZ +1596878080,1596878335,RU +1596878336,1596881919,CZ 1596881920,1596887295,RU 1596887296,1596887551,KZ 1596887552,1596888063,UA @@ -33244,12 +34327,14 @@ 1596890112,1596890623,RU 1596890624,1596890879,CZ 1596890880,1596900351,RU -1596900352,1596900863,CZ +1596900352,1596900607,CZ +1596900608,1596900863,RU 1596900864,1596901375,NL 1596901376,1596907519,BY 1596907520,1596909567,RU 1596909568,1596911615,KZ -1596911616,1596915711,RU +1596911616,1596911871,BY +1596911872,1596915711,RU 1596915712,1596923903,UA 1596923904,1596925951,CZ 1596925952,1596932095,RU @@ -33339,7 +34424,9 @@ 1599209472,1599242239,IR 1599242240,1599258623,CZ 1599258624,1599324159,RU -1599324160,1599340543,IE +1599324160,1599339007,IE +1599339008,1599339263,RU +1599339264,1599340543,IE 1599340544,1599356927,RU 1599356928,1599373311,BH 1599373312,1599406079,RU @@ -33384,7 +34471,9 @@ 1600978944,1601011711,SE 1601011712,1601044479,UA 1601044480,1601077247,RU -1601077248,1601110015,IT +1601077248,1601109567,IT +1601109568,1601109631,FR +1601109632,1601110015,IT 1601110016,1601142783,BG 1601142784,1601175551,UA 1601175552,1601699839,DE @@ -33456,7 +34545,6 @@ 1602349056,1602351103,RU 1602351104,1602353151,CZ 1602353152,1602355199,ES -1602355200,1602357247,GB 1602357248,1602359295,FR 1602359296,1602361343,DE 1602361344,1602363391,FI @@ -33545,8 +34633,7 @@ 1603055616,1603059711,SE 1603059712,1603063807,AM 1603063808,1603067903,BG -1603067904,1603067927,DE -1603067928,1603071999,GB +1603067904,1603071999,GB 1603072000,1603076095,CZ 1603076096,1603080191,RU 1603080192,1603080703,GB @@ -33610,7 +34697,12 @@ 1603215360,1603219455,DE 1603219456,1603223551,CH 1603223552,1603223807,FR -1603223808,1603227647,GB +1603223808,1603225087,GB +1603225088,1603225343,FR +1603225344,1603226255,GB +1603226256,1603226263,DE +1603226264,1603226271,NL +1603226272,1603227647,GB 1603227648,1603231743,AT 1603231744,1603235839,IT 1603235840,1603239935,RU @@ -33632,9 +34724,7 @@ 1603895296,1603928063,RU 1603928064,1603944447,DK 1603944448,1603977215,RU -1603977216,1603990847,GB -1603990848,1603990911,A1 -1603990912,1603993599,GB +1603977216,1603993599,GB 1603993600,1604009983,ME 1604009984,1604026367,PL 1604026368,1604042751,NL @@ -33642,7 +34732,18 @@ 1604059136,1604075519,MK 1604075520,1604091903,RU 1604091904,1604108287,BA -1604108288,1604141055,DE +1604108288,1604114431,DE +1604114432,1604115455,IR +1604115456,1604115967,DE +1604115968,1604116479,IR +1604116480,1604118783,DE +1604118784,1604120063,IR +1604120064,1604120575,DE +1604120576,1604122623,PL +1604122624,1604123135,IR +1604123136,1604123647,DE +1604123648,1604124671,IR +1604124672,1604141055,DE 1604141056,1604157439,IT 1604157440,1604190207,FR 1604190208,1604206591,UA @@ -33654,7 +34755,9 @@ 1604288512,1604304895,RU 1604304896,1604321279,SI 1604321280,1604386815,PL -1604386816,1604452351,RU +1604386816,1604444159,RU +1604444160,1604445183,KZ +1604445184,1604452351,RU 1604452352,1604517887,RO 1604517888,1604583423,RU 1604583424,1604648959,UA @@ -33698,7 +34801,9 @@ 1605108408,1605108415,IT 1605108416,1605108567,GB 1605108568,1605108575,IT -1605108576,1605109223,GB +1605108576,1605108903,GB +1605108904,1605108911,IT +1605108912,1605109223,GB 1605109224,1605109231,IT 1605109232,1605109495,GB 1605109496,1605109503,IT @@ -33714,9 +34819,7 @@ 1605111024,1605111031,IT 1605111032,1605111199,GB 1605111200,1605111207,IT -1605111208,1605111375,GB -1605111376,1605111383,IT -1605111384,1605111799,GB +1605111208,1605111799,GB 1605111800,1605111807,IT 1605111808,1605111879,GB 1605111880,1605111887,IT @@ -33724,7 +34827,9 @@ 1605111920,1605111927,IT 1605111928,1605111935,GB 1605111936,1605111943,IT -1605111944,1605112847,GB +1605111944,1605112423,GB +1605112424,1605112431,IT +1605112432,1605112847,GB 1605112848,1605112855,IT 1605112856,1605113087,GB 1605113088,1605113095,IT @@ -33733,16 +34838,16 @@ 1605113392,1605113407,GB 1605113408,1605113415,IT 1605113416,1605113567,GB -1605113568,1605113575,IT -1605113576,1605114199,GB +1605113568,1605113583,IT +1605113584,1605113815,GB +1605113816,1605113823,IT +1605113824,1605114199,GB 1605114200,1605114207,IT 1605114208,1605114287,GB 1605114288,1605114295,IT 1605114296,1605114327,GB 1605114328,1605114335,IT -1605114336,1605114871,GB -1605114872,1605114879,IT -1605114880,1605114975,GB +1605114336,1605114975,GB 1605114976,1605114983,IT 1605114984,1605115007,GB 1605115008,1605115015,IT @@ -33754,26 +34859,28 @@ 1605115712,1605115719,IT 1605115720,1605115903,GB 1605115904,1605124095,RU -1605124096,1605125263,GB -1605125264,1605125267,DE -1605125268,1605125269,EU -1605125270,1605125275,DE +1605124096,1605125119,GB +1605125120,1605125275,DE 1605125276,1605125276,GB -1605125277,1605125279,DE -1605125280,1605125903,GB +1605125277,1605125375,DE +1605125376,1605125903,GB 1605125904,1605125919,DE -1605125920,1605130239,GB +1605125920,1605126701,GB +1605126702,1605126702,US +1605126703,1605130239,GB 1605130240,1605130271,NL -1605130272,1605132287,GB +1605130272,1605131263,GB +1605131264,1605131519,DE +1605131520,1605132287,GB 1605132288,1605148671,RU 1605148672,1605156863,PT 1605156864,1605165055,JO 1605165056,1605173247,GB 1605173248,1605181439,TR 1605181440,1605189631,LT -1605189632,1605189759,CZ -1605189760,1605189887,SK -1605189888,1605197823,CZ +1605189632,1605189887,CZ +1605189888,1605190143,SK +1605190144,1605197823,CZ 1605197824,1605206015,DE 1605206016,1605214207,RU 1605214208,1605222399,TR @@ -33799,14 +34906,16 @@ 1605369856,1605402623,FR 1605402624,1605435391,SI 1605435392,1605468159,GB -1605468160,1605500927,RO +1605468160,1605500927,SA 1605500928,1605533695,PL 1605533696,1605566463,HR 1605566464,1605599231,RU 1605599232,1605631999,GR 1605632000,1605664767,RS 1605664768,1605697535,MK -1605697536,1605753855,RU +1605697536,1605753343,RU +1605753344,1605753471,US +1605753472,1605753855,RU 1605753856,1605754879,FR 1605754880,1605763071,RU 1605763072,1605769215,KZ @@ -33814,8 +34923,10 @@ 1605771264,1605795839,RU 1605795840,1605828607,BE 1605828608,1605828863,GB -1605828864,1605829375,US -1605829376,1605830399,IL +1605828864,1605829631,US +1605829632,1605829887,GB +1605829888,1605830143,US +1605830144,1605830399,IL 1605830400,1605830655,US 1605830656,1605840895,RU 1605840896,1605844991,CH @@ -33830,17 +34941,26 @@ 1607572480,1607575551,SE 1607575552,1607577599,GB 1607577600,1607581695,SE -1607581696,1607595263,DK -1607595264,1607595519,SE -1607595520,1607598079,DK -1607598080,1607598335,IT +1607581696,1607598079,DK +1607598080,1607598335,GB 1607598336,1607598591,EU -1607598592,1607601919,IT +1607598592,1607599103,GB +1607599104,1607600383,IT +1607600384,1607600639,DE +1607600640,1607600895,AT +1607600896,1607601151,CH +1607601152,1607601919,IT 1607601920,1607602175,GB 1607602176,1607606015,IT 1607606016,1607606271,FR -1607606272,1607608319,IT -1607608320,1607610367,EU +1607606272,1607606783,DE +1607606784,1607607039,GB +1607607040,1607607295,IT +1607607296,1607607551,PL +1607607552,1607608319,IT +1607608320,1607608575,HU +1607608576,1607608831,SK +1607608832,1607610367,EU 1607610368,1607612415,IE 1607612416,1607614463,EU 1607614464,1607615487,FR @@ -33851,10 +34971,13 @@ 1607621376,1607621631,EU 1607621632,1607622655,IT 1607622656,1607624703,ES -1607624704,1607625727,IT +1607624704,1607625471,IT +1607625472,1607625599,EU +1607625600,1607625727,IT 1607625728,1607626751,ES -1607626752,1607627519,EU -1607627520,1607628543,IT +1607626752,1607627519,FR +1607627520,1607627775,FI +1607627776,1607628543,IT 1607628544,1607628799,EU 1607628800,1607629567,IT 1607629568,1607634431,EU @@ -33862,7 +34985,9 @@ 1607636480,1607639039,EU 1607639040,1607640805,IT 1607640806,1607640806,CH -1607640807,1607647231,IT +1607640807,1607642388,IT +1607642389,1607642389,NL +1607642390,1607647231,IT 1607647232,1607651327,DE 1607651328,1607655423,FR 1607655424,1607663615,IT @@ -33905,14 +35030,12 @@ 1607949312,1607950335,UA 1607950336,1607952383,RU 1607952384,1607953407,UA -1607953408,1607955711,RU -1607955712,1607955967,UA -1607955968,1607956479,RU +1607953408,1607956479,RU 1607956480,1607957503,ES 1607957504,1607958527,UA 1607958528,1607959551,PS 1607959552,1607960575,EE -1607960576,1607962623,RU +1607960576,1607961599,RU 1607962624,1607963647,UA 1607963648,1607965695,RU 1607965696,1607966719,UA @@ -33954,16 +35077,20 @@ 1611016960,1611036671,US 1611036672,1611037183,NL 1611037184,1611084031,US -1611084032,1611084287,NL -1611084288,1611086335,US +1611084032,1611084543,NL +1611084544,1611086335,US 1611086336,1611086847,NL 1611086848,1611116543,US 1611116544,1611117567,NL 1611117568,1611128831,US 1611128832,1611130879,NL -1611130880,1611227135,US +1611130880,1611218943,US +1611218944,1611227135,KH 1611227136,1611235327,CA -1611235328,1611662335,US +1611235328,1611243519,SG +1611243520,1611247615,MY +1611247616,1611251711,HK +1611251712,1611662335,US 1611662336,1611662847,NL 1611662848,1611692543,US 1611692544,1611693567,NL @@ -33984,7 +35111,12 @@ 1613504512,1613529087,CA 1613529088,1613545471,US 1613545472,1613565951,CA -1613565952,1613606911,US +1613565952,1613584639,US +1613584640,1613584895,HK +1613584896,1613585407,US +1613585408,1613585663,DE +1613585664,1613585919,GB +1613585920,1613606911,US 1613606912,1613615103,CA 1613615104,1613635583,US 1613635584,1613640191,CA @@ -34030,23 +35162,19 @@ 1634467840,1634729983,CA 1634729984,1652293631,US 1652293632,1652310015,CA -1652310016,1652447743,US -1652447744,1652447999,CN -1652448000,1652461823,US -1652461824,1652462079,CN -1652462080,1652481279,US +1652310016,1652481279,US 1652481280,1652481791,CN 1652481792,1653500927,US 1653500928,1653501183,FR 1653501184,1653501439,IL -1653501440,1653501695,HK -1653501696,1653534719,US +1653501440,1653534719,US 1653534720,1653538815,CA 1653538816,1653555199,US 1653555200,1653567487,CA 1653567488,1653571583,US 1653571584,1653575679,CA -1653575680,1653592063,US +1653575680,1653579775,US +1653583872,1653592063,US 1653592064,1653596159,CA 1653596160,1653600255,US 1653600256,1653604351,CA @@ -34069,35 +35197,7 @@ 1680535552,1680539647,CA 1680539648,1680564223,US 1680564224,1680572415,CA -1680572416,1680627199,US -1680627200,1680627263,CA -1680627264,1680646399,US -1680646400,1680646655,CA -1680646656,1680646911,US -1680646912,1680647423,CA -1680647424,1680650751,US -1680650752,1680650879,CA -1680650880,1680651775,US -1680651776,1680652031,CA -1680652032,1680652351,US -1680652352,1680652543,CA -1680652544,1680734719,US -1680734720,1680734975,CA -1680734976,1680749567,US -1680749568,1680749695,CA -1680749696,1680780927,US -1680780928,1680781055,CA -1680781056,1680781439,US -1680781440,1680781567,CA -1680781568,1680798591,US -1680798592,1680798719,CA -1680798720,1680801023,US -1680801024,1680801151,CA -1680801152,1680808703,US -1680808704,1680808831,CA -1680808832,1680814399,US -1680814400,1680814463,PR -1680814464,1681915903,US +1680572416,1681915903,US 1686110208,1694498815,US 1694498816,1694499839,CN 1694499840,1694500863,ID @@ -34230,6 +35330,7 @@ 1710949376,1710950399,NP 1710950400,1711210495,CN 1711210496,1711276031,ID +1724715556,1724715556,MU 1728053248,1728120063,AU 1728120064,1728120319,SG 1728120320,1728120575,IN @@ -34239,7 +35340,9 @@ 1728123904,1728125951,CN 1728125952,1728126975,LA 1728126976,1728132095,HK -1728132096,1728135167,AU +1728132096,1728134399,AU +1728134400,1728134655,US +1728134656,1728135167,AU 1728135168,1728136191,HK 1728136192,1728137215,MY 1728137216,1728138239,CN @@ -34248,8 +35351,7 @@ 1728140288,1728141311,SG 1728141312,1728142335,CN 1728142336,1728143359,NP -1728143360,1728143615,GU -1728143616,1728144383,MP +1728143360,1728144383,MP 1728144384,1728145407,IN 1728145408,1728146431,MY 1728146432,1728147455,AU @@ -34274,6 +35376,7 @@ 1728171008,1728172031,AU 1728172032,1728173055,VN 1728173056,1728175103,AU +1728175104,1728176127,TW 1728176128,1728177151,HK 1728177152,1728178175,AU 1728178176,1728179199,LA @@ -34311,6 +35414,7 @@ 1728246784,1728254975,JP 1728254976,1728255999,MY 1728256000,1728257023,HK +1728257024,1728258047,JP 1728258048,1728259071,IN 1728259072,1728260095,KR 1728260096,1728261119,IN @@ -34327,7 +35431,8 @@ 1728286720,1728287743,AU 1728287744,1728290815,CN 1728290816,1728291839,AU -1728291840,1728292863,SG +1728291840,1728292607,US +1728292608,1728292863,SG 1728292864,1728293887,PG 1728293888,1728294911,MY 1728294912,1728295935,TH @@ -34349,6 +35454,7 @@ 1728316416,1728317439,MY 1728317440,1728319487,JP 1728319488,1728320511,AU +1728320512,1728322559,HK 1728322560,1728323583,MY 1728323584,1728324607,JP 1728324608,1728325631,SG @@ -34377,14 +35483,13 @@ 1728346624,1728347135,AU 1728347136,1728347147,SG 1728347148,1728347148,AP -1728347149,1728347391,SG -1728347392,1728347421,AU +1728347149,1728347416,SG +1728347417,1728347417,AP +1728347418,1728347421,SG 1728347422,1728347422,AP -1728347423,1728347647,AU -1728347648,1728348159,SG +1728347423,1728348159,SG 1728348160,1728349183,VN -1728349184,1728349951,AU -1728349952,1728350207,NP +1728349184,1728350207,AU 1728350208,1728351231,NZ 1728351232,1728352255,MY 1728352256,1728353279,BD @@ -34409,12 +35514,14 @@ 1728369664,1728370687,AU 1728370688,1728371711,TH 1728371712,1728372735,IN +1728372736,1728373759,CN 1728373760,1728374783,TH 1728374784,1728375039,SG 1728375040,1728375295,IN 1728375296,1728376831,AU 1728376832,1728377855,ID -1728377856,1728378879,HK +1728377856,1728378623,HK +1728378624,1728378879,US 1728378880,1728380927,IN 1728380928,1728382975,PH 1728382976,1728383999,SG @@ -34438,11 +35545,14 @@ 1728399104,1728400383,NZ 1728400384,1728400895,AU 1728400896,1728401151,IN +1728401152,1728401407,HK 1728401408,1728402431,NZ 1728402432,1728403455,IN 1728403456,1728406527,AU 1728406528,1728407551,TW +1728407552,1728407807,AU 1728407808,1728408063,MY +1728408064,1728408319,AU 1728408320,1728408575,ID 1728408576,1728409599,NZ 1728409600,1728410623,IN @@ -34458,13 +35568,16 @@ 1728419072,1728419327,HK 1728419328,1728419583,NP 1728419584,1728419839,SG +1728419840,1728420863,CN 1728420864,1728421887,NZ 1728421888,1728422911,JP 1728422912,1728423935,AU +1728423936,1728424959,CN 1728424960,1728425983,AF 1728425984,1728427007,JP 1728427008,1728428031,MY 1728428032,1728430079,IN +1728430080,1728431103,CN 1728431104,1728431615,AF 1728431616,1728431871,HK 1728431872,1728432127,SG @@ -34476,6 +35589,7 @@ 1728437248,1728438271,HK 1728438272,1728439295,NZ 1728439296,1728439807,NP +1728439808,1728440319,KH 1728440320,1728441343,BD 1728441344,1728442367,MY 1728442368,1728443391,SG @@ -34484,6 +35598,7 @@ 1728445440,1728446463,CN 1728446464,1728446975,ID 1728446976,1728447231,IN +1728447232,1728447487,AU 1728447488,1728448511,HK 1728448512,1728449535,KH 1728449536,1728450559,AU @@ -34507,11 +35622,14 @@ 1728467968,1728468735,HK 1728468736,1728469247,IN 1728469248,1728469503,NZ +1728469504,1728470015,IN 1728470016,1728471039,JP 1728471040,1728472063,PH 1728472064,1728473087,KR +1728473088,1728473343,PH 1728473344,1728473599,AU 1728473600,1728474111,SG +1728474112,1728475135,CN 1728475136,1728476159,JP 1728476160,1728476415,AU 1728476416,1728476927,ID @@ -34546,6 +35664,7 @@ 1728501504,1728502783,AU 1728502784,1728503807,CN 1728503808,1728504831,JP +1728504832,1728505855,CN 1728505856,1728506879,NL 1728506880,1728507903,MY 1728507904,1728508927,JP @@ -34583,11 +35702,12 @@ 1728538624,1728539647,AF 1728539648,1728540671,IN 1728540672,1728541695,BD -1728541696,1728543743,JP +1728541696,1728542719,JP 1728543744,1728544767,SG 1728544768,1728545791,IN 1728545792,1728546815,JP 1728546816,1728547839,AU +1728547840,1728548863,CN 1728548864,1728549119,KH 1728549120,1728549375,IN 1728549376,1728549631,PH @@ -34607,6 +35727,7 @@ 1728558080,1728559103,IN 1728559104,1728560127,ID 1728560128,1728560639,AU +1728560640,1728561151,KR 1728561152,1728562175,AU 1728562176,1728562431,VN 1728562432,1728562687,VU @@ -34623,7 +35744,6 @@ 1728574464,1728575487,KR 1728575488,1728576511,BD 1728576512,1728577535,BT -1728577536,1728578559,LA 1728578560,1728580607,CN 1728580608,1728580863,ID 1728580864,1728581119,VN @@ -34643,6 +35763,7 @@ 1728593408,1728593663,IN 1728593664,1728593919,ID 1728593920,1728594943,JP +1728594944,1728595967,CN 1728595968,1728596479,NZ 1728596480,1728598015,ID 1728598016,1728599039,NZ @@ -34654,6 +35775,7 @@ 1728606208,1728607231,PK 1728607232,1728608255,IN 1728608256,1728608511,SG +1728608512,1728608767,BD 1728608768,1728609023,ID 1728609024,1728610303,IN 1728610304,1728611327,TH @@ -34692,17 +35814,20 @@ 1728641024,1728642047,IN 1728642048,1728643071,NZ 1728643072,1728645119,VN -1728645120,1728646143,SG +1728645120,1728646143,CN 1728646144,1728647167,IN -1728647168,1728648191,AU +1728647168,1728648703,AU 1728648704,1728648959,ID 1728648960,1728649215,PK +1728649216,1728650239,CN 1728650240,1728651263,JP 1728651264,1728652287,KR 1728652288,1728653311,ID 1728653312,1728654335,NZ 1728654336,1728655359,ID +1728655360,1728655871,AU 1728655872,1728656127,SB +1728656128,1728656383,MY 1728656384,1728661503,AU 1728661504,1728662527,IN 1728662528,1728665599,VN @@ -34711,6 +35836,8 @@ 1728668672,1728669695,SG 1728669696,1728670207,BD 1728670208,1728670463,NZ +1728670464,1728670719,ID +1728670720,1728671743,CN 1728671744,1728672767,BD 1728672768,1728673791,TW 1728673792,1728674815,JP @@ -34724,13 +35851,14 @@ 1728684032,1728685055,AU 1728685056,1728686079,JP 1728686080,1728687103,AU -1728687104,1728689407,JP +1728687104,1728688127,JP +1728689152,1728689407,JP 1728689408,1728689663,BD 1728689664,1728689919,PK +1728689920,1728690175,ID 1728690176,1728691199,BD 1728691200,1728692223,KH -1728692224,1728693247,JP -1728693248,1728698367,VN +1728692224,1728698367,VN 1728698368,1728699391,NZ 1728699392,1728699903,BD 1728699904,1728700415,IN @@ -34773,6 +35901,7 @@ 1728734208,1728735231,SG 1728735232,1728736255,ID 1728736256,1728736511,HK +1728736512,1728736767,IN 1728736768,1728737023,ID 1728737024,1728737279,CN 1728737280,1728738303,JP @@ -34797,8 +35926,10 @@ 1728756736,1728757759,IN 1728757760,1728758783,JP 1728758784,1728759039,MY -1728759040,1728759295,HK -1728759296,1728759551,SG +1728759040,1728759257,HK +1728759258,1728759258,KR +1728759259,1728759295,HK +1728759296,1728759551,MY 1728759552,1728759807,HK 1728759808,1728760831,PH 1728760832,1728761855,TW @@ -34806,6 +35937,7 @@ 1728762880,1728763903,VN 1728763904,1728764927,KR 1728764928,1728765439,SG +1728765440,1728765695,IN 1728765696,1728765951,ID 1728765952,1728766975,IN 1728766976,1728767999,TH @@ -34819,7 +35951,6 @@ 1728775168,1728776191,JP 1728776192,1728777215,AU 1728777216,1728778239,TH -1728778240,1728779263,JP 1728779264,1728779519,IN 1728779776,1728780287,ID 1728780288,1728781311,KR @@ -34858,6 +35989,7 @@ 1728813056,1728814079,IN 1728814080,1728815103,JP 1728815104,1728817151,AU +1728817152,1728818175,CN 1728818176,1728819199,VN 1728819200,1728819711,ID 1728819712,1728819967,NZ @@ -34898,7 +36030,7 @@ 1728848896,1728849919,AU 1728849920,1728850943,PK 1728850944,1728851967,BD -1728851968,1728854015,JP +1728852992,1728854015,JP 1728854016,1728854527,AU 1728854528,1728854783,PK 1728854784,1728855039,AU @@ -34906,11 +36038,13 @@ 1728856064,1728857087,MY 1728857088,1728858111,CN 1728858112,1728859135,BD +1728859136,1728860159,HK 1728860160,1728860671,ID 1728860672,1728861183,BD 1728861184,1728861439,ID 1728861440,1728862207,AU 1728862208,1728863231,PH +1728863232,1728864255,CN 1728864256,1728865279,AF 1728865280,1728866303,AU 1728866304,1728867327,VN @@ -34935,11 +36069,9 @@ 1728882432,1728882687,ID 1728882688,1728883711,IN 1728883712,1728885759,BD -1728885760,1728886783,JP 1728886784,1728887807,CN 1728887808,1728888831,AU 1728888832,1728889855,IN -1728889856,1728890879,JP 1728890880,1728891903,AU 1728891904,1728892927,BD 1728892928,1728893439,BN @@ -34952,19 +36084,16 @@ 1728898048,1728899071,BD 1728899072,1728900095,CN 1728900096,1728901119,BD -1728901120,1728901375,ID -1728901376,1728901631,AU -1728901632,1728902143,ID -1728902144,1728902399,SG +1728901120,1728902143,ID 1728902400,1728902655,IN -1728902912,1728903167,BD 1728903168,1728905215,KR 1728905472,1728905727,PK 1728905728,1728906239,IN +1728906240,1728907263,MY 1728907264,1728908287,NZ +1728908288,1728909311,CN 1728909312,1728912383,JP 1728912384,1728913407,TH -1728913408,1728914431,PH 1728914432,1728915199,ID 1728915200,1728915455,NZ 1728915456,1728917503,JP @@ -34972,7 +36101,9 @@ 1728918528,1728919551,KR 1728919552,1728920575,AU 1728920576,1728921599,JP -1728921600,1728922623,AF +1728921600,1728921855,AF +1728921856,1728922111,US +1728922112,1728922623,AF 1728922624,1728923647,AU 1728924416,1728924671,MY 1728924672,1728925695,VN @@ -34981,8 +36112,7 @@ 1728928768,1728929791,JP 1728929792,1728930815,IN 1728930816,1728931839,AU -1728931840,1728932863,JP -1728932864,1728933887,IN +1728932864,1728934911,IN 1728934912,1728935935,NZ 1728935936,1728936959,MY 1728936960,1728937983,CN @@ -35003,15 +36133,14 @@ 1728951808,1728952063,SG 1728952064,1728952319,IN 1728952832,1728953343,AU -1728953344,1728954112,GB -1728954113,1728954367,HK -1728954368,1728955391,JP +1728953344,1728954367,HK 1728955392,1728956415,CN 1728956416,1728957439,ID -1728957440,1728959487,JP +1728958464,1728959487,JP 1728959488,1728960511,TH 1728960512,1728961279,AU 1728961280,1728961535,IN +1728961536,1728962559,CN 1728962560,1728963583,BD 1728963584,1728964607,TH 1728964608,1728965631,HK @@ -35027,9 +36156,7 @@ 1728973824,1728974847,JP 1728974848,1728976383,ID 1728976384,1728976895,AU -1728976896,1728977151,AF 1728977920,1728978943,MY -1728978944,1728979967,JP 1728979968,1728980991,MN 1728980992,1728982015,AU 1728982016,1728982527,ID @@ -35047,11 +36174,14 @@ 1728990336,1728990463,ID 1728990464,1728990975,KR 1728990976,1728991231,SG +1728991232,1728992255,JP 1728992256,1728993279,CN 1728993280,1728994303,PG 1728994304,1728995327,AU 1728995328,1728996095,IN 1728996096,1728996351,SG +1728996352,1728997375,CN +1728997376,1728998399,IN 1728998400,1728998655,ID 1728998656,1728998911,BD 1728998912,1728999423,ID @@ -35077,14 +36207,17 @@ 1729020160,1729020415,BD 1729020416,1729020671,PH 1729020672,1729020927,ID +1729020928,1729021951,IN 1729021952,1729022975,AU 1729022976,1729023999,BD 1729024000,1729025023,IN 1729025024,1729026047,SG 1729026048,1729027071,NZ -1729027072,1729028095,HK +1729027072,1729027327,HK +1729027328,1729027583,AU +1729027584,1729027839,JP +1729027840,1729028095,HK 1729028096,1729029119,SG -1729029120,1729029375,AU 1729029376,1729029631,ID 1729029632,1729029887,AU 1729029888,1729030143,PK @@ -35097,7 +36230,6 @@ 1729035264,1729036287,AU 1729036288,1729037311,JP 1729037312,1729039359,CN -1729039360,1729040383,JP 1729040384,1729041407,CN 1729041408,1729042687,HK 1729042688,1729042943,SG @@ -35109,8 +36241,7 @@ 1729046528,1729047551,BD 1729047552,1729048575,AU 1729048576,1729049599,VN -1729049600,1729050623,IN -1729051648,1729053695,IN +1729049600,1729053695,IN 1729053696,1729054719,JP 1729054720,1729055231,AU 1729055232,1729055487,IN @@ -35157,8 +36288,7 @@ 1729090560,1729091583,JP 1729091584,1729092607,HK 1729092608,1729094143,BD -1729094400,1729094655,IN -1729094656,1729095167,AU +1729094656,1729095679,IN 1729095680,1729096703,SG 1729096704,1729097215,AU 1729097216,1729097727,AF @@ -35166,6 +36296,7 @@ 1729098752,1729099775,BD 1729099776,1729100543,IN 1729100544,1729100799,ID +1729100800,1729101823,IN 1729101824,1729102847,VN 1729102848,1729103871,IN 1729103872,1729104895,JP @@ -35173,8 +36304,7 @@ 1729105664,1729105919,VU 1729105920,1729106943,SG 1729106944,1729107967,NZ -1729108480,1729108607,KR -1729108608,1729108991,HK +1729108480,1729108991,HK 1729108992,1729111039,IN 1729111040,1729112063,JP 1729112064,1729113087,MY @@ -35242,6 +36372,7 @@ 1729167360,1729168383,IN 1729168384,1729169407,JP 1729169408,1729170431,TW +1729170432,1729171455,HK 1729171456,1729171967,AU 1729171968,1729172223,IN 1729172224,1729172479,MY @@ -35257,7 +36388,6 @@ 1729182208,1729182463,ID 1729182464,1729182719,AU 1729182720,1729183743,AF -1729183744,1729184767,JP 1729184768,1729185791,BD 1729185792,1729186815,HK 1729186816,1729187327,ID @@ -35273,9 +36403,9 @@ 1729198080,1729199103,CN 1729199104,1729199615,MY 1729199616,1729199871,JP -1729199872,1729200127,TH 1729200128,1729201151,IN 1729201152,1729202175,AU +1729202176,1729203199,CN 1729203200,1729205247,SG 1729205248,1729206271,JP 1729206272,1729207295,AU @@ -35318,13 +36448,14 @@ 1729239040,1729240063,JP 1729240064,1729242111,ID 1729242112,1729244159,AU -1729244160,1729245183,SG 1729245184,1729247231,AU 1729247232,1729247487,NZ 1729247488,1729247743,AU 1729247744,1729248255,NZ 1729248256,1729249279,JP -1729249280,1729253375,IN +1729249280,1729252351,IN +1729252352,1729253375,ID +1729253376,1729254399,BD 1729254400,1729255423,AU 1729255424,1729257471,MY 1729257472,1729258495,ID @@ -35368,6 +36499,7 @@ 1729294848,1729295103,IN 1729295104,1729295359,PK 1729295360,1729296383,MY +1729296384,1729297407,IN 1729297408,1729298431,AU 1729299456,1729300479,NZ 1729300480,1729300991,SG @@ -35416,7 +36548,7 @@ 1729352704,1729353727,IN 1729353728,1729353983,AU 1729353984,1729354239,IN -1729354240,1729354751,AU +1729354240,1729354495,AU 1729354752,1729355775,VN 1729355776,1729356799,IN 1729356800,1729357823,ID @@ -35460,7 +36592,7 @@ 1729392640,1729393663,CN 1729393664,1729394687,KR 1729394688,1729395711,TH -1729395712,1729395967,AU +1729395712,1729395967,NR 1729395968,1729396735,IN 1729396736,1729397759,CN 1729397760,1729398783,PK @@ -35474,7 +36606,7 @@ 1729406208,1729406463,HK 1729406464,1729406975,ID 1729406976,1729407999,SG -1729408000,1729409023,JP +1729408000,1729409023,HK 1729409024,1729410047,TW 1729410048,1729411071,BD 1729411072,1729413119,ID @@ -35542,7 +36674,6 @@ 1729475584,1729476607,MY 1729476608,1729477631,IN 1729477632,1729478655,AU -1729478656,1729478911,BD 1729478912,1729479423,NZ 1729479424,1729479679,IN 1729479680,1729480703,TW @@ -35583,7 +36714,6 @@ 1729546240,1729546495,JP 1729546496,1729547263,HK 1729548288,1729549311,AU -1729549312,1729550335,JP 1729550336,1729551359,MY 1729551360,1729552383,KR 1729552384,1729553407,AU @@ -35639,6 +36769,7 @@ 1729600512,1729601535,VN 1729601536,1729603583,CN 1729603584,1729604607,HK +1729604608,1729604863,AU 1729605376,1729605631,ID 1729605632,1729606655,CN 1729606656,1729607679,ID @@ -35653,7 +36784,7 @@ 1729613824,1729614847,SG 1729614848,1729615103,NZ 1729615104,1729615359,KH -1729615360,1729615871,IN +1729615360,1729615615,IN 1729615872,1729616895,AU 1729616896,1729617919,JP 1729617920,1729618943,ID @@ -35673,7 +36804,6 @@ 1729629952,1729630207,HK 1729630208,1729631231,PH 1729631232,1729632255,IN -1729632256,1729633279,SG 1729633280,1729634303,NZ 1729634304,1729635327,KH 1729635328,1729636351,IN @@ -35760,7 +36890,6 @@ 1729723392,1729726463,IN 1729726464,1729727487,PK 1729727488,1729728511,KI -1729728512,1729729535,JP 1729729536,1729730559,CN 1729730560,1729731583,IN 1729731584,1729732607,CN @@ -35809,7 +36938,8 @@ 1729776128,1729776639,MY 1729777664,1729779711,PK 1729779712,1729780735,AU -1729780736,1729781759,HK +1729780736,1729781503,HK +1729781504,1729781759,TL 1729781760,1729782783,IN 1729782784,1729783551,ID 1729783552,1729783807,NZ @@ -35893,7 +37023,6 @@ 1729864704,1729866751,IN 1729866752,1729867775,AU 1729867776,1729869823,HK -1729869824,1729870847,JP 1729870848,1729871871,AU 1729871872,1729872895,JP 1729872896,1729873919,AU @@ -35901,7 +37030,6 @@ 1729874944,1729875455,MY 1729875456,1729875967,ID 1729875968,1729876991,CN -1729876992,1729878015,JP 1729878016,1729879039,NZ 1729879040,1729879167,AU 1729879168,1729879295,JP @@ -35958,7 +37086,8 @@ 1729918976,1729919999,BD 1729920000,1729921023,TH 1729921024,1729922047,AU -1729922048,1729922559,US +1729922048,1729922303,AF +1729922304,1729922559,US 1729922560,1729923071,AF 1729923072,1729924095,VN 1729924096,1729925119,IN @@ -35989,7 +37118,6 @@ 1729952000,1729952511,JP 1729952512,1729952767,NZ 1729952768,1729953791,IN -1729953792,1729954815,MY 1729954816,1729955839,ID 1729955840,1729956863,BD 1729956864,1729957887,HK @@ -36006,12 +37134,11 @@ 1729968128,1729969151,MY 1729969152,1729970175,LK 1729970176,1729971199,AU -1729971200,1729972223,JP +1729971200,1729972223,SG 1729972224,1729973247,HK 1729973248,1729974271,AU 1729974272,1729975295,PH 1729975296,1729976831,AU -1729976832,1729977343,NZ 1729977344,1729978367,HK 1729978368,1729979391,IN 1729979392,1729980415,AU @@ -36053,7 +37180,7 @@ 1730012160,1730013183,ID 1730013184,1730014207,IN 1730015232,1730016255,MY -1730016256,1730017279,PH +1730016256,1730017279,NZ 1730017280,1730017791,IN 1730017792,1730019327,PH 1730019328,1730020351,ID @@ -36080,14 +37207,13 @@ 1730043904,1730044927,CN 1730044928,1730046975,HK 1730046976,1730047999,KR -1730048000,1730049023,ID +1730048000,1730049023,TL 1730050048,1730050303,AU 1730050304,1730050559,SG 1730050560,1730051071,ID 1730051072,1730052095,TH 1730052096,1730054143,TW -1730054144,1730054399,US -1730054400,1730055167,AF +1730054144,1730055167,AF 1730055168,1730056191,IN 1730056192,1730057215,ID 1730057216,1730058239,CN @@ -36107,7 +37233,6 @@ 1730073600,1730073855,HK 1730074112,1730074367,AU 1730074368,1730074623,SG -1730074624,1730075647,CN 1730075648,1730076671,ID 1730077696,1730078719,CN 1730078720,1730079743,HK @@ -36173,7 +37298,62 @@ 1730147328,1730148351,JP 1730148352,1730149375,ID 1730149376,1730150399,JP -1730150400,1730412543,CN +1730150400,1730360319,CN +1730360320,1730361343,IN +1730361344,1730362367,SG +1730362368,1730363391,JP +1730363392,1730364415,VN +1730364416,1730365439,IN +1730365440,1730367487,HK +1730367488,1730368511,AU +1730368512,1730369535,HK +1730369536,1730370047,NZ +1730370048,1730370303,IN +1730370304,1730370559,JP +1730370560,1730371583,AU +1730371584,1730372607,TH +1730372608,1730373631,IN +1730373632,1730374655,CN +1730374656,1730375679,BD +1730375680,1730376191,AU +1730376192,1730376703,VU +1730376704,1730377727,CN +1730377728,1730378239,IN +1730378240,1730378495,HK +1730378496,1730378751,IN +1730378752,1730379775,HK +1730379776,1730380799,AU +1730380800,1730381823,IN +1730381824,1730382847,MY +1730382848,1730383359,ID +1730383360,1730383615,IN +1730383616,1730383871,MY +1730383872,1730385919,HK +1730385920,1730386943,AU +1730386944,1730387967,BD +1730387968,1730389503,IN +1730389504,1730390015,AF +1730390016,1730391039,BD +1730391040,1730392063,HK +1730392064,1730393087,AU +1730393088,1730394111,SG +1730394112,1730395135,HK +1730395136,1730396159,JP +1730396160,1730398207,IN +1730398208,1730399231,CN +1730399232,1730400255,TW +1730400256,1730402303,PK +1730402304,1730402559,NZ +1730402560,1730402815,IN +1730402816,1730403071,ID +1730403072,1730403327,AU +1730403328,1730404351,CN +1730404352,1730406399,AU +1730406400,1730407423,IN +1730407424,1730408447,ID +1730408448,1730410495,IN +1730410496,1730411519,SG +1730411520,1730412543,HK 1730412544,1730414591,AU 1730414592,1730415615,ID 1730415616,1730416127,AU @@ -36218,7 +37398,6 @@ 1730476800,1730477055,IN 1730477056,1730478079,AU 1730478080,1730479103,CN -1730479104,1730480127,HK 1730480128,1730480639,AU 1730480640,1730481151,JP 1730481152,1730483199,CN @@ -36252,8 +37431,6 @@ 1730521088,1730522111,ID 1730522112,1730524159,CN 1730524160,1730525183,IN -1730525184,1730526207,HK -1730526208,1730528255,JP 1730528256,1730529279,SG 1730529280,1730529791,IN 1730529792,1730530303,AU @@ -36277,8 +37454,6 @@ 1730552832,1730553855,IN 1730553856,1730555903,CN 1730555904,1730556415,IN -1730556416,1730556927,HK -1730556928,1730557951,JP 1730557952,1730558975,CN 1730558976,1730559999,MY 1730560000,1730561023,HK @@ -36318,7 +37493,6 @@ 1730592768,1730593791,MY 1730593792,1730594815,NP 1730594816,1730596863,IN -1730596864,1730597887,JP 1730597888,1730598911,PH 1730598912,1730599423,AU 1730599424,1730599935,VU @@ -36433,7 +37607,8 @@ 1730753536,1730754559,CN 1730754560,1730755071,IN 1730755072,1730755583,TH -1730755584,1730756607,JP +1730755584,1730756351,JP +1730756352,1730756607,CN 1730756608,1730757631,HK 1730757632,1730758655,SG 1730758656,1730759679,JP @@ -36528,7 +37703,7 @@ 1730858240,1730858495,ID 1730858496,1730859007,IN 1730859008,1730860031,BN -1730860032,1730861055,MY +1730860032,1730861055,HK 1730861056,1730862079,MM 1730862080,1730863103,JP 1730863104,1730864127,AU @@ -36563,9 +37738,9 @@ 1730892800,1730893823,CN 1730893824,1730895103,AU 1730895104,1730895359,BD -1730895360,1730895871,IN -1730895872,1730899455,CN -1730899456,1730899967,MO +1730895360,1730895871,NL +1730895872,1730898943,CN +1730898944,1730899967,MO 1730899968,1730900991,IN 1730900992,1730901503,AU 1730901504,1730901759,DE @@ -36735,9 +37910,14 @@ 1731165184,1731167231,IN 1731167232,1731168255,ID 1731168256,1731170559,CN -1731170560,1731171327,PK +1731170560,1731170687,HK +1731170688,1731170815,MY +1731170816,1731171071,AU +1731171072,1731171199,TH +1731171200,1731171327,MY 1731171328,1731172863,IN -1731172864,1731173375,MY +1731172864,1731173119,MY +1731173120,1731173375,SG 1731173376,1731178495,IN 1731178496,1731179519,HK 1731179520,1731180543,JP @@ -36748,7 +37928,7 @@ 1731182592,1731183615,VN 1731183616,1731184639,IN 1731184640,1731185663,CN -1731185664,1731186687,NZ +1731185664,1731186687,US 1731186688,1731187711,SG 1731187712,1731188735,CN 1731188736,1731189759,IN @@ -36949,11 +38129,12 @@ 1731426304,1731427327,BD 1731427328,1731428351,KH 1731428352,1731428607,IN -1731428608,1731428863,NZ 1731428864,1731429119,AU 1731429120,1731429375,ID 1731429376,1731431423,IN -1731431424,1731432447,TW +1731431424,1731431935,TR +1731431936,1731432191,TW +1731432192,1731432447,TR 1731432448,1731433471,HK 1731433472,1731435519,IN 1731435520,1731436031,NZ @@ -37069,7 +38250,11 @@ 1731557376,1731558399,JP 1731558400,1731564543,CN 1731564544,1731565567,NZ -1731565568,1731566079,HK +1731565568,1731565600,HK +1731565601,1731565605,JP +1731565606,1731565611,HK +1731565612,1731565613,JP +1731565614,1731566079,HK 1731566080,1731566591,PH 1731566592,1731567615,IN 1731567616,1731568639,CN @@ -37084,8 +38269,10 @@ 1731574784,1731576831,ID 1731576832,1731577087,AU 1731577088,1731577599,SG -1731577600,1731578879,AU -1731578880,1731582975,CN +1731577600,1731577855,HK +1731577856,1731578879,AU +1731578880,1731580927,CN +1731581952,1731582975,CN 1731582976,1731583999,PH 1731584000,1731585023,HK 1731585024,1731586047,VN @@ -37110,7 +38297,864 @@ 1731611648,1731614719,PK 1731614720,1731615743,JP 1731615744,1731616767,ID -1731616768,1731620863,IN +1731616768,1731620351,IN +1731620352,1731620607,MY +1731620608,1731620863,AU +1731620864,1731621887,KH +1731621888,1731625983,HK +1731625984,1731626495,AU +1731626496,1731626751,ID +1731626752,1731628543,IN +1731628544,1731628799,PH +1731628800,1731630079,IN +1731630080,1731631103,BD +1731631104,1731632127,SG +1731632128,1731633151,JP +1731633152,1731635199,CN +1731635200,1731636223,IN +1731636224,1731636479,ID +1731636480,1731637247,IN +1731637248,1731638271,HK +1731638272,1731639295,IN +1731639296,1731640319,JP +1731640320,1731641343,IN +1731641344,1731642367,HK +1731642368,1731644415,IN +1731644416,1731646463,JP +1731646464,1731647487,CN +1731647488,1731648511,ID +1731648512,1731649535,IN +1731649536,1731649791,NZ +1731649792,1731650559,ID +1731650560,1731651583,CN +1731651584,1731652607,AU +1731652608,1731653119,IN +1731653120,1731653631,AU +1731653632,1731654655,CN +1731654656,1731655679,IN +1731655680,1731657727,VN +1731657728,1731658751,TH +1731658752,1731659775,JP +1731659776,1731660031,HK +1731660032,1731660287,SG +1731660288,1731660543,MY +1731660544,1731660799,BN +1731660800,1731661823,JP +1731661824,1731662847,AU +1731662848,1731663871,HK +1731663872,1731664895,CN +1731664896,1731665919,HK +1731665920,1731666175,AU +1731666176,1731666431,ID +1731666432,1731666687,AU +1731666688,1731666943,KR +1731666944,1731667967,ID +1731667968,1731668991,IN +1731668992,1731670015,AU +1731670016,1731671039,TL +1731671040,1731671551,AU +1731671552,1731672063,TH +1731672064,1731672575,ID +1731672576,1731672831,AU +1731672832,1731673087,TH +1731673088,1731675135,IN +1731675136,1731676159,PK +1731676160,1731677183,IN +1731677184,1731678207,AU +1731678208,1731679231,CN +1731679232,1731681279,IN +1731681280,1731682303,AU +1731682304,1731686399,IN +1731686400,1731686911,HK +1731686912,1731688447,AU +1731688448,1731689471,CN +1731689472,1731690495,SG +1731690496,1731691519,HK +1731691520,1731691775,AU +1731691776,1731692031,PK +1731692032,1731692543,AU +1731692544,1731693055,PK +1731693056,1731693311,SG +1731693312,1731693567,ID +1731693568,1731694591,TH +1731694592,1731695615,BD +1731695616,1731696639,AU +1731696640,1731697663,CN +1731697664,1731698687,JP +1731698688,1731698943,ID +1731698944,1731699199,PH +1731699200,1731699711,AU +1731699712,1731701759,IN +1731701760,1731702783,CN +1731702784,1731703295,AU +1731703296,1731703551,AF +1731703552,1731703807,NZ +1731703808,1731705855,IN +1731705856,1731706879,KR +1731706880,1731708927,JP +1731708928,1731709951,HK +1731709952,1731711999,CN +1731712000,1731712255,AU +1731712256,1731713023,IN +1731713024,1731713279,ID +1731713280,1731713535,AU +1731713536,1731713791,HK +1731713792,1731714047,AU +1731714048,1731715071,ID +1731715072,1731716095,AU +1731716096,1731717119,CN +1731717120,1731718143,AU +1731718144,1731720191,CN +1731720192,1731723263,IN +1731723264,1731724287,AU +1731724288,1731725311,BD +1731725312,1731726335,CN +1731726336,1731727359,AU +1731727360,1731729407,CN +1731729408,1731730431,HK +1731730432,1731731199,IN +1731731200,1731731455,AU +1731731456,1731732479,CN +1731732480,1731734527,IN +1731734528,1731735551,HK +1731735552,1731736575,JP +1731736576,1731737599,HK +1731737600,1731739647,CN +1731739648,1731741183,IN +1731741184,1731741439,ID +1731741440,1731741695,AU +1731741696,1731743743,CN +1731743744,1731744767,JP +1731744768,1731747839,IN +1731747840,1731748863,JP +1731748864,1731750911,CN +1731750912,1731751935,JP +1731751936,1731753983,HK +1731753984,1731755007,IN +1731755008,1731756031,SG +1731756032,1731757055,PH +1731757056,1731758079,JP +1731758080,1731759103,HK +1731759104,1731760127,CN +1731760128,1731761663,ID +1731761664,1731762175,AU +1731762176,1731763199,CN +1731763200,1731767295,VN +1731767296,1731767807,IN +1731767808,1731768063,KH +1731768064,1731770367,IN +1731770368,1731771391,CN +1731771392,1731772415,ID +1731772416,1731773439,HK +1731773440,1731774463,IN +1731774464,1731775487,CN +1731775488,1731776511,ID +1731776512,1731777023,BD +1731777024,1731777535,IN +1731777536,1731778559,JP +1731778560,1731779071,HK +1731779072,1731779583,JP +1731779584,1731782655,IN +1731782656,1731783679,ID +1731783680,1731788799,IN +1731788800,1731789823,AU +1731789824,1731790847,JP +1731790848,1731791871,ID +1731791872,1731792895,CN +1731792896,1731793919,IN +1731793920,1731794943,BD +1731794944,1731795967,HK +1731795968,1731796991,JP +1731796992,1731798015,AU +1731798016,1731799039,ID +1731799040,1731800063,BD +1731800064,1731802111,JP +1731802112,1731804159,CN +1731804160,1731805183,KR +1731805184,1731806207,IN +1731806208,1731806463,AU +1731806464,1731807231,IN +1731807232,1731808255,SG +1731808256,1731809279,CN +1731809280,1731811583,IN +1731811584,1731811839,AU +1731811840,1731812095,HK +1731812096,1731812351,AU +1731812352,1731813375,MN +1731813376,1731815423,JP +1731815424,1731816447,VN +1731816448,1731817471,CN +1731817472,1731818495,VN +1731818496,1731820543,BD +1731820544,1731821567,IN +1731821568,1731822591,JP +1731822592,1731823615,IN +1731823616,1731824639,CN +1731824640,1731825663,IN +1731825664,1731826687,JP +1731826688,1731827199,AU +1731827200,1731827455,IN +1731827456,1731827711,BD +1731827712,1731828735,PK +1731828736,1731829759,SG +1731829760,1731830783,IN +1731830784,1731831039,SG +1731831040,1731831807,AU +1731831808,1731832831,PK +1731832832,1731836927,IN +1731836928,1731837951,MY +1731837952,1731838975,ID +1731838976,1731839999,CN +1731840000,1731841023,HK +1731841024,1731842047,NP +1731842048,1731843071,VN +1731843072,1731845119,IN +1731845120,1731846143,VN +1731846144,1731846655,HK +1731846656,1731846911,IN +1731846912,1731847167,PH +1731847168,1731848191,HK +1731848192,1731849215,MP +1731849216,1731858431,IN +1731858432,1731859455,MY +1731859456,1731860479,FJ +1731860480,1731861503,CN +1731861504,1731862527,IN +1731862528,1731862783,AU +1731862784,1731863039,ID +1731863040,1731863551,AU +1731863552,1731871743,IN +1731871744,1731872767,JP +1731872768,1731873791,BD +1731873792,1731877887,IN +1731877888,1731878911,BD +1731878912,1731879935,IN +1731879936,1731881983,ID +1731881984,1731882495,BD +1731882496,1731882751,SG +1731882752,1731883007,ID +1731883008,1731883263,SG +1731883264,1731883519,MY +1731883520,1731891199,IN +1731891200,1731891711,NP +1731891712,1731892223,ID +1731892224,1731893247,TH +1731893248,1731895295,IN +1731895296,1731896319,ID +1731896320,1731899391,IN +1731899392,1731900415,HK +1731900416,1731900671,IN +1731900672,1731900927,HK +1731900928,1731901439,CN +1731901440,1731903487,IN +1731903488,1731905535,AU +1731905536,1731908607,IN +1731908608,1731911679,AU +1731911680,1731912703,KH +1731912704,1731913727,NZ +1731913728,1731913983,AU +1731913984,1731928063,IN +1731928064,1731929087,JP +1731929088,1731930111,BD +1731930112,1731933183,HK +1731933184,1731934207,LA +1731934208,1731939327,IN +1731939328,1731940351,CN +1731940352,1731942655,IN +1731942656,1731942911,JP +1731942912,1731943423,HK +1731943424,1731944447,KR +1731944448,1731945471,IN +1731945472,1731946495,CN +1731946496,1731947519,IN +1731947520,1731948543,AU +1731948544,1731953663,CN +1731953664,1731954687,IN +1731954688,1731955711,JP +1731956736,1731957759,HK +1731957760,1731958783,CN +1731958784,1731959807,IN +1731959808,1731960831,KR +1731960832,1731961855,AU +1731961856,1731962879,CN +1731962880,1731963903,BD +1731963904,1731964927,KH +1731964928,1731965951,BD +1731965952,1731966463,IN +1731966464,1731966975,AU +1731966976,1731975167,IN +1731975168,1731976191,CN +1731976192,1731977215,TW +1731977216,1731979519,IN +1731979520,1731979775,BD +1731979776,1731980287,ID +1731980288,1731986431,IN +1731986432,1731987455,JP +1731987456,1731988479,SG +1731988480,1731989503,JP +1731989504,1731990527,VN +1731990528,1731990783,AU +1731990784,1731991039,IN +1731991040,1731991551,AU +1731991552,1731992575,MY +1731992576,1731993599,IN +1731993600,1731994623,CN +1731994624,1731995647,JP +1731995648,1731996671,IN +1731996672,1731997695,CN +1731997696,1731999743,IN +1731999744,1732002815,HK +1732002816,1732007935,IN +1732007936,1732009983,JP +1732009984,1732010239,AU +1732010240,1732010495,MN +1732010496,1732010751,AU +1732010752,1732011007,NZ +1732011008,1732012287,IN +1732012288,1732013055,AU +1732013056,1732014079,HK +1732014080,1732016127,IN +1732016128,1732018175,KR +1732018176,1732019199,IN +1732019200,1732019967,AU +1732019968,1732022271,IN +1732022272,1732024319,HK +1732024320,1732025343,AU +1732025344,1732026367,IN +1732026368,1732027391,BD +1732027392,1732028415,CN +1732028416,1732029439,PH +1732029440,1732030463,BD +1732030464,1732031487,IN +1732031488,1732032511,ID +1732032512,1732032767,PH +1732032768,1732033023,TH +1732033024,1732033535,IN +1732033536,1732034559,JP +1732034560,1732035583,NZ +1732035584,1732036607,IN +1732036608,1732037631,AU +1732037632,1732038655,JP +1732038656,1732040703,IN +1732040704,1732040959,AU +1732040960,1732041215,SG +1732041216,1732041727,IN +1732041728,1732042751,HK +1732042752,1732043775,JP +1732043776,1732044799,CN +1732044800,1732045823,HK +1732045824,1732046847,CN +1732046848,1732047871,AU +1732047872,1732048895,IN +1732048896,1732049919,HK +1732049920,1732050943,PH +1732050944,1732051967,HK +1732051968,1732052991,SG +1732052992,1732054015,MM +1732054016,1732055039,IN +1732055040,1732056063,ID +1732056064,1732057087,HK +1732057088,1732058111,KH +1732058112,1732059135,HK +1732059136,1732060159,IN +1732060160,1732061183,HK +1732061184,1732061439,AU +1732061440,1732061695,ID +1732061696,1732062207,AU +1732062208,1732064255,VN +1732064256,1732066303,IN +1732066304,1732067327,CN +1732067328,1732068607,IN +1732068608,1732068863,NZ +1732068864,1732069119,AU +1732069120,1732069375,ID +1732069376,1732074495,IN +1732074496,1732075519,KH +1732075520,1732076543,AU +1732076544,1732077567,IN +1732077568,1732078591,CN +1732078592,1732080639,IN +1732080640,1732081663,ID +1732081664,1732082687,HK +1732082688,1732083711,MY +1732083712,1732084735,AU +1732084736,1732085759,IN +1732085760,1732086783,TW +1732086784,1732087807,CN +1732087808,1732088831,HK +1732088832,1732089599,IN +1732089600,1732089855,JP +1732089856,1732092927,CN +1732092928,1732093951,IN +1732093952,1732094975,HK +1732094976,1732097023,CN +1732097024,1732098047,IN +1732098048,1732100095,CN +1732100096,1732100607,SG +1732100608,1732107263,IN +1732107264,1732108287,HK +1732108288,1732109823,AU +1732109824,1732110335,IN +1732110336,1732111359,JP +1732111360,1732113407,HK +1732113408,1732114431,JP +1732114432,1732115455,ID +1732115456,1732116479,IN +1732116480,1732117503,PH +1732117504,1732118527,SG +1732118528,1732119551,VN +1732119552,1732122623,IN +1732122624,1732123647,CN +1732123648,1732124159,AU +1732124160,1732124671,PH +1732124672,1732126719,AU +1732126720,1732127743,IN +1732127744,1732128767,HK +1732128768,1732129023,SG +1732129024,1732129279,NZ +1732129280,1732129535,AU +1732129536,1732129791,HK +1732129792,1732130815,CN +1732130816,1732134911,IN +1732134912,1732140031,CN +1732140032,1732141055,IN +1732141056,1732151295,CN +1732151296,1732152319,IN +1732152320,1732153855,BD +1732153856,1732154367,IN +1732154368,1732155391,HK +1732155392,1732156415,PH +1732156416,1732166655,CN +1732166656,1732167167,ID +1732167168,1732167679,IN +1732167680,1732168191,AU +1732168192,1732168703,ID +1732168704,1732174847,CN +1732174848,1732175871,KR +1732175872,1732176895,PK +1732176896,1732177919,IN +1732177920,1732178943,SG +1732178944,1732179967,JP +1732179968,1732182015,IN +1732182016,1732184063,HK +1732184064,1732188671,IN +1732188672,1732188927,AU +1732188928,1732189183,WS +1732189184,1732190207,IN +1732190208,1732205567,CN +1732205568,1732206591,NZ +1732206592,1732207615,ID +1732207616,1732207871,AU +1732207872,1732208127,IN +1732208128,1732208383,PH +1732208384,1732208639,AU +1732208640,1732213759,VN +1732213760,1732215807,IN +1732215808,1732217855,HK +1732217856,1732219903,CN +1732219904,1732220927,IN +1732220928,1732221951,CN +1732221952,1732222975,BD +1732222976,1732230143,CN +1732230144,1732230399,LA +1732230400,1732230655,AU +1732230656,1732230911,KH +1732230912,1732231167,AU +1732231168,1732236287,CN +1732236288,1732237311,VN +1732237312,1732240383,JP +1732240384,1732241407,AU +1732241408,1732241663,IN +1732241664,1732241919,ID +1732241920,1732242431,BD +1732242432,1732243455,HK +1732243456,1732247551,CN +1740636160,1740644351,CN +1740644352,1740645375,IN +1740645376,1740647423,HK +1740647424,1740648447,MO +1740648448,1740651519,CN +1740651520,1740653567,IN +1740653568,1740654591,JP +1740654592,1740655615,IN +1740655616,1740656639,NP +1740656640,1740656895,NZ +1740656896,1740657151,AF +1740657152,1740657663,AU +1740657664,1740665855,CN +1740665856,1740666879,IN +1740666880,1740667903,JP +1740667904,1740668927,PH +1740668928,1740674047,CN +1740674048,1740675071,JP +1740675072,1740676095,AU +1740676096,1740677119,BD +1740677120,1740678143,HK +1740678144,1740679167,CN +1740679168,1740680447,IN +1740680448,1740680703,AU +1740680704,1740680959,MM +1740680960,1740681215,AU +1740681216,1740682239,HK +1740682240,1740683263,KH +1740683264,1740684287,PH +1740684288,1740685311,CN +1740685312,1740686591,AU +1740686592,1740686847,NZ +1740686848,1740687359,IN +1740687360,1740688383,HK +1740688384,1740689407,IN +1740689408,1740692479,CN +1740692480,1740693503,IN +1740693504,1740694527,HK +1740694528,1740696575,JP +1740696576,1740697599,VN +1740697600,1740698623,NZ +1740698624,1740700671,IN +1740700672,1740701695,CN +1740701696,1740702719,IN +1740702720,1740703743,MX +1740703744,1740704255,NZ +1740704256,1740704767,AU +1740704768,1740705791,JP +1740705792,1740706047,NZ +1740706048,1740706303,AU +1740706304,1740706559,PK +1740706560,1740706815,ID +1740706816,1740709887,IN +1740709888,1740710911,HK +1740710912,1740711423,IN +1740711424,1740711935,NZ +1740711936,1740713983,CN +1740713984,1740719103,IN +1740719104,1740720127,HK +1740720128,1740721151,JP +1740721152,1740721407,AU +1740721408,1740721663,IN +1740721664,1740721919,AU +1740721920,1740722175,IN +1740722176,1740723199,AU +1740723200,1740731391,IN +1740731392,1740732415,ID +1740732416,1740734463,CN +1740734464,1740736511,HK +1740736512,1740737535,NZ +1740737536,1740740607,CN +1740740608,1740742655,IN +1740742656,1740743679,CN +1740743680,1740743935,NZ +1740743936,1740744191,PH +1740744192,1740744703,AU +1740744704,1740745727,BD +1740745728,1740746751,HK +1740746752,1740747775,JP +1740747776,1740748799,KH +1740748800,1740749823,JP +1740749824,1740751871,CN +1740751872,1740753919,IN +1740753920,1740754943,KH +1740754944,1740755967,AU +1740755968,1740764159,CN +1740764160,1740766207,HK +1740766208,1740767231,IN +1740767232,1740769279,AU +1740769280,1740771327,IN +1740771328,1740772351,CN +1740772352,1740776447,IN +1740776448,1740777471,HK +1740777472,1740777983,JP +1740777984,1740778239,KR +1740778240,1740778495,HK +1740778496,1740779519,IN +1740779520,1740780543,AU +1740780544,1740784639,IN +1740784640,1740784895,AU +1740784896,1740785663,IN +1740785664,1740786687,JP +1740786688,1740787711,SG +1740787712,1740788735,MY +1740788736,1740789759,KH +1740789760,1740790783,IN +1740791808,1740792831,IN +1740792832,1740794879,HK +1740794880,1740795903,KR +1740795904,1740796415,NZ +1740796416,1740798207,IN +1740798208,1740798463,AU +1740798464,1740798975,IN +1740798976,1740799999,AU +1740800000,1740800511,IN +1740800512,1740800767,ID +1740800768,1740805119,IN +1740805120,1740806143,HK +1740806144,1740809215,IN +1740809216,1740810239,JP +1740810240,1740811263,NL +1740811264,1740812287,ID +1740812288,1740813311,MN +1740813312,1740814335,IN +1740815360,1740816383,VN +1740816384,1740821503,IN +1740821504,1740822015,HK +1740822016,1740822527,AU +1740822528,1740825599,IN +1740825600,1740825855,SG +1740825856,1740826111,AU +1740826112,1740826623,CN +1740826624,1740827647,IN +1740827648,1740828671,HK +1740828672,1740829695,IN +1740829696,1740830719,HK +1740830720,1740831743,IN +1740831744,1740832767,KR +1740832768,1740833791,BD +1740833792,1740834815,HK +1740834816,1740835839,NZ +1740835840,1740836863,AU +1740836864,1740837119,IN +1740837120,1740837375,AU +1740837376,1740837887,ID +1740837888,1740838911,MY +1740838912,1740839935,IN +1740839936,1740840191,SG +1740840192,1740840959,ID +1740840960,1740841983,SG +1740841984,1740845055,IN +1740845056,1740846079,HK +1740846080,1740846591,AU +1740846592,1740847103,BD +1740847104,1740848127,ID +1740848128,1740849407,AU +1740849408,1740849663,ID +1740849664,1740850175,AU +1740850176,1740855295,IN +1740855296,1740856319,ID +1740856320,1740858367,IN +1740858368,1740859391,SG +1740859392,1740860415,CN +1740860416,1740861439,HK +1740861440,1740862463,CN +1740862464,1740863487,HK +1740863488,1740865535,IN +1740865536,1740866559,AU +1740866560,1740867583,HK +1740867584,1740868607,CN +1740868608,1740869119,BD +1740869120,1740869375,ID +1740869376,1740869631,MY +1740869632,1740870655,JP +1740870656,1740872703,CN +1740872704,1740873727,ID +1740873728,1740874751,CN +1740874752,1740876287,ID +1740876288,1740876799,AU +1740876800,1740880895,IN +1740880896,1740881919,SG +1740881920,1740882943,CN +1740882944,1740884991,IN +1740884992,1740885503,BD +1740885504,1740886015,AU +1740886016,1740893183,IN +1740893184,1740895231,VN +1740895232,1740901375,IN +1740901376,1740901887,TH +1740901888,1740902143,ID +1740902144,1740902399,IN +1740902400,1740903423,VN +1740903424,1740904447,HK +1740904448,1740904959,NZ +1740904960,1740907519,IN +1740907520,1740908543,US +1740908544,1740909055,PK +1740909056,1740910591,ID +1740910592,1740911615,CN +1740911616,1740912639,IN +1740912640,1740913663,PH +1740913664,1740915711,CN +1740915712,1740916735,AU +1740916736,1740917759,CN +1740917760,1740918783,IN +1740918784,1740920319,AU +1740920320,1740920831,HK +1740920832,1740923903,CN +1740923904,1740924927,HK +1740924928,1740925951,PH +1740925952,1740926463,NZ +1740926464,1740926719,IN +1740926720,1740926975,AU +1740926976,1740927999,SG +1740928000,1740928255,ID +1740928256,1740928511,IN +1740928512,1740929023,AU +1740929024,1740931071,HK +1740931072,1740932095,PH +1740932096,1740933119,IN +1740933120,1740934143,PH +1740934144,1740935167,AU +1740935168,1740936191,IN +1740936192,1740937215,AU +1740937216,1740938239,HK +1740938240,1740938495,AU +1740938496,1740938751,IN +1740938752,1740939263,TH +1740939264,1740940287,PK +1740940288,1740941311,JP +1740941312,1740942335,CN +1740942336,1740943359,TW +1740944384,1740945407,US +1740945408,1740946431,CN +1740946432,1740947967,IN +1740947968,1740948223,AU +1740948224,1740948479,MY +1740948480,1740950527,IN +1740950528,1740951551,CN +1740951552,1740957695,IN +1740957696,1740958719,BD +1740958720,1740959743,VN +1740959744,1740960255,NL +1740960256,1740960767,IN +1740960768,1740962815,VN +1740962816,1740964863,SG +1740964864,1740965887,HK +1740965888,1740966911,IN +1740966912,1740967935,JP +1740967936,1740968959,IN +1740968960,1740969983,MY +1740969984,1740971007,HK +1740971008,1740975103,IN +1740975104,1740976127,PK +1740976128,1740976639,BD +1740976640,1740976895,SG +1740976896,1740977151,IN +1740977152,1740978175,NZ +1740978176,1740979199,MY +1740979200,1740980223,NZ +1740980224,1740981247,AU +1740981248,1740982271,HK +1740982272,1740985343,IN +1740985344,1740986367,PH +1740986368,1740986623,AU +1740986624,1740986879,ID +1740986880,1740987391,IN +1740987392,1740988415,ID +1740988416,1740989439,SG +1740989440,1740990463,IN +1740990464,1740991487,KH +1740991488,1741000703,IN +1741000704,1741001727,AU +1741001728,1741002751,HK +1741002752,1741003775,BD +1741003776,1741004799,HK +1741004800,1741005823,AU +1741005824,1741006847,MV +1741006848,1741007871,HK +1741007872,1741008895,TW +1741008896,1741009919,BT +1741009920,1741010943,CN +1741010944,1741011455,IN +1741011456,1741011967,AU +1741011968,1741012991,ID +1741012992,1741014015,HK +1741014016,1741015039,MM +1741015040,1741016063,PH +1741016064,1741017087,BD +1741017088,1741018111,JP +1741018112,1741019135,AU +1741019136,1741020159,HK +1741020160,1741022207,IN +1741022208,1741023231,CN +1741023232,1741025279,AU +1741025280,1741026303,IN +1741026304,1741027327,TH +1741027328,1741028351,BD +1741028352,1741029375,CN +1741029376,1741029631,SG +1741029632,1741029887,HK +1741029888,1741030399,BD +1741030400,1741031423,JP +1741031424,1741031935,NP +1741031936,1741032447,IN +1741032448,1741033471,JP +1741033472,1741033983,MY +1741033984,1741034495,HK +1741034496,1741035519,CN +1741035520,1741036031,AU +1741036544,1741037567,IN +1741037568,1741038079,AU +1741038080,1741038591,IN +1741038592,1741039615,JP +1741039616,1741040639,AU +1741040640,1741042687,HK +1741042688,1741043199,MY +1741043200,1741043711,AU +1741043712,1741044735,HK +1741044736,1741046783,CN +1741046784,1741047807,MY +1741047808,1741048831,CN +1741048832,1741049855,SG +1741049856,1741050367,IN +1741050368,1741050623,HK +1741050624,1741050879,IN +1741050880,1741051903,MY +1741051904,1741052927,PH +1741052928,1741053183,AU +1741053184,1741053439,ID +1741053440,1741055999,IN +1741056000,1741056511,NZ +1741056512,1741057023,AU +1741057024,1741058047,JP +1741058048,1741058559,AU +1741058560,1741061119,ID +1741061120,1741062143,CN +1741062144,1741062655,IN +1741062656,1741062911,AU +1741062912,1741063167,ID +1741063168,1741065215,BD +1741065216,1741067263,SG +1741067264,1741068287,MM +1741068288,1741069311,TH +1741069312,1741070335,CN +1741070336,1741071359,JP +1741071360,1741072383,IN +1741072384,1741073407,BD +1741073408,1741074431,IN +1741074432,1741075455,TL +1741075456,1741076479,CN +1741076480,1741077247,NZ +1741077248,1741077503,IN +1741077504,1741079551,HK +1741079552,1741081599,CN +1741081600,1741082623,HK +1741082624,1741084671,JP +1741084672,1741092863,CN +1741092864,1741093887,HK +1741093888,1741094911,BD +1741094912,1741095423,NZ +1741095424,1741095935,ID +1741095936,1741115391,VN +1741115392,1741115647,AU +1741115648,1741115903,NZ +1741115904,1741116415,AU +1741116416,1741117439,BD +1741117440,1741119487,IN +1741119488,1741119743,AU +1741119744,1741120511,IN +1741120512,1741122559,HK +1741122560,1741123583,BD +1741123584,1741125119,IN +1741125120,1741125375,ID +1741125376,1741125631,AU +1741125632,1741128703,IN +1741128704,1741129727,JP +1741129728,1741130751,IN +1741130752,1741131775,JP +1741131776,1741132799,IN +1741132800,1741133823,HK +1741133824,1741134847,BD +1741134848,1741136895,IN +1741136896,1741137919,CN +1741137920,1741138431,BD +1741138944,1741139967,IN 1742734336,1742735359,IN 1742735360,1742736383,JP 1742736384,1742737407,PK @@ -37133,7 +39177,7 @@ 1742750720,1742751743,IN 1742751744,1742752767,HK 1742752768,1742753791,NZ -1742753792,1742754815,CN +1742753792,1742754815,HK 1742754816,1742756863,AU 1742756864,1742757887,JP 1742757888,1742758911,BN @@ -37199,9 +39243,8 @@ 1742823680,1742823935,IN 1742823936,1742824191,ID 1742824192,1742826495,IN -1742826496,1742827519,JP 1742827520,1742828543,IN -1742828544,1742830591,JP +1742829568,1742830591,JP 1742830592,1742833663,IN 1742833664,1742834687,PH 1742834688,1742835711,AU @@ -37299,9 +39342,7 @@ 1742927872,1742928895,VN 1742928896,1742929919,NZ 1742929920,1742930175,IN -1742930176,1742930431,MY 1742930432,1742930943,PH -1742930944,1742931967,KH 1742931968,1742932991,JP 1742932992,1742933503,SG 1742933504,1742933759,ID @@ -37338,12 +39379,10 @@ 1742972928,1742973439,AU 1742973440,1742973951,NZ 1742973952,1742975999,SG -1742976000,1742977023,JP -1742977024,1742978047,HK 1742978048,1742979071,JP 1742979072,1742980095,HK 1742980096,1742981119,CN -1742981120,1742982143,NZ +1742981120,1742982143,AU 1742982144,1742983167,CN 1742983168,1742984191,IN 1742984192,1742985215,CN @@ -37361,7 +39400,6 @@ 1742994432,1742995455,ID 1742995456,1742996479,BD 1742996480,1742997503,TH -1742997504,1742998527,JP 1742998528,1742999551,CN 1742999552,1742999807,AU 1742999808,1743000063,ID @@ -37380,27 +39418,22 @@ 1743015936,1743016447,ID 1743016448,1743016703,HK 1743016704,1743016959,IN -1743016960,1743017983,KH 1743017984,1743019007,CN 1743019008,1743021055,HK 1743021056,1743021311,SG 1743021312,1743021567,NZ 1743021568,1743021823,PH 1743021824,1743022079,IN -1743022080,1743023103,AU 1743023104,1743024127,HK 1743024128,1743025151,IN 1743025152,1743026175,ID 1743026176,1743027199,BD 1743027200,1743028223,AU 1743028224,1743029247,CN -1743029248,1743029503,AU -1743030272,1743031295,HK 1743031296,1743035391,IN 1743035392,1743036415,PK 1743036416,1743037439,CN 1743037440,1743038463,AU -1743038464,1743039487,JP 1743039488,1743040511,IN 1743040512,1743041535,CN 1743041536,1743042559,HK @@ -37414,7 +39447,6 @@ 1743049728,1743050751,AU 1743050752,1743051775,TW 1743051776,1743052799,IN -1743052800,1743053823,JP 1743053824,1743055871,CN 1743055872,1743059199,ID 1743059200,1743059967,IN @@ -37439,9 +39471,7 @@ 1743074048,1743074303,IN 1743074304,1743075327,HK 1743075328,1743076351,MY -1743076352,1743077375,JP 1743077376,1743078399,IN -1743078400,1743079423,JP 1743079424,1743080959,ID 1743080960,1743081471,IN 1743081472,1743083519,BD @@ -37465,7 +39495,6 @@ 1743095808,1743096831,CN 1743096832,1743098879,HK 1743098880,1743099903,CN -1743099904,1743100927,KH 1743100928,1743101951,KR 1743101952,1743103999,ID 1743104000,1743105023,IN @@ -37496,7 +39525,6 @@ 1743126528,1743127551,CN 1743127552,1743128575,BD 1743128576,1743129599,JP -1743129600,1743131647,HK 1743131648,1743132671,IN 1743132672,1743133695,JP 1743133696,1743134719,CN @@ -37511,7 +39539,6 @@ 1743140864,1743141887,MY 1743141888,1743142911,BD 1743142912,1743143935,BN -1743143936,1743144959,HK 1743144960,1743145983,AU 1743145984,1743147007,NZ 1743147008,1743147263,AU @@ -37526,24 +39553,21 @@ 1743153152,1743154175,BD 1743154176,1743155199,HK 1743155200,1743156223,KR -1743156224,1743157247,KH 1743157248,1743158271,HK -1743158272,1743160319,JP +1743159296,1743160319,JP 1743160320,1743161343,TH -1743161344,1743163391,HK +1743161344,1743162367,HK 1743163392,1743166463,IN 1743166464,1743167487,AU 1743167488,1743168511,HK 1743169024,1743169535,IN 1743169536,1743170559,JP -1743170560,1743171583,KR 1743171584,1743172607,AU 1743172608,1743173631,BD 1743173632,1743174655,AU 1743174656,1743175679,ID 1743175680,1743176703,HK 1743176704,1743179775,CN -1743179776,1743180799,JP 1743180800,1743181823,CN 1743181824,1743182847,HK 1743182848,1743184895,IN @@ -37565,7 +39589,6 @@ 1743201280,1743202303,PH 1743202304,1743204351,IN 1743204352,1743205375,TW -1743205376,1743206399,JP 1743206400,1743207423,HK 1743207424,1743208447,KH 1743208448,1743210495,CN @@ -37587,8 +39610,7 @@ 1743225856,1743226367,IN 1743226368,1743226623,PH 1743226624,1743226879,BD -1743226880,1743227647,AF -1743227648,1743227903,IR +1743226880,1743227903,AF 1743227904,1743228927,HK 1743228928,1743229951,CN 1743229952,1743230975,VN @@ -37620,8 +39642,9 @@ 1743256576,1743258623,HK 1743258624,1743259647,CN 1743259648,1743260671,IN -1743260672,1743261695,JP -1743261696,1743262719,HK +1743260672,1743261703,JP +1743261704,1743261711,PH +1743261712,1743262719,HK 1743262720,1743264767,IN 1743264768,1743265279,MY 1743265280,1743265535,ID @@ -37635,12 +39658,10 @@ 1743273984,1743275007,ID 1743275008,1743276031,HK 1743276032,1743277055,JP -1743277056,1743278079,PH 1743278080,1743279103,LA 1743279104,1743281151,HK 1743281152,1743283199,AU 1743283200,1743284223,BD -1743284224,1743285247,JP 1743285248,1743286271,NZ 1743286272,1743287295,IN 1743287296,1743288319,AU @@ -37649,18 +39670,15 @@ 1743291392,1743292415,AU 1743292416,1743293439,IN 1743293440,1743293951,AU -1743293952,1743294463,PG 1743294464,1743295487,CN 1743295488,1743296511,IN 1743296512,1743297535,NP 1743297536,1743298303,NZ 1743298304,1743299583,AU -1743299584,1743300607,KH 1743300608,1743301631,AU 1743301632,1743303679,IN 1743303680,1743304703,NZ 1743304704,1743305727,IN -1743305728,1743306751,JP 1743306752,1743307775,KH 1743307776,1743308799,AU 1743308800,1743309823,JP @@ -37679,7 +39697,6 @@ 1743319296,1743319551,IN 1743319552,1743320063,ID 1743320064,1743321087,IN -1743321088,1743322111,JP 1743322112,1743323135,AU 1743323136,1743324159,MY 1743324160,1743325183,CN @@ -37689,7 +39706,6 @@ 1743329280,1743330303,IN 1743330304,1743331327,AU 1743331328,1743333375,PH -1743333376,1743334399,JP 1743334400,1743335423,CN 1743335424,1743336447,VN 1743336448,1743337471,CN @@ -37717,7 +39733,7 @@ 1743355904,1743356927,CN 1743356928,1743357951,NZ 1743357952,1743358975,CN -1743358976,1743359487,AF +1743358976,1743359231,AF 1743359488,1743361023,ID 1743361024,1743362047,AU 1743362048,1743364095,ID @@ -37732,10 +39748,9 @@ 1743370240,1743371263,HK 1743371264,1743372287,MO 1743372288,1743373311,TH -1743373312,1743375359,JP +1743373312,1743374335,JP 1743375360,1743376383,MM 1743376384,1743377407,AU -1743377408,1743378431,JP 1743378432,1743379455,IN 1743379456,1743380479,NZ 1743380480,1743381503,AU @@ -37746,10 +39761,8 @@ 1743385088,1743385343,AU 1743385344,1743386623,IN 1743386624,1743387647,HK -1743387648,1743388671,JP 1743388672,1743389695,CN 1743389696,1743390719,KR -1743390720,1743391743,JP 1743391744,1743391999,PK 1743392000,1743392767,AU 1743392768,1743393791,HK @@ -37759,13 +39772,11 @@ 1743396864,1743397887,HK 1743397888,1743398911,VN 1743398912,1743399935,TW -1743399936,1743400959,JP 1743400960,1743401983,PG 1743401984,1743403007,HK 1743403008,1743404031,CN 1743404032,1743405055,AU 1743405056,1743407103,IN -1743407104,1743408127,JP 1743408128,1743410175,TW 1743410176,1743411199,SG 1743411200,1743412223,VN @@ -37787,7 +39798,6 @@ 1743426560,1743426815,SG 1743426816,1743430399,IN 1743430400,1743430655,AU -1743430656,1743431679,JP 1743431680,1743432703,SG 1743432704,1743433727,CN 1743433728,1743434751,JP @@ -37804,7 +39814,7 @@ 1743446016,1743448063,TW 1743448064,1743449087,AU 1743449088,1743451135,IN -1743451136,1743452159,HK +1743451136,1743452159,CN 1743452160,1743453183,AU 1743453184,1743454207,ID 1743454208,1743455231,IN @@ -37829,8 +39839,6 @@ 1743470848,1743471103,AU 1743471104,1743471615,ID 1743471616,1743472639,IN -1743472640,1743473663,KH -1743473664,1743474687,JP 1743474688,1743476735,CN 1743476736,1743477759,TW 1743477760,1743479807,AU @@ -37847,9 +39855,9 @@ 1743493120,1743493631,ID 1743493632,1743493887,AU 1743493888,1743495167,IN -1743495168,1743497215,JP 1743497216,1743499263,HK -1743499264,1743500287,AF +1743499264,1743499519,US +1743499520,1743500287,AF 1743500288,1743501311,JP 1743501312,1743502335,CN 1743502336,1743503359,AU @@ -37859,9 +39867,42 @@ 1743506432,1743506943,SG 1743506944,1743507455,IN 1743507456,1743509503,VN -1743509504,1743510527,HK -1743510528,1743552511,CN -1743585280,1743589375,CN +1743510528,1743545343,CN +1743545344,1743546367,HK +1743546368,1743549951,IN +1743549952,1743550207,AU +1743550208,1743550463,SG +1743550464,1743551487,CN +1743551488,1743552511,IN +1743552512,1743553535,JP +1743553536,1743554559,PK +1743554560,1743555583,HK +1743555584,1743557631,JP +1743557632,1743558655,ID +1743558656,1743560703,IN +1743560704,1743561215,ID +1743561216,1743561727,AU +1743561728,1743564799,IN +1743564800,1743565823,PH +1743565824,1743566847,JP +1743566848,1743567871,CN +1743567872,1743569151,ID +1743569152,1743569919,IN +1743569920,1743570943,SG +1743570944,1743571199,IN +1743571200,1743571455,ID +1743571456,1743571967,AU +1743571968,1743574015,IN +1743574016,1743574527,AU +1743574528,1743574783,US +1743574784,1743575039,AU +1743575040,1743576063,HK +1743576064,1743577087,CN +1743577088,1743578111,JP +1743578112,1743579135,MY +1743579136,1743580159,CN +1743580160,1743581183,IN +1743581184,1743589375,CN 1743589376,1743590399,AU 1743590400,1743591423,KR 1743591424,1743593471,CN @@ -37874,7 +39915,7 @@ 1743599616,1743600639,IN 1743600640,1743602687,VN 1743602688,1743603711,CN -1743603712,1743605759,HK +1743603712,1743604735,HK 1743605760,1743606015,SG 1743606016,1743606527,AU 1743606528,1743606783,AF @@ -37910,18 +39951,16 @@ 1743666432,1743666687,IN 1743666688,1743666943,AU 1743666944,1743667199,BD -1743667200,1743668223,KH -1743668224,1743672319,VN +1743667200,1743672319,VN 1743672320,1743673343,NZ 1743673344,1743676415,CN 1743676416,1743679487,IN -1743679488,1743680511,JP 1743680512,1743681535,TL 1743681536,1743682559,AU 1743682560,1743683583,MY 1743683584,1743683839,JP 1743683840,1743684095,AU -1743684096,1743684351,HK +1743684096,1743684351,JP 1743684352,1743684607,AU 1743684608,1743685631,CN 1743685632,1743686655,ID @@ -37948,9 +39987,7 @@ 1743715328,1743717375,CN 1743717376,1743718399,BD 1743718400,1743719423,NZ -1743719424,1743720447,HK 1743720448,1743721471,JP -1743721472,1743722495,SG 1743722496,1743723519,AU 1743723520,1743724543,HK 1743724544,1743725567,VN @@ -37962,14 +39999,13 @@ 1743729664,1743730687,KH 1743730688,1743731711,IN 1743731712,1743732735,TW -1743732736,1743733759,HK 1743733760,1743734783,CN 1743734784,1743735807,HK 1743735808,1743736319,AU 1743736320,1743736575,IN 1743736576,1743736831,AU 1743736832,1743738879,IN -1743738880,1743740927,JP +1743739904,1743740927,JP 1743740928,1743741951,CN 1743741952,1743742975,HK 1743742976,1743743487,NZ @@ -37994,7 +40030,6 @@ 1743767552,1743768575,PH 1743768576,1743770623,CN 1743770624,1743770879,AU -1743770880,1743771135,PH 1743771136,1743771647,NZ 1743771648,1743772671,JP 1743772672,1743773695,SG @@ -38019,7 +40054,7 @@ 1743795200,1743796223,NZ 1743796224,1743797247,JP 1743797248,1743798271,TH -1743798272,1743800319,HK +1743798272,1743799295,HK 1743800320,1743801343,CN 1743801344,1743802367,IN 1743802368,1743803391,HK @@ -38047,9 +40082,8 @@ 1743826944,1743827967,MY 1743827968,1743828991,HK 1743828992,1743830015,NZ -1743830016,1743830271,IN 1743831040,1743832063,IN -1743832064,1743834111,HK +1743833088,1743834111,HK 1743834112,1743838207,IN 1743838208,1743838463,PK 1743838464,1743838719,HK @@ -38186,8 +40220,7 @@ 1743983616,1743984639,KR 1743984640,1743985663,CN 1743985664,1743994879,IN -1743994880,1743995135,PG -1743995136,1743995903,AU +1743994880,1743995903,AU 1743995904,1743997951,IN 1743997952,1743999999,BD 1744000000,1744001023,AU @@ -38216,7 +40249,7 @@ 1744022528,1744023551,SG 1744023552,1744023807,IN 1744023808,1744024319,ID -1744024320,1744024575,AF +1744024320,1744024575,US 1744024576,1744025599,HK 1744025600,1744026623,IN 1744027648,1744028671,MY @@ -38236,7 +40269,7 @@ 1744041984,1744043007,TW 1744043008,1744044031,CN 1744044032,1744045055,HK -1744045056,1744047103,SG +1744046080,1744047103,SG 1744047104,1744048127,BD 1744048128,1744049151,CN 1744049152,1744050175,BD @@ -38262,8 +40295,8 @@ 1744077824,1744078847,PK 1744078848,1744079871,VN 1744079872,1744080895,BD -1744080896,1744081407,US -1744081408,1744081919,AF +1744080896,1744081151,US +1744081152,1744081919,AF 1744081920,1744082943,HK 1744082944,1744083967,IN 1744083968,1744084991,HK @@ -38370,7 +40403,7 @@ 1744189440,1744190463,KR 1744190464,1744191487,JP 1744191488,1744192511,IN -1744192512,1744194559,JP +1744192512,1744193535,JP 1744194560,1744194815,ID 1744194816,1744195071,HK 1744195072,1744195327,SG @@ -38403,7 +40436,6 @@ 1744218112,1744218367,AU 1744218368,1744218623,ID 1744218624,1744219135,IN -1744219136,1744220159,PH 1744220160,1744220927,HK 1744220928,1744221183,JP 1744221184,1744222207,NZ @@ -38411,7 +40443,11 @@ 1744222720,1744222975,AU 1744223232,1744224255,TH 1744225280,1744226303,IN -1744226304,1744227327,SG +1744226304,1744226559,SG +1744226560,1744226595,ID +1744226596,1744226596,SG +1744226597,1744226815,ID +1744226816,1744227327,SG 1744227328,1744228351,MY 1744228352,1744229375,TW 1744229376,1744230399,IN @@ -38503,7 +40539,7 @@ 1744315392,1744316415,HK 1744316416,1744317439,KH 1744317440,1744318463,AU -1744318464,1744320511,JP +1744318464,1744319487,JP 1744320512,1744321535,ID 1744321536,1744322559,IN 1744322560,1744323583,CN @@ -38520,7 +40556,7 @@ 1744337920,1744338943,CN 1744338944,1744339967,AU 1744339968,1744340991,SG -1744340992,1744343039,HK +1744342016,1744343039,HK 1744343040,1744343551,SG 1744343552,1744343807,ID 1744343808,1744344063,AU @@ -38534,9 +40570,8 @@ 1744353280,1744354303,HK 1744354304,1744355327,AU 1744355328,1744356351,CN -1744356352,1744357375,JP 1744357376,1744357631,NZ -1744357632,1744358399,AU +1744357632,1744357887,AU 1744358400,1744359423,BD 1744359424,1744360447,IN 1744360448,1744361471,CN @@ -38547,7 +40582,7 @@ 1744367616,1744368639,HK 1744368640,1744369663,IN 1744369664,1744369919,ID -1744369920,1744370431,AU +1744369920,1744370175,AU 1744370432,1744370687,JP 1744370688,1744371711,HK 1744371712,1744372735,BD @@ -38608,7 +40643,6 @@ 1744434176,1744435199,CN 1744435200,1744436223,IN 1744436224,1744437247,CN -1744438272,1744439295,JP 1744439296,1744439807,AU 1744439808,1744440319,IN 1744440320,1744441343,HK @@ -38632,8 +40666,7 @@ 1744455680,1744456703,JP 1744456704,1744459775,IN 1744459776,1744460799,NZ -1744460800,1744462847,JP -1744462848,1744463871,NZ +1744460800,1744461823,JP 1744463872,1744464895,CN 1744464896,1744465919,JP 1744465920,1744466943,IN @@ -38648,9 +40681,7 @@ 1744474112,1744481279,IN 1744481280,1744482303,JP 1744483328,1744484351,CN -1744484352,1744485119,IN -1744485120,1744485375,MY -1744485376,1744486399,IN +1744484352,1744486399,IN 1744486400,1744487423,CN 1744487424,1744487935,TH 1744487936,1744488191,NZ @@ -38660,7 +40691,6 @@ 1744490496,1744491519,IN 1744491520,1744492543,AU 1744492544,1744493567,CN -1744493568,1744494079,AU 1744494080,1744494591,PK 1744494592,1744495615,CN 1744495616,1744497663,NZ @@ -38669,7 +40699,6 @@ 1744500736,1744502783,CN 1744502784,1744503807,MY 1744503808,1744504831,AU -1744504832,1744505855,MY 1744505856,1744506367,AU 1744506368,1744506623,ID 1744506624,1744506879,AU @@ -38752,7 +40781,12 @@ 1744594432,1744594943,AU 1744594944,1744595967,CN 1744595968,1744596991,IN -1744596992,1744598015,SG +1744596992,1744597123,SG +1744597124,1744597124,US +1744597125,1744597151,SG +1744597152,1744597183,IN +1744597184,1744597215,JP +1744597216,1744598015,SG 1744599040,1744601087,JP 1744602112,1744603135,HK 1744603136,1744604159,JP @@ -38770,7 +40804,8 @@ 1744617472,1744618495,IN 1744619520,1744620543,SG 1744620544,1744622591,CN -1744622592,1744625663,IN +1744622592,1744624639,IN +1744624640,1744625663,NL 1744626688,1744627711,KR 1744627712,1744628735,CN 1744628736,1744629759,IN @@ -38891,12 +40926,11 @@ 1744747520,1744748543,CN 1744749056,1744749567,NZ 1744749568,1744749823,CN -1744749824,1744750591,AU 1744750592,1744752639,IN 1744752640,1744753663,HK 1744753664,1744754687,SG 1744754688,1744755711,VN -1744755712,1744756735,CN +1744755712,1744756735,HK 1744756736,1744757759,PF 1744757760,1744758271,NZ 1744758272,1744758527,IN @@ -38999,7 +41033,9 @@ 1747316736,1747317759,CA 1747317760,1747485016,US 1747485017,1747485017,NL -1747485018,1747517439,US +1747485018,1747500223,US +1747500224,1747500224,IE +1747500225,1747517439,US 1747517440,1747521535,BR 1747521536,1747521791,US 1747521792,1747522303,BR @@ -39009,7 +41045,9 @@ 1747779584,1747795967,NL 1747795968,1747801855,US 1747801856,1747802111,IE -1747802112,1749061631,US +1747802112,1747853924,US +1747853925,1747853925,NL +1747853926,1749061631,US 1749061632,1749069823,NL 1749069824,1749094399,US 1749094400,1749098495,NL @@ -39027,7 +41065,9 @@ 1749397504,1749406719,NL 1749406720,1749413887,US 1749413888,1749422079,NL -1749422080,1749476863,US +1749422080,1749449727,US +1749449728,1749450239,NL +1749450240,1749476863,US 1749476864,1749496319,NL 1749496320,1749497855,US 1749497856,1749499391,NL @@ -39051,19 +41091,66 @@ 1749685248,1749686783,NL 1749686784,1749696511,US 1749696512,1749698047,NL -1749698048,1749749247,US +1749698048,1749698559,US +1749698560,1749718015,NL +1749718016,1749749247,US 1749749248,1749749759,NL 1749749760,1749757951,US 1749757952,1749767167,NL -1749767168,1749816831,US +1749767168,1749767679,US +1749767680,1749769215,NL +1749769216,1749770239,US +1749770240,1749778431,NL +1749778432,1749816831,US 1749816832,1749818367,NL 1749818368,1749819391,US 1749819392,1749827583,NL -1749827584,1749862143,US +1749827584,1749837823,US +1749837824,1749838847,NL +1749838848,1749862143,US 1749862144,1749862399,NL -1749862400,1749866239,US +1749862400,1749863423,US +1749863424,1749863679,NL +1749863680,1749866239,US 1749866240,1749866495,NL -1749866496,1753251839,US +1749866496,1749867263,US +1749867264,1749867519,NL +1749867520,1749868031,US +1749868032,1749868287,NL +1749868288,1750079999,US +1750080000,1750081535,NL +1750081536,1750089727,US +1750089728,1750106111,NL +1750106112,1750241279,US +1750241280,1750252543,NL +1750252544,1750253567,US +1750253568,1750261759,NL +1750261760,1750270975,US +1750270976,1750290943,NL +1750290944,1750292479,US +1750292480,1750294527,NL +1750294528,1750302719,US +1750302720,1750321663,NL +1750321664,1750323199,US +1750323200,1750331391,NL +1750331392,1750372351,US +1750372352,1750373375,NL +1750373376,1750374399,US +1750374400,1750374911,NL +1750374912,1750494719,US +1750494720,1750495231,NL +1750495232,1750515199,US +1750515200,1750515711,NL +1750515712,1750523903,US +1750523904,1750533119,NL +1750533120,1750581247,US +1750581248,1750597631,NL +1750597632,1750705151,US +1750705152,1750724607,NL +1750724608,1751505919,US +1751505920,1751506175,IN +1751506176,1751506431,HK +1751506432,1753251839,US 1753251840,1753252095,MN 1753252096,1753252351,SY 1753252352,1753252607,BY @@ -39089,7 +41176,10 @@ 1753341952,1753346047,CA 1753346048,1753483263,US 1753483264,1753483519,IE -1753483520,1753486335,US +1753483520,1753483775,IL +1753483776,1753484607,US +1753484608,1753484655,BR +1753484656,1753486335,US 1753486336,1753486591,IN 1753486592,1753487359,US 1753487360,1753487615,CH @@ -39097,7 +41187,16 @@ 1753489408,1753489663,GB 1753489664,1753490175,US 1753490176,1753490431,AU -1753490432,1753735167,US +1753490432,1753490687,IL +1753490688,1753494527,US +1753494528,1753494783,IL +1753494784,1753516543,US +1753516544,1753516799,ES +1753516800,1753517567,US +1753517568,1753517823,NO +1753517824,1753522431,US +1753522432,1753522687,FR +1753522688,1753735167,US 1753735168,1753743359,IE 1753743360,1754136575,US 1754136576,1754169343,CA @@ -39120,7 +41219,10 @@ 1754209536,1754209791,BR 1754209792,1754210047,AR 1754210048,1754210303,BJ -1754210304,1754230783,US +1754210304,1754223615,US +1754223616,1754223623,MX +1754223624,1754223631,AU +1754223632,1754230783,US 1754230784,1754234879,VG 1754234880,1754251519,US 1754251520,1754251775,LY @@ -39270,7 +41372,7 @@ 1755824128,1755824383,TV 1755824384,1755824639,SY 1755824640,1755824895,ZW -1755824896,1755825151,TG +1755824896,1755825151,US 1755825152,1755825407,GM 1755825408,1755825663,AO 1755825664,1755825919,LB @@ -39312,7 +41414,7 @@ 1755834880,1755835135,PG 1755835136,1755835391,PR 1755835392,1755835647,BA -1755835648,1755835903,LS +1755835648,1755835903,US 1755835904,1755836159,GN 1755836160,1755836415,FJ 1755836416,1755836671,MH @@ -39358,7 +41460,9 @@ 1757427712,1757443071,US 1757443072,1757446143,CA 1757446144,1757447167,US -1757447168,1757448191,CA +1757447168,1757447343,CA +1757447344,1757447344,US +1757447345,1757448191,CA 1757448192,1757450239,US 1757450240,1757451263,CA 1757451264,1757452287,US @@ -39389,7 +41493,9 @@ 1757543296,1757543327,AU 1757543328,1757552639,US 1757552640,1757560831,CA -1757560832,1757597695,US +1757560832,1757596415,US +1757596416,1757596671,AU +1757596672,1757597695,US 1757597696,1757599743,GB 1757599744,1757642751,US 1757642752,1757675519,CA @@ -39409,31 +41515,31 @@ 1758413568,1758414335,US 1758414336,1758414591,LV 1758414592,1758414847,IN -1758414848,1758415103,GD +1758414848,1758415103,US 1758415104,1758415359,GB 1758415360,1758415615,FR 1758415616,1758415871,CY 1758415872,1758416127,IT 1758416128,1758416383,US 1758416384,1758416639,CF -1758416640,1758416895,IL +1758416640,1758416895,US 1758416896,1758417151,VC 1758417152,1758417407,ID 1758417408,1758417663,CL 1758417664,1758417919,HK 1758417920,1758418175,DE -1758418176,1758418431,RU +1758418176,1758418431,US 1758418432,1758418687,CN 1758418688,1758418943,BL 1758418944,1758419199,US 1758419200,1758419455,CR -1758419456,1758419711,EG -1758419712,1758419967,VE -1758419968,1758420223,US +1758419456,1758420223,US 1758420224,1758420479,HU 1758420480,1758420735,CH 1758420736,1758420991,MM -1758420992,1759128575,US +1758420992,1758429695,US +1758429696,1758430207,DE +1758430208,1759128575,US 1759128576,1759129599,CA 1759129600,1759131647,US 1759131648,1759133695,CA @@ -39447,8 +41553,8 @@ 1759160320,1759162367,BM 1759162368,1759163391,BB 1759163392,1759166463,US -1759166464,1759167487,CA -1759167488,1759172607,US +1759166464,1759167511,CA +1759167512,1759172607,US 1759172608,1759173631,VC 1759173632,1759178751,US 1759178752,1759179775,PR @@ -39486,9 +41592,7 @@ 1759416576,1759416831,HK 1759416832,1759417599,US 1759417600,1759417855,FR -1759417856,1759419391,US -1759419392,1759419647,MX -1759419648,1759428607,US +1759417856,1759428607,US 1759428608,1759428863,LB 1759428864,1759429119,US 1759429120,1759429375,LK @@ -39558,7 +41662,7 @@ 1759519744,1759519999,TC 1759520000,1759520255,VG 1759520256,1759520511,WF -1759520512,1759520767,UM +1759520512,1759520767,US 1759520768,1759521023,SV 1759521024,1759521279,TK 1759521280,1759521535,SJ @@ -39569,7 +41673,7 @@ 1759522560,1759522815,PN 1759522816,1759523071,MP 1759523072,1759523327,NF -1759523328,1759523583,US +1759523328,1759523583,PR 1759523584,1759523839,NU 1759523840,1759524095,NC 1759524096,1759524351,NL @@ -39586,8 +41690,8 @@ 1759526912,1759535103,US 1759535104,1759543295,CA 1759543296,1759547391,US -1759547392,1759549439,NL -1759549440,1760047103,US +1759547392,1759548415,NL +1759548416,1760047103,US 1760047104,1760051199,CA 1760051200,1760083967,US 1760083968,1760086015,SE @@ -39614,22 +41718,25 @@ 1760440832,1760441343,AU 1760441344,1760443391,US 1760443392,1760444415,DE -1760444416,1760468991,US +1760444416,1760465919,US +1760465920,1760466943,JP +1760466944,1760468479,US +1760468480,1760468991,DE 1760468992,1760469503,JP 1760469504,1760470527,US 1760470528,1760471039,DE 1760471040,1760473087,GB 1760473088,1760473599,DE 1760473600,1760475135,US -1760475136,1760477183,GB +1760475136,1760476159,GB +1760476160,1760477183,FR 1760477184,1760657407,US 1760657408,1760677887,CA 1760677888,1760690175,US 1760690176,1760755711,CA 1760755712,1760776191,US 1760776192,1760784383,CA -1760784384,1760817151,US -1760817152,1760817407,MO +1760784384,1760817407,US 1760817408,1760817663,BZ 1760817664,1760817919,BS 1760817920,1760818175,PA @@ -39645,7 +41752,9 @@ 1760820480,1760820735,CA 1760820736,1760837631,US 1760837632,1760839679,CA -1760839680,1760867327,US +1760839680,1760840379,US +1760840380,1760840380,LU +1760840381,1760867327,US 1760867328,1760868351,PR 1760868352,1760869375,US 1760869376,1760870399,CA @@ -39688,17 +41797,46 @@ 1761019648,1761019903,VE 1761019904,1761023231,US 1761023232,1761023487,JP -1761023488,1761075199,US +1761023488,1761043711,US +1761043712,1761043967,PH +1761043968,1761044479,US +1761044480,1761044735,AU +1761044736,1761046527,US +1761046528,1761046783,JP +1761046784,1761048063,US +1761048064,1761048319,IN +1761048320,1761075199,US 1761075200,1761083391,CA 1761083392,1761181695,US 1761181696,1761181951,MX -1761181952,1761185791,US +1761181952,1761183743,US +1761183744,1761183999,AU +1761184000,1761185023,US +1761185024,1761185279,RU +1761185280,1761185535,US +1761185536,1761185791,AE 1761185792,1761186047,MX -1761186048,1761187327,US +1761186048,1761186303,US +1761186304,1761186559,DE +1761186560,1761186815,US +1761186816,1761187071,MX +1761187072,1761187327,US 1761187328,1761187583,PK -1761187584,1761189887,US +1761187584,1761188095,US +1761188096,1761188351,RU +1761188352,1761189631,US +1761189632,1761189887,DE 1761189888,1761190143,JP -1761190144,1761195007,US +1761190144,1761191679,US +1761191680,1761191935,MX +1761191936,1761192703,US +1761192704,1761192959,AU +1761192960,1761193727,US +1761193728,1761193983,DE +1761193984,1761194239,US +1761194240,1761194495,PH +1761194496,1761194751,HK +1761194752,1761195007,US 1761195008,1761195263,HK 1761195264,1761198079,US 1761198080,1761214463,CA @@ -39725,7 +41863,7 @@ 1761259520,1761259775,KH 1761259776,1761260031,AZ 1761260032,1761260287,ET -1761260288,1761260543,CU +1761260288,1761260543,US 1761260544,1761260799,EC 1761260800,1761261055,MU 1761261056,1761261311,JM @@ -39734,13 +41872,25 @@ 1761261824,1761262079,SG 1761262080,1761262335,IN 1761262336,1761262591,PK -1761262592,1761288191,US +1761262592,1761262847,US +1761262848,1761263103,RU +1761263104,1761273087,US +1761273088,1761273343,PH +1761273344,1761273599,US +1761273600,1761273855,AU +1761273856,1761275391,US +1761275392,1761275647,JP +1761275648,1761288191,US 1761288192,1761292287,CA 1761292288,1761302015,US 1761302016,1761302271,CA -1761302272,1761304575,US +1761302272,1761302527,US +1761302528,1761302783,CA +1761302784,1761304575,US 1761304576,1761308671,CA -1761308672,1761478655,US +1761308672,1761328639,US +1761328640,1761328895,AU +1761328896,1761478655,US 1761478656,1761479679,CA 1761479680,1761484799,US 1761484800,1761485823,CA @@ -39751,7 +41901,9 @@ 1761501184,1761502207,VG 1761502208,1761515519,US 1761515520,1761517567,CA -1761517568,1761522687,US +1761517568,1761519615,US +1761519616,1761521663,PR +1761521664,1761522687,US 1761522688,1761523711,CA 1761523712,1761524735,US 1761524736,1761525759,CA @@ -39770,7 +41922,7 @@ 1761595392,1761596415,CA 1761596416,1761601535,US 1761601536,1761602559,VC -1761602560,1761605631,US +1761602560,1761606655,US 1761606656,1761607679,VC 1761607680,1762656255,ZA 1762656256,1762660351,MU @@ -39787,7 +41939,7 @@ 1762681088,1762681599,DE 1762681600,1762684927,MU 1762684928,1762689023,KE -1762689024,1762691071,MU +1762689024,1762691071,DJ 1762691072,1762693119,TZ 1762693120,1762695167,MZ 1762695168,1762701311,ZA @@ -39798,14 +41950,15 @@ 1762770944,1762783231,MU 1762783232,1762791423,KE 1762791424,1762795519,DJ -1762795520,1762803711,MU -1762803712,1762807807,ZA -1762807808,1762815999,MU +1762795520,1762799615,TZ +1762799616,1762803711,MZ +1762803712,1762815999,ZA 1762816000,1762820095,FR 1762820096,1762942975,MU 1762942976,1762947071,NL 1762947072,1762951167,SE -1762951168,1762983935,MU +1762951168,1762955263,DE +1762955264,1762983935,MU 1762983936,1763000319,KE 1763000320,1763008511,UG 1763008512,1763016703,RW @@ -39825,24 +41978,31 @@ 1763344896,1763352575,DE 1763352576,1763385343,MU 1763385344,1763393535,AE -1763393536,1763402239,MU +1763393536,1763401727,GB +1763401728,1763402239,MU 1763402240,1763402751,KE -1763402752,1763428351,MU +1763402752,1763406335,MU +1763406336,1763406847,ZA +1763406848,1763428351,MU 1763428352,1763428863,ZA 1763428864,1763430399,MU 1763430400,1763438591,KE 1763438592,1763442687,UG -1763442688,1763450879,MU +1763442688,1763446783,RW +1763446784,1763450879,DJ 1763450880,1763459071,TZ 1763459072,1763463167,MZ -1763463168,1763471359,ZA -1763471360,1763475455,MU +1763463168,1763475455,ZA 1763475456,1763479551,FR -1763479552,1763573759,MU +1763479552,1763483647,GB +1763483648,1763573759,MU 1763573760,1763577855,US -1763577856,1763602431,MU +1763577856,1763598335,MU +1763598336,1763602431,IN 1763602432,1763606527,NL -1763606528,1763631103,MU +1763606528,1763610623,MU +1763610624,1763614719,DE +1763614720,1763631103,MU 1763631104,1763635199,AE 1763635200,1763657727,MU 1763657728,1763659775,ZA @@ -39924,11 +42084,11 @@ 1795560448,1795560959,CA 1795560960,1795561247,US 1795561248,1795561343,CA -1795561344,1795561471,US -1795561472,1795562239,CA -1795562240,1795563263,US -1795563264,1795563519,CA -1795563520,1795564031,US +1795561344,1795561983,US +1795561984,1795562495,CA +1795562496,1795562911,US +1795562912,1795562943,CA +1795562944,1795564031,US 1795564032,1795564543,CA 1795564544,1795565823,US 1795565824,1795566079,CA @@ -39946,27 +42106,13 @@ 1795593728,1795595775,NL 1795595776,1795596287,US 1795596288,1795603455,NL -1795603456,1796253695,US -1796253696,1796253951,CA -1796253952,1796257919,US -1796257920,1796258047,PR -1796258048,1796262911,US -1796262912,1796263167,PR -1796263168,1796325375,US -1796325376,1796325631,PR -1796325632,1796402431,US -1796402432,1796402559,CA -1796402560,1796403199,US -1796403200,1796403327,CA -1796403328,1796404095,US -1796404096,1796404223,CA -1796404224,1796404735,US -1796404736,1796404863,CA -1796404864,1796406655,US -1796406656,1796406783,CA -1796406784,1805000058,US +1795603456,1805000058,US 1805000059,1805000059,CA -1805000060,1805049855,US +1805000060,1805016575,US +1805016576,1805016831,NZ +1805016832,1805017087,TR +1805017088,1805021183,CN +1805021184,1805049855,US 1805049856,1805058047,CA 1805058048,1805144063,US 1805144064,1805148159,CA @@ -39978,7 +42124,9 @@ 1805171608,1805171615,CA 1805171616,1805190399,US 1805190400,1805190655,ES -1805190656,1805210623,US +1805190656,1805194239,US +1805194240,1805194495,AU +1805194496,1805210623,US 1805210624,1805210879,EG 1805210880,1805251583,US 1805251584,1805251839,DE @@ -39990,7 +42138,7 @@ 1805253120,1805253375,DE 1805253376,1805253631,GB 1805253632,1805253887,DE -1805253888,1805254143,GB +1805253888,1805254143,US 1805254144,1805254399,DE 1805254400,1805254655,GB 1805254656,1805582335,US @@ -40007,14 +42155,22 @@ 1805752576,1805753087,CA 1805753088,1805754111,US 1805754112,1805754367,CA -1805754368,1806172159,US +1805754368,1806134015,US +1806134016,1806134271,IN +1806134272,1806172159,US 1806172160,1806172415,DE 1806172416,1806172671,GB 1806172672,1806172927,DE 1806172928,1806173183,GB 1806173184,1806174207,US 1806174208,1806174463,BR -1806174464,1806205183,US +1806174464,1806180351,US +1806180352,1806180607,AU +1806180608,1806198271,US +1806198272,1806198527,JP +1806198528,1806203391,US +1806203392,1806203647,AU +1806203648,1806205183,US 1806205184,1806205439,CA 1806205440,1806263551,US 1806263552,1806263807,KR @@ -40076,14 +42232,15 @@ 1815962112,1815962623,NL 1815962624,1815963391,US 1815963392,1815963647,NL -1815963648,1815964159,US +1815963648,1815963903,US +1815963904,1815964159,FR 1815964160,1815964415,DK 1815964416,1815964671,PL 1815964672,1815965695,US 1815965696,1815966207,DE 1815966208,1815966719,US 1815966720,1815966975,GB -1815966976,1815967231,US +1815966976,1815967231,NL 1815967232,1815967487,CA 1815967488,1815968255,US 1815968256,1815968767,FR @@ -40123,14 +42280,18 @@ 1815996160,1815996415,CA 1815996416,1815997695,US 1815997696,1815997951,FR -1815997952,1816001023,US +1815997952,1816000063,US +1816000064,1816000511,JP +1816000512,1816001023,US 1816001024,1816001279,JP 1816001280,1816001535,AU 1816001536,1816001791,US 1816001792,1816002559,NL 1816002560,1816068095,US 1816068096,1816133631,CA -1816133632,1822429183,US +1816133632,1819976622,US +1819976623,1819976623,RE +1819976624,1822429183,US 1822429184,1822433279,CA 1822433280,1822445567,US 1822445568,1822451199,CA @@ -40150,26 +42311,13 @@ 1822553856,1822554111,HK 1822554112,1822572543,US 1822572544,1822605311,CA -1822605312,1822611514,US -1822611515,1822611515,CA -1822611516,1822614015,US +1822605312,1822614015,US 1822614016,1822614271,JP -1822614272,1822614783,US -1822614784,1822615039,FR -1822615040,1822615295,NO -1822615296,1822617855,US +1822614272,1822617855,US 1822617856,1822618367,CA -1822618368,1822619135,US -1822619136,1822619391,CA -1822619392,1822619647,US +1822618368,1822619647,US 1822619648,1822620415,AU -1822620416,1822620927,US -1822620928,1822621247,NO -1822621248,1822621249,US -1822621250,1822621250,NO -1822621251,1822621263,US -1822621264,1822621264,NO -1822621265,1822654463,US +1822620416,1822654463,US 1822654464,1822662143,CA 1822662144,1822662399,US 1822662400,1822670847,CA @@ -40196,64 +42344,65 @@ 1823375360,1823379455,CA 1823379456,1823383551,US 1823383552,1823387647,CA -1823387648,1823420799,US -1823420800,1823420815,MX -1823420816,1823421455,US -1823421456,1823421463,IL -1823421464,1823428607,US +1823387648,1823428607,US 1823428608,1823432703,CA -1823432704,1823440895,US -1823440896,1823441919,CA -1823441920,1823442175,US -1823442176,1823443199,CA -1823443200,1823443455,US -1823443456,1823444479,CA -1823444480,1823465471,US +1823432704,1823442431,US +1823442432,1823442687,CA +1823442688,1823465471,US 1823465472,1823469567,CA 1823469568,1823735807,US 1823735808,1823866879,CA 1823866880,1828716543,US -1828716544,1830797007,FR -1830797008,1830797008,MQ -1830797009,1830813695,FR +1828716544,1830813695,FR 1830813696,1831337983,NL 1831337984,1831862271,DE 1831862272,1832124415,PT 1832124416,1832386559,IT -1832386560,1832517631,DK +1832386560,1832456959,DK +1832456960,1832457215,SE +1832457216,1832478463,DK +1832478464,1832478719,SE +1832478720,1832517631,DK 1832517632,1832583167,SE 1832583168,1832648703,DK 1832648704,1832681471,HR 1832681472,1832714239,RU 1832714240,1832747007,HU 1832747008,1832779775,RU -1832779776,1832780031,FR -1832780032,1832780287,MQ -1832780288,1832780799,FR -1832780800,1832781311,MQ -1832781312,1832783871,FR -1832783872,1832784639,GP -1832784640,1832786943,FR -1832786944,1832787455,GF -1832787456,1832791551,FR -1832791552,1832791807,YT -1832791808,1832794879,FR -1832794880,1832795135,GP -1832795136,1832796415,FR +1832779776,1832780799,FR +1832780800,1832781055,MQ +1832781056,1832782591,FR +1832782592,1832783103,MQ +1832783104,1832784639,FR +1832784640,1832785407,GP +1832785408,1832786943,FR +1832786944,1832787967,GF +1832787968,1832790527,FR +1832790528,1832790783,YT +1832790784,1832794111,FR +1832794112,1832794879,GP +1832794880,1832795391,FR +1832795392,1832795647,GF +1832795648,1832796415,FR 1832796416,1832796671,RE 1832796672,1832796927,FR 1832796928,1832797183,GP 1832797184,1832798463,FR -1832798464,1832798719,GP -1832798720,1832798975,FR -1832798976,1832799231,GP -1832799232,1832799743,FR -1832799744,1832799999,GP -1832800000,1832802559,FR -1832802560,1832802815,MQ -1832802816,1832803327,FR -1832803328,1832803839,MQ -1832803840,1832812543,FR +1832798464,1832798975,GP +1832798976,1832800255,FR +1832800256,1832800511,MQ +1832800512,1832800767,FR +1832800768,1832801535,MQ +1832801536,1832804351,FR +1832804352,1832804607,MQ +1832804608,1832805119,FR +1832805120,1832805631,MQ +1832805632,1832805887,FR +1832805888,1832806399,MQ +1832806400,1832806911,GP +1832806912,1832807167,FR +1832807168,1832807935,GP +1832807936,1832812543,FR 1832812544,1832845311,RU 1832845312,1832878079,BH 1832878080,1832910847,RU @@ -40320,7 +42469,9 @@ 1833308160,1833310207,FR 1833310208,1833312255,RU 1833312256,1833314303,ES -1833314304,1833316351,IM +1833314304,1833315963,IM +1833315964,1833315967,GB +1833315968,1833316351,IM 1833316352,1833318399,DK 1833318400,1833320447,GB 1833320448,1833320959,AE @@ -40509,10 +42660,13 @@ 1835597824,1835606015,HU 1835606016,1835614207,CZ 1835614208,1835622399,RU -1835622400,1835630591,SE +1835622400,1835627007,SE +1835627008,1835627263,DK +1835627264,1835630591,SE 1835630592,1835636735,RU 1835636736,1835638527,LU -1835638528,1835646975,RU +1835638528,1835638783,AM +1835638784,1835646975,RU 1835646976,1835655167,BA 1835655168,1835663359,CY 1835663360,1835671551,UA @@ -40552,7 +42706,9 @@ 1835917856,1835917863,IT 1835917864,1835917919,GB 1835917920,1835917935,IT -1835917936,1835918383,GB +1835917936,1835918031,GB +1835918032,1835918039,IT +1835918040,1835918383,GB 1835918384,1835918391,IT 1835918392,1835918439,GB 1835918440,1835918447,IT @@ -40572,9 +42728,7 @@ 1835919752,1835919759,IT 1835919760,1835920479,GB 1835920480,1835920487,IT -1835920488,1835920519,GB -1835920520,1835920527,IT -1835920528,1835921119,GB +1835920488,1835921119,GB 1835921120,1835921127,IT 1835921128,1835921343,GB 1835921344,1835921351,IT @@ -40590,17 +42744,17 @@ 1835922648,1835922655,IT 1835922656,1835922671,GB 1835922672,1835922679,IT -1835922680,1835923007,GB +1835922680,1835922959,GB +1835922960,1835922967,IT +1835922968,1835923007,GB 1835923008,1835923015,IT -1835923016,1835923351,GB -1835923352,1835923359,IT -1835923360,1835924375,GB +1835923016,1835923343,GB +1835923344,1835923351,IT +1835923352,1835924375,GB 1835924376,1835924383,IT 1835924384,1835925159,GB 1835925160,1835925167,IT -1835925168,1835925303,GB -1835925304,1835925311,IT -1835925312,1835925327,GB +1835925168,1835925327,GB 1835925328,1835925335,IT 1835925336,1835925503,GB 1835925504,1835933695,LV @@ -40619,7 +42773,153 @@ 1836023808,1836040191,RU 1836040192,1836048383,GB 1836048384,1836056575,RS -1836056576,1836580863,IT +1836056576,1836450337,IT +1836450338,1836450338,CN +1836450339,1836450371,IT +1836450372,1836450372,CN +1836450373,1836450450,IT +1836450451,1836450451,CN +1836450452,1836450470,IT +1836450471,1836450471,CN +1836450472,1836450511,IT +1836450512,1836450512,CN +1836450513,1836450869,IT +1836450870,1836450870,CN +1836450871,1836450881,IT +1836450882,1836450882,CN +1836450883,1836450883,IT +1836450884,1836450884,CN +1836450885,1836450926,IT +1836450927,1836450927,CN +1836450928,1836450931,IT +1836450932,1836450932,CN +1836450933,1836450940,IT +1836450941,1836450941,CN +1836450942,1836450955,IT +1836450956,1836450956,CN +1836450957,1836451346,IT +1836451347,1836451348,CN +1836451349,1836451350,IT +1836451351,1836451351,CN +1836451352,1836451406,IT +1836451407,1836451407,CN +1836451408,1836451417,IT +1836451418,1836451418,CN +1836451419,1836451461,IT +1836451462,1836451462,CN +1836451463,1836451463,IT +1836451464,1836451464,CN +1836451465,1836451521,IT +1836451522,1836451522,CN +1836451523,1836452122,IT +1836452123,1836452123,CN +1836452124,1836452147,IT +1836452148,1836452148,CN +1836452149,1836452186,IT +1836452187,1836452187,CN +1836452188,1836452315,IT +1836452316,1836452316,CN +1836452317,1836452343,IT +1836452344,1836452345,CN +1836452346,1836452445,IT +1836452446,1836452446,CN +1836452447,1836452447,IT +1836452448,1836452448,CN +1836452449,1836452450,IT +1836452451,1836452451,CN +1836452452,1836452546,IT +1836452547,1836452547,CN +1836452548,1836452751,IT +1836452752,1836452752,CN +1836452753,1836452755,IT +1836452756,1836452757,CN +1836452758,1836453483,IT +1836453484,1836453484,CN +1836453485,1836453539,IT +1836453540,1836453540,CN +1836453541,1836453573,IT +1836453574,1836453574,CN +1836453575,1836454695,IT +1836454696,1836454696,CN +1836454697,1836454740,IT +1836454741,1836454741,CN +1836454742,1836454755,IT +1836454756,1836454756,CN +1836454757,1836455219,IT +1836455220,1836455220,CN +1836455221,1836455228,IT +1836455229,1836455229,CN +1836455230,1836455233,IT +1836455234,1836455234,CN +1836455235,1836455263,IT +1836455264,1836455264,CN +1836455265,1836455272,IT +1836455273,1836455274,CN +1836455275,1836455281,IT +1836455282,1836455282,CN +1836455283,1836455305,IT +1836455306,1836455306,CN +1836455307,1836455309,IT +1836455310,1836455310,CN +1836455311,1836455378,IT +1836455379,1836455379,CN +1836455380,1836455454,IT +1836455455,1836455455,CN +1836455456,1836455458,IT +1836455459,1836455460,CN +1836455461,1836455516,IT +1836455517,1836455517,CN +1836455518,1836455546,IT +1836455547,1836455547,CN +1836455548,1836455556,IT +1836455557,1836455557,CN +1836455558,1836455562,IT +1836455563,1836455563,CN +1836455564,1836455565,IT +1836455566,1836455566,CN +1836455567,1836455568,IT +1836455569,1836455570,CN +1836455571,1836455589,IT +1836455590,1836455590,CN +1836455591,1836455631,IT +1836455632,1836455632,CN +1836455633,1836455987,IT +1836455988,1836455988,CN +1836455989,1836455993,IT +1836455994,1836455995,CN +1836455996,1836455997,IT +1836455998,1836455998,CN +1836455999,1836456001,IT +1836456002,1836456002,CN +1836456003,1836456021,IT +1836456022,1836456022,CN +1836456023,1836456097,IT +1836456098,1836456098,CN +1836456099,1836456117,IT +1836456118,1836456118,CN +1836456119,1836456131,IT +1836456132,1836456135,CN +1836456136,1836456136,IT +1836456137,1836456137,CN +1836456138,1836458047,IT +1836458048,1836458048,CN +1836458049,1836459294,IT +1836459295,1836459295,CN +1836459296,1836459383,IT +1836459384,1836459384,CN +1836459385,1836459399,IT +1836459400,1836459400,CN +1836459401,1836466454,IT +1836466455,1836466455,CN +1836466456,1836466465,IT +1836466466,1836466466,CN +1836466467,1836466529,IT +1836466530,1836466530,CN +1836466531,1836466532,IT +1836466533,1836466533,CN +1836466534,1836466551,IT +1836466552,1836466552,CN +1836466553,1836580863,IT 1836580864,1836597247,RU 1836597248,1836598271,LU 1836598272,1836605439,FR @@ -40636,33 +42936,34 @@ 1836681216,1836711935,BG 1836711936,1836728319,UA 1836728320,1836744703,RS -1836744704,1836745983,FR -1836745984,1836746239,RE -1836746240,1836746495,FR -1836746496,1836747007,RE -1836747008,1836750335,FR +1836744704,1836746495,FR +1836746496,1836746751,RE +1836746752,1836747263,FR +1836747264,1836748031,RE +1836748032,1836748287,FR +1836748288,1836748543,RE +1836748544,1836749567,FR +1836749568,1836750079,RE +1836750080,1836750335,FR 1836750336,1836750591,RE -1836750592,1836751103,FR -1836751104,1836751359,RE -1836751360,1836751871,FR -1836751872,1836752127,RE -1836752128,1836752639,FR -1836752640,1836753151,RE -1836753152,1836754175,FR -1836754176,1836754431,RE -1836754432,1836755199,FR -1836755200,1836755711,RE -1836755712,1836755967,FR +1836750592,1836750847,FR +1836750848,1836751359,RE +1836751360,1836753919,FR +1836753920,1836754175,RE +1836754176,1836754431,FR +1836754432,1836754687,RE +1836754688,1836754943,FR +1836754944,1836755199,RE +1836755200,1836755967,FR 1836755968,1836756223,RE -1836756224,1836756735,FR -1836756736,1836756991,RE -1836756992,1836758783,FR -1836758784,1836759039,RE -1836759040,1836759551,FR -1836759552,1836759807,RE -1836759808,1836760063,FR -1836760064,1836760831,RE -1836760832,1836761087,FR +1836756224,1836756479,FR +1836756480,1836756735,RE +1836756736,1836758015,FR +1836758016,1836758271,RE +1836758272,1836760063,FR +1836760064,1836760319,RE +1836760320,1836760831,FR +1836760832,1836761087,RE 1836761088,1836777471,IR 1836777472,1836793855,SI 1836793856,1836794567,GB @@ -40673,7 +42974,9 @@ 1836794595,1836794595,FR 1836794596,1836797951,GB 1836797952,1836798207,DE -1836798208,1836810239,GB +1836798208,1836807087,GB +1836807088,1836807088,CN +1836807089,1836810239,GB 1836810240,1836826623,RU 1836826624,1836843007,CZ 1836843008,1836875775,RU @@ -40691,7 +42994,77 @@ 1837056000,1837072383,IQ 1837072384,1837088767,RU 1837088768,1837105151,SI -1837105152,1838153727,BE +1837105152,1837500953,BE +1837500954,1837500954,CN +1837500955,1837501019,BE +1837501020,1837501020,CN +1837501021,1837501040,BE +1837501041,1837501041,CN +1837501042,1837501119,BE +1837501120,1837501120,CN +1837501121,1837501584,BE +1837501585,1837501585,CN +1837501586,1837501588,BE +1837501589,1837501589,CN +1837501590,1837501623,BE +1837501624,1837501624,CN +1837501625,1837501643,BE +1837501644,1837501644,CN +1837501645,1837501998,BE +1837501999,1837501999,CN +1837502000,1837502022,BE +1837502023,1837502023,CN +1837502024,1837502041,BE +1837502042,1837502042,CN +1837502043,1837502052,BE +1837502053,1837502053,CN +1837502054,1837502126,BE +1837502127,1837502127,CN +1837502128,1837502164,BE +1837502165,1837502165,CN +1837502166,1837502539,BE +1837502540,1837502540,CN +1837502541,1837502574,BE +1837502575,1837502575,CN +1837502576,1837502606,BE +1837502607,1837502607,CN +1837502608,1837502610,BE +1837502611,1837502611,CN +1837502612,1837502639,BE +1837502640,1837502640,CN +1837502641,1837502702,BE +1837502703,1837502703,CN +1837502704,1837502818,BE +1837502819,1837502819,CN +1837502820,1837502913,BE +1837502914,1837502914,CN +1837502915,1837502931,BE +1837502932,1837502932,CN +1837502933,1837503116,BE +1837503117,1837503117,CN +1837503118,1837503125,BE +1837503126,1837503127,CN +1837503128,1837503129,BE +1837503130,1837503131,CN +1837503132,1837503136,BE +1837503137,1837503137,CN +1837503138,1837503153,BE +1837503154,1837503154,CN +1837503155,1837503156,BE +1837503157,1837503157,CN +1837503158,1837503163,BE +1837503164,1837503165,CN +1837503166,1837503166,BE +1837503167,1837503167,CN +1837503168,1837503175,BE +1837503176,1837503176,CN +1837503177,1837503184,BE +1837503185,1837503185,CN +1837503186,1837503186,BE +1837503187,1837503187,CN +1837503188,1837503188,BE +1837503189,1837503189,CN +1837503190,1838153727,BE 1838153728,1839202303,GB 1839202304,1839235071,BG 1839235072,1839267839,IL @@ -40712,18 +43085,21 @@ 1839497216,1839529983,CH 1839529984,1839562751,RU 1839562752,1839595519,BA -1839595520,1839661055,RO -1839661056,1839693823,UA +1839595520,1839603711,SA +1839603712,1839618047,RO +1839618048,1839628287,SA +1839628288,1839661055,RO +1839661056,1839686655,UA +1839686656,1839687167,ES +1839687168,1839693055,UA +1839693056,1839693311,ES +1839693312,1839693823,UA 1839693824,1839726591,RU 1839726592,1839759359,IT 1839759360,1839792127,RU -1839792128,1839793279,GB -1839793280,1839793407,A1 -1839793408,1839794847,GB +1839792128,1839794847,GB 1839794848,1839794879,CH -1839794880,1839796479,GB -1839796480,1839796671,A1 -1839796672,1839816703,GB +1839794880,1839816703,GB 1839816704,1839824895,NO 1839824896,1839890431,RU 1839890432,1839923199,GB @@ -40823,11 +43199,9 @@ 1841889280,1841897471,IR 1841897472,1841905663,KZ 1841905664,1841922047,RU -1841922048,1841924351,NL -1841924352,1841924607,GB -1841924608,1841925887,NL -1841925888,1841926143,DE -1841926144,1841930239,NL +1841922048,1841926099,NL +1841926100,1841926100,DE +1841926101,1841930239,NL 1841930240,1841938431,KG 1841938432,1841946623,RU 1841946624,1841954815,UA @@ -40851,23 +43225,35 @@ 1842044928,1842053119,GB 1842053120,1842069503,IR 1842069504,1842077695,RU -1842077696,1842078207,MQ -1842078208,1842078463,FR -1842078464,1842078975,MQ -1842078976,1842079743,FR -1842079744,1842080767,MQ +1842077696,1842078207,FR +1842078208,1842078463,MQ +1842078464,1842079231,FR +1842079232,1842079743,MQ +1842079744,1842080255,GP +1842080256,1842080767,MQ 1842080768,1842081023,GP -1842081024,1842083071,MQ -1842083072,1842083327,GP +1842081024,1842081791,MQ +1842081792,1842082047,GP +1842082048,1842082815,MQ +1842082816,1842083327,GP 1842083328,1842084607,MQ 1842084608,1842084863,GP 1842084864,1842085887,MQ 1842085888,1842118655,GB 1842118656,1842151423,FI 1842151424,1842153471,FR -1842153472,1842154271,NO +1842153472,1842153983,NO +1842153984,1842154239,US +1842154240,1842154271,NO 1842154272,1842154303,HK -1842154304,1842155519,NO +1842154304,1842154335,NO +1842154336,1842154343,SG +1842154344,1842154351,NO +1842154352,1842154367,SG +1842154368,1842154495,NO +1842154496,1842155007,US +1842155008,1842155263,AU +1842155264,1842155519,NL 1842155520,1842157567,IT 1842157568,1842159615,AE 1842159616,1842161663,BA @@ -40902,10 +43288,10 @@ 1842214912,1842216959,RU 1842216960,1842225151,RO 1842225152,1842233343,UA -1842233344,1842241535,RO +1842233344,1842241535,SA 1842241536,1842249727,RS 1842249728,1842257919,RU -1842257920,1842266111,EU +1842257920,1842266111,NL 1842266112,1842274303,PL 1842282496,1842286591,RU 1842286592,1842290687,GB @@ -40949,7 +43335,11 @@ 1843789824,1843806207,SK 1843806208,1843822591,IR 1843822592,1843838975,RU -1843838976,1843855359,DE +1843838976,1843846911,DE +1843846912,1843847167,IR +1843847168,1843853055,DE +1843853056,1843853311,IR +1843853312,1843855359,DE 1843855360,1843871743,PL 1843871744,1843888127,GB 1843888128,1843904511,CZ @@ -40968,9 +43358,7 @@ 1843943424,1843945471,CH 1843945472,1843947519,FR 1843947520,1843949567,RU -1843949568,1843950079,ES -1843950080,1843950335,BY -1843950336,1843950591,ES +1843949568,1843950591,ES 1843950592,1843951615,BY 1843951616,1843955711,DE 1843955712,1843957759,IT @@ -41005,10 +43393,7 @@ 1844021248,1844027391,DE 1844027392,1844029439,CZ 1844029440,1844031487,RU -1844031488,1844031743,EU -1844031744,1844031999,AT -1844032000,1844032255,GB -1844032256,1844033535,EU +1844031488,1844033535,EU 1844033536,1844035583,RS 1844035584,1844037631,MD 1844037632,1844041727,RU @@ -41024,8 +43409,7 @@ 1844068352,1844070399,ES 1844070400,1844072447,LU 1844072448,1844076543,ES -1844076544,1844078079,IE -1844078080,1844078591,GB +1844076544,1844078591,IE 1844078592,1844080639,DE 1844080640,1844082687,GE 1844082688,1844084735,DE @@ -41073,9 +43457,7 @@ 1844169504,1844169519,US 1844169520,1844169567,GI 1844169568,1844169583,US -1844169584,1844169599,GI -1844169600,1844169647,US -1844169648,1844169727,GI +1844169584,1844169727,GI 1844169728,1844170751,DE 1844170752,1844174847,RU 1844174848,1844178943,DE @@ -41090,8 +43472,7 @@ 1844207616,1844211711,RU 1844211712,1844215807,SK 1844215808,1844219903,BE -1844219904,1844220159,US -1844220160,1844220927,DE +1844219904,1844220927,DE 1844220928,1844222975,A2 1844222976,1844223999,DE 1844224000,1844228095,GB @@ -41150,7 +43531,19 @@ 1844772864,1844838399,RS 1844838400,1844903935,GB 1844903936,1844969471,NO -1844969472,1845034751,RU +1844969472,1845006335,RU +1845006336,1845010431,KZ +1845010432,1845022719,RU +1845022720,1845023743,KZ +1845023744,1845025535,RU +1845025536,1845025791,KZ +1845025792,1845027583,RU +1845027584,1845027839,ES +1845027840,1845029887,RU +1845029888,1845030143,KZ +1845030144,1845030911,RU +1845030912,1845031935,GE +1845031936,1845034751,RU 1845034752,1845035007,BY 1845035008,1845100543,GB 1845100544,1845166079,DE @@ -41206,7 +43599,13 @@ 1848393728,1848401919,JP 1848401920,1848406015,PH 1848406016,1848410111,NP -1848410112,1848414207,PH +1848410112,1848411135,JP +1848411136,1848411391,PH +1848411392,1848412415,JP +1848412416,1848412671,PH +1848412672,1848413439,JP +1848413440,1848413951,PH +1848413952,1848414207,JP 1848414208,1848418303,CN 1848418304,1848420351,AU 1848420352,1848422399,ID @@ -41239,7 +43638,6 @@ 1850400768,1850408959,JP 1850408960,1850490879,CN 1850490880,1850507263,KR -1850507776,1850508031,AU 1850509312,1850510335,AU 1850510336,1850511359,KR 1850511360,1850513407,ID @@ -41318,8 +43716,7 @@ 1860733952,1860734975,AU 1860734976,1860735999,NZ 1860736000,1860737023,AU -1860737024,1860739071,JP -1860739072,1860743167,PH +1860737024,1860743167,JP 1860743168,1860743333,AP 1860743334,1860743334,HK 1860743335,1860743462,AP @@ -41367,8 +43764,8 @@ 1866989568,1867513855,CN 1867513856,1867775999,TW 1867776000,1867825151,TH -1867825152,1867825663,MM -1867825664,1867841535,TH +1867825152,1867826175,MM +1867826176,1867841535,TH 1867841536,1867907071,CN 1867907072,1868038143,JP 1868038144,1868103679,PK @@ -41448,7 +43845,9 @@ 1876766720,1876768767,MY 1876768768,1876769791,AU 1876769792,1876770815,JP -1876770816,1876787199,SG +1876770816,1876785407,SG +1876785408,1876785439,HK +1876785440,1876787199,SG 1876787200,1876885503,CN 1876893696,1876901887,TH 1876901888,1876918271,SG @@ -41456,13 +43855,11 @@ 1876934656,1876942847,JP 1876942848,1876946943,AU 1876946944,1876947967,CN -1876947968,1876948991,AF 1876948992,1876950015,CN 1876950016,1876951039,ID 1876951040,1877475327,CN 1877475328,1877688319,JP -1877688320,1877689343,IN -1877690368,1877691391,IN +1877688320,1877691391,IN 1877691392,1877692415,JP 1877692416,1877696511,PH 1877696512,1877704703,CN @@ -41499,7 +43896,8 @@ 1884291072,1885863935,CN 1885863936,1885995007,TW 1885995008,1886191615,KR -1886191616,1886195711,PH +1886191616,1886195455,JP +1886195456,1886195711,PH 1886195712,1886197759,ID 1886197760,1886199807,JP 1886199808,1886207999,KR @@ -41543,6 +43941,7 @@ 1888266240,1888268287,JP 1888268288,1888270335,AU 1888270336,1888271359,SG +1888271360,1888272383,IN 1888272384,1888288767,KR 1888288768,1888354303,AU 1888354304,1888485375,TH @@ -41596,8 +43995,7 @@ 1897170944,1897172991,ID 1897172992,1897175039,PH 1897175040,1897176063,JP -1897177088,1897185279,PH -1897185280,1897201663,JP +1897177088,1897201663,JP 1897201664,1897209855,KR 1897209856,1897213951,AU 1897213952,1897218047,JP @@ -41615,12 +44013,13 @@ 1897365504,1897398271,MY 1897398272,1897660415,CN 1897660416,1897725951,HK -1897725952,1897730047,JP -1897730048,1897734143,AU -1897734144,1897738239,HK -1897738240,1897742335,KR -1897742336,1897746431,SG -1897746432,1897758719,US +1897725952,1897726463,US +1897726464,1897726527,JP +1897726528,1897730047,US +1897730048,1897730303,AU +1897730304,1897730559,US +1897730560,1897730815,AU +1897730816,1897758719,US 1897758720,1897779199,KR 1897779200,1897781247,AU 1897781248,1897783295,JP @@ -41634,7 +44033,9 @@ 1897791488,1897824255,KR 1897824256,1897857023,IN 1897857024,1897922559,CN -1897922560,1898708991,JP +1897922560,1898676991,JP +1898676992,1898677247,US +1898677248,1898708991,JP 1898708992,1899233279,CN 1899233280,1899237375,AU 1899237376,1899241471,JP @@ -41696,6 +44097,7 @@ 1908756480,1908760575,KR 1908760576,1908761599,NZ 1908761600,1908762623,CN +1908762624,1908763647,IN 1908763648,1908764671,ID 1908764672,1908768767,AU 1908768768,1908801535,JP @@ -41708,15 +44110,15 @@ 1909456896,1909473279,JP 1909473280,1909474303,A2 1909474304,1909475327,PH -1909475328,1909479939,A2 -1909479940,1909479940,US -1909479941,1909481471,A2 +1909475328,1909480447,A2 +1909480448,1909480703,US +1909480704,1909481471,A2 1909481472,1909587967,CN 1909587968,1909719039,MY 1909719040,1909735423,CN -1909735424,1909736713,US +1909735424,1909736713,IN 1909736714,1909736714,AP -1909736715,1909743615,US +1909736715,1909743615,IN 1909743616,1909744639,AU 1909744640,1909745663,CN 1909745664,1909746687,JP @@ -41802,7 +44204,9 @@ 1920003072,1920008191,HK 1920008192,1920057343,CN 1920057344,1920058111,HK -1920058112,1920072703,CN +1920058112,1920069631,CN +1920069632,1920071167,HK +1920071168,1920072703,CN 1920072704,1920073727,HK 1920073728,1920466943,CN 1920466944,1920991231,ID @@ -41823,11 +44227,7 @@ 1921384448,1921388543,NZ 1921392640,1921400831,JP 1921400832,1921404927,ID -1921404928,1921405823,HK -1921405824,1921405855,MM -1921405856,1921405919,HK -1921405920,1921405951,MM -1921405952,1921406463,HK +1921404928,1921406463,HK 1921406464,1921406719,GB 1921406720,1921406975,HK 1921406976,1921409023,BD @@ -41862,7 +44262,9 @@ 1921953792,1921957887,JP 1921957888,1921974271,GU 1921974272,1922039807,IN -1922039808,1925447679,JP +1922039808,1924379903,JP +1924379904,1924380159,US +1924380160,1925447679,JP 1925447680,1925578751,CN 1925578752,1925611519,AU 1925611520,1925619711,PH @@ -41873,8 +44275,8 @@ 1925642240,1925644287,CN 1925644288,1925660671,KR 1925660672,1925661439,TW -1925661440,1925662207,HK -1925662208,1925663743,TW +1925661440,1925662463,HK +1925662464,1925663743,TW 1925663744,1925664767,HK 1925664768,1925677055,ID 1925677056,1926234111,KR @@ -41915,7 +44317,7 @@ 1933922304,1933926399,IN 1933926400,1933934591,KR 1933934592,1933942783,IN -1933942784,1933950975,AU +1933942784,1933950975,NZ 1933950976,1933955071,JP 1933955072,1933957119,BD 1933957120,1933959167,ID @@ -41937,7 +44339,8 @@ 1934966784,1934974975,ID 1934974976,1934983167,JP 1934983168,1934983423,MY -1934983424,1934985215,AU +1934983424,1934984959,AU +1934984960,1934985215,US 1934985216,1934987263,JP 1934987264,1934991359,TW 1934991360,1934999551,KR @@ -42033,12 +44436,21 @@ 1946163200,1946165247,CN 1946165248,1946173439,PK 1946173440,1946173695,PG -1946173696,1946175487,SG -1946175488,1946176511,SY -1946176512,1946176767,PH +1946173696,1946173951,TW +1946173952,1946174463,SG +1946174464,1946174719,TW +1946174720,1946175487,SG +1946175488,1946175615,HK +1946175616,1946175999,SG +1946176000,1946176255,JP +1946176256,1946176511,SG +1946176512,1946176647,AU +1946176648,1946176767,PH 1946176768,1946178047,SG 1946178048,1946178303,HK -1946178304,1946181631,SG +1946178304,1946179583,SG +1946179584,1946179839,AU +1946179840,1946181631,SG 1946181632,1946189823,MY 1946189824,1946222591,JP 1946222592,1946943487,CN @@ -42059,11 +44471,11 @@ 1949440000,1949442047,ID 1949442048,1949446143,TW 1949446144,1949448191,JP -1949448192,1949448447,AU -1949448448,1949448703,HK -1949448704,1949448959,AU -1949448960,1949449215,IN -1949449216,1949449471,SG +1949448192,1949449139,AU +1949449140,1949449140,IN +1949449141,1949449395,AU +1949449396,1949449396,AP +1949449397,1949449471,AU 1949449472,1949449727,JP 1949449728,1949450239,AU 1949450240,1949466623,IN @@ -42088,7 +44500,6 @@ 1950520320,1950521343,PH 1950521344,1950523391,IN 1950523392,1950527487,AU -1950527488,1950531583,JP 1950531584,1950533631,NP 1950533632,1950535679,ID 1950535680,1950539775,HK @@ -42167,9 +44578,11 @@ 1958830080,1958838271,JP 1958838272,1958842367,IN 1958842368,1958844415,NZ +1958844416,1958845439,CN 1958845440,1958845951,MY 1958845952,1958846463,HK 1958846464,1958847487,IN +1958847488,1958848511,CN 1958848512,1958850559,BD 1958850560,1958852607,CN 1958852608,1958853631,AU @@ -42182,17 +44595,18 @@ 1959100416,1959102463,ID 1959102464,1959104511,JP 1959104512,1959106559,AU -1959106560,1959108607,JP 1959110656,1959112703,JP 1959112704,1959114751,HK 1959114752,1959115007,IN -1959115008,1959116799,HK +1959115008,1959116287,HK +1959116288,1959116543,AU +1959116544,1959116799,HK 1959116800,1959133183,SG 1959133184,1959239679,CN 1959239680,1959241727,KR 1959241728,1959243775,IN 1959243776,1959247871,JP -1959247872,1959251967,ID +1959247872,1959249919,ID 1959251968,1959256063,NZ 1959256064,1959260159,AU 1959260160,1959264255,JP @@ -42242,15 +44656,11 @@ 1962622976,1962639359,CN 1962639360,1962658815,NZ 1962658816,1962659839,HK -1962659840,1962660863,SG -1962660864,1962661375,HK -1962661376,1962663935,SG +1962659840,1962663935,SG 1962663936,1962672127,HK 1962672128,1962803199,CN 1962803200,1962827775,JP -1962827776,1962829823,ID -1962829824,1962831871,JP -1962831872,1962835967,ID +1962827776,1962835967,ID 1962835968,1962868735,CN 1962868736,1962885119,AU 1962885120,1962901503,KR @@ -42276,16 +44686,12 @@ 1964138496,1964146687,HK 1964146688,1964171263,JP 1964171264,1964173311,BD -1964173312,1964173727,AP -1964173728,1964173743,JP -1964173744,1964173776,AP +1964173312,1964173776,AP 1964173777,1964173777,JP 1964173778,1964173823,AP 1964173824,1964174079,HK 1964174080,1964174335,AU -1964174336,1964174495,SG -1964174496,1964174511,SN -1964174512,1964174591,SG +1964174336,1964174591,SG 1964174592,1964175359,AP 1964175360,1964179455,GB 1964179456,1964244991,TW @@ -42321,9 +44727,7 @@ 1966571520,1966587903,KR 1966587904,1966588159,AF 1966588160,1966588415,US -1966588416,1966590975,AF -1966590976,1966591231,US -1966591232,1966591999,AF +1966588416,1966591999,AF 1966592000,1966596095,JP 1966596096,1966600191,AU 1966600192,1966602239,IN @@ -42386,8 +44790,8 @@ 1970800640,1970802943,AU 1970802944,1970803199,SG 1970803200,1970803711,AU -1970803712,1970804223,HK -1970804224,1970804479,AU +1970803712,1970803967,HK +1970803968,1970804479,AU 1970804480,1970804735,SG 1970804736,1970806783,KH 1970806784,1970808831,NZ @@ -42403,7 +44807,8 @@ 1970926336,1970926591,US 1970926592,1970926847,SG 1970926848,1970927103,IL -1970927104,1970927615,SG +1970927104,1970927359,SG +1970927360,1970927615,US 1970927616,1970929663,AU 1970929664,1970962431,VN 1970962432,1970995199,CN @@ -42465,7 +44870,8 @@ 1986498560,1986502655,HK 1986510848,1986519039,KR 1986519040,1986523135,PK -1986523136,1986525183,CN +1986523136,1986523904,HK +1986523905,1986525183,CN 1986525184,1986527231,BN 1986527232,1986723839,JP 1986723840,1986740223,AU @@ -42481,9 +44887,7 @@ 1988034560,1988067327,AU 1988067328,1988075519,CN 1988075520,1988083711,AU -1988083712,1988158975,KR -1988158976,1988159231,US -1988159232,1988362239,KR +1988083712,1988362239,KR 1988362240,1988624383,CN 1988624384,1988755455,ID 1988755456,1988861951,AU @@ -42499,7 +44903,9 @@ 1989662720,1989663743,AU 1989663744,1989664767,ID 1989664768,1990197247,JP -1990197248,1990983679,TW +1990197248,1990448639,TW +1990448640,1990448895,CN +1990448896,1990983679,TW 1990983680,1991245823,TH 1991245824,1991311359,KR 1991311360,1991376895,JP @@ -42537,7 +44943,9 @@ 1996685312,1996750847,HK 1996750848,1997078527,CN 1997078528,1997094911,AU -1997094912,1997144063,HK +1997094912,1997111295,HK +1997111296,1997127679,AU +1997127680,1997144063,HK 1997144064,1997176831,CN 1997176832,1997180927,AU 1997180928,1997185023,HK @@ -42582,9 +44990,9 @@ 1998061568,1998258175,JP 1998258176,1998266367,SG 1998266368,1998268415,JP -1998268416,1998271231,SG -1998271232,1998271487,AU -1998271488,1998271815,SG +1998268416,1998271271,SG +1998271272,1998271272,AU +1998271273,1998271815,SG 1998271816,1998271823,JP 1998271824,1998272431,SG 1998272432,1998272447,JP @@ -42602,9 +45010,7 @@ 1998503936,1998520319,JP 1998520320,1998553087,TH 1998553088,1998561279,JP -1998561280,1998562047,IN -1998562048,1998562303,TH -1998562304,1998562559,IN +1998561280,1998562559,IN 1998562560,1998562815,AP 1998562816,1998562863,IN 1998562864,1998562864,HK @@ -42627,7 +45033,6 @@ 1999136768,1999138815,AU 1999138816,1999142911,MY 1999142912,1999249407,CN -1999249408,1999257599,PH 1999257600,1999273983,TH 1999273984,1999278079,CN 1999278080,1999280127,HK @@ -42651,11 +45056,7 @@ 2000355328,2000371711,KR 2000371712,2000373759,JP 2000373760,2000375807,HK -2000375808,2000376319,AF -2000376320,2000376575,US -2000376576,2000377343,AF -2000377344,2000377599,US -2000377600,2000377855,AF +2000375808,2000377855,AF 2000377856,2000379903,JP 2000379904,2000388095,TH 2000388096,2000617471,CN @@ -42686,66 +45087,67 @@ 2001829888,2001841247,HK 2001841248,2001841248,SA 2001841249,2001846271,HK -2001846272,2001855231,SG +2001846272,2001854943,SG +2001854944,2001854951,CN +2001854952,2001855231,SG 2001855232,2001855263,US -2001855264,2001855807,SG -2001855808,2001855823,GB -2001855824,2001857283,SG -2001857284,2001857287,US -2001857288,2001857383,SG -2001857384,2001857391,US -2001857392,2001857399,SG -2001857400,2001857407,US -2001857408,2001857428,SG -2001857429,2001857429,US -2001857430,2001857430,NL -2001857431,2001857975,SG -2001857976,2001857983,US -2001857984,2001858007,SG -2001858008,2001858011,US -2001858012,2001858111,SG -2001858112,2001858143,US -2001858144,2001859007,SG -2001859008,2001859015,NL -2001859016,2001859039,SG -2001859040,2001859071,US -2001859072,2001859791,SG -2001859792,2001859799,US -2001859800,2001859807,SG -2001859808,2001859811,US -2001859812,2001859899,SG -2001859900,2001859903,US -2001859904,2001860119,SG -2001860120,2001860127,US -2001860128,2001860227,SG -2001860228,2001860231,US -2001860232,2001860335,SG -2001860336,2001860343,US -2001860344,2001860439,SG -2001860440,2001860443,US -2001860444,2001860527,SG -2001860528,2001860531,US -2001860532,2001860603,SG -2001860604,2001860607,US -2001860608,2001860791,SG -2001860792,2001860795,US -2001860796,2001860855,SG -2001860856,2001860863,US -2001860864,2001860903,SG -2001860904,2001860907,US -2001860908,2001860959,SG -2001860960,2001860963,US -2001860964,2001861087,SG -2001861088,2001861095,US -2001861096,2001861207,SG -2001861208,2001861215,US -2001861216,2001861399,SG -2001861400,2001861415,US -2001861416,2001861439,SG -2001861440,2001861447,AU -2001861448,2001862015,SG -2001862016,2001862047,US -2001862048,2001862655,SG +2001855264,2001855743,SG +2001855744,2001855999,HK +2001856000,2001856127,SG +2001856128,2001856151,CZ +2001856152,2001856155,SG +2001856156,2001856159,CZ +2001856160,2001856191,SG +2001856192,2001856199,CZ +2001856200,2001857279,SG +2001857280,2001857535,HK +2001857536,2001857791,SG +2001857792,2001858047,HK +2001858048,2001858335,SG +2001858336,2001858367,US +2001858368,2001858639,SG +2001858640,2001858655,US +2001858656,2001859071,SG +2001859072,2001859327,HK +2001859328,2001860031,SG +2001860032,2001860047,HK +2001860048,2001860351,SG +2001860352,2001860607,HK +2001860608,2001860655,SG +2001860656,2001860659,US +2001860660,2001860661,HK +2001860662,2001860664,US +2001860665,2001860665,HK +2001860666,2001860667,US +2001860668,2001860668,HK +2001860669,2001860671,US +2001860672,2001860991,SG +2001860992,2001860995,US +2001860996,2001860997,HK +2001860998,2001861001,US +2001861002,2001861003,HK +2001861004,2001861007,US +2001861008,2001861263,SG +2001861264,2001861265,US +2001861266,2001861267,HK +2001861268,2001861268,US +2001861269,2001861269,HK +2001861270,2001861271,US +2001861272,2001861272,HK +2001861273,2001861273,US +2001861274,2001861274,HK +2001861275,2001861279,US +2001861280,2001862079,SG +2001862080,2001862101,US +2001862102,2001862102,HK +2001862103,2001862116,US +2001862117,2001862118,HK +2001862119,2001862124,US +2001862125,2001862125,HK +2001862126,2001862128,US +2001862129,2001862131,HK +2001862132,2001862143,US +2001862144,2001862655,SG 2001862656,2001864703,AU 2001864704,2001870847,JP 2001870848,2001879039,KR @@ -42849,11 +45251,10 @@ 2015216384,2015216639,AU 2015216640,2015217663,IN 2015217664,2015219456,GU -2015219457,2015219711,IN -2015219712,2015219967,US +2015219457,2015219967,IN 2015219968,2015220223,PH 2015220224,2015220479,IN -2015220480,2015220735,HK +2015220480,2015220735,JP 2015220736,2015223807,IN 2015223808,2015225855,ID 2015225856,2015227903,IN @@ -42885,14 +45286,12 @@ 2019035136,2019037183,CN 2019037184,2019041279,JP 2019041280,2019045375,IN -2019045376,2019045631,US -2019045632,2019049471,JP +2019045376,2019045887,US +2019045888,2019049471,JP 2019049472,2019078143,AU 2019078144,2019082239,IN 2019082240,2019098623,HK -2019098624,2019106815,PH -2019106816,2019107071,NO -2019107072,2019115007,PH +2019098624,2019115007,PH 2019115008,2019117055,US 2019117056,2019119103,IN 2019119104,2019121151,NZ @@ -43005,15 +45404,15 @@ 2035941376,2036006911,NZ 2036006912,2036072447,AU 2036072448,2036334591,JP -2036334592,2036422655,PH -2036422656,2036422911,US -2036422912,2036465663,PH +2036334592,2036465663,PH 2036465664,2036596735,NZ 2036596736,2036598783,ID 2036598784,2036600831,JP 2036600832,2036604927,ID 2036604928,2036609023,SG -2036609024,2036611071,AF +2036609024,2036609791,AF +2036609792,2036610047,US +2036610048,2036611071,AF 2036611072,2036613119,JP 2036613120,2036629503,KR 2036629504,2036678655,CN @@ -43072,12 +45471,9 @@ 2047082496,2047410175,CN 2047410176,2047492095,HK 2047492096,2047496191,KR -2047496192,2047504383,HK -2047504384,2047506431,CN +2047496192,2047506431,HK 2047506432,2047508479,US -2047508480,2047517695,CN -2047517696,2047518719,HK -2047518720,2047574015,CN +2047508480,2047574015,CN 2047574016,2047606783,SG 2047606784,2047770879,CN 2047770880,2047773184,HK @@ -43095,7 +45491,9 @@ 2050091008,2050097151,JP 2050097152,2050101247,SG 2050101248,2050113535,JP -2050113536,2050129919,SG +2050113536,2050129663,SG +2050129664,2050129727,JP +2050129728,2050129919,SG 2050129920,2050162687,IN 2050162688,2050228223,CN 2050228224,2050490367,PH @@ -43177,15 +45575,11 @@ 2056816864,2056816895,MY 2056816896,2056817335,JP 2056817336,2056817343,HK -2056817344,2056817663,JP -2056817664,2056817919,AU -2056817920,2056818431,JP -2056818432,2056818687,SG -2056818688,2056818943,JP -2056818944,2056818993,MY +2056817344,2056817727,JP +2056817728,2056817791,AU +2056817792,2056818993,JP 2056818994,2056818994,AP -2056818995,2056819199,MY -2056819200,2056823849,JP +2056818995,2056823849,JP 2056823850,2056823850,SG 2056823851,2056830975,JP 2056830976,2056847359,CN @@ -43224,36 +45618,38 @@ 2060062720,2060066815,JP 2060066816,2060075007,KR 2060075008,2060083199,AU -2060083200,2060091391,PH +2060083200,2060091391,JP 2060091392,2060189695,KR 2060189696,2060451839,CN 2060451840,2061500415,JP 2061500416,2063073279,CN 2063073280,2063077375,BD -2063077376,2063077377,HK +2063077376,2063077377,PH 2063077378,2063077378,AP -2063077379,2063079423,HK +2063077379,2063077631,PH +2063077632,2063079423,HK 2063079424,2063081471,CN 2063081472,2063085567,ID 2063085568,2063089663,CN 2063089664,2063097855,JP 2063097856,2063106047,MM -2063106048,2063107071,SG +2063106048,2063106559,SG +2063106560,2063106815,AU +2063106816,2063107071,SG 2063107072,2063107327,AP -2063107328,2063107623,SG -2063107624,2063107631,AU -2063107632,2063108095,SG +2063107328,2063108095,SG 2063108096,2063110143,HK 2063110144,2063111167,JP 2063111168,2063114239,AU 2063114240,2063115263,IN -2063115264,2063118159,JP -2063118160,2063118191,PH -2063118192,2063118335,JP +2063115264,2063118079,JP +2063118080,2063118335,PH 2063118336,2063118591,IN 2063118592,2063119871,JP 2063119872,2063120383,IN -2063120384,2063121919,JP +2063120384,2063120895,JP +2063120896,2063121151,AU +2063121152,2063121919,JP 2063121920,2063122431,IN 2063122432,2063138815,SG 2063138816,2063335423,JP @@ -43465,14 +45861,17 @@ 2082340864,2082406399,IN 2082406400,2082471935,CN 2082471936,2083007231,JP -2083007232,2083007487,US -2083007488,2083007743,JP -2083007744,2083007999,US -2083008000,2083012351,JP -2083012352,2083012607,US -2083012608,2083024895,JP +2083007232,2083007999,US +2083008000,2083010047,JP +2083010048,2083010303,US +2083010304,2083011071,JP +2083011072,2083011583,US +2083011584,2083012095,JP +2083012096,2083012351,US +2083012352,2083024895,JP 2083024896,2083053567,CN 2083053568,2083057663,TH +2083057664,2083058687,CN 2083058688,2083059711,IN 2083059712,2083061759,ID 2083061760,2083110911,JP @@ -43495,7 +45894,6 @@ 2084569088,2084732927,CN 2084732928,2084741119,SG 2084741120,2084743167,ID -2084743168,2084745215,JP 2084745216,2084749311,KR 2084749312,2084753407,JP 2084753408,2084757503,KR @@ -43527,7 +45925,6 @@ 2087518208,2087519231,TH 2087519232,2087520255,SG 2087520256,2087522303,FM -2087522304,2087524351,BD 2087524352,2087526399,TH 2087526400,2087534591,PK 2087534592,2087542783,AU @@ -43638,9 +46035,7 @@ 2097610752,2097643519,AU 2097643520,2097676287,KR 2097676288,2098200575,JP -2098200576,2098623239,IN -2098623240,2098623240,PG -2098623241,2098724863,IN +2098200576,2098724863,IN 2098724864,2098987007,TH 2098987008,2099183615,JP 2099183616,2099199999,MO @@ -43648,9 +46043,7 @@ 2099216384,2099232767,KR 2099232768,2100297727,CN 2100297728,2100854783,JP -2100854784,2100874495,US -2100874496,2100874751,AU -2100874752,2100887551,US +2100854784,2100887551,US 2100887552,2100953087,KR 2100953088,2100969471,VN 2100969472,2100985855,JP @@ -43708,7 +46101,9 @@ 2111258624,2111275007,JP 2111275008,2111307775,HK 2111307776,2111832063,CN -2111832064,2112487423,TW +2111832064,2112082431,TW +2112082432,2112083199,CN +2112083200,2112487423,TW 2112487424,2112618495,VN 2112618496,2112880639,NZ 2112880640,2113560063,KR @@ -43716,13 +46111,21 @@ 2113560320,2113683455,KR 2113683456,2113685663,JP 2113685664,2113685695,SG -2113685696,2113687999,JP -2113688000,2113688031,AU -2113688032,2113688959,JP +2113685696,2113687295,JP +2113687296,2113687551,AU +2113687552,2113687807,JP +2113687808,2113688063,AU +2113688064,2113688959,JP 2113688960,2113688991,SG -2113688992,2113693599,JP +2113688992,2113691135,JP +2113691136,2113691391,SG +2113691392,2113693599,JP 2113693600,2113693615,HK -2113693616,2113716223,JP +2113693616,2113693879,JP +2113693880,2113693887,AU +2113693888,2113694175,JP +2113694176,2113694191,HK +2113694192,2113716223,JP 2113716224,2113724927,SG 2113724928,2113725183,IN 2113725184,2113728511,SG @@ -43731,6 +46134,7 @@ 2113761280,2113765375,VN 2113765376,2113798143,HK 2113798144,2113811455,AU +2113811456,2113812479,IN 2113812480,2113813503,JP 2113813504,2113830911,AU 2113830912,2113863679,CN @@ -43743,8 +46147,8 @@ 2147491840,2147494911,DE 2147494912,2147495167,RO 2147495168,2147495423,DE -2147495424,2147495935,RO -2147495936,2147497215,DE +2147495424,2147496959,RO +2147496960,2147497215,DE 2147497216,2147497471,RO 2147497472,2147498239,DE 2147498240,2147498495,RO @@ -43764,7 +46168,15 @@ 2147526656,2147528703,UA 2147528704,2147532799,CZ 2147532800,2147534847,DE -2147534848,2147549183,GR +2147534848,2147536127,GR +2147536128,2147536383,CY +2147536384,2147538431,GR +2147538432,2147538943,CY +2147538944,2147541247,GR +2147541248,2147541503,CY +2147541504,2147546623,GR +2147546624,2147546879,CY +2147546880,2147549183,GR 2147549184,2147942399,US 2147942400,2148007935,DE 2148007936,2148532223,US @@ -43817,10 +46229,16 @@ 2153387008,2153387263,CH 2153387264,2153387775,US 2153387776,2153388031,CH -2153388032,2153406463,US +2153388032,2153396991,US +2153396992,2153397247,IL +2153397248,2153397503,IN +2153397504,2153397759,SA +2153397760,2153398015,QA +2153398016,2153398271,BH +2153398272,2153406463,US 2153406464,2153407487,JP 2153407488,2153407743,HK -2153407744,2153407999,US +2153407744,2153407999,AE 2153408000,2153408511,BR 2153408512,2153408767,AU 2153408768,2153409023,PA @@ -43880,15 +46298,10 @@ 2156331008,2156593151,US 2156593152,2156658687,IL 2156658688,2156691455,IR -2156691456,2156691967,FR -2156691968,2156692223,A2 -2156692224,2156692479,FR -2156692480,2156692991,A2 -2156692992,2156693247,FR -2156693248,2156693503,A2 +2156691456,2156693503,A2 2156693504,2156693759,FR -2156693760,2156694783,A2 -2156694784,2156695039,FR +2156693760,2156694271,A2 +2156694272,2156695039,FR 2156695040,2156695551,A2 2156695552,2156697599,FR 2156697600,2156699647,GR @@ -43928,7 +46341,9 @@ 2160914432,2160918527,SA 2160918528,2161508351,US 2161508352,2161573887,FI -2161573888,2162687999,US +2161573888,2162228223,US +2162228224,2162228479,CA +2162228480,2162687999,US 2162688000,2162753535,GB 2162753536,2162819071,CA 2162819072,2162884607,SA @@ -43944,12 +46359,15 @@ 2163638528,2163671039,DE 2163671040,2163867647,US 2163867648,2163933183,AU -2163933184,2164981759,US +2163933184,2164260863,US +2164260864,2164326399,CM +2164326400,2164981759,US 2164981760,2165112831,GB 2165112832,2165178367,DE 2165178368,2165309439,US 2165309440,2165374975,SE 2165374976,2165440511,US +2165440512,2165506047,NG 2165506048,2165571583,US 2165571584,2165637119,FR 2165637120,2165964799,US @@ -43957,21 +46375,16 @@ 2166030336,2166095871,AT 2166095872,2166292479,US 2166292480,2166358015,GB -2166358016,2166466559,US -2166466560,2166466815,CA -2166466816,2166571007,US +2166358016,2166571007,US 2166571008,2166575103,GB -2166575104,2166575359,US -2166575360,2166575615,GB -2166575616,2166594563,US +2166575104,2166594563,US 2166594564,2166594564,DE -2166594565,2166606847,US -2166606848,2166607009,GB -2166607010,2166607010,DE -2166607011,2166607103,GB -2166607104,2166613759,US -2166613760,2166614015,DE -2166614016,2168193023,US +2166594565,2167209983,US +2167209984,2167242751,DZ +2167242752,2167275519,BF +2167275520,2167930879,US +2167930880,2167996415,NG +2167996416,2168193023,US 2168193024,2168258559,JP 2168258560,2168651775,US 2168651776,2168717311,GB @@ -43994,7 +46407,11 @@ 2170945536,2171011071,FR 2171011072,2171076607,DE 2171076608,2171142143,FR -2171142144,2172452863,US +2171142144,2172256255,US +2172256256,2172272639,GH +2172272640,2172289023,RE +2172289024,2172321791,AO +2172321792,2172452863,US 2172452864,2172518399,NL 2172518400,2172583935,US 2172583936,2172649471,AU @@ -44035,6 +46452,11 @@ 2177105920,2177302527,US 2177302528,2177368063,FR 2177368064,2177695743,US +2177695744,2177703935,UG +2177703936,2177720319,ZA +2177720320,2177728511,NG +2177728512,2177744895,ZA +2177744896,2177761279,BW 2177761280,2177826815,DE 2177826816,2177892351,US 2177892352,2177957887,SA @@ -44042,13 +46464,7 @@ 2178351104,2178416639,GB 2178416640,2178482175,US 2178482176,2178547711,DE -2178547712,2178900223,US -2178900224,2178900479,NZ -2178900480,2179391487,US -2179391488,2179391999,GB -2179392000,2179397632,US -2179397633,2179397633,GB -2179397634,2179465215,US +2178547712,2179465215,US 2179465216,2179497983,LS 2179497984,2179530751,ZA 2179530752,2179596287,DE @@ -44059,23 +46475,7 @@ 2180448256,2180513791,DE 2180513792,2180579327,US 2180579328,2180644863,JP -2180644864,2180645453,US -2180645454,2180645454,GB -2180645455,2180646372,US -2180646373,2180646373,DE -2180646374,2180657313,US -2180657314,2180657314,JP -2180657315,2180657317,US -2180657318,2180657318,JP -2180657319,2180657324,US -2180657325,2180657325,GB -2180657326,2180657340,US -2180657341,2180657341,NL -2180657342,2180657364,US -2180657365,2180657365,FR -2180657366,2180657372,US -2180657373,2180657373,DE -2180657374,2180907007,US +2180644864,2180907007,US 2180907008,2180972543,KR 2180972544,2181038079,US 2181038080,2181040127,GB @@ -44165,49 +46565,40 @@ 2187722752,2187788287,AU 2187788288,2187853823,US 2187853824,2187919359,BE -2187919360,2188378111,US +2187919360,2187984895,PH +2187984896,2188378111,US 2188378112,2188443647,NL 2188443648,2188509183,CA 2188509184,2188574719,US 2188574720,2188640255,NL 2188640256,2188705791,AU -2188705792,2188705857,EU -2188705858,2188705858,DE -2188705859,2188705957,EU -2188705958,2188705958,DE -2188705959,2188706101,EU -2188706102,2188706102,DE -2188706103,2188706453,EU -2188706454,2188706454,DK -2188706455,2188708607,EU -2188708608,2188708863,FR -2188708864,2188711800,EU -2188711801,2188711801,DE -2188711802,2188716031,EU -2188716032,2188716287,FR -2188716288,2188718581,EU -2188718582,2188718582,DE -2188718583,2188724463,EU +2188705792,2188706153,EU +2188706154,2188706154,SI +2188706155,2188718161,EU +2188718162,2188718162,SI +2188718163,2188718337,EU +2188718338,2188718338,AT +2188718339,2188718473,EU +2188718474,2188718474,AT +2188718475,2188724463,EU 2188724464,2188724464,NL -2188724465,2188724991,EU -2188724992,2188725247,RS -2188725248,2188726783,EU -2188726784,2188727039,GB -2188727040,2188728319,EU +2188724465,2188724735,EU +2188724736,2188724991,NL +2188724992,2188725247,EU +2188725248,2188725503,GB +2188725504,2188728319,EU 2188728320,2188728575,GB -2188728576,2188734463,EU -2188734464,2188734719,FR -2188734720,2188736511,EU +2188728576,2188729855,EU +2188729856,2188730111,ES +2188730112,2188736511,EU 2188736512,2188736767,GB 2188736768,2188738306,EU 2188738307,2188738307,GB -2188738308,2188749055,EU -2188749056,2188749311,SL -2188749312,2188750335,EU -2188750336,2188750591,US -2188750592,2188768767,EU -2188768768,2188769279,YT -2188769280,2188771327,EU +2188738308,2188749183,EU +2188749184,2188749311,SL +2188749312,2188754431,EU +2188754432,2188754687,RU +2188754688,2188771327,EU 2188771328,2188900351,US 2188900352,2188900607,EU 2188900608,2188902399,US @@ -44218,7 +46609,8 @@ 2189230080,2189295615,CH 2189295616,2189557759,US 2189557760,2189623295,AU -2189623296,2189754367,US +2189623296,2189688831,FR +2189688832,2189754367,US 2189754368,2189819903,DE 2189819904,2189950975,US 2189950976,2190016511,IT @@ -44237,9 +46629,7 @@ 2191458304,2191523839,GB 2191523840,2191589375,US 2191589376,2191654911,NL -2191654912,2192132863,US -2192132864,2192133119,DE -2192133120,2192769023,US +2191654912,2192769023,US 2192769024,2192834559,CA 2192834560,2192867327,DE 2192867328,2192883711,SY @@ -44267,7 +46657,9 @@ 2193205248,2193207295,FR 2193207296,2193209343,CZ 2193209344,2193211391,FR -2193211392,2193227775,BG +2193211392,2193223423,BG +2193223424,2193223679,GB +2193223680,2193227775,BG 2193227776,2193293311,IT 2193293312,2193358847,US 2193358848,2193424383,FI @@ -44290,9 +46682,13 @@ 2193707752,2193707759,IT 2193707760,2193708735,GB 2193708736,2193708743,IT -2193708744,2193709087,GB +2193708744,2193708967,GB +2193708968,2193708975,IT +2193708976,2193709087,GB 2193709088,2193709095,IT -2193709096,2193709631,GB +2193709096,2193709199,GB +2193709200,2193709215,IT +2193709216,2193709631,GB 2193709632,2193709639,IT 2193709640,2193711103,GB 2193711104,2193713151,DE @@ -44338,7 +46734,9 @@ 2197751808,2197753855,RU 2197753856,2197754879,GB 2197754880,2197755135,DK -2197755136,2197757951,GB +2197755136,2197756159,GB +2197756160,2197756175,PT +2197756176,2197757951,GB 2197757952,2197766143,RU 2197766144,2197768191,PS 2197768192,2197770239,DE @@ -44443,13 +46841,17 @@ 2204893184,2204894207,AR 2204894208,2204895231,PA 2204895232,2204897279,BR -2204897280,2204898303,HN +2204897280,2204898095,HN +2204898096,2204898111,CR +2204898112,2204898303,HN 2204898304,2204899327,PA 2204899328,2204902399,BR 2204902400,2204903423,CR 2204903424,2204904447,AR 2204904448,2204910591,BR -2204910592,2204911615,CL +2204910592,2204910847,AR +2204910848,2204911487,CL +2204911488,2204911615,CO 2204911616,2204913663,BR 2204913664,2204914687,AR 2204914688,2204929023,BR @@ -44486,7 +46888,7 @@ 2206400512,2206466047,US 2206466048,2207121407,CA 2207121408,2207449087,US -2207449088,2207514623,HK +2207449088,2207514623,JP 2207514624,2207647487,CA 2207647488,2207647743,US 2207647744,2207648511,CA @@ -44568,7 +46970,7 @@ 2211446784,2211643391,US 2211643392,2211708927,NL 2211708928,2211774463,US -2211774464,2211839999,HK +2211774464,2211839999,JP 2211840000,2212036607,US 2212036608,2212102143,AU 2212102144,2212233215,US @@ -44652,7 +47054,9 @@ 2214591488,2214592511,BR 2214592512,2218786815,US 2218786816,2219769855,IL -2219769856,2224160767,US +2219769856,2223111679,US +2223111680,2223111935,VI +2223111936,2224160767,US 2224160768,2224226303,GB 2224226304,2224242687,US 2224242688,2224259071,SG @@ -44683,10 +47087,10 @@ 2226847744,2226913279,DE 2226913280,2226921471,US 2226921472,2226921727,EU -2226921728,2227052543,US -2227052544,2227052609,EU -2227052610,2227052610,CH -2227052611,2227052799,EU +2226921728,2226999039,US +2226999040,2226999295,BE +2226999296,2227052543,US +2227052544,2227052799,EU 2227052800,2227109887,US 2227109888,2227175423,PE 2227175424,2227372031,US @@ -44735,7 +47139,9 @@ 2231333888,2231335935,BR 2231335936,2231336959,MX 2231336960,2231337983,BR -2231337984,2231339007,HN +2231337984,2231338695,HN +2231338696,2231338703,US +2231338704,2231339007,HN 2231339008,2231346175,BR 2231346176,2231347199,PY 2231347200,2231355391,BR @@ -44747,7 +47153,9 @@ 2231362560,2231364607,BR 2231364608,2231365631,CL 2231365632,2231369727,BR -2231369728,2248146943,JP +2231369728,2239889407,JP +2239889408,2239890431,US +2239890432,2248146943,JP 2248146944,2248148991,IT 2248148992,2248151039,ES 2248151040,2248153087,GB @@ -44791,9 +47199,7 @@ 2250047488,2250113023,US 2250113024,2250178559,DE 2250178560,2250244095,CA -2250244096,2250282239,US -2250282240,2250282495,GB -2250282496,2250375167,US +2250244096,2250375167,US 2250375168,2250440703,DE 2250440704,2250506239,US 2250506240,2250571775,GB @@ -44845,7 +47251,9 @@ 2255814656,2255880191,CA 2255880192,2255945727,US 2255945728,2256011263,DE -2256011264,2256666623,US +2256011264,2256551935,US +2256551936,2256601087,GB +2256601088,2256666623,US 2256666624,2256732159,DE 2256732160,2257190911,US 2257190912,2257256447,SE @@ -44859,12 +47267,9 @@ 2257716736,2257716991,EU 2257716992,2257717503,NL 2257717504,2257717759,GB -2257717760,2257718015,FR -2257718016,2257765119,NL +2257717760,2257765119,NL 2257765120,2257765375,EU -2257765376,2257771007,NL -2257771008,2257771263,NO -2257771264,2257776639,NL +2257765376,2257776639,NL 2257776640,2257776895,IN 2257776896,2257780735,NL 2257780736,2257846271,DE @@ -44903,9 +47308,7 @@ 2258594144,2258594175,HK 2258594176,2258594303,AU 2258594304,2258594607,HK -2258594608,2258594613,AP -2258594614,2258594614,HK -2258594615,2258594623,AP +2258594608,2258594623,AP 2258594624,2258594751,HK 2258594752,2258594815,AP 2258594816,2258595103,AU @@ -44929,9 +47332,7 @@ 2258597072,2258597079,TW 2258597080,2258597215,HK 2258597216,2258597263,AU -2258597264,2258597293,HK -2258597294,2258597294,PG -2258597295,2258597303,HK +2258597264,2258597303,HK 2258597304,2258597311,AU 2258597312,2258597367,HK 2258597368,2258597371,AU @@ -44979,16 +47380,13 @@ 2258602240,2258602495,HK 2258602496,2258602751,AU 2258602752,2258603071,HK -2258603072,2258603087,PG -2258603088,2258603089,HK -2258603090,2258603090,PG -2258603091,2258603103,HK -2258603104,2258603135,PG +2258603072,2258603087,AU +2258603088,2258603103,HK +2258603104,2258603135,AU 2258603136,2258603139,HK -2258603140,2258603199,PG +2258603140,2258603199,AU 2258603200,2258603207,HK -2258603208,2258603263,PG -2258603264,2258603775,AU +2258603208,2258603775,AU 2258603776,2258603839,HK 2258603840,2258603903,AU 2258603904,2258603943,HK @@ -45035,9 +47433,11 @@ 2258608656,2258608663,JP 2258608664,2258608671,AU 2258608672,2258608687,JP -2258608688,2258610175,AU -2258610176,2258610431,IN -2258610432,2258610703,AU +2258608688,2258610179,AU +2258610180,2258610183,IN +2258610184,2258610239,AU +2258610240,2258610303,IN +2258610304,2258610703,AU 2258610704,2258610719,TW 2258610720,2258610751,AU 2258610752,2258610755,TW @@ -45049,18 +47449,31 @@ 2258611120,2258611167,JP 2258611168,2258611215,AU 2258611216,2258611223,NZ -2258611224,2258611967,AU +2258611224,2258611711,AU +2258611712,2258611967,NZ 2258611968,2258612223,HK 2258612224,2258614783,AU 2258614784,2258614815,IN 2258614816,2258615039,AU 2258615040,2258615055,IN 2258615056,2258616319,AU -2258616320,2258632703,HK +2258616320,2258621951,HK +2258621952,2258622207,NZ +2258622208,2258622719,HK +2258622720,2258623231,NZ +2258623232,2258624255,HK +2258624256,2258624511,AU +2258624512,2258632703,HK 2258632704,2258698239,JP 2258698240,2259222527,US 2259222528,2259288063,DE -2259288064,2259353599,US +2259288064,2259304703,US +2259304704,2259304719,NL +2259304720,2259343391,US +2259343392,2259343423,HK +2259343424,2259343743,US +2259343744,2259343775,BR +2259343776,2259353599,US 2259353600,2259419135,DE 2259419136,2259681279,US 2259681280,2259746815,DE @@ -45075,9 +47488,7 @@ 2260467712,2260533247,NL 2260533248,2260598783,US 2260598784,2260664319,CA -2260664320,2260720639,GB -2260720640,2260720895,DE -2260720896,2260723711,GB +2260664320,2260723711,GB 2260723712,2260723967,IL 2260723968,2260729343,GB 2260729344,2260729599,IL @@ -45113,7 +47524,7 @@ 2263613440,2263678975,TH 2263678976,2263744511,JP 2263744512,2263810047,US -2263810048,2263875583,GB +2263810048,2263875583,SA 2263875584,2264203263,US 2264203264,2264268799,DE 2264268800,2264334335,FR @@ -45127,11 +47538,15 @@ 2264905728,2264907775,ES 2264907776,2264924159,DE 2264924160,2264989695,CA -2264989696,2265605887,US +2264989696,2265055231,US +2265055232,2265448447,FR +2265448448,2265605887,US 2265605888,2265606143,GB 2265606144,2265710847,US 2265710848,2265776127,CA -2265776128,2266169343,US +2265776128,2265841663,FR +2265841664,2266103807,US +2266103808,2266169343,FR 2266169344,2266234879,CA 2266234880,2266431487,US 2266431488,2266497023,CA @@ -45140,25 +47555,43 @@ 2266694912,2270488575,US 2270488576,2270490623,MO 2270490624,2270494719,IN -2270494720,2276786175,US +2270494720,2270756863,FR +2270756864,2270953471,US +2270953472,2271084543,FR +2271084544,2271674367,US +2271674368,2271805439,FR +2271805440,2272067583,US +2272067584,2272133119,FR +2272133120,2276786175,US 2276786176,2276851711,CA -2276851712,2277769215,US +2276851712,2276917247,US +2276917248,2276982783,FR +2276982784,2277048319,US +2277048320,2277113855,FR +2277113856,2277769215,US 2277769216,2277834751,GB -2277834752,2280998911,US +2277834752,2279342079,US +2279342080,2280982527,FR +2280982528,2280982783,US +2280982784,2280983039,FR +2280983040,2280983295,US +2280983296,2280992779,FR +2280992780,2280992781,CA +2280992782,2280993023,FR +2280993024,2280993035,CA +2280993036,2280993036,US +2280993037,2280993279,CA +2280993280,2280998911,FR 2280998912,2280999167,EU -2280999168,2281007103,US +2280999168,2281007103,FR 2281007104,2281007359,IN -2281007360,2281010159,US -2281010160,2281010175,SG -2281010176,2281023487,US +2281007360,2281023487,FR 2281023488,2281023743,IN -2281023744,2281029631,US -2281029632,2281029887,FR -2281029888,2281037823,US -2281037824,2281037951,FR -2281037952,2281701375,US +2281023744,2281701375,FR 2281701376,2281705471,CH -2281705472,2282226019,US +2281705472,2281705727,US +2281705728,2281705983,CN +2281705984,2282226019,US 2282226020,2282226020,AP 2282226021,2282226175,US 2282226176,2282226243,AU @@ -45192,11 +47625,11 @@ 2292842496,2292908031,GB 2292908032,2292973567,US 2292973568,2293039103,DE -2293039104,2293054975,EU -2293054976,2293055231,LU -2293055232,2293080575,EU +2293039104,2293080575,EU 2293080576,2293080831,BE -2293080832,2293104639,EU +2293080832,2293085183,EU +2293085184,2293085439,BE +2293085440,2293104639,EU 2293104640,2293825535,US 2293825536,2293891071,IN 2293891072,2293956607,AU @@ -45219,11 +47652,7 @@ 2297298944,2297364479,CH 2297364480,2297626623,US 2297626624,2297692159,DE -2297692160,2298144255,US -2298144256,2298144511,GB -2298144512,2298371071,US -2298371072,2298371327,GB -2298371328,2299461631,US +2297692160,2299461631,US 2299461632,2299527167,CA 2299527168,2299592703,US 2299592704,2299658239,NL @@ -45241,14 +47670,28 @@ 2302083072,2302214143,NL 2302214144,2302279679,US 2302279680,2302345215,SE +2302345216,2302346239,IN +2302346240,2302347263,BD +2302347264,2302348287,IN +2302348288,2302349311,ID +2302349312,2302351359,HK +2302351360,2302357503,VN +2302357504,2302358527,BD +2302358528,2302363647,IN +2302363648,2302364671,JP +2302364672,2302365695,IN +2302365696,2302366719,HK +2302366720,2302367743,IN +2302367744,2302368767,CN 2302410752,2302541823,SE 2302541824,2302607359,CH -2302607360,2302640127,SC +2302607360,2302625761,SC +2302625762,2302625762,CA +2302625763,2302640127,SC +2302640128,2302672895,UG 2302672896,2302935039,US 2302935040,2303000575,KR -2303000576,2303189557,US -2303189558,2303189558,IE -2303189559,2303190527,US +2303000576,2303190527,US 2303190528,2303190783,AP 2303190784,2303262719,US 2303262720,2303328255,GB @@ -45427,7 +47870,7 @@ 2317651968,2317652991,PE 2317652992,2317654015,AR 2317654016,2317655039,MX -2317655040,2317670399,BR +2317655040,2317671423,BR 2317671424,2317672447,AR 2317672448,2317675519,BR 2317675520,2317676543,AR @@ -45459,6 +47902,7 @@ 2319152128,2319153151,VE 2319153152,2319156223,BR 2319156224,2319157247,CR +2319157248,2319158271,BR 2319158272,2319159295,AR 2319159296,2319160319,BR 2319160320,2319161343,PA @@ -45468,7 +47912,9 @@ 2319167488,2319168511,HN 2319168512,2319174655,BR 2319174656,2319175679,HN -2319175680,2319187967,BR +2319175680,2319184895,BR +2319184896,2319185919,AR +2319185920,2319187967,BR 2319187968,2319319039,US 2319319040,2319384575,NO 2319384576,2319450111,FR @@ -45494,36 +47940,86 @@ 2321420288,2321430527,BR 2321430528,2321431551,CR 2321431552,2321446911,BR -2321446912,2321447935,HN -2321447936,2321453055,BR +2321446912,2321447727,HN +2321447728,2321447743,NL +2321447744,2321447935,HN +2321447936,2321452031,BR +2321452032,2321453055,MX 2321453056,2321454079,HN -2321454080,2321456127,BR -2321457152,2321471487,BR +2321454080,2321471487,BR 2321471488,2321472511,HN 2321472512,2321477631,BR 2321477632,2321478655,TT +2321478656,2321479679,SV +2321479680,2321480703,GY +2321480704,2321481727,GT 2321481728,2321547263,US 2321547264,2321612799,FR 2321612800,2321627135,BR 2321627136,2321628159,CO 2321628160,2321633279,BR 2321633280,2321634303,CO -2321634304,2321661951,BR -2321662976,2321663999,BR +2321634304,2321648639,BR +2321648640,2321649663,SV +2321649664,2321652735,BR +2321652736,2321653759,BZ +2321653760,2321654783,NI +2321654784,2321655807,BR +2321655808,2321656831,MX +2321656832,2321657855,BR +2321657856,2321658879,AR +2321658880,2321663999,BR 2321664000,2321665023,AR -2321665024,2321666047,BR +2321665024,2321673215,BR +2321673216,2321674239,AR +2321674240,2321676287,BR +2321676288,2321677311,DO +2321677312,2321678335,BR 2321678336,2321743871,US 2321743872,2321744895,SV 2321744896,2321745919,AR 2321745920,2321753087,BR 2321753088,2321754111,HN +2321754112,2321755135,BR 2321755136,2321756159,UY -2321756160,2321774591,BR +2321756160,2321769471,BR +2321769472,2321770495,PY +2321770496,2321774719,BR +2321774720,2321774847,PE +2321774848,2321774975,AR +2321774976,2321775103,VE +2321775104,2321775231,PE +2321775232,2321775359,BR +2321775360,2321775487,EC +2321775488,2321775615,AR 2321775616,2321776639,VE +2321776640,2321777663,AR +2321777664,2321778687,BR +2321778688,2321779711,PA +2321779712,2321780735,BR +2321780736,2321780991,PA +2321780992,2321781247,BR +2321781248,2321781503,PA +2321781504,2321781759,BR +2321781760,2321782783,MX +2321782784,2321787903,BR +2321787904,2321788927,AR +2321788928,2321789951,CL +2321789952,2321790975,SV +2321790976,2321791999,AR +2321792000,2321797119,BR +2321797120,2321798143,BZ +2321798144,2321799167,CW +2321799168,2321800191,BZ +2321800192,2321801215,VE +2321801216,2321802239,CL +2321802240,2321804287,BR +2321804288,2321805311,DO +2321805312,2321809407,BR 2321809408,2321874943,ES 2321874944,2321940479,JP 2321940480,2322006015,FR -2322006016,2322071551,US +2322006016,2322071551,SE 2322071552,2322130431,GB 2322130432,2322130687,SG 2322130688,2322137087,GB @@ -45532,17 +48028,196 @@ 2322268160,2322333695,JP 2322333696,2322368511,US 2322368512,2322368767,MY -2322368768,2322923519,US +2322368768,2322563583,US +2322563584,2322563839,FI +2322563840,2322923519,US +2322923520,2322924543,BR +2322924544,2322925567,NI +2322925568,2322929663,AR +2322929664,2322933759,BR +2322933760,2322934783,CO +2322934784,2322935807,VE +2322935808,2322936831,AR +2322936832,2322940927,BR +2322940928,2322941951,CL +2322941952,2322942975,BR +2322942976,2322943999,AR +2322944000,2322945023,BR +2322945024,2322946047,CO +2322946048,2322948095,BR +2322948096,2322949119,HN +2322949120,2322951167,BR +2322951168,2322952191,CO +2322952192,2322953215,AR +2322953216,2322956287,BR +2322956288,2322957311,AR +2322957312,2322958335,BR +2322958336,2322959359,CO +2322959360,2322960383,GT +2322960384,2322961407,BR +2322961408,2322962431,CL +2322962432,2322963455,BR +2322963456,2322964479,AR +2322964480,2322965503,PE +2322965504,2322974719,BR +2322974720,2322975743,AR +2322975744,2322980863,BR +2322989056,2322991103,BR +2322991104,2322992127,CL +2322992128,2322998271,BR +2322998272,2322999295,AR +2322999296,2323001343,BR +2323001344,2323002367,AR +2323002368,2323009535,BR +2323009536,2323010559,CR +2323010560,2323015679,BR +2323015680,2323016703,GT +2323016704,2323017727,BR +2323017728,2323018751,AR +2323018752,2323020799,BR +2323020800,2323021823,PA +2323021824,2323025919,BR +2323025920,2323026943,AR +2323026944,2323028991,BR +2323028992,2323030015,CR +2323030016,2323042303,BR +2323042304,2323045375,AR +2323045376,2323054591,BR 2323054592,2323120127,CA +2323120128,2323185663,US +2323185664,2323186687,BR +2323186688,2323187711,CO +2323187712,2323188735,BR +2323188736,2323189759,CO +2323189760,2323205119,BR +2323205120,2323209215,AR +2323209216,2323210239,BR +2323210240,2323211263,CL +2323211264,2323213311,AR +2323213312,2323214335,CL +2323214336,2323215359,AR +2323215360,2323217407,BR +2323217408,2323218431,AR +2323218432,2323221503,BR +2323221504,2323222527,CR +2323222528,2323225599,BR +2323225600,2323226623,CO +2323226624,2323227647,AR +2323227648,2323228671,BR +2323228672,2323229695,CL +2323229696,2323230719,BR +2323230720,2323231743,CL +2323231744,2323236863,BR +2323236864,2323237887,CO +2323237888,2323244031,BR +2323244032,2323245055,AR +2323245056,2323247103,BR +2323247104,2323248127,AR +2323248128,2323252223,BR +2323252224,2323253247,VE +2323253248,2323257343,BR +2323257344,2323258367,CR +2323258368,2323275775,BR +2323275776,2323276799,MX +2323276800,2323278847,BR +2323278848,2323279871,EC +2323279872,2323283967,BR +2323283968,2323284991,AR +2323284992,2323288063,BR +2323288064,2323289087,MX +2323289088,2323291135,BR +2323291136,2323292159,AR +2323292160,2323293183,PY +2323293184,2323298303,BR +2323298304,2323299327,PY +2323299328,2323300351,AR +2323300352,2323301375,HN +2323301376,2323302399,BR +2323302400,2323303423,CO +2323303424,2323308543,BR +2323308544,2323309567,CL +2323309568,2323310591,AR +2323310592,2323313663,BR +2323313664,2323314687,CR +2323314688,2323315711,BR +2323315712,2323316735,MX 2323316736,2323382271,US 2323382272,2323447807,NO -2323447808,2323775487,US +2323447808,2323690495,US +2323690496,2323690751,IN +2323690752,2323699711,US +2323699712,2323700735,NL +2323700736,2323701759,US +2323701760,2323709951,VG +2323709952,2323775487,US 2323775488,2323841023,AU 2323841024,2323906559,CH 2323906560,2323972095,IT 2323972096,2324037631,US 2324037632,2324103167,IL 2324103168,2327379967,US +2327379968,2327380991,MX +2327380992,2327383039,BR +2327383040,2327384063,CL +2327384064,2327387135,BR +2327387136,2327388159,NI +2327388160,2327396351,BR +2327396352,2327398399,VE +2327398400,2327399423,BR +2327399424,2327400447,BZ +2327400448,2327401471,AR +2327401472,2327406591,BR +2327406592,2327407615,NI +2327407616,2327408639,BR +2327408640,2327409663,AR +2327409664,2327410687,PE +2327410688,2327414783,BR +2327414784,2327415807,EC +2327415808,2327416831,AR +2327416832,2327432191,BR +2327432192,2327433215,AR +2327433216,2327434239,BQ +2327434240,2327437311,BR +2327437312,2327438335,MX +2327438336,2327443455,BR +2327443456,2327444479,CR +2327444480,2327446527,BR +2327446528,2327447551,VE +2327447552,2327448575,CL +2327448576,2327449599,PA +2327449600,2327450623,BR +2327450624,2327451647,CO +2327451648,2327452671,BR +2327452672,2327453695,MX +2327453696,2327460863,BR +2327460864,2327461887,PY +2327461888,2327462911,MX +2327462912,2327468031,BR +2327468032,2327469055,PA +2327469056,2327471103,BR +2327471104,2327472127,MX +2327472128,2327476223,BR +2327476224,2327477247,CL +2327477248,2327480319,BR +2327480320,2327481343,HN +2327481344,2327482367,AR +2327482368,2327483391,BR +2327483392,2327485439,AR +2327485440,2327486463,BR +2327486464,2327487487,AR +2327487488,2327490559,BR +2327490560,2327491583,VE +2327491584,2327493631,BR +2327493632,2327494655,CO +2327494656,2327496703,BR +2327496704,2327497727,MX +2327497728,2327498751,BR +2327498752,2327499775,HN +2327499776,2327501823,AR +2327501824,2327507967,BR +2327507968,2327508991,AR +2327508992,2327510015,SV +2327510016,2327511039,AR 2327511040,2327838719,CH 2327838720,2327969791,US 2327969792,2328035327,AU @@ -45555,6 +48230,29 @@ 2328363008,2328494079,DE 2328494080,2328559615,US 2328559616,2328625151,BE +2328625152,2328627199,AR +2328627200,2328628223,BR +2328628224,2328629247,BZ +2328629248,2328635391,BR +2328635392,2328636415,AR +2328636416,2328652799,BR +2328652800,2328653823,PA +2328653824,2328664063,BR +2328664064,2328667135,AR +2328667136,2328668159,BR +2328668160,2328669183,MX +2328669184,2328671231,BR +2328671232,2328672255,HN +2328672256,2328677375,BR +2328677376,2328678399,MX +2328678400,2328680447,BR +2328680448,2328681471,AR +2328681472,2328683519,BR +2328683520,2328684543,CL +2328684544,2328685567,BR +2328685568,2328686591,VE +2328686592,2328687615,BR +2328687616,2328690687,AR 2328690688,2328756223,BE 2328756224,2328797439,CH 2328797440,2328797695,AU @@ -45567,6 +48265,37 @@ 2329411584,2329477119,FI 2329477120,2329542655,AU 2329542656,2329608191,CA +2329608192,2329610239,AR +2329610240,2329611263,PY +2329611264,2329612287,SV +2329612288,2329613311,AR +2329613312,2329617407,BR +2329617408,2329618431,MX +2329618432,2329619455,AR +2329619456,2329622527,BR +2329622528,2329623551,CL +2329623552,2329624575,AR +2329624576,2329626623,BR +2329626624,2329627647,HN +2329627648,2329628671,BR +2329628672,2329629695,AR +2329629696,2329638911,BR +2329638912,2329639935,HN +2329639936,2329644031,BR +2329644032,2329645055,CW +2329645056,2329648127,BR +2329648128,2329649151,SV +2329649152,2329650175,AR +2329650176,2329652223,BR +2329652224,2329653247,HN +2329653248,2329662463,BR +2329662464,2329664511,AR +2329664512,2329666559,BR +2329666560,2329667583,CL +2329667584,2329668607,AR +2329668608,2329671679,BR +2329671680,2329672703,AR +2329672704,2329673727,BR 2329673728,2329739263,US 2329739264,2329804799,CH 2329804800,2329870335,DE @@ -45599,11 +48328,28 @@ 2331639808,2331770879,GB 2331836416,2331901951,GB 2331901952,2331967487,US +2331967488,2331980799,BR +2331980800,2331981567,PA +2331981568,2331981823,US +2331981824,2331982847,BR +2331982848,2331983871,MX +2331983872,2331987967,BR +2331987968,2331988991,AR +2331988992,2331990015,BR +2331990016,2331991039,AR +2331991040,2331992063,BR +2331992064,2331994111,CL +2331994112,2331997183,BR +2331997184,2331998207,MX +2331998208,2332006399,BR +2332006400,2332007423,SV +2332007424,2332010495,BR +2332010496,2332011519,AR +2332011520,2332030975,BR +2332030976,2332031999,DO +2332032000,2332033023,AW 2332033024,2332098559,ID -2332098560,2332298751,DE -2332298752,2332298879,GB -2332298880,2332360703,DE -2332426240,2332622847,DE +2332098560,2332622847,DE 2332622848,2332688383,CN 2332688384,2332753919,NL 2332753920,2333868031,DE @@ -45624,7 +48370,9 @@ 2335965184,2336161791,US 2336161792,2336227327,NL 2336292864,2336358399,US -2336358400,2336423935,FI +2336358400,2336411647,FI +2336411648,2336412671,SG +2336412672,2336423935,FI 2336423936,2336882687,US 2336882688,2336948223,FI 2336948224,2337013759,DE @@ -45673,7 +48421,9 @@ 2338848768,2338914303,US 2338914304,2339962879,NO 2339962880,2340028415,US -2340028416,2340093951,SE +2340028416,2340081663,SE +2340081664,2340081919,BR +2340081920,2340093951,SE 2340093952,2340159487,FI 2340159488,2340225023,FR 2340225024,2340421631,US @@ -45706,7 +48456,13 @@ 2342518784,2342584319,FR 2342584320,2342649856,US 2342649857,2342658047,SG -2342658048,2342715391,US +2342658048,2342682623,US +2342682624,2342690815,DE +2342690816,2342700247,US +2342700248,2342700248,GB +2342700249,2342705120,US +2342705121,2342705121,GB +2342705122,2342715391,US 2342715392,2342780927,AU 2342780928,2342846463,NO 2342846464,2342911999,BE @@ -45846,8 +48602,8 @@ 2365587456,2365589503,JO 2365589504,2365590527,US 2365590528,2365591039,NO -2365591040,2365591455,EU -2365591456,2365591551,NO +2365591040,2365591295,EU +2365591296,2365591551,NO 2365591552,2365593599,DE 2365593600,2365595647,NL 2365595648,2365603839,GB @@ -45866,7 +48622,9 @@ 2366032896,2366033151,GB 2366033152,2366111743,DE 2366111744,2366144511,MT -2366144512,2366149375,RU +2366144512,2366148479,RU +2366148480,2366148607,US +2366148608,2366149375,RU 2366149376,2366149407,DE 2366149408,2366149423,PL 2366149424,2366149439,SK @@ -45890,9 +48648,7 @@ 2366167040,2366169087,GB 2366169088,2366171135,CH 2366171136,2366308351,DE -2366308352,2366368255,GB -2366368256,2366368511,FR -2366368512,2366373887,GB +2366308352,2366373887,GB 2366373888,2367487999,DE 2367488000,2367553535,SI 2367553536,2370895871,DE @@ -45911,25 +48667,19 @@ 2372214784,2372218879,DE 2372218880,2372222463,FR 2372222464,2372222975,CH -2372222976,2372224511,EU -2372224512,2372224767,GB -2372224768,2372227071,EU +2372222976,2372224655,EU +2372224656,2372224671,GB +2372224672,2372227071,EU 2372227072,2372227327,NO -2372227328,2372227499,EU -2372227500,2372227510,NO -2372227511,2372227519,EU -2372227520,2372227522,NO -2372227523,2372227570,EU -2372227571,2372227571,NO -2372227572,2372228351,EU -2372228352,2372228607,KR -2372228608,2372230399,EU -2372230400,2372230655,RU -2372230656,2372231679,EU +2372227328,2372227839,EU +2372227840,2372228607,KR +2372228608,2372231167,EU +2372231168,2372231295,HU +2372231296,2372231679,EU 2372231680,2372232191,GB -2372232192,2372233471,EU -2372233472,2372233727,NO -2372233728,2372238729,EU +2372232192,2372233727,EU +2372233728,2372233983,GB +2372233984,2372238729,EU 2372238730,2372238730,US 2372238731,2372239359,EU 2372239360,2372240383,SK @@ -45956,11 +48706,11 @@ 2372503552,2372505599,UA 2372505600,2372507647,NL 2372507648,2372509695,IT -2372509696,2372510207,A2 -2372510208,2372510335,AO +2372509696,2372510335,A2 2372510336,2372510336,ES -2372510337,2372510463,AO -2372510464,2372511743,A2 +2372510337,2372510719,A2 +2372510720,2372510975,AO +2372510976,2372511743,A2 2372511744,2372513791,BA 2372513792,2372534271,GB 2372534272,2372665343,US @@ -45969,18 +48719,22 @@ 2372796416,2372993023,US 2372993024,2373025791,DE 2373025792,2373026047,SG -2373026048,2373058559,DE +2373026048,2373031423,DE +2373031424,2373031679,US +2373031680,2373036031,DE +2373036032,2373038079,US +2373038080,2373058559,DE 2373058560,2373124095,US 2373124096,2373189631,FR 2373189632,2373255167,US 2373255168,2373451775,CA 2373451776,2373517311,AU 2373517312,2373582847,US -2373582848,2373623807,CH -2373623808,2373627102,AU +2373582848,2373626879,CH +2373626880,2373627102,AU 2373627103,2373627103,CH -2373627104,2373627903,AU -2373627904,2373648383,CH +2373627104,2373627135,AU +2373627136,2373648383,CH 2373648384,2373910527,US 2373910528,2373911041,FI 2373911042,2373911042,EU @@ -46028,9 +48782,7 @@ 2375090176,2375155711,NO 2375155712,2375221247,US 2375221248,2375352319,SE -2375352320,2376079615,US -2376079616,2376079871,GB -2376079872,2376269823,US +2375352320,2376269823,US 2376269824,2376335359,GB 2376335360,2376597503,US 2376597504,2376663039,AU @@ -46052,7 +48804,9 @@ 2377449472,2377515007,FR 2377515008,2377842687,US 2377842688,2377908223,GB -2377908224,2378022911,US +2377908224,2378010111,US +2378010112,2378010367,AU +2378010368,2378022911,US 2378022912,2378023423,HK 2378023424,2378025983,US 2378025984,2378026239,NL @@ -46074,7 +48828,9 @@ 2378500608,2378500863,GB 2378500864,2378501631,US 2378501632,2378501887,EU -2378501888,2378694655,US +2378501888,2378504191,US +2378504192,2378504447,NL +2378504448,2378694655,US 2378694656,2378760191,DE 2378760192,2378825727,AT 2378825728,2378891263,US @@ -46092,11 +48848,7 @@ 2380465152,2380465407,FR 2380465408,2380465663,AP 2380465664,2380529663,FR -2380529664,2380558847,GB -2380558848,2380559103,ZA -2380559104,2380578815,GB -2380578816,2380579071,JP -2380579072,2380593663,GB +2380529664,2380593663,GB 2380593664,2380593919,AP 2380593920,2380595199,GB 2380660736,2380726271,US @@ -46117,10 +48869,10 @@ 2382168064,2382233599,BE 2382233600,2382299135,US 2382299136,2382331903,GR -2382331904,2382336255,FR -2382336256,2382337791,NL -2382337792,2382338047,FR -2382338048,2382340095,NL +2382331904,2382335999,FR +2382336000,2382337279,NL +2382337280,2382337535,FR +2382337536,2382340095,NL 2382340096,2382342143,CH 2382342144,2382344191,AT 2382344192,2382346239,NL @@ -46160,11 +48912,13 @@ 2382692352,2383085567,CA 2383085568,2383151103,US 2383151104,2385903615,CA -2385903616,2385915903,US +2385903616,2385908735,US +2385908736,2385909759,VG +2385909760,2385915903,US 2385915904,2385919999,CA 2385920000,2385952767,US 2385952768,2385954815,BM -2385954816,2385955327,US +2385954816,2385955839,US 2385955840,2385956863,TC 2385956864,2385969151,US 2385969152,2386624511,CA @@ -46178,7 +48932,9 @@ 2387003648,2387003903,CA 2387003904,2387004159,CH 2387004160,2387344127,CA -2387344128,2387345407,US +2387344128,2387344895,US +2387344896,2387345151,CA +2387345152,2387345407,US 2387345408,2387410943,CA 2387410944,2387476479,US 2387476480,2387542015,CA @@ -46199,18 +48955,37 @@ 2390995456,2391015423,US 2391015424,2391277567,CA 2391277568,2391343103,US -2391343104,2392012799,CA -2392012800,2392013823,US -2392013824,2392020991,CA -2392020992,2392021247,HK -2392021248,2392021503,JP -2392021504,2392021759,US +2391343104,2391998463,CA +2391998464,2392002303,US +2392002304,2392010751,CA +2392010752,2392011263,US +2392011264,2392011519,CA +2392011520,2392011775,US +2392011776,2392012543,CA +2392012544,2392014079,US +2392014080,2392014335,CA +2392015360,2392015871,CA +2392015872,2392017407,US +2392017408,2392017663,CA +2392017664,2392018431,US +2392018432,2392018687,CA +2392018688,2392018943,US +2392018944,2392019199,CA +2392019200,2392019455,US +2392019456,2392019967,CA +2392019968,2392021759,US 2392021760,2392022015,NL 2392022016,2392022271,FR 2392022272,2392022527,DE 2392022528,2392022783,GB 2392022784,2392023039,US -2392023040,2394947583,CA +2392023040,2392024319,CA +2392024320,2392024575,US +2392024576,2392025087,VI +2392025088,2392063999,US +2392064000,2392096767,CA +2392096768,2392129535,US +2392129536,2394947583,CA 2394947584,2395013119,US 2395013120,2395209727,CA 2395209728,2395340799,US @@ -46225,7 +49000,33 @@ 2398945280,2399010815,CA 2399010816,2399109119,US 2399109120,2399141887,PR -2399141888,2401036287,US +2399141888,2399148031,BR +2399148032,2399149055,DO +2399149056,2399150079,BR +2399150080,2399151103,BQ +2399151104,2399158271,BR +2399158272,2399159295,AR +2399159296,2399161343,BR +2399161344,2399163391,AR +2399163392,2399165439,BR +2399165440,2399166463,CO +2399166464,2399167487,VE +2399167488,2399167743,AR +2399167744,2399167999,BO +2399168512,2399169535,SV +2399169536,2399170559,CO +2399170560,2399182847,BR +2399182848,2399183871,CR +2399183872,2399184895,BR +2399184896,2399185919,AR +2399185920,2399186943,TT +2399186944,2399202303,BR +2399202304,2399203327,HN +2399203328,2399204351,CL +2399204352,2399205375,AR +2399205376,2399206399,PE +2399206400,2399207423,BR +2399207424,2401036287,US 2401036288,2401036543,EU 2401036544,2401828863,US 2401828864,2401894399,GB @@ -46269,6 +49070,28 @@ 2407661568,2407727103,AT 2407727104,2408054783,US 2408054784,2408120319,JP +2408120320,2408125439,BR +2408125440,2408126463,AR +2408126464,2408127487,NI +2408127488,2408140799,BR +2408140800,2408141823,DO +2408141824,2408144895,BR +2408144896,2408145919,CO +2408145920,2408147967,BR +2408147968,2408148991,MX +2408148992,2408150015,BO +2408150016,2408157183,BR +2408157184,2408158207,PE +2408158208,2408159231,CR +2408159232,2408162303,BR +2408162304,2408164351,HN +2408164352,2408169471,BR +2408169472,2408170495,TT +2408170496,2408178687,BR +2408178688,2408179711,HN +2408179712,2408182783,BR +2408182784,2408183807,AR +2408183808,2408185855,BR 2408185856,2409562111,US 2409562112,2409627647,GB 2409627648,2409693183,ZA @@ -46289,11 +49112,54 @@ 2411462656,2411593727,AU 2411593728,2411749375,US 2411749376,2411753471,MY -2411753472,2411986943,US +2411753472,2411757567,SG +2411757568,2411986943,US 2411986944,2412052479,FR -2412052480,2412576767,US +2412052480,2412314623,US +2412380160,2412383231,BR +2412383232,2412384255,CL +2412384256,2412387327,AR +2412387328,2412388351,BR +2412388352,2412389375,AR +2412389376,2412399615,BR +2412399616,2412400639,MX +2412400640,2412402687,BR +2412402688,2412403711,AR +2412403712,2412404735,BR +2412404736,2412405759,AR +2412405760,2412414975,BR +2412414976,2412415999,AR +2412416000,2412417023,CL +2412417024,2412418047,AR +2412418048,2412419071,BR +2412419072,2412420095,PA +2412420096,2412421119,MX +2412421120,2412422143,CR +2412423168,2412429311,BR +2412429312,2412430335,AR +2412430336,2412431359,HN +2412431360,2412432383,AR +2412432384,2412433407,MX +2412433408,2412434431,PY +2412434432,2412444671,BR +2412444672,2412445695,NI +2412445696,2412576767,US 2412576768,2412642303,AT 2412642304,2412773375,US +2412773376,2412777471,BR +2412777472,2412778495,HN +2412778496,2412782591,BR +2412782592,2412783615,AR +2412784640,2412786687,AR +2412786688,2412787711,CL +2412787712,2412788735,GT +2412788736,2412789759,BR +2412789760,2412790783,CO +2412790784,2412791807,BR +2412797952,2412799999,BR +2412806144,2412814335,BR +2412815360,2412816383,DO +2412817408,2412822527,BR 2412838912,2412904447,US 2412904448,2412969983,GB 2412969984,2413297663,US @@ -46302,7 +49168,9 @@ 2413428736,2413494271,AU 2413494272,2413625343,US 2413625344,2413690879,JP -2413690880,2413821951,US +2413690880,2413758463,US +2413758464,2413758975,GB +2413758976,2413821951,US 2413821952,2413887487,AT 2413887488,2413953023,IT 2413953024,2414411775,US @@ -46322,7 +49190,13 @@ 2415788032,2415853567,US 2415919104,2415984639,CN 2416050176,2416058367,US -2416058368,2416115711,NL +2416058368,2416084991,NL +2416084992,2416085247,AU +2416085248,2416085503,NL +2416085504,2416085759,US +2416085760,2416086015,NL +2416086016,2416086271,SG +2416086272,2416115711,NL 2416115712,2416181247,US 2416181248,2416246783,FI 2416246784,2416312319,US @@ -46330,7 +49204,9 @@ 2416377856,2416443391,CN 2416443392,2416705535,US 2416705536,2416771071,CN -2416771072,2416963583,US +2416771072,2416916479,US +2416916480,2416916735,AU +2416916736,2416963583,US 2416963584,2416963839,EU 2416963840,2416967679,US 2416967680,2417033215,IN @@ -46343,17 +49219,129 @@ 2417688576,2417754111,SE 2417754112,2418016255,US 2418016256,2418081791,GB -2418081792,2418312959,US -2418312960,2418313215,IN -2418313216,2418323007,US -2418323008,2418323008,PH -2418323009,2418334719,US -2418334720,2418338815,IN -2418338816,2418341887,US -2418341888,2418342143,IN -2418342144,2418342399,US -2418342400,2418342911,IN -2418342912,2418606079,US +2418081792,2418278655,US +2418278656,2418278911,ZA +2418278912,2418279487,US +2418279488,2418279491,ES +2418279492,2418281151,US +2418281152,2418281215,IN +2418281216,2418281983,US +2418281984,2418282239,ES +2418282240,2418284543,US +2418284544,2418285055,CA +2418285056,2418285567,MX +2418285568,2418286335,US +2418286336,2418286591,MX +2418286592,2418287103,CA +2418287104,2418287295,US +2418287296,2418287359,GB +2418287360,2418291199,US +2418291200,2418292223,AR +2418292224,2418292735,PH +2418292736,2418294015,US +2418294016,2418294783,AR +2418294784,2418294911,US +2418294912,2418295039,GB +2418295040,2418295807,US +2418295808,2418295935,GB +2418295936,2418295947,US +2418295948,2418295951,GB +2418295952,2418296063,US +2418296064,2418296319,DE +2418296320,2418297343,IN +2418297344,2418297855,US +2418297856,2418298367,BR +2418298368,2418298623,ZA +2418298624,2418301439,US +2418301440,2418301695,PH +2418301696,2418302463,US +2418302464,2418302719,PH +2418302720,2418302975,US +2418302976,2418303231,IN +2418303232,2418303487,ZA +2418303488,2418303871,US +2418303872,2418303879,GB +2418303880,2418304511,US +2418304512,2418304671,GB +2418304672,2418304767,US +2418304768,2418304895,DE +2418304896,2418305151,US +2418305152,2418305279,IN +2418305280,2418305535,ES +2418305536,2418306303,US +2418306304,2418306559,GB +2418306560,2418307327,MU +2418307328,2418307455,US +2418307456,2418307583,PH +2418307584,2418308095,LV +2418308096,2418308351,PH +2418308352,2418308383,GB +2418308384,2418308607,US +2418308608,2418309119,RO +2418309120,2418309631,PL +2418309632,2418310143,US +2418310144,2418310655,PH +2418310656,2418311167,US +2418311168,2418311679,IN +2418311680,2418312703,CZ +2418312704,2418313215,IN +2418313216,2418314239,PH +2418314240,2418314751,IN +2418314752,2418315007,PH +2418315008,2418315135,IN +2418315136,2418315263,US +2418315264,2418315775,IN +2418315776,2418316287,CN +2418316288,2418316799,IN +2418316800,2418317055,AU +2418317056,2418317311,JP +2418317312,2418317823,PH +2418317824,2418318079,US +2418318080,2418318335,IN +2418318336,2418319871,PH +2418319872,2418320127,KR +2418320128,2418320191,US +2418320192,2418320255,AU +2418320256,2418320319,IN +2418320320,2418320383,PH +2418320384,2418321407,US +2418321408,2418322431,PH +2418322432,2418322687,US +2418322688,2418322847,IN +2418322848,2418323455,US +2418323456,2418323711,IN +2418323712,2418323967,US +2418323968,2418324479,IN +2418324480,2418324735,PH +2418324736,2418324799,IN +2418324800,2418324991,US +2418324992,2418326015,IN +2418326016,2418326527,PH +2418326528,2418327039,IN +2418327040,2418327423,US +2418327424,2418327487,PH +2418327488,2418328063,US +2418328064,2418328831,SK +2418328832,2418329599,US +2418329600,2418330367,SK +2418330368,2418331135,US +2418331136,2418331647,IN +2418331648,2418332159,US +2418332160,2418332671,IN +2418332672,2418333183,PH +2418333184,2418334207,IN +2418334208,2418334463,CN +2418334464,2418334719,PH +2418334720,2418339071,IN +2418339072,2418339839,MU +2418339840,2418340351,CN +2418340352,2418340863,US +2418340864,2418341375,IN +2418341376,2418341887,PH +2418341888,2418342911,IN +2418342912,2418343423,PH +2418343424,2418343935,IN +2418343936,2418606079,US 2418606080,2418671615,DE 2418671616,2418737151,US 2418737152,2418802687,NL @@ -46418,7 +49406,9 @@ 2425487360,2426667007,US 2426667008,2426732543,NO 2426732544,2426798079,FR -2426798080,2427224063,US +2426798080,2426942463,US +2426942464,2426943487,CA +2426943488,2427224063,US 2427224064,2427256831,CA 2427256832,2427322367,GB 2427322368,2427453439,US @@ -46430,9 +49420,7 @@ 2427544832,2427584511,NO 2427584512,2427650047,GB 2427650048,2427846655,NO -2427846656,2428174335,US -2428174336,2428178431,GB -2428178432,2428183562,US +2427846656,2428183562,US 2428183563,2428183563,EU 2428183564,2428567551,US 2428567552,2428633087,NO @@ -46455,13 +49443,11 @@ 2429797376,2429878271,US 2429878272,2429943807,JP 2429943808,2430009343,HK -2430009344,2432172031,US +2430009344,2431846143,US +2431846144,2431846399,GB +2431846400,2432172031,US 2432172032,2432237567,BE -2432237568,2432568575,US -2432568576,2432568831,BE -2432568832,2432587263,US -2432587264,2432587519,IE -2432587520,2432616447,US +2432237568,2432616447,US 2432616448,2432617471,NL 2432617472,2432630783,US 2432630784,2432696319,CN @@ -46470,30 +49456,24 @@ 2433247488,2433810431,NL 2433810432,2433875967,GB 2433875968,2435055615,NL -2435055616,2435121151,GB +2435055616,2435071743,GB +2435071744,2435071999,NL +2435072000,2435121151,GB 2435121152,2436300799,NL 2436300800,2436366335,GB 2436366336,2436759551,NL 2436759552,2436767743,GB -2436767744,2436767874,EU -2436767875,2436767875,DE -2436767876,2436767999,EU +2436767744,2436767999,EU 2436768000,2436775935,GB 2436775936,2436784127,DE 2436784128,2436825087,GB -2436825088,2436955647,NL -2436955648,2436955903,DE -2436955904,2441150463,NL +2436825088,2441150463,NL 2441150464,2441215999,BE 2441216000,2446983167,NL 2446983168,2447048703,EU 2447048704,2447376383,NL -2447376384,2447384575,GB -2447384576,2447384831,BE -2447384832,2447441919,GB -2447441920,2447446271,DE -2447446272,2447446527,GB -2447446528,2447507455,DE +2447376384,2447441919,GB +2447441920,2447507455,DE 2447507456,2447572991,FR 2447572992,2447638527,GB 2447638528,2447704063,DE @@ -46521,7 +49501,8 @@ 2448851968,2448883711,GB 2448883712,2448949247,FI 2448949248,2449014783,FR -2449014784,2449080319,RU +2449014784,2449045503,RU +2449045504,2449080319,KZ 2449080320,2449145855,CH 2449145856,2449211391,SE 2449211392,2449276927,CH @@ -46530,8 +49511,7 @@ 2449420288,2449422335,DE 2449422336,2449424383,DK 2449424384,2449440767,OM -2449440768,2449441279,NL -2449441280,2449442815,RO +2449440768,2449442815,NL 2449442816,2449444863,RU 2449444864,2449448959,SK 2449448960,2449457151,KZ @@ -46545,8 +49525,8 @@ 2449479680,2449481727,FR 2449481728,2449485823,DE 2449485824,2449487871,IE -2449487872,2449488127,GB -2449488128,2449489919,RO +2449487872,2449488383,GB +2449488384,2449489919,RO 2449489920,2449490943,FR 2449490944,2449491199,DE 2449491200,2449491967,FR @@ -46570,15 +49550,11 @@ 2451026432,2451026687,AU 2451026688,2451031039,US 2451031040,2451031295,AP -2451031296,2451031807,US -2451031808,2451032063,SG -2451032064,2451035135,US +2451031296,2451035135,US 2451035136,2451035391,EU -2451035392,2451042815,US -2451042816,2451043071,ZA -2451043072,2451986959,US -2451986960,2451986960,GB -2451986961,2452619263,US +2451035392,2451042559,US +2451042560,2451043071,ZA +2451043072,2452619263,US 2452619264,2452684799,IT 2452684800,2452750335,US 2452750336,2452815871,NL @@ -46625,26 +49601,16 @@ 2454585344,2454716415,US 2454716416,2454781951,GB 2454781952,2454847487,FI -2454847488,2454851327,US -2454851328,2454851583,DE +2454847488,2454851583,US 2454851584,2454851839,DK -2454851840,2454853119,US +2454851840,2454852863,US +2454852864,2454853119,BE 2454853120,2454853375,DK -2454853376,2454864895,US -2454864896,2454865151,FR -2454865152,2454885503,US -2454885504,2454885631,GB -2454885632,2454887423,US +2454853376,2454887423,US 2454887424,2454887679,DK -2454887680,2454904999,US -2454905000,2454905007,BR -2454905008,2454905919,US +2454887680,2454905919,US 2454905920,2454905951,AR -2454905952,2454906943,US -2454906944,2454906951,CL -2454906952,2454907263,US -2454907264,2454907391,CL -2454907392,2454907903,US +2454905952,2454907903,US 2454907904,2454908159,VE 2454908160,2454913023,US 2454913024,2454978559,CL @@ -46655,7 +49621,8 @@ 2455245568,2455245823,SG 2455245824,2455246847,AU 2455246848,2455247871,IN -2455247872,2455248895,US +2455247872,2455248127,AU +2455248128,2455248895,US 2455248896,2455257087,TH 2455257088,2455261183,PH 2455261184,2455262207,MY @@ -46664,13 +49631,16 @@ 2455265280,2455273471,US 2455273472,2455275519,AU 2455275520,2455279615,US -2455279616,2455281663,MO +2455279616,2455280127,MO +2455280128,2455280383,MY +2455280384,2455281663,MO 2455281664,2455285759,IN 2455285760,2455371775,US 2455371776,2455437311,GB 2455437312,2455830527,US 2455830528,2455896063,GB -2455896064,2456027135,US +2455896064,2455961599,US +2455961600,2456027135,JP 2456027136,2456092671,IT 2456092672,2456158207,GB 2456158208,2456223743,CZ @@ -46679,7 +49649,9 @@ 2456354816,2456420351,GB 2456420352,2456485887,EU 2456485888,2456551423,DE -2456551424,2456603135,AT +2456551424,2456602623,AT +2456602624,2456602879,DE +2456602880,2456603135,AT 2456603136,2456603391,EU 2456603392,2456616959,AT 2456616960,2456682495,CH @@ -46736,9 +49708,11 @@ 2459828224,2459860991,RU 2459860992,2459893759,ES 2459893760,2459959295,CH -2459959296,2460024831,US +2459959296,2460024831,JP 2460024832,2460090367,FI -2460090368,2460155903,GB +2460090368,2460152319,GB +2460152320,2460152575,FR +2460152576,2460155903,GB 2460155904,2460221439,US 2460221440,2460286975,BR 2460286976,2460549119,US @@ -46906,9 +49880,7 @@ 2470248448,2470510591,US 2470510592,2470576127,BR 2470576128,2470641663,AU -2470641664,2470703359,LU -2470703360,2470703615,BE -2470703616,2470707199,LU +2470641664,2470707199,LU 2470707200,2470772735,GB 2470772736,2470838271,AU 2470838272,2471165951,US @@ -46937,7 +49909,9 @@ 2472935424,2473000959,GR 2473000960,2473332735,US 2473332736,2473333247,AE -2473333248,2473342975,US +2473333248,2473336831,US +2473336832,2473338879,AU +2473338880,2473342975,US 2473342976,2473345023,GB 2473345024,2473345535,US 2473345536,2473346047,AE @@ -46950,9 +49924,7 @@ 2473459712,2473525247,ZA 2473525248,2473656319,NO 2473656320,2473721855,US -2473721856,2473730559,GB -2473730560,2473731071,HK -2473731072,2473785599,GB +2473721856,2473785599,GB 2473785600,2473785708,AP 2473785709,2473785709,HK 2473785710,2473785855,AP @@ -47050,9 +50022,9 @@ 2486960128,2487025663,FR 2487025664,2487369727,US 2487369728,2487386111,PF -2487386112,2487877631,US -2487877632,2487943167,A2 -2487943168,2488205311,US +2487386112,2487418879,US +2487418880,2487549951,JP +2487549952,2488205311,US 2488205312,2488270847,GB 2488270848,2488336383,US 2488336384,2488401919,PL @@ -47067,7 +50039,9 @@ 2489843712,2489995544,US 2489995545,2489995545,AP 2489995546,2490013695,US -2490013696,2490015743,GB +2490013696,2490014011,GB +2490014012,2490014012,US +2490014013,2490015743,GB 2490015744,2490041599,US 2490041600,2490041855,AP 2490041856,2490043391,US @@ -47094,7 +50068,9 @@ 2492989440,2493513727,US 2493513728,2493579263,SE 2493579264,2493644799,JP -2493644800,2494103551,US +2493644800,2493756415,US +2493756416,2493757439,CA +2493757440,2494103551,US 2494103552,2494169087,FR 2494169088,2494562303,US 2494562304,2494627839,GB @@ -47102,9 +50078,7 @@ 2494650624,2494650879,BR 2494650880,2494660607,US 2494660608,2494661119,EU -2494661120,2494677247,US -2494677248,2494677503,AU -2494677504,2494677759,US +2494661120,2494677759,US 2494677760,2494678015,AU 2494678016,2494683391,US 2494683392,2494683647,AP @@ -47117,9 +50091,11 @@ 2495152128,2495217663,EU 2495217664,2495283199,US 2495283200,2495348735,CH -2495348736,2495349051,US +2495348736,2495348991,US +2495348992,2495349051,DE 2495349052,2495349052,EU -2495349053,2495351039,US +2495349053,2495349247,DE +2495349248,2495351039,US 2495351040,2495351295,EU 2495351296,2495353143,US 2495353144,2495353144,EU @@ -47129,9 +50105,7 @@ 2495807488,2495873023,AU 2495873024,2495938559,CH 2495938560,2496004095,GB -2496004096,2496015103,AT -2496015104,2496015359,PL -2496015360,2496069631,AT +2496004096,2496069631,AT 2496069632,2496135167,US 2496135168,2496200703,NL 2496200704,2497682431,MX @@ -47140,9 +50114,7 @@ 2498475008,2498476031,EC 2498476032,2499110519,MX 2499110520,2499110527,NI -2499110528,2499128575,MX -2499128576,2499128831,US -2499128832,2499477503,MX +2499110528,2499477503,MX 2499477504,2499543039,DE 2499543040,2499674111,GB 2499674112,2499739647,US @@ -47163,95 +50135,102 @@ 2500132992,2500133023,NL 2500133024,2500141055,US 2500141056,2500141311,IE -2500141312,2500141471,US -2500141472,2500141503,IE -2500141504,2500141823,US -2500141824,2500144127,IE -2500144128,2500144895,US +2500141312,2500141823,US +2500141824,2500142847,IE +2500142848,2500143103,US +2500143104,2500143615,IE +2500143616,2500144895,US 2500144896,2500145151,IE 2500145152,2500149503,US 2500149504,2500149759,GB -2500149760,2500150527,US -2500150528,2500150783,GB -2500150784,2500161023,US -2500161024,2500161535,GB -2500161536,2500161791,US -2500161792,2500162047,GB +2500149760,2500150655,US +2500150656,2500150719,GB +2500150720,2500155647,US +2500155648,2500155903,GB +2500155904,2500161023,US +2500161024,2500162047,GB 2500162048,2500162559,US 2500162560,2500162815,GB 2500162816,2500166143,US 2500166144,2500166399,GB 2500166400,2500170751,US 2500170752,2500170752,FI -2500170753,2500175871,US -2500175872,2500175879,RO -2500175880,2500177935,US +2500170753,2500177935,US 2500177936,2500177943,PL -2500177944,2500188679,US +2500177944,2500180735,US +2500180736,2500180991,HR +2500180992,2500188679,US 2500188680,2500188687,CH 2500188688,2500196351,US 2500196352,2500198399,FI 2500198400,2500198911,US 2500198912,2500199167,GB -2500199168,2500199423,US -2500199424,2500199679,IE -2500199680,2500200703,US -2500200704,2500200959,GB -2500200960,2500201535,US +2500199168,2500199471,US +2500199472,2500199475,IE +2500199476,2500201535,US 2500201536,2500201543,GB 2500201544,2500202879,US 2500202880,2500203007,ES -2500203008,2500212415,US +2500203008,2500209919,US +2500209920,2500210175,GB +2500210176,2500212415,US 2500212416,2500212423,CH 2500212424,2500212991,US 2500212992,2500213247,ES -2500213248,2500219135,US -2500219136,2500219391,DE -2500219392,2500221455,US +2500213248,2500221455,US 2500221456,2500221459,FR 2500221460,2500225551,US 2500225552,2500225559,ES -2500225560,2500228607,US -2500228608,2500228863,FR -2500228864,2500230041,US +2500225560,2500230041,US 2500230042,2500230042,GB 2500230043,2500235775,US 2500235776,2500236031,ES -2500236032,2500236543,GB -2500236544,2500236837,US +2500236032,2500236837,US 2500236838,2500236838,ES 2500236839,2500238047,US 2500238048,2500238055,FR -2500238056,2500238079,US -2500238080,2500238335,YT -2500238336,2500238383,US -2500238384,2500238399,DE -2500238400,2500238463,US -2500238464,2500238527,DE -2500238528,2500245503,US -2500245504,2500245759,GB -2500245760,2500246015,US -2500246016,2500246527,GB +2500238056,2500239615,US +2500239616,2500239871,FR +2500239872,2500240383,US +2500240384,2500240639,FR +2500240640,2500240895,US +2500240896,2500241407,FR +2500241408,2500246271,US +2500246272,2500246527,GB 2500246528,2500247551,US 2500247552,2500248575,ES -2500248576,2500272127,US -2500272128,2500272639,GB -2500272640,2500276223,US +2500248576,2500249599,US +2500249600,2500249855,ES +2500249856,2500263935,US +2500263936,2500264191,FR +2500264192,2500272127,US +2500272128,2500272383,GB +2500272384,2500273151,US +2500273152,2500273407,GB +2500273408,2500275199,US +2500275200,2500275455,GB +2500275456,2500276223,US 2500276224,2500276735,GB 2500276736,2500276991,US 2500276992,2500277247,GB 2500277248,2500278751,US 2500278752,2500278783,GB -2500278784,2500289023,US -2500289024,2500289151,FR -2500289152,2500292607,US +2500278784,2500288511,US +2500288512,2500288767,FR +2500288768,2500289023,US +2500289024,2500289279,FR +2500289280,2500290559,US +2500290560,2500290815,FR +2500290816,2500292607,US 2500292608,2500292863,DE -2500292864,2500293375,US -2500293376,2500293631,DE -2500293632,2500313855,US +2500292864,2500313855,US 2500313856,2500314111,AT -2500314112,2500319231,US -2500319232,2500321279,ES +2500314112,2500318207,US +2500318208,2500318463,IT +2500318464,2500319439,US +2500319440,2500319471,ES +2500319472,2500319487,US +2500319488,2500321279,ES 2500321280,2500392959,US 2500392960,2500393215,IN 2500393216,2500393983,US @@ -47259,44 +50238,48 @@ 2500394240,2500532749,US 2500532750,2500532750,GR 2500532751,2500535295,US -2500535296,2500535551,IE -2500535552,2500537343,US -2500537344,2500537599,GB -2500537600,2500537687,US -2500537688,2500537695,GB -2500537696,2500542751,US +2500535296,2500535807,IE +2500535808,2500537599,US +2500537600,2500537855,GB +2500537856,2500542751,US 2500542752,2500542755,NL 2500542756,2500551679,US 2500551680,2500551935,FR -2500551936,2500553759,US -2500553760,2500553767,GB -2500553768,2500554379,US +2500551936,2500553727,US +2500553728,2500553983,GB +2500553984,2500554379,US 2500554380,2500554487,DE 2500554488,2500555263,US 2500555264,2500555519,FR -2500555520,2500562719,US +2500555520,2500558847,US +2500558848,2500559103,FR +2500559104,2500559359,US +2500559360,2500559615,FR +2500559616,2500562431,US +2500562432,2500562687,GB +2500562688,2500562719,US 2500562720,2500562727,GB 2500562728,2500562767,US 2500562768,2500562775,GB -2500562776,2500562959,US -2500562960,2500562967,ES -2500562968,2500568679,US +2500562776,2500562943,US +2500562944,2500563199,ES +2500563200,2500567039,US +2500567040,2500567295,GB +2500567296,2500568679,US 2500568680,2500568683,GB 2500568684,2500591615,US 2500591616,2500595711,GB -2500595712,2500608511,US -2500608512,2500608767,ES -2500608768,2500609023,US -2500609024,2500609535,ES -2500609536,2500616191,US -2500616192,2500616703,IT -2500616704,2500636735,US -2500636736,2500636799,GB -2500636800,2500637727,US +2500595712,2500596223,US +2500596224,2500596735,CH +2500596736,2500616191,US +2500616192,2500616447,IT +2500616448,2500637727,US 2500637728,2500637759,GB 2500637760,2500638719,US 2500638720,2500639743,GB -2500639744,2500646911,US +2500639744,2500644863,US +2500644864,2500645119,FR +2500645120,2500646911,US 2500646912,2500647935,ES 2500647936,2500666111,US 2500666112,2500666367,EU @@ -47304,27 +50287,35 @@ 2500666464,2500666471,LU 2500666472,2500681759,US 2500681760,2500681767,PL -2500681768,2500687871,US +2500681768,2500685823,US +2500685824,2500686079,FR +2500686080,2500687871,US 2500687872,2500689919,FR -2500689920,2500694271,US -2500694272,2500694783,IT +2500689920,2500694527,US +2500694528,2500694783,IT 2500694784,2500719103,US -2500719104,2500720639,IE -2500720640,2500720652,US -2500720653,2500720653,IE -2500720654,2500720895,US -2500720896,2500721151,IE -2500721152,2500723799,US +2500719104,2500721151,IE +2500721152,2500723711,US +2500723712,2500723799,GB 2500723800,2500723807,ES -2500723808,2500743215,US +2500723808,2500723967,GB +2500723968,2500728063,US +2500728064,2500728319,GB +2500728320,2500739599,US +2500739600,2500739607,DE +2500739608,2500743215,US 2500743216,2500743223,GB 2500743224,2500984831,US -2500984832,2501001215,GB -2501001216,2501574655,US +2500984832,2501017599,GB +2501017600,2501574655,US 2501574656,2501640191,KZ -2501640192,2503016447,US -2503016448,2503081983,IL -2503081984,2503671807,US +2501640192,2502033407,US +2502033408,2502037503,LU +2502037504,2502041599,US +2502041600,2502045695,ES +2502045696,2503016447,US +2503016448,2503147519,IL +2503147520,2503671807,US 2503671808,2503737343,NL 2503737344,2503868415,US 2503868416,2503876607,RU @@ -47340,53 +50331,43 @@ 2503917568,2503933951,BG 2503933952,2504180735,US 2504180736,2504180991,ES -2504180992,2504470527,US -2504470528,2504470783,ES -2504470784,2504472831,US +2504180992,2504472831,US 2504472832,2504473599,ES 2504473600,2504474623,US 2504474624,2504482815,HR 2504482816,2504486911,ES 2504486912,2504491007,US 2504491008,2504499199,IT -2504499200,2504519679,US -2504519680,2504519935,IT -2504519936,2504520191,DE -2504520192,2504521215,US -2504521216,2504521471,CH -2504521472,2504521727,NL -2504521728,2504921087,US -2504921088,2504921343,IL -2504921344,2504921855,US -2504921856,2504922111,IL -2504922112,2504922879,US -2504922880,2504923391,IL -2504923392,2504925951,US -2504925952,2504926207,IL -2504926208,2504926975,US -2504926976,2504927231,IL -2504927232,2504927743,US -2504927744,2504927999,IL -2504928000,2504934399,US -2504934400,2504934655,IL -2504934656,2504935935,US -2504935936,2504936191,IL -2504936192,2504936447,US -2504936448,2504936703,IL -2504936704,2504938751,US -2504938752,2504939007,IL -2504939008,2504939519,US -2504939520,2504939775,IL -2504939776,2504943871,US -2504943872,2504944639,IL -2504944640,2504944895,US -2504944896,2504945663,IL -2504945664,2504946687,US -2504946688,2504946943,IL -2504946944,2504947711,US -2504947712,2504947967,IL -2504947968,2504949759,US -2504949760,2504982527,IL +2504499200,2504499455,US +2504499456,2504499711,IE +2504499712,2504917503,US +2504917504,2504917759,IL +2504917760,2504918642,US +2504918643,2504918643,IL +2504918644,2504920831,US +2504920832,2504921087,IL +2504921088,2504923135,US +2504923136,2504923391,IL +2504923392,2504925695,US +2504925696,2504926207,IL +2504926208,2504926719,US +2504926720,2504926975,IL +2504926976,2504931583,US +2504931584,2504931839,IL +2504931840,2504936191,US +2504936192,2504936447,IL +2504936448,2504938495,US +2504938496,2504938751,IL +2504938752,2504943615,US +2504943616,2504944639,IL +2504944640,2504945151,US +2504945152,2504945407,IL +2504945408,2504945663,US +2504945664,2504946175,IL +2504946176,2504946431,US +2504946432,2504946687,IL +2504946688,2504949503,US +2504949504,2504982527,IL 2504982528,2505457663,US 2505457664,2505459711,IE 2505459712,2505469439,US @@ -47407,15 +50388,19 @@ 2505790464,2505791487,US 2505791488,2505792511,FR 2505792512,2505793535,US -2505793536,2505801727,ES -2505801728,2506293247,US +2505793536,2505803775,ES +2505803776,2506293247,US 2506293248,2506358783,CA -2506358784,2506359295,ES -2506359296,2506360831,US -2506360832,2506361087,ES -2506361088,2506401791,US -2506401792,2506402815,IT -2506402816,2506489855,US +2506358784,2506359039,ES +2506359040,2506360063,US +2506360064,2506360319,ES +2506360320,2506360575,US +2506360576,2506361087,ES +2506361088,2506399999,US +2506400000,2506400255,IT +2506400256,2506401791,US +2506401792,2506403839,IT +2506403840,2506489855,US 2506489856,2506498047,ES 2506498048,2506499071,FR 2506499072,2506506239,ES @@ -47455,9 +50440,7 @@ 2508324864,2508455935,US 2508455936,2508521471,IT 2508521472,2508587007,CH -2508587008,2508631295,BE -2508631296,2508631551,US -2508631552,2508652543,BE +2508587008,2508652543,BE 2508652544,2508718079,AU 2508718080,2508914687,US 2508914688,2508980223,IT @@ -47504,12 +50487,64 @@ 2512912384,2512945151,HU 2512945152,2512977919,JO 2512977920,2513043455,DE -2513043456,2513108991,FR +2513043456,2513044691,FR +2513044692,2513044695,IT +2513044696,2513044703,FR +2513044704,2513044735,DE +2513044736,2513044751,FR +2513044752,2513044767,BE +2513044768,2513044799,ES +2513044800,2513044815,FR +2513044816,2513044831,IT +2513044832,2513045247,FR +2513045248,2513045255,CZ +2513045256,2513046591,FR +2513046592,2513046623,ES +2513046624,2513048047,FR +2513048048,2513048063,ES +2513048064,2513049375,FR +2513049376,2513049407,DE +2513049408,2513049551,FR +2513049552,2513049567,ES +2513049568,2513051487,FR +2513051488,2513051519,GB +2513051520,2513057045,FR +2513057046,2513057046,PT +2513057047,2513068207,FR +2513068208,2513068223,DE +2513068224,2513068287,NL +2513068288,2513070559,FR +2513070560,2513070591,ES +2513070592,2513070623,FR +2513070624,2513070655,ES +2513070656,2513073791,FR +2513073792,2513073855,IT +2513073856,2513073951,FR +2513073952,2513073983,ES +2513073984,2513076471,FR +2513076472,2513076479,ES +2513076480,2513078367,FR +2513078368,2513078371,GB +2513078372,2513079250,FR +2513079251,2513079254,ES +2513079255,2513080031,FR +2513080032,2513080063,IT +2513080064,2513081327,FR +2513081328,2513081343,ES +2513081344,2513081935,FR +2513081936,2513081939,DE +2513081940,2513082561,FR +2513082562,2513082562,GB +2513082563,2513102899,FR +2513102900,2513102903,CZ +2513102904,2513108991,FR 2513108992,2513502207,DE 2513502208,2513567743,NO 2513567744,2513600511,GR 2513600512,2513633279,NL -2513633280,2513698815,DE +2513633280,2513672495,DE +2513672496,2513672496,US +2513672497,2513698815,DE 2513698816,2513764351,DK 2513764352,2514419711,DE 2514419712,2514485247,GB @@ -47522,6 +50557,7 @@ 2515664896,2516037631,DE 2516037632,2516038143,DK 2516038144,2516058111,DE +2516058112,2516123647,CA 2516123648,2516254719,DE 2516254720,2516320255,FR 2516320256,2516451327,US @@ -47564,15 +50600,10 @@ 2516563968,2516566015,GB 2516566016,2516582399,IQ 2516582400,2516647935,CN -2516647936,2521186303,JP -2521186304,2521194495,US -2521194496,2521206783,JP -2521206784,2521210879,US -2521210880,2521223167,JP -2521223168,2521227263,DE -2521227264,2523201535,JP +2516647936,2523201535,JP 2523201536,2523267071,AU -2523267072,2523529215,US +2523267072,2523463679,US +2523463680,2523529215,CA 2523529216,2523594751,NO 2523594752,2523595775,HK 2523595776,2523596799,KH @@ -47622,7 +50653,8 @@ 2524971008,2525036543,ES 2525036544,2525037567,IN 2525037568,2525038591,PK -2525038592,2525039615,HK +2525038592,2525039359,CN +2525039360,2525039615,HK 2525039616,2525040639,AU 2525040640,2525041151,BD 2525041152,2525041407,ID @@ -47643,7 +50675,7 @@ 2525060096,2525061119,AU 2525061120,2525062143,TW 2525062144,2525071359,IN -2525071360,2525072383,HK +2525071360,2525072383,CN 2525072384,2525073407,MN 2525073408,2525075455,IN 2525075456,2525076479,CN @@ -47725,13 +50757,14 @@ 2532465664,2532467711,CN 2532467712,2532468735,TW 2532468736,2532469759,BD -2532469760,2532470783,ID +2532469760,2532470783,TL 2532470784,2532473855,CN 2532473856,2532474879,HK 2532474880,2532475903,NZ 2532475904,2532476927,KR 2532476928,2532477951,AU -2532477952,2532478975,IN +2532477952,2532478463,IN +2532478464,2532478975,AE 2532478976,2532479999,KR 2532480000,2532481023,IN 2532481024,2532486143,CN @@ -47741,7 +50774,8 @@ 2532492288,2532495359,IN 2532495360,2532496383,HK 2532496384,2532497407,CN -2532497408,2532499455,HK +2532497408,2532498431,HK +2532498432,2532499455,US 2532499456,2532500479,CN 2532500480,2532501503,HK 2532501504,2532506623,CN @@ -47753,20 +50787,33 @@ 2533097472,2533228543,US 2533228544,2533294079,PL 2533294080,2533359615,CN -2533359616,2533369855,UA -2533369856,2533371903,BG -2533371904,2533375999,UA +2533359616,2533367807,UA +2533367808,2533369855,BG +2533369856,2533375999,UA 2533376000,2533392383,HU 2533392384,2538602495,IT 2538602496,2538604967,FR 2538604968,2538604975,ES -2538604976,2538606031,FR +2538604976,2538605271,FR +2538605272,2538605279,ES +2538605280,2538606027,FR +2538606028,2538606031,DE 2538606032,2538606039,ES 2538606040,2538606043,FR 2538606044,2538606047,DE -2538606048,2538619903,FR +2538606048,2538606403,FR +2538606404,2538606407,GB +2538606408,2538619359,FR +2538619360,2538619375,ES +2538619376,2538619431,FR +2538619432,2538619435,DE +2538619436,2538619903,FR 2538619904,2538619911,ES -2538619912,2538634227,FR +2538619912,2538625527,FR +2538625528,2538625535,DE +2538625536,2538626687,FR +2538626688,2538626703,ES +2538626704,2538634227,FR 2538634228,2538634231,DE 2538634232,2538644015,FR 2538644016,2538644039,ES @@ -47782,7 +50829,11 @@ 2538646272,2538646399,BE 2538646400,2538646783,FR 2538646784,2538647039,CZ -2538647040,2538648591,FR +2538647040,2538648015,FR +2538648016,2538648031,ES +2538648032,2538648239,FR +2538648240,2538648255,DE +2538648256,2538648591,FR 2538648592,2538648623,BE 2538648624,2538649767,FR 2538649768,2538649775,DE @@ -47804,14 +50855,27 @@ 2538651280,2538651283,DE 2538651284,2538652727,FR 2538652728,2538652731,DE -2538652732,2538653379,FR +2538652732,2538653327,FR +2538653328,2538653331,CZ +2538653332,2538653379,FR 2538653380,2538653383,DE 2538653384,2538653387,ES 2538653388,2538653927,FR 2538653928,2538653931,ES -2538653932,2538656959,FR +2538653932,2538656515,FR +2538656516,2538656519,IT +2538656520,2538656959,FR 2538656960,2538656975,ES -2538656976,2538668031,FR +2538656976,2538657135,FR +2538657136,2538657139,RO +2538657140,2538658347,FR +2538658348,2538658351,DE +2538658352,2538658623,FR +2538658624,2538658655,NL +2538658656,2538664847,FR +2538664848,2538664863,NL +2538664864,2538664895,DE +2538664896,2538668031,FR 2538668032,2539978751,IT 2539978752,2540240895,US 2540240896,2540306431,FI @@ -47832,9 +50896,7 @@ 2542338048,2543583231,US 2543583232,2543648767,SE 2543648768,2543714303,NO -2543779840,2544154840,US -2544154841,2544154842,CA -2544154843,2544500735,US +2543779840,2544500735,US 2544500736,2544566271,GB 2544566272,2544631807,US 2544697344,2544828415,US @@ -47859,7 +50921,7 @@ 2547187712,2547318783,GB 2547318784,2547515391,US 2547523584,2547535871,GB -2547540480,2547540735,SE +2547535872,2547548159,BG 2547548160,2547580927,NO 2548039680,2548563967,GB 2548563968,2548826111,IR @@ -47948,7 +51010,7 @@ 2549901312,2549903359,RU 2549903360,2549905407,ES 2549905408,2549907455,GB -2549907456,2549923839,DE +2549907456,2549923839,SE 2549923840,2549927935,BG 2549927936,2549929983,HR 2549929984,2549932031,DE @@ -47958,9 +51020,11 @@ 2550136832,2550202367,DO 2550202368,2553544703,US 2553544704,2553610239,IN -2553610240,2554211383,US +2553610240,2554211327,US +2554211328,2554211383,SG 2554211384,2554211387,AP -2554211388,2554227967,US +2554211388,2554211583,SG +2554211584,2554227967,US 2554227968,2554228029,EU 2554228030,2554228030,US 2554228031,2554228223,EU @@ -48007,7 +51071,9 @@ 2557673472,2557739007,DK 2557739008,2557870079,US 2557870080,2557935615,ID -2557935616,2558789571,US +2557935616,2558658499,US +2558658500,2558658500,PR +2558658501,2558789571,US 2558789572,2558789572,PR 2558789573,2558918655,US 2558918656,2558984191,GB @@ -48073,17 +51139,37 @@ 2570190848,2572681215,US 2572681216,2572746751,SE 2572746752,2572943359,US -2572943360,2572955647,DE +2572943360,2572951551,DE +2572951552,2572953599,US +2572953600,2572953855,BY +2572953856,2572954111,HK +2572954112,2572954367,DE +2572954368,2572954623,HK +2572954624,2572954879,AU +2572954880,2572955135,HK +2572955136,2572955388,DE +2572955389,2572955389,HK +2572955390,2572955647,DE 2572955648,2572959743,BR -2572959744,2572976127,DE -2572976128,2572989439,NL +2572959744,2572960255,DE +2572960256,2572960511,SE +2572960512,2572960767,BE +2572960768,2572961023,FR +2572961024,2572961279,CH +2572961280,2572961535,IT +2572961536,2572961791,ES +2572961792,2572968447,DE +2572968448,2572968959,CZ +2572968960,2572975103,BR +2572975104,2572975615,DE +2572975616,2572975871,SE +2572975872,2572989439,NL 2572989440,2572989951,GR -2572989952,2572991487,DE +2572989952,2572991487,NL 2572991488,2573000703,BR -2573000704,2573336575,DE -2573336576,2573353983,EU -2573353984,2573354239,BE -2573354240,2573369343,EU +2573000704,2573008895,FR +2573008896,2573336575,DE +2573336576,2573369343,EU 2573369344,2573402111,DE 2573402112,2573467647,CN 2573467648,2573533183,DE @@ -48095,14 +51181,18 @@ 2574188544,2574254079,NZ 2574254080,2574286847,SE 2574286848,2574287103,AU -2574287104,2574319615,SE +2574287104,2574311167,SE +2574311168,2574311423,US +2574311424,2574319615,SE 2574319616,2574647295,US 2574647296,2574778367,CN 2574778368,2576297471,JP 2576297472,2576302079,US 2576302080,2583582207,JP 2583582208,2583582463,HK -2583582464,2583691263,JP +2583582464,2583601663,JP +2583601664,2583602175,US +2583602176,2583691263,JP 2583691264,2583695359,ZA 2583695360,2583697407,BW 2583697408,2583699455,CI @@ -48127,7 +51217,8 @@ 2584739904,2584740095,ZA 2584740096,2584740351,US 2584740352,2584740415,AU -2584740416,2584740607,ZA +2584740416,2584740479,DE +2584740480,2584740607,ZA 2584740608,2584740863,US 2584740864,2584740927,AU 2584740928,2584741119,ZA @@ -48139,7 +51230,8 @@ 2584741952,2584742143,ZA 2584742144,2584742399,US 2584742400,2584742463,AU -2584742464,2584742655,ZA +2584742464,2584742527,DE +2584742528,2584742655,ZA 2584742656,2584742911,US 2584742912,2584742975,KR 2584742976,2584743167,ZA @@ -48151,7 +51243,8 @@ 2584744000,2584744191,ZA 2584744192,2584744447,US 2584744448,2584744511,AU -2584744512,2584744703,ZA +2584744512,2584744575,ZA +2584744576,2584744703,DE 2584744704,2584744959,US 2584744960,2584745023,AU 2584745024,2584745215,ZA @@ -48264,27 +51357,25 @@ 2584763968,2584764159,ZA 2584764160,2584764415,US 2584764416,2584764671,ZA -2584764672,2584764927,US -2584764928,2584775679,ZA -2584775680,2584777727,US -2584777728,2584780799,ZA -2584780800,2584788991,US -2584788992,2584801279,ZA -2584801280,2585001983,US +2584764672,2584775423,US +2584775424,2584775679,KE +2584775680,2585001983,US 2585001984,2585067519,CA 2585067520,2585788415,US 2585788416,2585853951,GB 2585853952,2585985023,JP -2585985024,2586480639,US +2585985024,2586378751,US +2586378752,2586379263,UA +2586379264,2586480639,US 2586480640,2586484735,IL 2586484736,2586486783,GB 2586486784,2586510335,US 2586510336,2586511359,ES -2586511360,2586566655,US +2586511360,2586544127,US +2586544128,2586546175,SE +2586546176,2586566655,US 2586566656,2586566687,FR -2586566688,2586610175,US -2586610176,2586610431,ES -2586610432,2586610687,US +2586566688,2586610687,US 2586610688,2586611711,ES 2586611712,2586619903,US 2586619904,2586620415,FR @@ -48300,18 +51391,32 @@ 2586650880,2586651135,NL 2586651136,2586714879,US 2586714880,2586715135,NL -2586715136,2586733567,US +2586715136,2586716159,US +2586716160,2586716671,ES +2586716672,2586717183,US +2586717184,2586718207,ES +2586718208,2586733567,US 2586733568,2586733823,LT 2586733824,2586734591,US 2586734592,2586735615,LT -2586735616,2586788607,US -2586788608,2586788863,GB -2586788864,2586804223,US +2586735616,2586788863,US +2586788864,2586789119,GB +2586789120,2586789887,US +2586789888,2586790143,GB +2586790144,2586804223,US 2586804224,2586804479,ES -2586804480,2586828799,US +2586804480,2586805247,US +2586805248,2586805503,ES +2586805504,2586806271,US +2586806272,2586807295,ES +2586807296,2586828799,US 2586828800,2586829055,CH -2586829056,2586870783,US -2586870784,2586875903,ES +2586829056,2586869759,US +2586869760,2586870015,ES +2586870016,2586870271,US +2586870272,2586874367,ES +2586874368,2586874879,US +2586874880,2586875903,ES 2586875904,2586876415,US 2586876416,2586876671,ES 2586876672,2586876927,US @@ -48325,13 +51430,15 @@ 2586953984,2586954239,PE 2586954240,2587017215,US 2587017216,2587017471,IE -2587017472,2587018239,US -2587018240,2587018495,IE +2587017472,2587017983,US +2587017984,2587018495,IE 2587018496,2587018671,US 2587018672,2587018687,IE 2587018688,2587019263,US 2587019264,2587019775,IE -2587019776,2587021823,US +2587019776,2587020031,US +2587020032,2587020799,IE +2587020800,2587021823,US 2587021824,2587022335,IE 2587022336,2587066879,US 2587066880,2587067135,GB @@ -48339,61 +51446,67 @@ 2587067392,2587067903,GB 2587067904,2587068415,US 2587068416,2587068479,GB -2587068480,2587071759,US +2587068480,2587070463,US +2587070464,2587070719,GB +2587070720,2587071759,US 2587071760,2587071775,GB -2587071776,2587131903,US -2587131904,2587132159,FR -2587132160,2587197439,US +2587071776,2587128522,US +2587128523,2587128523,TR +2587128524,2587131903,US +2587131904,2587132415,FR +2587132416,2587197439,US 2587197440,2587197695,ES 2587197696,2587240389,US 2587240390,2587240390,FR 2587240391,2587249417,US 2587249418,2587249418,FR -2587249419,2587378175,US -2587378176,2587378431,IT -2587378432,2587379967,US -2587379968,2587380223,IT -2587380224,2587394047,US -2587394048,2587394559,ES -2587394560,2587394815,US -2587394816,2587395071,ES -2587395072,2587396095,US +2587249419,2587361791,US +2587361792,2587362047,MD +2587362048,2587394559,US +2587394560,2587395327,ES +2587395328,2587396095,US 2587396096,2587399167,ES -2587399168,2587412479,US -2587412480,2587414527,IT +2587399168,2587412223,US +2587412224,2587414527,IT 2587414528,2587443199,US 2587443200,2587447295,CH 2587447296,2587476760,US 2587476761,2587476761,LB -2587476762,2587477759,US -2587477760,2587478015,LB -2587478016,2587479119,US +2587476762,2587479119,US 2587479120,2587479120,LB -2587479121,2587481087,US -2587481088,2587481343,LB -2587481344,2587481969,US +2587479121,2587481969,US 2587481970,2587481970,LB -2587481971,2587492351,US +2587481971,2587488255,US +2587488256,2587492351,GB 2587492352,2587493375,ES 2587493376,2587494399,US 2587494400,2587496447,ES -2587496448,2587508735,US +2587496448,2587504639,US +2587504640,2587508735,ES 2587508736,2587525119,GB 2587525120,2587542527,US -2587542528,2587544063,ES -2587544064,2587545599,US -2587545600,2587546623,ES -2587546624,2587582463,US +2587542528,2587544575,ES +2587544576,2587545599,US +2587545600,2587549695,ES +2587549696,2587582463,US 2587582464,2587586559,NL 2587586560,2587592703,US 2587592704,2587594751,GB -2587594752,2587926527,US +2587594752,2587623423,US +2587623424,2587627519,BG +2587627520,2587639807,US +2587639808,2587640063,GB +2587640064,2587926527,US 2587926528,2587930623,BG -2587930624,2587939071,US -2587939072,2587939583,PR -2587939584,2587940607,US -2587940608,2587940863,PR -2587940864,2587951103,US +2587930624,2587938815,US +2587938816,2587939583,PR +2587939584,2587939711,US +2587939712,2587939839,PR +2587939840,2587940095,US +2587940096,2587940607,PR +2587940608,2587940863,US +2587940864,2587941119,PR +2587941120,2587951103,US 2587951104,2587952127,ZA 2587952128,2587953151,NG 2587953152,2587954175,MU @@ -48417,6 +51530,7 @@ 2588042240,2588043263,SS 2588043264,2588044287,AO 2588044288,2588045311,LS +2588045312,2588046335,ZA 2588046336,2588047359,TD 2588047360,2588049407,MW 2588049408,2588053503,BJ @@ -48438,10 +51552,12 @@ 2588213248,2588278783,ZA 2588278784,2588295167,KE 2588295168,2588299263,GH +2588299264,2588303359,TG 2588303360,2588311551,CM 2588311552,2588315647,ZA 2588315648,2588317695,BW -2588317696,2588318207,MU +2588317696,2588317951,ZA +2588317952,2588318207,MU 2588318208,2588318719,ZA 2588318720,2588319743,UG 2588319744,2588327935,SC @@ -48525,15 +51641,21 @@ 2590507008,2591031295,TN 2591031296,2591096831,GA 2591096832,2591162367,NG +2591162368,2591293439,ZA 2591293440,2591326207,GA 2591326208,2591358975,AO 2591358976,2591375359,GH 2591375360,2591391743,NG 2591391744,2591408127,ZA +2591408128,2591424511,BI 2591424512,2591457279,NG 2591457280,2591473663,ML 2591473664,2591477759,AO -2591477760,2591481855,PT +2591477760,2591478783,PT +2591478784,2591479039,AO +2591479040,2591479551,PT +2591479552,2591479807,AO +2591479808,2591481855,PT 2591481856,2591483903,TZ 2591485952,2591486975,SO 2591486976,2591487999,ZA @@ -48557,6 +51679,7 @@ 2591612928,2591621119,ZW 2591621120,2591686655,DZ 2591686656,2591817727,KE +2591817728,2591948799,SN 2591948800,2591981567,MG 2591981568,2591997951,CM 2591997952,2592006143,ZA @@ -48567,12 +51690,10 @@ 2592026624,2592026879,US 2592026880,2592027391,ZA 2592027392,2592027647,GB -2592027648,2592028159,US -2592028160,2592028415,CA -2592028416,2592028671,US +2592027648,2592028671,US 2592028672,2592028799,NG 2592028800,2592028927,KE -2592028928,2592029183,ZA +2592028928,2592029183,US 2592029184,2592029311,CI 2592029312,2592030207,ZA 2592030208,2592030335,GH @@ -48590,13 +51711,15 @@ 2600730624,2600796159,SE 2600796160,2601123839,US 2601123840,2601189375,CA +2601189376,2601254911,EG +2601254912,2601287679,TZ 2601320448,2601451519,US 2601451520,2601517055,CA 2601517056,2602565631,US 2602565632,2602631167,NZ 2602631168,2602774015,US 2602774016,2602774271,IN -2602774272,2602825727,US +2602774528,2602825727,US 2602825728,2602825983,AU 2602825984,2603417599,US 2603417600,2603483135,DE @@ -48622,6 +51745,7 @@ 2605187072,2605252607,US 2605252608,2605318143,AT 2605318144,2606301183,US +2606301184,2606366719,AO 2606366720,2606448649,US 2606448650,2606448651,EU 2606448652,2606467071,US @@ -48629,9 +51753,7 @@ 2606467328,2606563327,US 2606628864,2606646783,US 2606646784,2606647039,EU -2606647040,2606648831,US -2606648832,2606649087,IE -2606649088,2607349759,US +2606647040,2607349759,US 2607349760,2607415295,CH 2607415296,2608728063,US 2608728064,2608728319,AP @@ -48665,11 +51787,7 @@ 2613248000,2613313535,US 2613379072,2613444607,US 2613444608,2613510143,GB -2613510144,2613650226,US -2613650227,2613650227,BM -2613650228,2613650242,US -2613650243,2613650243,MX -2613650244,2613706751,US +2613510144,2613706751,US 2613706752,2613772287,GB 2613772288,2613837823,US 2613837824,2613903359,NL @@ -48699,11 +51817,12 @@ 2616786944,2616852479,GB 2616852480,2616885527,DE 2616885528,2616885529,EU -2616885530,2616917759,DE -2616917760,2616918015,FR +2616885530,2616918015,DE 2616983552,2617049087,US 2617049088,2617114623,IT -2617114624,2617123839,US +2617114624,2617115135,US +2617115136,2617115647,CA +2617115648,2617123839,US 2617123840,2617124095,DE 2617124096,2617124863,US 2617124864,2617126911,NL @@ -48718,21 +51837,20 @@ 2617140736,2617140991,CA 2617140992,2617141247,LC 2617141248,2617141503,SV -2617141504,2617141759,GT +2617141504,2617141759,US 2617141760,2617142015,ZW 2617142016,2617142271,KR 2617142272,2617142527,US 2617142528,2617142783,LU -2617142784,2617143039,PH +2617142784,2617143039,US 2617143040,2617143295,UG 2617143296,2617143551,US 2617143552,2617143807,TT 2617143808,2617144063,US 2617144064,2617144319,ZA -2617144320,2617144575,MU +2617144320,2617144575,US 2617144576,2617144831,FJ -2617144832,2617145087,US -2617145088,2617145343,MX +2617144832,2617145343,US 2617145344,2617145599,NI 2617145600,2617145855,UA 2617145856,2617146111,US @@ -48740,9 +51858,8 @@ 2617146368,2617146623,US 2617146624,2617146879,GY 2617146880,2617147135,DE -2617147136,2617147391,AO -2617147392,2617148415,US -2617151488,2617155583,CA +2617147136,2617149439,US +2617149440,2617155583,CA 2617155584,2617163775,US 2617163776,2617164031,SK 2617164032,2617164287,MC @@ -48757,7 +51874,7 @@ 2617166336,2617166591,KH 2617166592,2617166847,TJ 2617166848,2617167103,KG -2617167104,2617167359,IS +2617167104,2617167359,IN 2617167360,2617167615,DK 2617167616,2617167871,IL 2617167872,2617168127,PL @@ -48780,7 +51897,7 @@ 2617172224,2617172479,AF 2617172480,2617172735,JP 2617172736,2617172991,CM -2617172992,2617173247,US +2617172992,2617173247,VA 2617173248,2617173503,JP 2617173504,2617173759,TM 2617173760,2617174015,GE @@ -48796,13 +51913,13 @@ 2617176320,2617176575,AU 2617176576,2617176831,TH 2617176832,2617177087,VN -2617177088,2617177343,AM +2617177088,2617177343,US 2617177344,2617177599,RU 2617177600,2617177855,IN 2617177856,2617178111,BE 2617178112,2617178367,IM 2617178368,2617178623,BN -2617178624,2617178879,AD +2617178624,2617178879,US 2617178880,2617179135,LT 2617179136,2617179391,MD 2617179392,2617179647,SI @@ -48826,7 +51943,9 @@ 2618949632,2619080703,US 2619080704,2619146239,FR 2619146240,2619277311,US -2619277312,2619342847,BN +2619277312,2619327743,BN +2619327744,2619327999,MY +2619328000,2619342847,BN 2619342848,2619473919,US 2619473920,2619539455,CA 2619539456,2619604991,ES @@ -48865,7 +51984,11 @@ 2624192512,2624258047,CH 2624258048,2624266495,US 2624266496,2624266751,AP -2624266752,2624391696,US +2624266752,2624279063,US +2624279064,2624279071,IN +2624279072,2624281087,US +2624281088,2624281343,IN +2624281344,2624391696,US 2624391697,2624391697,EU 2624391698,2624393727,US 2624393728,2624393983,EU @@ -48879,16 +52002,14 @@ 2625961984,2626027519,LU 2626027520,2626093055,US 2626093056,2626158591,CH -2626158592,2626224127,US -2626224128,2626289663,CZ -2626289664,2626879487,US +2626158592,2626879487,US 2626879488,2626945023,KR 2626945024,2627010559,IT 2627010560,2627076095,NZ 2627076096,2627141631,NL 2627141632,2627469311,US 2627469312,2627731455,TZ -2627731456,2629828607,EG +2627731456,2631925759,EG 2634022912,2634088447,CN 2634088448,2635202559,JP 2635202560,2635268095,CN @@ -48900,8 +52021,23 @@ 2635726848,2635792383,CH 2635792384,2635988991,IT 2635988992,2636120063,US -2636120064,2637561855,ID -2637561856,2638020607,US +2636120064,2637430783,ID +2637430784,2637438975,CA +2637438976,2637630975,US +2637630976,2637631231,IE +2637631232,2637733151,US +2637733152,2637733183,JP +2637733184,2637733375,US +2637733376,2637733407,SG +2637733408,2637997055,US +2637997056,2637997311,AU +2637997312,2637998591,US +2637998592,2637998847,AU +2637998848,2638000127,US +2638000128,2638000255,AU +2638000256,2638002175,US +2638002176,2638002687,AU +2638002688,2638020607,US 2638020608,2638086143,CN 2638086144,2638151679,US 2638151680,2639331327,JP @@ -48921,7 +52057,10 @@ 2640445440,2640510975,US 2640510976,2640576511,FR 2640576512,2640642047,EC -2640642048,2641952767,JP +2640642048,2641928191,JP +2641928192,2641936383,SG +2641936384,2641944575,US +2641944576,2641952767,JP 2641952768,2642018303,US 2642018304,2642083839,CN 2642083840,2642149375,US @@ -48930,7 +52069,9 @@ 2642280448,2642411519,US 2642411520,2642477055,AU 2642477056,2642542591,FI -2642542592,2642935807,US +2642542592,2642751487,US +2642751488,2642753535,CA +2642753536,2642935807,US 2642935808,2643001343,FR 2643001344,2643066879,US 2643066880,2643132415,IT @@ -48950,10 +52091,9 @@ 2644574208,2644639743,CH 2644639744,2644770815,DE 2644770816,2644836351,BE -2644836352,2644956927,US -2644956928,2644957183,HK -2644957184,2644959231,GB -2644959232,2644967423,US +2644836352,2644957183,US +2644957184,2644957439,GB +2644957440,2644967423,US 2644967424,2645032959,AT 2645032960,2645098495,CH 2645098496,2645164031,FR @@ -49046,7 +52186,17 @@ 2655059968,2655125503,US 2655125504,2655191039,PL 2655191040,2655256575,EU -2655256576,2655715327,US +2655256576,2655323135,US +2655323136,2655323647,CA +2655323648,2655324671,US +2655324672,2655324799,CA +2655324800,2655325695,US +2655325696,2655325823,CA +2655325824,2655326207,US +2655326208,2655326463,CA +2655326464,2655373256,US +2655373257,2655373257,CA +2655373258,2655715327,US 2655715328,2655780863,PL 2655780864,2656387071,US 2656387072,2656403455,CA @@ -49073,11 +52223,11 @@ 2658009088,2658074623,IT 2658074624,2658140159,US 2658140160,2658205695,NO -2658205696,2658451455,US -2658451456,2658451711,MY -2658451712,2658459648,US +2658205696,2658459647,US +2658459648,2658459648,HU 2658459649,2658459649,EU -2658459650,2658598911,US +2658459650,2658459903,HU +2658459904,2658598911,US 2658598912,2658664447,GB 2658664448,2658926591,US 2658926592,2659057663,GB @@ -49121,7 +52271,11 @@ 2662203392,2662662143,GB 2662662144,2662670335,KG 2662670336,2662674431,AZ -2662674432,2662686719,DE +2662674432,2662677087,DE +2662677088,2662677279,US +2662677280,2662677375,DE +2662677376,2662678527,US +2662678528,2662686719,DE 2662686720,2662694911,CH 2662694912,2662727679,KG 2662727680,2662793215,HK @@ -49132,21 +52286,27 @@ 2663579648,2663645183,SK 2663645184,2663710719,CZ 2663710720,2663776255,SK -2663776256,2664955903,JP +2663776256,2663891199,JP +2663891200,2663891455,CN +2663891456,2664955903,JP 2664955904,2665021439,CH 2665021440,2665086975,JP 2665086976,2665152511,GB 2665152512,2665218047,US 2665218048,2665283583,CH -2665283584,2665414655,US +2665283584,2665359359,US +2665359360,2665359871,MF +2665359872,2665375743,US +2665375744,2665377791,CA +2665377792,2665414655,US 2665414656,2665480191,GB 2665480192,2665545727,US 2665545728,2665611263,DE 2665611264,2665676799,CH 2665676800,2665742335,ES -2665742336,2665783551,US -2665783552,2665783807,GB -2665783808,2665873407,US +2665742336,2665805055,US +2665805056,2665805311,CA +2665805312,2665873407,US 2665873408,2665938943,GB 2665938944,2666004479,FR 2666004480,2666070015,CH @@ -49205,9 +52365,7 @@ 2668118016,2668134399,FR 2668134400,2668150783,GB 2668150784,2668167167,NL -2668167168,2668286463,US -2668286464,2668286719,GB -2668286720,2668363775,US +2668167168,2668363775,US 2668363776,2668429311,CH 2668429312,2668494847,AU 2668494848,2668560383,US @@ -49286,15 +52444,16 @@ 2674130944,2674147327,GB 2674147328,2674163711,NL 2674163712,2674175999,GB -2674176000,2674192383,US +2674176000,2674177286,US +2674177287,2674177287,GB +2674177288,2674192383,US 2674192384,2674196479,CH 2674196480,2674249727,GB 2674249728,2674251775,US 2674251776,2674262015,GB 2674262016,2674327551,US 2674327552,2674393087,CH -2674393088,2674458623,GB -2674458624,2674589695,US +2674393088,2674589695,US 2674589696,2674655231,SE 2674655232,2674720767,US 2674720768,2674786303,FR @@ -49304,11 +52463,25 @@ 2675048448,2675113983,GB 2675113984,2675245055,US 2675245056,2675310591,NZ -2675310592,2675574463,US -2675574464,2675574495,IT -2675574496,2675589119,US +2675310592,2675574239,US +2675574240,2675574271,IT +2675574272,2675576703,US +2675576704,2675576711,JO +2675576712,2675578527,US +2675578528,2675578535,CO +2675578536,2675580063,US +2675580064,2675580095,AE +2675580096,2675589119,US 2675589120,2675605503,DE -2675605504,2675965951,US +2675605504,2675606271,US +2675606272,2675606527,IT +2675606528,2675606975,US +2675606976,2675607039,IT +2675607040,2675628415,US +2675628416,2675628447,GB +2675628448,2675630095,US +2675630096,2675630111,GB +2675630112,2675965951,US 2675965952,2676031487,CA 2676031488,2676097023,US 2676097024,2676162559,NO @@ -49327,15 +52500,17 @@ 2677538816,2677604351,FI 2677604352,2677635071,US 2677635072,2677636095,CN -2677636096,2677639679,US +2677636096,2677639167,US +2677639168,2677639423,CA +2677639424,2677639679,US 2677639680,2677639935,CA 2677639936,2677642239,US 2677642240,2677642495,ES 2677642496,2677642751,CA 2677642752,2677643007,SE -2677643008,2677644287,US -2677644288,2677644543,GB -2677644544,2677648383,US +2677643008,2677644347,US +2677644348,2677644348,GB +2677644349,2677648383,US 2677648384,2677649407,JP 2677649408,2677650431,US 2677650432,2677650943,RO @@ -49351,9 +52526,7 @@ 2677669888,2677735423,DE 2677735424,2677800959,US 2677800960,2677866495,CH -2677866496,2677924863,US -2677924864,2677925119,GB -2677925120,2677997567,US +2677866496,2677997567,US 2677997568,2678063103,CA 2678063104,2678128639,UA 2678128640,2678194175,US @@ -49370,16 +52543,15 @@ 2678862848,2678863103,BR 2678863104,2678865919,US 2678865920,2678866175,AU -2678866176,2678872831,US -2678872832,2678873087,IN -2678873088,2678885375,US +2678866176,2678876159,US +2678876160,2678878207,FR +2678878208,2678885375,US 2678885376,2678885631,GB 2678885632,2678885887,US 2678885888,2678886143,DE 2678886144,2678886399,NL 2678886400,2678886655,GB -2678886656,2678886911,IT -2678886912,2678893567,US +2678886656,2678893567,US 2678893568,2678893823,CL 2678893824,2678901759,US 2678901760,2678902015,NZ @@ -49412,14 +52584,19 @@ 2679535616,2679537663,GB 2679537664,2680029183,US 2680029184,2680094719,SE -2680094720,2680225791,US -2680225792,2680356863,SE +2680094720,2680160255,US +2680160256,2680225791,TH +2680225792,2680264191,SE +2680264192,2680264447,DK +2680264448,2680356863,SE 2680356864,2680422399,DK 2680422400,2680487935,AU 2680487936,2680553471,GB 2680553472,2680684543,US 2680684544,2680750079,SE -2680750080,2681012223,US +2680750080,2680881151,US +2680881152,2680897535,CA +2680897536,2681012223,US 2681012224,2681077759,PL 2681077760,2681143295,CA 2681143296,2681208831,AU @@ -49437,15 +52614,16 @@ 2681798656,2681864191,FR 2681864192,2681929727,US 2681929728,2681995263,GB -2681995264,2682014207,US +2681995264,2682008575,US +2682008576,2682008831,GB +2682008832,2682014207,US 2682014208,2682014719,GB -2682014720,2682015231,US +2682014720,2682014975,TH +2682014976,2682015231,US 2682015232,2682015487,IN 2682015488,2682107903,US 2682107904,2682108159,GB -2682108160,2682123263,US -2682123264,2682123519,AU -2682123520,2682257407,US +2682108160,2682257407,US 2682257408,2682322943,UA 2682322944,2682388479,US 2682388480,2682454015,CN @@ -49488,9 +52666,7 @@ 2684186624,2684188671,DE 2684188672,2684190719,RU 2684190720,2684198911,NL -2684198912,2684199423,GB -2684199424,2684199679,EU -2684199680,2684200959,GB +2684198912,2684200959,GB 2684200960,2684203007,RU 2684203008,2684205055,GB 2684205056,2684207103,IT @@ -49530,8 +52706,8 @@ 2687041536,2687238143,US 2687238144,2687297231,DE 2687297232,2687297239,GB -2687297240,2687297247,SE -2687297248,2687301795,DE +2687297240,2687297243,SE +2687297244,2687301795,DE 2687301796,2687301796,EU 2687301797,2687560191,DE 2687560192,2687560447,ZA @@ -49543,7 +52719,9 @@ 2688286720,2688352255,DE 2688352256,2688418825,CH 2688418826,2688418826,EU -2688418827,2688421119,CH +2688418827,2688420351,CH +2688420352,2688420607,CN +2688420608,2688421119,CH 2688421120,2688421375,AP 2688421376,2688548863,CH 2688548864,2688614399,AU @@ -49579,17 +52757,18 @@ 2689594112,2689594879,GB 2689594880,2689597439,US 2689597440,2689662975,IT -2689662976,2689794047,US -2689794048,2689802239,DE -2689802240,2689802751,GB +2689662976,2689801727,US +2689801728,2689801983,DE +2689801984,2689802751,US 2689802752,2689803263,TR -2689803264,2689810431,GB -2689810432,2689818623,US -2689818624,2689819135,IN -2689819136,2689826815,US -2689826816,2689835007,JP -2689835008,2689843199,AU -2689843200,2689925119,US +2689803264,2689803519,GB +2689803520,2689804799,US +2689804800,2689805055,GB +2689805056,2689818879,US +2689818880,2689819135,IN +2689819136,2689835007,US +2689835008,2689835263,AU +2689835264,2689925119,US 2689925120,2689990655,CH 2689990656,2690383871,US 2690383872,2690449407,FR @@ -49617,7 +52796,8 @@ 2697789440,2697854975,US 2697854976,2697889791,AU 2697889792,2697891839,US -2697891840,2697892863,AU +2697891840,2697892095,GB +2697892096,2697892863,AU 2697892864,2697894399,US 2697894400,2697920511,AU 2697920512,2698117119,US @@ -49634,17 +52814,24 @@ 2698903552,2698969087,AU 2698969088,2699034623,CA 2699034624,2699165695,AO +2699165696,2699198463,NG 2699231232,2699296767,US 2699296768,2699362303,FR 2699362304,2699624447,US 2699624448,2699689983,JP -2699755520,2700935167,JP +2699755520,2700214271,JP +2700214272,2700247039,NA +2700247040,2700263423,UG +2700279808,2700935167,JP 2700935168,2701066239,US -2701066240,2701074431,ZA -2701074432,2701099007,BG -2701099008,2701123583,ZA -2701123584,2701131775,BG -2701131776,2701139967,HN +2701066240,2701131775,BG +2701131776,2701131807,HN +2701131808,2701131823,CA +2701131824,2701132543,HN +2701132544,2701132559,CR +2701132560,2701136047,HN +2701136048,2701136055,US +2701136056,2701139967,HN 2701139968,2701148159,NI 2701148160,2701149183,AR 2701149184,2701150207,HN @@ -49666,7 +52853,9 @@ 2701393920,2701459455,NO 2701459456,2701524991,AT 2701524992,2701656063,US -2701656064,2701721599,RU +2701656064,2701688831,RU +2701688832,2701721087,US +2701721088,2701721599,RU 2701721600,2701787135,TR 2701787136,2701852671,CO 2701852672,2701918207,US @@ -49678,8 +52867,10 @@ 2702442496,2702508031,CH 2702508032,2702573567,US 2702573568,2702581759,AR -2702581760,2702585855,VE -2702585856,2702587903,CW +2702581760,2702583807,VE +2702583808,2702585855,MX +2702585856,2702586367,PA +2702586368,2702587903,CW 2702587904,2702589951,BR 2702589952,2702606335,GF 2702606336,2702639103,BO @@ -49721,12 +52912,14 @@ 2705399808,2705407999,NZ 2705408000,2705432575,AU 2705432576,2705440767,NZ -2705440768,2705456895,AU -2705456896,2705522687,NZ +2705440768,2705457151,AU +2705457152,2705522687,NZ 2705522688,2705588223,ES 2705588224,2705596159,US 2705596160,2705596415,CA -2705596416,2705691647,US +2705596416,2705688319,US +2705688320,2705688575,DE +2705688576,2705691647,US 2705691648,2705692671,GB 2705692672,2705710079,US 2705710080,2705711103,IN @@ -49754,14 +52947,13 @@ 2708471808,2708537343,GB 2708537344,2708635135,US 2708635136,2708635391,EU -2708635392,2708661247,US -2708661248,2708661503,AU -2708661504,2708733951,US +2708635392,2708733951,US 2708733952,2708799487,ES 2708799488,2708865023,AU 2708865024,2708930559,JP 2708930560,2709127167,US 2709127168,2709192703,KR +2709192704,2709258239,ZA 2709258240,2709389311,US 2709389312,2709454847,SG 2709454848,2709716991,US @@ -49792,12 +52984,17 @@ 2713583616,2713649151,AR 2713649152,2713946367,US 2713946368,2713946623,CA -2713946624,2713946879,GB -2713946880,2713976831,US +2713946624,2713976831,US 2713976832,2714042367,VE 2714042368,2714238975,US 2714238976,2714304511,TH -2714304512,2714386431,US +2714304512,2714370799,US +2714370800,2714370815,PH +2714370816,2714370895,US +2714370896,2714370911,CN +2714370912,2714373127,US +2714373128,2714373128,SG +2714373129,2714386431,US 2714386432,2714402815,JP 2714402816,2714697727,US 2714697728,2714763263,CN @@ -49839,18 +53036,18 @@ 2721382400,2721447935,CA 2721447936,2721579007,US 2721579008,2721644543,IN -2721644544,2722693119,US -2722693120,2722754559,CA -2722754560,2722754815,GB -2722754816,2722758655,CA +2721644544,2722496511,US +2722496512,2722562047,CA +2722562048,2722693119,US +2722693120,2722758655,CA 2722758656,2723479551,US 2723479552,2723545087,CA 2723545088,2723610623,CH 2723610624,2723832575,US 2723832576,2723832831,GB 2723832832,2724268287,US -2724268288,2724268415,MX -2724268416,2724303989,US +2724268288,2724268543,MX +2724268544,2724303989,US 2724303990,2724303990,GB 2724303991,2724790271,US 2724790272,2724855807,CN @@ -49867,7 +53064,19 @@ 2727411712,2727608319,AU 2727608320,2728132607,US 2728132608,2728263679,CA -2728263680,2731543551,US +2728263680,2728263935,US +2728263936,2728264703,AU +2728264704,2728266495,US +2728266496,2728266751,QA +2728266752,2728273407,US +2728273408,2728273663,IE +2728273664,2728282271,US +2728282272,2728282303,CA +2728282304,2728286207,US +2728286208,2728286463,DE +2728286464,2728289023,US +2728289024,2728289279,AE +2728289280,2731543551,US 2731543552,2731544575,CA 2731544576,2731549695,US 2731549696,2731550719,CA @@ -49888,9 +53097,7 @@ 2731674624,2731679743,US 2731679744,2731680767,CA 2731680768,2731681791,US -2731681792,2731682047,PR -2731682048,2731682303,VI -2731682304,2731682815,PR +2731681792,2731682815,PR 2731682816,2731685887,US 2731685888,2731686911,CA 2731686912,2731688959,US @@ -49919,7 +53126,7 @@ 2731792384,2731795455,US 2731795456,2731796479,DE 2731796480,2731797503,CA -2731797504,2731800575,US +2731798528,2731800575,US 2731800576,2731801599,CA 2731801600,2731804671,US 2731804672,2731805695,CA @@ -49939,7 +53146,9 @@ 2731843584,2731845631,PR 2731845632,2731853823,US 2731853824,2731855871,CA -2731855872,2731856895,VC +2731855872,2731856127,VC +2731856128,2731856383,LC +2731856384,2731856895,VC 2731856896,2731862015,US 2731862016,2731864063,CA 2731864064,2731870207,US @@ -49969,8 +53178,8 @@ 2732201984,2732203007,VG 2732203008,2732204031,US 2732204032,2732206079,CA -2732206080,2732220159,US -2732220160,2732220400,CA +2732206080,2732220287,US +2732220288,2732220400,CA 2732220401,2732220401,US 2732220402,2732220415,CA 2732220416,2732227583,US @@ -49998,7 +53207,9 @@ 2732337152,2732351487,US 2732351488,2732353535,PR 2732353536,2732361727,US -2732361728,2732363775,BB +2732361728,2732362495,BB +2732362496,2732363007,DM +2732363008,2732363775,BB 2732363776,2732371967,US 2732372992,2732375039,US 2732375040,2732376063,CA @@ -50046,7 +53257,9 @@ 2732549120,2732550143,CA 2732550144,2732580863,US 2732580864,2732582911,CA -2732582912,2733903871,US +2732582912,2733882879,US +2733882880,2733883135,CA +2733883136,2733903871,US 2733903872,2733904895,PR 2733904896,2733907967,CA 2733907968,2733911039,US @@ -50095,7 +53308,10 @@ 2734102528,2734104575,VI 2734104576,2734105599,US 2734105600,2734106623,CA -2734106624,2734119935,US +2734106624,2734107647,A2 +2734107648,2734108415,US +2734108416,2734108671,A2 +2734108672,2734119935,US 2734119936,2734120959,CA 2734120960,2734123007,VG 2734123008,2734125055,US @@ -50214,13 +53430,7 @@ 2734633984,2734635007,CA 2734635008,2734649343,US 2734649344,2734650367,CA -2734650368,2734655927,US -2734655928,2734655935,GB -2734655936,2734656127,US -2734656128,2734656255,GB -2734656256,2734656383,US -2734656384,2734656511,GB -2734656512,2734657535,US +2734650368,2734657535,US 2734657536,2734658559,VG 2734658560,2734659583,CA 2734659584,2734665727,US @@ -50248,9 +53458,12 @@ 2736848896,2736914431,US 2736914432,2736979967,NO 2736979968,2737438719,US -2737438720,2737767423,JP +2737438720,2737594367,JP +2737594368,2737602559,US +2737602560,2737610751,SG +2737610752,2737767423,JP 2737767424,2737768447,CN -2737768448,2737769471,AU +2737768448,2737769471,SG 2737769472,2737770495,IN 2737770496,2737771263,AU 2737771264,2737771519,JP @@ -50289,7 +53502,9 @@ 2737813504,2737815551,NZ 2737815552,2737816575,MY 2737816576,2737817599,AU -2737817600,2737818623,MY +2737817600,2737818111,MY +2737818112,2737818367,AU +2737818368,2737818623,MY 2737818624,2737819647,NZ 2737819648,2737821695,IN 2737821696,2737822719,AU @@ -50375,11 +53590,7 @@ 2746351616,2746417151,CR 2746417152,2746482687,CN 2746482688,2746548223,KR -2746548224,2746824703,US -2746824704,2746824959,CA -2746824960,2746839295,US -2746839296,2746839551,CA -2746839552,2747072511,US +2746548224,2747072511,US 2747072512,2747138047,AU 2747138048,2747465727,US 2747465728,2748055551,ZA @@ -50398,9 +53609,9 @@ 2750349312,2750414847,KR 2750414848,2750692863,US 2750692864,2750693375,EU -2750693376,2750724351,US -2750724352,2750724607,TW -2750724608,2750873599,US +2750693376,2750739967,US +2750739968,2750740223,CN +2750740224,2750873599,US 2750873600,2750939135,CL 2750939136,2751070207,US 2751070208,2751135743,CL @@ -50474,7 +53685,9 @@ 2757033984,2757099519,BR 2757099520,2757230591,US 2757230592,2757296127,ZA -2757296128,2757754879,US +2757296128,2757394431,US +2757394432,2757394687,GB +2757394688,2757754879,US 2757754880,2757820415,CL 2757820416,2757885951,AU 2757885952,2757951487,CL @@ -50577,7 +53790,9 @@ 2769747968,2769813503,CA 2769813504,2769879039,US 2769879040,2769944575,ZA -2769944576,2770272255,US +2769944576,2769999871,US +2769999872,2769999935,GB +2769999936,2770272255,US 2770272256,2770337791,AU 2770337792,2770993151,US 2770993152,2771124223,IN @@ -50596,11 +53811,17 @@ 2773286912,2773745663,US 2773745664,2773794815,NZ 2773794816,2773798911,IN -2773798912,2773807103,NZ +2773798912,2773805055,NZ +2773805056,2773807103,JP 2773807104,2773811199,IN 2773811200,2773876735,US 2773876736,2773942271,AU -2773942272,2774335487,US +2773942272,2774138879,US +2774163456,2774171647,CV +2774188032,2774192127,ZA +2774196224,2774200319,ZA +2774200320,2774204415,NG +2774204416,2774335487,US 2774335488,2774401023,JP 2774401024,2774532095,US 2774532096,2774597631,JP @@ -50618,7 +53839,8 @@ 2776104960,2776170495,GB 2776170496,2776478207,US 2776478208,2776478463,EU -2776478464,2776478975,US +2776478464,2776478719,ZA +2776478720,2776478975,US 2776478976,2776479231,AU 2776479232,2776697614,US 2776697615,2776697615,EU @@ -50632,7 +53854,9 @@ 2778333184,2778398719,CA 2778398720,2779054079,US 2779054080,2779119615,ZA -2779119616,2779906047,US +2779119616,2779316223,US +2779316224,2779381759,RE +2779381760,2779906047,US 2779906048,2779971583,CA 2779971584,2780037119,US 2780037120,2780102655,ZA @@ -50645,8 +53869,8 @@ 2780561408,2780758015,US 2780758016,2780823551,AU 2780823552,2780925951,US -2780925952,2780926463,GB -2780926464,2780926975,US +2780925952,2780926207,GB +2780926208,2780926975,US 2780926976,2780927487,GB 2780927488,2780927743,US 2780927744,2780927999,GB @@ -50667,11 +53891,16 @@ 2780934912,2780935167,GB 2780935168,2780954623,US 2780954624,2781020159,KR -2781020160,2781478911,US +2781020160,2781206527,US +2781206528,2781207551,GB +2781207552,2781208575,DE +2781208576,2781478911,US 2781478912,2781544447,HK -2781544448,2781624063,US -2781624064,2781624319,CA -2781624320,2781629951,US +2781544448,2781623807,US +2781623808,2781624319,CA +2781624320,2781628415,US +2781628416,2781628671,DE +2781628672,2781629951,US 2781629952,2781630207,EU 2781630208,2781630463,US 2781630464,2781631487,MY @@ -50687,7 +53916,9 @@ 2782658560,2782724095,PH 2782724096,2782789631,US 2782789632,2782855167,CH -2782855168,2783002623,US +2782855168,2782995455,US +2782995456,2782995967,CA +2782995968,2783002623,US 2783002624,2783002879,DK 2783002880,2783003135,US 2783003136,2783003391,RU @@ -50695,7 +53926,11 @@ 2783003648,2783003903,SE 2783003904,2783004159,US 2783004160,2783004671,CH -2783004672,2783010815,US +2783004672,2783005439,DE +2783005440,2783005695,US +2783005696,2783006719,FR +2783006720,2783007743,GB +2783007744,2783010815,US 2783010816,2783011327,HK 2783011328,2783011583,AU 2783011584,2783011839,US @@ -50709,14 +53944,18 @@ 2783313920,2783379455,US 2783379456,2783383551,SC 2783383552,2783387647,CA -2783387648,2783391743,SC +2783387648,2783391743,GB 2783391744,2783395839,US 2783395840,2783399935,DE 2783399936,2783404031,FR -2783404032,2783416319,SC -2783416320,2783420415,US +2783404032,2783408127,NL +2783408128,2783412223,NO +2783412224,2783416319,SE +2783416320,2783420415,RU 2783420416,2783424511,EE -2783424512,2783440895,SC +2783424512,2783428607,JP +2783428608,2783436799,US +2783436800,2783440895,IT 2783440896,2783444991,IN 2783444992,2783510527,US 2783510528,2783576063,ZA @@ -50728,6 +53967,7 @@ 2784362496,2784428031,KR 2784428032,2784952063,US 2784952064,2784952319,NL +2784952320,2785017855,ZA 2785017856,2785804287,US 2785804288,2786066431,CH 2786066432,2788163583,US @@ -50768,11 +54008,11 @@ 2792947712,2793013247,SG 2793013248,2793209855,US 2793209856,2793275391,KR -2793275392,2796748799,US -2796748800,2796814335,NZ -2796814336,2797646591,US -2797646592,2797646847,VI -2797646848,2798838015,US +2793275392,2796806911,US +2796806912,2796807167,NZ +2796807168,2796807935,US +2796807936,2796808191,NZ +2796808192,2798838015,US 2798838016,2798838271,CO 2798838272,2801795071,US 2801795072,2801860607,CO @@ -50789,7 +54029,9 @@ 2803826688,2803892223,US 2803892224,2805465087,CA 2805465088,2805989375,UY -2805989376,2806644735,US +2805989376,2806007807,US +2806007808,2806008063,GB +2806008064,2806644735,US 2806644736,2806710271,CA 2806710272,2807103487,US 2807103488,2807169023,NL @@ -50839,13 +54081,22 @@ 2809282653,2809282653,US 2809282654,2809286975,CA 2809286976,2809286991,US -2809286992,2809291823,CA +2809286992,2809291732,CA +2809291733,2809291733,US +2809291734,2809291823,CA 2809291824,2809291824,US 2809291825,2809291891,CA 2809291892,2809291892,US -2809291893,2809308599,CA +2809291893,2809297711,CA +2809297712,2809297712,US +2809297713,2809308599,CA 2809308600,2809308607,US -2809308608,2809331711,CA +2809308608,2809316607,CA +2809316608,2809316623,US +2809316624,2809321007,CA +2809321008,2809321015,US +2809321016,2809323519,CA +2809323520,2809331711,FR 2809331712,2809397247,US 2809397248,2809462783,UY 2809462784,2809855999,US @@ -50865,32 +54116,18 @@ 2811559936,2811625471,CH 2811625472,2812084223,US 2812084224,2812149759,BO -2812149760,2812293119,US +2812149760,2812291071,US +2812291072,2812292095,DE +2812292096,2812293119,US 2812293120,2812295167,IN 2812295168,2812297215,GB 2812297216,2812411903,US 2812411904,2812477439,AU -2812477440,2812753919,US -2812753920,2812755967,BR -2812755968,2812764159,US -2812764160,2812766207,GB -2812766208,2812774399,US -2812774400,2812776447,GB -2812776448,2812778495,DE -2812778496,2812779519,IT -2812779520,2812780543,FR -2812780544,2812781567,DK -2812781568,2812796927,US -2812796928,2812798975,AU -2812798976,2812801023,JP -2812801024,2812803071,US -2812803072,2812805119,SG +2812477440,2812805119,US 2812805120,2812870655,CH 2812870656,2812936191,JP 2812936192,2813067263,US -2813067264,2813120512,GB -2813120513,2813120513,US -2813120514,2813132799,GB +2813067264,2813132799,GB 2813132800,2813263871,US 2813263872,2813329407,JP 2813329408,2813526015,US @@ -50901,18 +54138,17 @@ 2814181376,2814246911,CN 2814246912,2814377215,US 2814377216,2814377471,EU -2814377472,2815033343,US -2815033344,2815098879,NL -2815098880,2815111347,GB -2815111348,2815111348,US -2815111349,2815139327,GB -2815139328,2815139583,US -2815139584,2815164415,GB +2814377472,2815082495,US +2815082496,2815090687,NL +2815090688,2815098879,US +2815098880,2815164415,GB 2815164416,2815229951,US 2815229952,2815295487,ID 2815295488,2815986943,US 2815986944,2815987199,GB -2815987200,2816159743,US +2815987200,2815988863,US +2815988864,2815988895,GB +2815988896,2816159743,US 2816159744,2816159999,IN 2816160000,2816262143,US 2816262144,2816263167,IE @@ -50927,21 +54163,22 @@ 2816272384,2816273407,JP 2816273408,2816274431,IN 2816274432,2816275455,AU -2816275456,2816278527,SG +2816275456,2816276479,CN +2816276480,2816278527,SG 2816278528,2816671743,US 2816671744,2816737279,CA 2816737280,2817059071,US 2817059072,2817059327,AP 2817059328,2817060863,US 2817060864,2817061119,EU -2817061120,2817062911,LU -2817062912,2817277951,US +2817061120,2817277951,US 2817277952,2817294335,NL 2817294336,2817325055,US 2817325056,2817325311,EU 2817325312,2817933055,US 2817933056,2817933311,CA -2817933312,2817986303,US +2817933312,2817933567,PR +2817933568,2817986303,US 2817986304,2817986559,AP 2817986560,2818002943,US 2818002944,2818003722,GB @@ -50953,7 +54190,9 @@ 2818310144,2818375679,AR 2818375680,2818572287,US 2818637824,2818670591,AU -2818670592,2822731894,US +2818670592,2822592397,US +2822592398,2822592398,IE +2822592399,2822731894,US 2822731895,2822731895,GB 2822731896,2822848997,US 2822848998,2822848998,EU @@ -50971,9 +54210,13 @@ 2824011776,2824077311,AR 2824077312,2824274720,US 2824274721,2824274721,EU -2824274722,2824357375,US +2824274722,2824292095,US +2824292096,2824292351,AU +2824292352,2824357375,US 2824357376,2824357631,GB -2824357632,2824404991,US +2824357632,2824357887,US +2824357888,2824358143,CA +2824358144,2824404991,US 2824404992,2824470527,ZA 2824536064,2824798207,US 2824798208,2824863743,TW @@ -51017,23 +54260,13 @@ 2829041664,2829041919,AU 2829041920,2829058047,US 2829058048,2829123583,CN -2829123584,2829148159,US -2829148160,2829148671,HK +2829123584,2829148415,US +2829148416,2829148671,HK 2829148672,2829174783,US -2829174784,2829175807,GB -2829175808,2829176319,US -2829176320,2829176831,DE -2829176832,2829177343,JP -2829177344,2829177855,AU -2829177856,2829178367,HK -2829178368,2829178879,US -2829178880,2829179391,MX -2829179392,2829179903,BR -2829179904,2829180927,IN -2829180928,2829181951,CN -2829181952,2829182463,US -2829182464,2829182975,VE -2829182976,2829254655,US +2829174784,2829175039,GB +2829175040,2829175551,US +2829175552,2829175807,GB +2829175808,2829254655,US 2829254656,2829320191,CH 2829320192,2829385727,ZA 2829385728,2829451263,MX @@ -51047,11 +54280,7 @@ 2829593344,2829593599,EU 2829593600,2829844479,US 2829844480,2829910015,ZA -2829910016,2830066431,US -2830066432,2830066687,HK -2830066688,2830085887,US -2830085888,2830086143,GB -2830086144,2830106623,US +2829910016,2830106623,US 2830106624,2830172159,CO 2830172160,2830434303,US 2830499840,2830586879,US @@ -51078,9 +54307,7 @@ 2832793600,2832859135,AU 2832859136,2832924671,US 2832924672,2832990207,KR -2832990208,2833252621,US -2833252622,2833252622,GB -2833252623,2833293311,US +2832990208,2833293311,US 2833293312,2833293567,EU 2833293568,2833383423,US 2833383424,2833448959,AR @@ -51102,15 +54329,25 @@ 2834825216,2834956287,KR 2834956288,2835087359,US 2835087360,2835152895,AU +2835152896,2835161087,LR +2835161088,2835169279,ZW +2835169280,2835177471,ZA +2835177472,2835181567,DZ +2835181568,2835183615,NG +2835183616,2835185663,ZA +2835185664,2835202047,RE 2835202048,2835206143,ZA 2835206144,2835208191,NG 2835208192,2835210239,ZA 2835210240,2835218431,MW 2835218432,2835283967,US 2835283968,2835349503,MX -2835349504,2837446655,US +2835349504,2835480575,ZA +2835480576,2837446655,US 2837446656,2837839871,CH -2837839872,2837905407,US +2837839872,2837858047,US +2837858048,2837858055,IN +2837858056,2837905407,US 2837905408,2837970943,CH 2837970944,2838036479,US 2838036480,2838233087,CH @@ -51121,48 +54358,49 @@ 2838757376,2838822911,CH 2838822912,2838865599,US 2838865600,2838865615,KR -2838865616,2838881055,US +2838865616,2838871295,US +2838871296,2838871311,CA +2838871312,2838881055,US 2838881056,2838881087,AT -2838881088,2838890351,US -2838890352,2838890367,CO -2838890368,2838904831,US +2838881088,2838887871,US +2838887872,2838887887,EC +2838887888,2838904831,US 2838904832,2838921215,CA -2838921216,2838938991,US +2838921216,2838930495,US +2838930496,2838930511,HK +2838930512,2838938991,US 2838938992,2838939007,AU -2838939008,2838939615,US -2838939616,2838939647,IE -2838939648,2838942527,US +2838939008,2838942527,US 2838942528,2838942559,AU 2838942560,2838943263,US 2838943264,2838943279,GB -2838943280,2838944975,US -2838944976,2838944991,AF -2838944992,2838946431,US +2838943280,2838946431,US 2838946432,2838946447,CA 2838946448,2838946735,US 2838946736,2838946751,CA -2838946752,2838948127,US -2838948128,2838948143,BR -2838948144,2839085055,US +2838946752,2838958927,US +2838958928,2838958943,AF +2838958944,2838962111,US +2838962112,2838962127,BR +2838962128,2838962527,US +2838962528,2838962543,GB +2838962544,2838964047,US +2838964048,2838964063,PE +2838964064,2839085055,US 2839085056,2839117823,MX -2839117824,2839150591,US +2839117824,2839150591,BR 2839150592,2839543807,CH 2839543808,2843803647,US 2843803648,2843869183,ZA 2843869184,2844524543,US 2844524544,2844590079,KR -2844590080,2844783359,US -2844783360,2844783615,AU -2844783616,2844784639,DE +2844590080,2844783615,US +2844783616,2844784639,EU 2844784640,2844862975,US 2844862976,2844863231,CA -2844863232,2844884991,US -2844884992,2844885247,FR -2844885248,2844902655,US -2844902656,2844902911,SG -2844902912,2844912639,US -2844912640,2844912895,JP -2844912896,2845704191,US +2844863232,2844902655,US +2844902656,2844902911,AP +2844902912,2845704191,US 2845704192,2845755391,CU 2845755392,2845755647,EU 2845755648,2845769727,CU @@ -51177,9 +54415,38 @@ 2848325632,2848522239,US 2848587776,2848653311,ZA 2848653312,2848980991,US -2848980992,2849964031,KR -2849964032,2850029567,HK -2850029568,2851995647,US +2848980992,2850029567,KR +2850029568,2851012607,US +2851012608,2851013631,TZ +2851013632,2851015679,ZA +2851015680,2851016703,CV +2851016704,2851017727,NG +2851017728,2851018751,SC +2851018752,2851019775,ZW +2851019776,2851020799,ZA +2851020800,2851021823,AO +2851021824,2851022847,EG +2851022848,2851023871,CM +2851023872,2851024895,ZA +2851024896,2851025919,NG +2851025920,2851026943,GH +2851026944,2851027967,DZ +2851027968,2851028991,ZA +2851028992,2851030015,CI +2851030016,2851031039,ZA +2851031040,2851032063,CD +2851032064,2851033087,AO +2851033088,2851035135,ZA +2851035136,2851036159,UG +2851036160,2851037183,LY +2851037184,2851038207,CF +2851038208,2851039231,ML +2851039232,2851040255,MZ +2851040256,2851041279,AO +2851041280,2851042303,GQ +2851042304,2851043327,LY +2851043328,2851044351,TD +2851078144,2851995647,US 2852061184,2852062207,ZA 2852062208,2852063231,CM 2852063232,2852064255,KE @@ -51202,7 +54469,7 @@ 2852083712,2852084735,AO 2852084736,2852085759,TN 2852085760,2852086783,KE -2852086784,2852087807,SD +2852086784,2852087807,SS 2852087808,2852088831,KE 2852088832,2852089855,LY 2852089856,2852090879,TZ @@ -51210,6 +54477,7 @@ 2852091904,2852092927,CG 2852092928,2852093951,NG 2852093952,2852094975,ZA +2852094976,2852095999,MZ 2852096000,2852097023,SD 2852097024,2852098047,NG 2852098048,2852099071,ZA @@ -51217,9 +54485,22 @@ 2852100096,2852101119,TD 2852101120,2852102143,LY 2852102144,2852103167,MU -2852126720,2852716653,US -2852716654,2852716654,AU -2852716655,2853306367,US +2852103168,2852106239,ZA +2852106240,2852107263,MA +2852107264,2852108287,NG +2852108288,2852109311,TZ +2852109312,2852110335,CD +2852110336,2852112383,ZA +2852112384,2852113407,KE +2852113408,2852114431,CD +2852114432,2852115455,NG +2852115456,2852116479,KE +2852116480,2852118527,ZA +2852118528,2852119551,NG +2852119552,2852121599,ZA +2852121600,2852122623,NG +2852122624,2852126719,ZA +2852126720,2853306367,US 2853306368,2853371903,CL 2853371904,2853765119,US 2853765120,2853830655,MX @@ -51230,7 +54511,9 @@ 2854748160,2855469055,US 2855469056,2855484671,PY 2855484672,2855485439,AR -2855485440,2855501823,UY +2855485440,2855487999,UY +2855488000,2855488255,AR +2855488256,2855501823,UY 2855501824,2855534591,AR 2855534592,2855706623,US 2855706624,2855706879,EU @@ -51238,7 +54521,13 @@ 2856058880,2856124415,CH 2856124416,2856184831,US 2856184832,2856185855,GB -2856185856,2856452095,US +2856185856,2856438783,US +2856438784,2856439039,BR +2856439040,2856439295,US +2856439296,2856439551,BR +2856439552,2856442367,US +2856442368,2856442623,PH +2856442624,2856452095,US 2856452096,2856517631,BR 2856517632,2856714239,US 2856714240,2856779775,MX @@ -51249,12 +54538,15 @@ 2857766656,2857766911,EU 2857766912,2859007999,US 2859008000,2859073535,JP -2859073536,2861850623,US +2859073536,2861069055,US +2861069056,2861069311,GB +2861069312,2861733375,US +2861733376,2861733631,CA +2861733632,2861850623,US 2861850624,2861850879,AP -2861850880,2861851391,HK +2861850880,2861851391,US 2861851392,2861851647,AP -2861851648,2861861375,HK -2861861376,2861862911,US +2861851648,2861862911,US 2861862912,2861863167,AU 2861863168,2861876735,US 2861876736,2861876991,GB @@ -51277,38 +54569,169 @@ 2864844800,2864845055,NL 2864845056,2864848895,US 2864848896,2864849151,GB -2864849152,2865417457,US -2865417458,2865417458,GB -2865417459,2865577983,US +2864849152,2865577983,US 2865577984,2865610751,BE 2865610752,2865889279,US 2865889280,2865954815,AR -2865954816,2866953215,US -2866953216,2866953471,AU -2866953472,2867593215,US +2865954816,2867593215,US 2867593216,2867724287,CH 2867855360,2868117503,US -2868379648,2868420607,US +2868379648,2868380159,IN +2868380160,2868380671,BR +2868380672,2868380927,US +2868380928,2868381055,MX +2868381056,2868381183,IN +2868381184,2868381695,MX +2868381696,2868382463,US +2868382464,2868382719,CL +2868382720,2868383231,IN +2868383232,2868383743,US +2868383744,2868384255,PH +2868384256,2868384767,BR +2868384768,2868390143,US +2868390144,2868390399,GB +2868390400,2868390911,IN +2868390912,2868391423,US +2868391424,2868391935,IN +2868391936,2868399615,US +2868399616,2868399871,BR +2868399872,2868400127,US +2868400128,2868400639,BR +2868400640,2868401151,US +2868401152,2868401663,BR +2868401664,2868401919,PH +2868401920,2868402175,AR +2868402176,2868410367,US +2868410368,2868410879,BR +2868410880,2868411391,AR +2868411392,2868411903,PL +2868411904,2868414719,US +2868414720,2868414975,MU +2868414976,2868415487,IN +2868415488,2868415999,US +2868416000,2868416255,AU +2868416256,2868416767,US +2868416768,2868417023,PL +2868417024,2868417535,JP +2868417536,2868418815,US +2868418816,2868419071,TR +2868419072,2868419327,PH +2868419328,2868419583,IN +2868419584,2868420607,PH 2868420608,2868423679,IN -2868423680,2868586495,US +2868423680,2868428287,US +2868428288,2868428799,IN +2868428800,2868432895,US +2868432896,2868433407,AR +2868433408,2868437503,US +2868437504,2868437759,BR +2868437760,2868576255,US +2868576256,2868578303,IN +2868578304,2868578815,BR +2868578816,2868579327,IN +2868579328,2868581375,US +2868581376,2868581887,IN +2868581888,2868582143,US +2868582144,2868582399,RO +2868582400,2868585471,US +2868585472,2868585727,GB +2868585728,2868585983,PH +2868585984,2868586495,GB 2868586496,2868588543,IN -2868588544,2868605376,US -2868605377,2868605377,NO -2868605378,2868658175,US -2868658176,2868658431,GB -2868658432,2868660223,US +2868588544,2868589055,PH +2868589056,2868591615,US +2868591616,2868592383,IN +2868592384,2868592447,DE +2868592448,2868592511,IN +2868592512,2868592639,US +2868592640,2868593663,NL +2868593664,2868593919,IN +2868593920,2868595711,US +2868595712,2868596223,FR +2868596224,2868596735,ES +2868596736,2868597759,DE +2868597760,2868598271,PH +2868598272,2868599295,US +2868599296,2868599807,IN +2868599808,2868600319,FR +2868600320,2868600831,AU +2868600832,2868601343,FR +2868601344,2868601855,CR +2868601856,2868602367,ES +2868602368,2868602623,US +2868602624,2868603007,ES +2868603008,2868603071,IN +2868603072,2868603135,ES +2868603136,2868603391,PH +2868603392,2868603647,US +2868603648,2868604159,DE +2868604160,2868604415,PH +2868604416,2868604927,IN +2868604928,2868605183,PH +2868605184,2868605951,SE +2868605952,2868606207,PL +2868606208,2868609023,ES +2868609024,2868610047,AU +2868610048,2868611327,US +2868611328,2868611583,AU +2868611584,2868611839,US +2868611840,2868612095,IN +2868612096,2868612607,US +2868612608,2868613119,IN +2868613120,2868613631,US +2868613632,2868614143,PH +2868614144,2868614399,US +2868614400,2868615167,IN +2868615168,2868615679,US +2868615680,2868616703,IN +2868616704,2868617215,US +2868617216,2868617471,PH +2868617472,2868617727,AU +2868617728,2868618239,US +2868618240,2868618367,PH +2868618368,2868618431,US +2868618432,2868618751,PH +2868618752,2868619263,US +2868619264,2868619775,PH +2868619776,2868620287,IN +2868620288,2868620799,US +2868620800,2868621503,IN +2868621504,2868621567,ES +2868621568,2868621823,ID +2868621824,2868621855,IN +2868621856,2868621919,US +2868621920,2868621951,IN +2868621952,2868622335,US +2868622336,2868622847,DE +2868622848,2868623359,US +2868623360,2868623871,PH +2868623872,2868624383,IN +2868624384,2868625407,ES +2868625408,2868649983,US +2868649984,2868651263,DE +2868651264,2868651391,US +2868651392,2868652031,DE +2868652032,2868658175,US +2868658176,2868660223,GB 2868660224,2868660479,EU -2868660480,2868662271,US +2868660480,2868662271,GB 2868662272,2868662527,EU -2868662528,2868673023,US -2868673024,2868673279,FR -2868673280,2868674336,US +2868662528,2868664319,DE +2868664320,2868667903,GB +2868667904,2868668927,US +2868668928,2868669439,GB +2868669440,2868669951,US +2868669952,2868670975,GB +2868670976,2868671487,US +2868671488,2868674336,GB 2868674337,2868674337,SE -2868674338,2868676607,US -2868676608,2868676863,AU -2868676864,2868682752,US +2868674338,2868674559,GB +2868674560,2868682752,PH 2868682753,2868682753,AP -2868682754,2868772863,US +2868682754,2868689151,PH +2868689152,2868689663,AU +2868689664,2868690943,PH +2868690944,2868772863,US 2868838400,2868903935,BE 2868903936,2869035007,SG 2869035008,2869166079,JP @@ -51392,12 +54815,10 @@ 2875195392,2875719679,TH 2875719680,2877292543,CN 2877292544,2879336447,US -2879336448,2879336959,GB -2879336960,2879467519,US +2879336448,2879336703,GB +2879336704,2879467519,US 2879467520,2879468031,AP -2879468032,2879469567,US -2879469568,2879470079,IN -2879470080,2881486847,US +2879468032,2881486847,US 2881486848,2881487103,GB 2881487104,2882469887,US 2882469888,2882535423,SG @@ -51406,10 +54827,118 @@ 2885681152,2886667007,US 2886667008,2886667263,DE 2886667264,2886729727,US -2887778304,2890399743,US -2890414080,2890415103,ZA -2890661888,2890924031,US -2894069760,2894921727,US +2887778304,2891034623,US +2891034624,2891036671,CA +2891036672,2891056383,US +2891056384,2891056639,ES +2891056640,2891058943,US +2891058944,2891059199,FR +2891059200,2891120639,US +2891251712,2891272191,US +2891272192,2891274239,CA +2891274240,2891282431,US +2891282432,2891283455,PR +2891283456,2891284479,CA +2891284480,2891364351,US +2891364352,2891374591,CA +2891374592,2891378687,US +2891378688,2891380735,CA +2891380736,2891403263,US +2891403264,2891407359,CA +2891407360,2891796479,US +2891796480,2891800575,CA +2891800576,2891807743,US +2891807744,2891808767,CA +2891808768,2891841535,US +2891841536,2891842303,SE +2891842304,2891843327,GB +2891843328,2891843839,SE +2891843840,2891844095,GB +2891844096,2891845119,FR +2891845120,2891846399,DE +2891846400,2891846911,CH +2891846912,2891847679,NL +2891847680,2891847935,SG +2891847936,2891848447,MY +2891848448,2891848959,JP +2891848960,2891849471,BN +2891849472,2891849983,PH +2891849984,2891850495,TH +2891850496,2891850751,SG +2891850752,2891854335,US +2891854336,2891855615,NL +2891855616,2891856127,SE +2891856128,2891856383,LU +2891856384,2891857919,US +2891857920,2891858175,ES +2891858176,2891858431,TR +2891858432,2891858687,RO +2891858688,2891862527,US +2891862528,2891863039,KR +2891863040,2891863551,AU +2891863552,2891864063,JP +2891864064,2891864575,SG +2891864576,2891871231,US +2891871232,2891871487,CA +2891871488,2891974655,US +2891974656,2891976703,CA +2891976704,2891982847,US +2891982848,2891984895,CA +2891984896,2892021759,US +2892021760,2892038143,CA +2892038144,2892040191,US +2892040192,2892042239,CA +2892042240,2892050431,US +2892050432,2892052479,CA +2892052480,2892053503,US +2892053504,2892054527,CA +2892054528,2892068863,US +2892068864,2892069887,CA +2892069888,2892070911,US +2892070912,2892103679,CA +2892103680,2892120831,US +2892120832,2892121087,CA +2892121088,2892140543,US +2892140544,2892144895,CA +2892144896,2892145407,US +2892145408,2892145663,CA +2892145664,2892146943,US +2892146944,2892147199,NL +2892147200,2892149503,US +2892149504,2892149759,NL +2892149760,2892150271,US +2892150272,2892150783,CA +2892150784,2892171263,US +2892171264,2892172287,CA +2892172288,2892174335,US +2892174336,2892177407,CA +2892177408,2892369919,US +2892369920,2892374015,CA +2892374016,2892420607,US +2892420608,2892420863,CA +2892420864,2892423167,US +2892423168,2892424191,VI +2892424192,2892425215,CA +2892425216,2892443647,US +2892443648,2892447743,CA +2892447744,2892464127,VG +2892464128,2892496895,CA +2892496896,2892906495,US +2892906496,2892910591,CA +2892910592,2892988415,US +2892988416,2892988671,SC +2892988672,2892988927,PA +2892988928,2892989183,SA +2892989184,2892989439,PE +2892989440,2892989695,CO +2892989696,2892989951,VE +2892989952,2892990207,US +2892990208,2892990463,CA +2892990464,2892990975,IT +2892990976,2892991231,ID +2892991232,2893676543,US +2893676544,2893807615,CA +2893807616,2894921727,US 2894921728,2895118335,GB 2895118336,2895301887,US 2895301888,2895302143,AR @@ -51418,7 +54947,9 @@ 2895708160,2896035839,US 2896035840,2896101375,DE 2896101376,2896166911,GB -2896166912,2896429280,US +2896166912,2896301499,US +2896301500,2896301500,DE +2896301501,2896429280,US 2896429281,2896429281,CA 2896429282,2897018879,US 2897018880,2897149951,DE @@ -51439,39 +54970,41 @@ 2899574784,2899902463,GB 2899902464,2899967999,US 2899968000,2900099071,CA -2900099072,2902458367,US +2900099072,2901740455,US +2901740456,2901740463,CA +2901740464,2902458367,US 2902458368,2902462463,A1 2902462464,2902476543,US 2902476544,2902476799,CW 2902476800,2902507519,US 2902507520,2902515711,CA -2902515712,2902564399,US -2902564400,2902564415,CN -2902564416,2902564687,US -2902564688,2902564703,AU -2902564704,2904555519,US +2902515712,2904555519,US 2904555520,2904817663,CA 2904817664,2905001983,US 2905001984,2905002152,GB 2905002153,2905002153,US -2905002154,2905002495,GB -2905002496,2905044991,US -2905044992,2905045503,SG -2905045504,2905379071,US -2905379072,2905379327,CA -2905379328,2905380607,US -2905380608,2905380863,CA -2905380864,2905387519,US +2905002154,2905002248,GB +2905002249,2905002249,NL +2905002250,2905002495,GB +2905002496,2905005055,US +2905005056,2905005311,GB +2905005312,2905044991,US +2905044992,2905045247,SG +2905045248,2905345279,US +2905345280,2905345535,AU +2905345536,2905346815,US +2905346816,2905347071,JP +2905347072,2905348095,US +2905348096,2905348351,PH +2905348352,2905348863,US +2905348864,2905349119,NZ +2905349120,2905387519,US 2905387520,2905388031,CA -2905388032,2905394175,US -2905394176,2905394687,CA -2905394688,2905401855,US +2905388032,2905401855,US 2905401856,2905402111,CA 2905402112,2905405679,US 2905405680,2905405687,CN -2905405688,2905407743,US -2905407744,2905407999,TW -2905408000,2905415679,US +2905405688,2905415679,US 2905415680,2905415935,GB 2905415936,2905446655,US 2905446656,2905446911,DE @@ -51494,7 +55027,8 @@ 2915250176,2915254271,CA 2915254272,2915516415,US 2915516416,2915516671,NL -2915516672,2915517183,US +2915516672,2915516927,CA +2915516928,2915517183,US 2915517184,2915517439,RU 2915517440,2915518463,DK 2915518464,2915520511,GB @@ -51503,18 +55037,29 @@ 2915521280,2915521535,PL 2915521536,2915526911,US 2915526912,2915527167,DE -2915527168,2915527679,US +2915527168,2915527423,US +2915527424,2915527679,DE 2915527680,2915528715,NL 2915528716,2915528735,US 2915528736,2915528751,NL 2915528752,2915528767,US 2915528768,2915528791,NL -2915528792,2915795013,US +2915528792,2915528863,US +2915528864,2915528879,NL +2915528880,2915528927,US +2915528928,2915528943,NL +2915528944,2915795013,US 2915795014,2915795014,MX -2915795015,2915958783,US +2915795015,2915894575,US +2915894576,2915894591,CA +2915894592,2915958783,US 2915958784,2916024319,CA 2916024320,2916163583,US -2916163584,2916169015,CA +2916163584,2916167375,CA +2916167376,2916167383,US +2916167384,2916168159,CA +2916168160,2916168167,US +2916168168,2916169015,CA 2916169016,2916169023,US 2916169024,2916171775,CA 2916171776,2916184063,US @@ -51533,7 +55078,9 @@ 2916581376,2916614143,PR 2916614144,2917031935,US 2917031936,2917032959,NL -2917032960,2917040127,US +2917032960,2917035007,US +2917035008,2917035519,NL +2917035520,2917040127,US 2917040128,2917041407,NL 2917041408,2917048831,US 2917048832,2917049343,NL @@ -51547,11 +55094,15 @@ 2917078528,2917079039,NL 2917079040,2917080063,US 2917080064,2917081087,NL -2917081088,2917105663,US +2917081088,2917100031,US +2917100032,2917100543,NL +2917100544,2917105663,US 2917105664,2917106175,NL 2917106176,2917106431,US 2917106432,2917106687,NL -2917106688,2917117951,US +2917106688,2917112831,US +2917112832,2917113855,NL +2917113856,2917117951,US 2917117952,2917122047,NL 2917122048,2917167905,US 2917167906,2917167906,BZ @@ -51561,7 +55112,9 @@ 2917170855,2917170856,UA 2917170857,2917171086,US 2917171087,2917171087,UA -2917171088,2917195775,US +2917171088,2917171199,US +2917171200,2917175295,CA +2917175296,2917195775,US 2917195776,2917199871,A2 2917199872,2917203967,CA 2917203968,2917257215,US @@ -51573,15 +55126,16 @@ 2917267840,2917267967,AG 2917267968,2917268223,JM 2917268224,2917268479,BB -2917268480,2917268735,TC -2917268736,2917269113,JM +2917268480,2917269113,JM 2917269114,2917269114,TC 2917269115,2917269503,JM 2917269504,2917449727,US 2917449728,2917466111,PR 2917466112,2917572607,US 2917572608,2917580799,CA -2917580800,2917597439,US +2917580800,2917593295,US +2917593296,2917593303,CO +2917593304,2917597439,US 2917597440,2917597695,GB 2917597696,2917621759,US 2917621760,2917629951,CA @@ -51618,10 +55172,12 @@ 2917704448,2917707519,US 2917707520,2917707775,CA 2917707776,2917709823,US -2917709824,2917710847,CA +2917709824,2917710079,CA +2917710080,2917710591,US +2917710592,2917710847,CA 2917710848,2917713919,US -2917713920,2917714431,CA -2917714432,2917715967,US +2917713920,2917714175,CA +2917714176,2917715967,US 2917715968,2917716223,CA 2917716224,2917720575,US 2917720576,2917720831,CA @@ -51635,7 +55191,9 @@ 2918051840,2918121471,CA 2918121472,2918154239,US 2918154240,2918170623,CA -2918170624,2918187775,US +2918170624,2918174463,US +2918174464,2918174719,MX +2918174720,2918187775,US 2918187776,2918188031,CA 2918188032,2918232063,US 2918232064,2918236159,CA @@ -51656,11 +55214,13 @@ 2918391808,2918395903,CA 2918395904,2918404095,US 2918404096,2918406911,PR -2918406912,2918407167,US -2918407168,2918408191,PR +2918406912,2918407423,US +2918407424,2918408191,PR 2918408192,2918432767,US 2918432768,2918436863,CA -2918436864,2918469631,US +2918436864,2918463231,US +2918463232,2918463487,CA +2918463488,2918469631,US 2918469632,2918471423,CA 2918471424,2918471679,US 2918471680,2918472703,CA @@ -51668,13 +55228,11 @@ 2918473216,2918473727,CA 2918473728,2918477823,US 2918477824,2918481919,CA -2918481920,2918527743,US -2918527744,2918527999,NO -2918528000,2918536719,US +2918481920,2918527231,US +2918527232,2918527487,FR +2918527488,2918536719,US 2918536720,2918536727,CA -2918536728,2918568191,US -2918568192,2918568319,AU -2918568320,2918570239,US +2918536728,2918570239,US 2918570240,2918570495,JP 2918570496,2918580223,US 2918580224,2918588415,CA @@ -51684,7 +55242,11 @@ 2918604544,2918604799,CA 2918604800,2918612991,US 2918612992,2918621183,CA -2918621184,2918699007,US +2918621184,2918653951,US +2918653952,2918662143,CA +2918662144,2918678527,US +2918678528,2918686719,CA +2918686720,2918699007,US 2918699008,2918703103,CA 2918703104,2918760447,US 2918760448,2918776831,CA @@ -51775,9 +55337,7 @@ 2926575616,2927099903,CA 2927099904,2927242751,US 2927242752,2927243263,AE -2927243264,2927254783,US -2927254784,2927255039,AE -2927255040,2927581183,US +2927243264,2927581183,US 2927581184,2927581439,SG 2927581440,2927981567,US 2927981568,2927982591,SG @@ -51785,7 +55345,15 @@ 2928175552,2928175559,VN 2928175560,2928177151,US 2928177152,2928181247,CA -2928181248,2928226303,US +2928181248,2928200191,US +2928200192,2928200447,AU +2928200448,2928201983,US +2928201984,2928202239,JP +2928202240,2928204799,US +2928204800,2928205055,NZ +2928205056,2928206335,US +2928206336,2928206591,PH +2928206592,2928226303,US 2928226304,2928230399,CA 2928230400,2928261375,US 2928261376,2928261887,CA @@ -51799,10 +55367,10 @@ 2928336896,2928455679,US 2928455680,2928459775,CA 2928459776,2928541695,US -2928541696,2928570671,CA -2928570672,2928570687,FR -2928570688,2928607231,CA -2928607232,2936012799,US +2928541696,2928607231,CA +2928607232,2928633199,US +2928633200,2928633215,CA +2928633216,2936012799,US 2936012800,2937847807,CN 2937847808,2937848831,KH 2937848832,2937849855,JP @@ -51853,7 +55421,9 @@ 2942304256,2942566399,TW 2942566400,2942599167,KH 2942599168,2942608383,IN -2942608384,2942609407,HK +2942608384,2942608639,HK +2942608640,2942608895,US +2942608896,2942609407,HK 2942609408,2942615551,IN 2942615552,2942619647,HK 2942619648,2942631935,JP @@ -51923,9 +55493,7 @@ 2947598336,2947602431,AU 2947602432,2947603455,NZ 2947603456,2947604479,TH -2947604480,2947611135,HK -2947611136,2947611391,AU -2947611392,2947612671,HK +2947604480,2947612671,HK 2947612672,2947678207,JP 2947678208,2947743743,CN 2947743744,2947809279,JP @@ -52000,7 +55568,9 @@ 2954825152,2954825159,NL 2954825160,2954825315,FR 2954825316,2954825319,ES -2954825320,2954825403,FR +2954825320,2954825383,FR +2954825384,2954825387,NL +2954825388,2954825403,FR 2954825404,2954825407,ES 2954825408,2954825535,FR 2954825536,2954825539,ES @@ -52039,7 +55609,9 @@ 2954830524,2954830527,DE 2954830528,2954830735,FR 2954830736,2954830751,NL -2954830752,2954831247,FR +2954830752,2954830879,FR +2954830880,2954830887,BE +2954830888,2954831247,FR 2954831248,2954831251,ES 2954831252,2954831807,FR 2954831808,2954831823,ES @@ -52066,13 +55638,17 @@ 2954834984,2954834991,IT 2954834992,2954835039,FR 2954835040,2954835043,DE -2954835044,2954835295,FR +2954835044,2954835067,FR +2954835068,2954835071,FI +2954835072,2954835295,FR 2954835296,2954835299,ES 2954835300,2954835443,FR 2954835444,2954835447,ES 2954835448,2954835451,FR 2954835452,2954835455,ES -2954835456,2954837071,FR +2954835456,2954835619,FR +2954835620,2954835620,ES +2954835621,2954837071,FR 2954837072,2954837075,ES 2954837076,2954837615,FR 2954837616,2954837619,IT @@ -52101,9 +55677,7 @@ 2954840256,2954840447,GB 2954840448,2954840515,FR 2954840516,2954840519,NL -2954840520,2954840731,FR -2954840732,2954840735,IT -2954840736,2954840927,FR +2954840520,2954840927,FR 2954840928,2954840931,DE 2954840932,2954841707,FR 2954841708,2954841711,NL @@ -52115,9 +55689,13 @@ 2954843760,2954843771,ES 2954843772,2954844147,FR 2954844148,2954844151,DE -2954844152,2954844999,FR +2954844152,2954844192,FR +2954844193,2954844193,NL +2954844194,2954844999,FR 2954845000,2954845003,ES -2954845004,2954846095,FR +2954845004,2954845183,FR +2954845184,2954845199,DE +2954845200,2954846095,FR 2954846096,2954846103,NL 2954846104,2954846107,FR 2954846108,2954846111,ES @@ -52149,13 +55727,13 @@ 2954859872,2954859903,ES 2954859904,2954861623,FR 2954861624,2954861631,IT -2954861632,2954861875,FR +2954861632,2954861867,FR +2954861868,2954861871,CZ +2954861872,2954861875,FR 2954861876,2954861879,CH 2954861880,2954862415,FR 2954862416,2954862419,ES -2954862420,2954865663,FR -2954865664,2954866687,ES -2954866688,2954867041,FR +2954862420,2954867041,FR 2954867042,2954867043,PT 2954867044,2954870799,FR 2954870800,2954870803,ES @@ -52164,7 +55742,11 @@ 2954870844,2954870847,ES 2954870848,2954870903,FR 2954870904,2954870907,ES -2954870908,2954875879,FR +2954870908,2954874431,FR +2954874432,2954874447,GB +2954874448,2954874655,FR +2954874656,2954874663,DE +2954874664,2954875879,FR 2954875880,2954875883,ES 2954875884,2954876871,FR 2954876872,2954876875,ES @@ -52209,7 +55791,9 @@ 2955034624,2955083775,IE 2955083776,2955149311,GB 2955149312,2955411455,UA -2955411456,2955673599,TR +2955411456,2955631615,TR +2955631616,2955631871,UA +2955631872,2955673599,TR 2955673600,2955804671,SA 2955804672,2955837439,EE 2955837440,2955845631,IR @@ -52244,7 +55828,7 @@ 2956500992,2956503039,NL 2956503040,2956504063,CY 2956504064,2956504319,CH -2956504320,2956504575,RU +2956504320,2956504575,NL 2956504576,2956504831,A1 2956504832,2956505087,RU 2956505088,2956506111,NL @@ -52297,8 +55881,8 @@ 2956823552,2956824575,US 2956824576,2956826623,PT 2956826624,2956828671,HR -2956828672,2956832767,BA -2956832768,2956833791,AT +2956828672,2956833023,BA +2956833024,2956833791,AT 2956833792,2956836863,BA 2956836864,2956853247,SK 2956853248,2956865535,HR @@ -52324,11 +55908,8 @@ 2957068288,2957070335,LU 2957070336,2957074431,IT 2957074432,2957082623,RU -2957082624,2957099007,DE -2957099008,2957100031,CH -2957100032,2957104639,DE -2957104640,2957105663,US -2957105664,2957115391,DE +2957082624,2957090815,DE +2957090816,2957115391,IR 2957115392,2957180927,AT 2957180928,2957189119,UA 2957189120,2957193215,LV @@ -52431,11 +56012,10 @@ 2959255552,2959261695,RU 2959261696,2959278079,KZ 2959278080,2959282175,RU -2959282176,2959290367,RO +2959282176,2959286271,SA +2959286272,2959290367,RO 2959290368,2959292415,PL -2959292416,2959309055,RU -2959309056,2959309311,UA -2959309312,2959343615,RU +2959292416,2959343615,RU 2959343616,2959351807,UA 2959351808,2959353855,EU 2959353856,2959355903,RU @@ -52536,7 +56116,9 @@ 2959884288,2959892479,KZ 2959892480,2959900671,UA 2959900672,2959902719,PL -2959902720,2959925247,RU +2959902720,2959915007,RU +2959915008,2959917055,UA +2959917056,2959925247,RU 2959925248,2959927295,RO 2959927296,2959929343,UA 2959929344,2959935487,RU @@ -52594,7 +56176,7 @@ 2960160768,2960162815,UA 2960162816,2960175103,RU 2960175104,2960179199,SK -2960179200,2960187391,EU +2960179200,2960187391,IR 2960187392,2960211967,RU 2960220160,2960224255,RO 2960224256,2960228351,RU @@ -52730,13 +56312,12 @@ 2960908288,2960916479,KG 2960916480,2960924671,UA 2960932864,2960933887,IR -2960933888,2960934399,GB -2960934400,2960934655,LI -2960934656,2960934911,DE +2960933888,2960934655,GB +2960934656,2960934911,NL 2960934912,2960941055,RO 2960941056,2960943103,AM 2960943104,2960945151,RO -2960945152,2960945663,LI +2960945152,2960945663,GB 2960945664,2960949247,RU 2960949248,2960951295,UA 2960951296,2960951807,RU @@ -52772,10 +56353,17 @@ 2961057792,2961061887,RU 2961061888,2961062911,PL 2961062912,2961063935,UA -2961063936,2961072127,CZ +2961063936,2961064959,NL +2961064960,2961065215,HK +2961065216,2961065471,AU +2961065472,2961065727,BR +2961065728,2961069567,NL +2961069568,2961069823,IN +2961069824,2961072127,NL 2961072128,2961088511,UA 2961088512,2961088767,SE -2961088768,2961089535,UA +2961088768,2961089023,RU +2961089024,2961089535,UA 2961089536,2961090559,KG 2961090560,2961096703,RO 2961096704,2961097471,GB @@ -52816,7 +56404,7 @@ 2967345152,2967347199,ES 2967347200,2967351295,HR 2967351296,2967355391,FR -2967355392,2967363583,RO +2967355392,2967363583,ES 2967363584,2967371775,SE 2967371776,2967388159,KZ 2967388160,2967392255,RU @@ -52829,14 +56417,19 @@ 2967422976,2967425023,KZ 2967425024,2967427071,DE 2967427072,2967428095,NL -2967428096,2967432959,RO +2967428096,2967432191,RO +2967432192,2967432447,GB +2967432448,2967432959,RO 2967432960,2967433215,CH 2967433216,2967434239,RO 2967434240,2967435007,GB -2967435008,2967441407,RO +2967435008,2967435263,IE +2967435264,2967441407,RO 2967441408,2967445503,MD 2967445504,2967446015,GB -2967446016,2967470079,RO +2967446016,2967446783,RO +2967446784,2967447039,DE +2967447040,2967470079,RO 2967470080,2967601151,SA 2967601152,2967633919,HU 2967633920,2967666687,RU @@ -52915,8 +56508,7 @@ 2987458560,2987462655,CZ 2987462656,2987466751,RS 2987466752,2987470847,GB -2987470848,2987474431,IQ -2987474432,2987474943,US +2987470848,2987474943,IQ 2987474944,2987479039,GB 2987479040,2987487231,CZ 2987487232,2987491327,HR @@ -52943,7 +56535,8 @@ 2987540480,2987544575,SK 2987544576,2987548671,NL 2987548672,2987552767,RU -2987552768,2987556863,GB +2987552768,2987553023,AE +2987553024,2987556863,GB 2987556864,2987560959,NL 2987560960,2987565055,DE 2987565056,2987569151,AT @@ -53002,7 +56595,9 @@ 2987732992,2987735039,HU 2987735040,2987737087,ES 2987737088,2987739135,RU -2987739136,2987743231,SE +2987739136,2987742982,SE +2987742983,2987742983,DK +2987742984,2987743231,SE 2987743232,2987745279,DK 2987745280,2987747327,IT 2987747328,2987749375,ES @@ -53020,9 +56615,7 @@ 2987771904,2987773951,IT 2987773952,2987775999,FR 2987776000,2987778047,NL -2987778048,2987779071,CH -2987779072,2987779583,LI -2987779584,2987780095,CH +2987778048,2987780095,CH 2987780096,2987782143,GB 2987782144,2987784191,EE 2987784192,2987786239,DK @@ -53097,11 +56690,17 @@ 2988442076,2988442079,ES 2988442080,2988442847,FR 2988442848,2988442863,IT -2988442864,2988444208,FR +2988442864,2988443263,FR +2988443264,2988443295,ES +2988443296,2988444208,FR 2988444209,2988444209,FI 2988444210,2988444671,FR 2988444672,2988444679,ES -2988444680,2988448607,FR +2988444680,2988446719,FR +2988446720,2988446723,DE +2988446724,2988446871,FR +2988446872,2988446872,IE +2988446873,2988448607,FR 2988448608,2988448639,ES 2988448640,2988448799,FR 2988448800,2988448815,ES @@ -53109,9 +56708,7 @@ 2988449208,2988449215,ES 2988449216,2988451839,FR 2988451840,2988453887,BE -2988453888,2988454399,GB -2988454400,2988454655,FR -2988454656,2988457983,GB +2988453888,2988457983,GB 2988457984,2988458319,FR 2988458320,2988458327,NL 2988458328,2988459119,FR @@ -53119,21 +56716,17 @@ 2988459128,2988459135,PL 2988459136,2988459535,FR 2988459536,2988459539,ES -2988459540,2988459679,FR -2988459680,2988459683,ES -2988459684,2988459687,FR +2988459540,2988459687,FR 2988459688,2988459691,PL 2988459692,2988459863,FR 2988459864,2988459867,ES -2988459868,2988460575,FR +2988459868,2988460063,FR +2988460064,2988460095,PT +2988460096,2988460575,FR 2988460576,2988460591,PT 2988460592,2988460651,FR 2988460652,2988460655,ES -2988460656,2988461703,FR -2988461704,2988461707,NL -2988461708,2988462603,FR -2988462604,2988462607,ES -2988462608,2988462747,FR +2988460656,2988462747,FR 2988462748,2988462751,ES 2988462752,2988463915,FR 2988463916,2988463919,ES @@ -53141,18 +56734,18 @@ 2988464000,2988464007,IE 2988464008,2988464015,LT 2988464016,2988464359,FR -2988464360,2988464360,NL -2988464361,2988464611,FR +2988464360,2988464363,NL +2988464364,2988464611,FR 2988464612,2988464615,IT 2988464616,2988464623,FR 2988464624,2988464627,ES 2988464628,2988465215,FR 2988465216,2988465219,ES -2988465220,2988465279,FR -2988465280,2988465295,DE -2988465296,2988465559,FR +2988465220,2988465559,FR 2988465560,2988465563,ES -2988465564,2988476415,FR +2988465564,2988466098,FR +2988466099,2988466099,BE +2988466100,2988476415,FR 2988476416,2988478463,IT 2988478464,2988478579,FR 2988478580,2988478583,DE @@ -53164,7 +56757,11 @@ 2988479728,2988479735,DE 2988479736,2988479791,FR 2988479792,2988479807,GB -2988479808,2988482111,FR +2988479808,2988480077,FR +2988480078,2988480078,ES +2988480079,2988480207,FR +2988480208,2988480223,ES +2988480224,2988482111,FR 2988482112,2988482143,DE 2988482144,2988482319,FR 2988482320,2988482335,IT @@ -53190,9 +56787,15 @@ 2988487236,2988487239,NL 2988487240,2988487303,FR 2988487304,2988487311,NL -2988487312,2988487883,FR +2988487312,2988487407,FR +2988487408,2988487415,IT +2988487416,2988487883,FR 2988487884,2988487887,NL -2988487888,2988489479,FR +2988487888,2988487919,FR +2988487920,2988487923,DE +2988487924,2988488971,FR +2988488972,2988488975,MT +2988488976,2988489479,FR 2988489480,2988489483,DE 2988489484,2988489675,FR 2988489676,2988489679,ES @@ -53202,9 +56805,15 @@ 2988490684,2988490686,IT 2988490687,2988490687,BE 2988490688,2988490719,ES -2988490720,2988492799,FR +2988490720,2988491151,FR +2988491152,2988491155,NL +2988491156,2988491251,FR +2988491252,2988491252,ES +2988491253,2988492799,FR 2988492800,2988494847,PL -2988494848,2988499663,FR +2988494848,2988499535,FR +2988499536,2988499551,ES +2988499552,2988499663,FR 2988499664,2988499671,NL 2988499672,2988499729,FR 2988499730,2988499730,GB @@ -53278,7 +56887,9 @@ 2988525888,2988525951,GB 2988525952,2988526415,FR 2988526416,2988526423,ES -2988526424,2988527527,FR +2988526424,2988527447,FR +2988527448,2988527455,NL +2988527456,2988527527,FR 2988527528,2988527531,NL 2988527532,2988527723,FR 2988527724,2988527727,ES @@ -53293,7 +56904,9 @@ 2988529360,2988529375,FR 2988529376,2988529383,GB 2988529384,2988529387,ES -2988529388,2988531275,FR +2988529388,2988530087,FR +2988530088,2988530091,NL +2988530092,2988531275,FR 2988531276,2988531279,PT 2988531280,2988535807,FR 2988535808,2988537855,ES @@ -53307,11 +56920,15 @@ 2988540564,2988540567,CZ 2988540568,2988541955,FR 2988541956,2988541959,DE -2988541960,2988542627,FR +2988541960,2988542339,FR +2988542340,2988542340,US +2988542341,2988542627,FR 2988542628,2988542631,NL 2988542632,2988544671,FR 2988544672,2988544687,GB -2988544688,2988546687,FR +2988544688,2988545515,FR +2988545516,2988545519,GB +2988545520,2988546687,FR 2988546688,2988546691,CH 2988546692,2988546703,FR 2988546704,2988546719,DE @@ -53345,11 +56962,15 @@ 2988551536,2988551551,DE 2988551552,2988552883,FR 2988552884,2988552887,IT -2988552888,2988553399,FR +2988552888,2988553199,FR +2988553200,2988553215,BE +2988553216,2988553399,FR 2988553400,2988553407,NL 2988553408,2988553531,FR 2988553532,2988553535,ES -2988553536,2988554035,FR +2988553536,2988553855,FR +2988553856,2988553919,BE +2988553920,2988554035,FR 2988554036,2988554039,ES 2988554040,2988555527,FR 2988555528,2988555531,DE @@ -53365,7 +56986,9 @@ 2988557508,2988557511,ES 2988557512,2988557539,FR 2988557540,2988557543,ES -2988557544,2988558203,FR +2988557544,2988557983,FR +2988557984,2988557999,IT +2988558000,2988558203,FR 2988558204,2988558207,DE 2988558208,2988558623,FR 2988558624,2988558655,NL @@ -53387,7 +57010,9 @@ 2988562848,2988562863,GB 2988562864,2988563559,FR 2988563560,2988563567,NL -2988563568,2988564023,FR +2988563568,2988563671,FR +2988563672,2988563675,DE +2988563676,2988564023,FR 2988564024,2988564027,IE 2988564028,2988564143,FR 2988564144,2988564159,ES @@ -53410,7 +57035,11 @@ 2989883392,2989948927,UA 2989948928,2990014463,FI 2990014464,2990079999,PL -2990080000,2990145535,RU +2990080000,2990096895,RU +2990096896,2990097023,KZ +2990097024,2990097151,US +2990097152,2990097279,KZ +2990097280,2990145535,RU 2990145536,2990211071,SI 2990211072,2990276607,GR 2990276608,2990342143,ES @@ -53419,9 +57048,7 @@ 2990440448,2990473215,NL 2990473216,2990475674,DE 2990475675,2990475675,HR -2990475676,2990500113,DE -2990500114,2990500115,PL -2990500116,2990538751,DE +2990475676,2990538751,DE 2990538752,2991063039,RU 2991063040,2991067135,SE 2991067136,2991071231,DK @@ -53447,23 +57074,27 @@ 2991341568,2991357951,MD 2991357952,2991358207,DE 2991358208,2991358463,US -2991358464,2991358887,DE -2991358888,2991358890,US -2991358891,2991358975,DE +2991358464,2991358891,DE +2991358892,2991358892,US +2991358893,2991358975,DE 2991358976,2991359487,US -2991359488,2991361279,DE +2991359488,2991360511,DE +2991360512,2991361023,US +2991361024,2991361279,DE 2991361280,2991361535,US -2991361536,2991364934,DE -2991364935,2991364935,US -2991364936,2991366143,DE +2991361536,2991363071,DE +2991363072,2991363583,US +2991363584,2991363839,DE +2991363840,2991364607,US +2991364608,2991365631,DE +2991365632,2991365887,US +2991365888,2991366143,DE 2991366144,2991366399,US -2991366400,2991366655,DE -2991366656,2991367167,US -2991367168,2991370239,DE -2991370240,2991370367,US -2991370368,2991370431,DE -2991370432,2991370751,US -2991370752,2991374335,DE +2991366400,2991368703,DE +2991368704,2991368959,US +2991368960,2991371263,DE +2991371264,2991371519,US +2991371520,2991374335,DE 2991374336,2991390719,RU 2991390720,2991407103,BA 2991407104,2991423487,DE @@ -53476,7 +57107,9 @@ 2991521792,2991538175,RS 2991538176,2991554559,SI 2991554560,2991570943,GB -2991570944,2991587327,IT +2991570944,2991571711,IT +2991571712,2991571967,GB +2991571968,2991587327,IT 2991587328,2991718399,SA 2991718400,2991849471,CH 2991849472,2991980543,NL @@ -53498,7 +57131,9 @@ 2995009536,2995011583,ES 2995011584,2995013631,DE 2995013632,2995015679,SE -2995015680,2995017727,BG +2995015680,2995017215,BG +2995017216,2995017471,JP +2995017472,2995017727,BG 2995017728,2995019775,IT 2995019776,2995021823,RU 2995021824,2995023871,IT @@ -53544,7 +57179,8 @@ 2996776960,2996781055,RU 2996781056,2996785151,RO 2996785152,2996789247,RU -2996789248,2996797439,UA +2996789248,2996793599,UA +2996793600,2996797439,RU 2996797440,2996801535,PL 2996801536,2996805631,RO 2996805632,2996809727,PL @@ -53557,9 +57193,7 @@ 2996862976,2996895743,AM 2996895744,2996928511,KW 2996928512,2996994047,RU -2996994048,2997004607,DE -2997004608,2997004671,RU -2997004672,2997026815,DE +2996994048,2997026815,DE 2997026816,2997059583,RU 2997059584,2997092351,BY 2997092352,2997125119,NO @@ -53600,14 +57234,16 @@ 2997520384,2997520895,NL 2997520896,2997521151,MT 2997521152,2997521407,US -2997521408,2997522175,IN +2997521408,2997521663,UY +2997521664,2997522175,IN 2997522176,2997522431,PK 2997522432,2997522687,IT 2997522688,2997522943,BE 2997522944,2997523199,NO 2997523200,2997523455,NL 2997523456,2997524479,DE -2997524480,2997526527,NL +2997524480,2997525503,NL +2997525504,2997526527,TR 2997526528,2997583871,RU 2997583872,2997616639,SY 2997616640,2997649407,SI @@ -53661,7 +57297,8 @@ 3000246272,3000248319,RO 3000248320,3000252415,PL 3000252416,3000254463,RO -3000254464,3000260607,RU +3000254464,3000256511,UA +3000256512,3000260607,RU 3000260608,3000262655,RS 3000262656,3000266751,UA 3000266752,3000268799,DE @@ -53687,7 +57324,12 @@ 3000315904,3000317951,LV 3000317952,3000319999,PL 3000320000,3000322047,FR -3000322048,3000326143,RU +3000322048,3000322303,PL +3000322304,3000322559,RU +3000322560,3000322815,DE +3000322816,3000323071,RU +3000323072,3000323583,DE +3000323584,3000326143,RU 3000326144,3000330239,PL 3000330240,3000332287,UA 3000332288,3000334335,RU @@ -53775,7 +57417,7 @@ 3000664064,3000668159,RO 3000668160,3000672255,RU 3000672256,3000676351,HR -3000676352,3000680447,RO +3000676352,3000680447,SA 3000682496,3000684543,UZ 3000684544,3000688639,RU 3000688640,3000692735,PL @@ -53786,9 +57428,7 @@ 3000713216,3000717311,IT 3000717312,3000721407,UA 3000721408,3000733695,PL -3000733696,3000741375,RU -3000741376,3000741631,UA -3000741632,3000745983,RU +3000733696,3000745983,RU 3000745984,3000750079,UA 3000750080,3000754175,RU 3000754176,3000758271,IR @@ -53834,7 +57474,9 @@ 3001909248,3001917439,ES 3001917440,3001919743,GB 3001919744,3001919999,AU -3001920000,3001921535,GB +3001920000,3001920255,GB +3001920256,3001920511,AU +3001920512,3001921535,GB 3001921536,3001929727,RU 3001929728,3001933823,RS 3001933824,3001937919,ES @@ -53865,9 +57507,7 @@ 3002052608,3002056703,IT 3002056704,3002060799,FI 3002060800,3002064895,ES -3002064896,3002065432,BG -3002065433,3002065688,RS -3002065689,3002068991,BG +3002064896,3002068991,BG 3002068992,3002073087,ES 3002073088,3002597375,TR 3002597376,3002599423,RU @@ -53883,7 +57523,9 @@ 3002617856,3002619903,RU 3002619904,3002621951,IT 3002621952,3002623999,NO -3002624000,3002628095,GB +3002624000,3002627327,GB +3002627328,3002627583,SA +3002627584,3002628095,GB 3002628096,3002630143,NO 3002630144,3002632191,GB 3002632192,3002634239,EE @@ -53949,9 +57591,7 @@ 3002763264,3002765311,RS 3002765312,3002767359,NL 3002767360,3002769407,RU -3002769408,3002769919,DE -3002769920,3002770175,ES -3002770176,3002773503,DE +3002769408,3002773503,DE 3002773504,3002775551,GB 3002775552,3002777599,RO 3002777600,3002779647,NL @@ -53980,7 +57620,11 @@ 3002826752,3002828799,SE 3002828800,3002830847,RU 3002830848,3002834943,FI -3002834944,3002836991,LU +3002834944,3002835063,BE +3002835064,3002835067,LU +3002835068,3002836319,BE +3002836320,3002836335,LU +3002836336,3002836991,BE 3002836992,3002841087,GB 3002841088,3002843135,CZ 3002843136,3002845183,NL @@ -54032,7 +57676,9 @@ 3003099136,3003101183,CZ 3003101184,3003103231,UA 3003103232,3003105279,IT -3003105280,3003109375,NL +3003105280,3003107327,NL +3003107328,3003107583,RU +3003107584,3003109375,NL 3003109376,3003111423,FR 3003111424,3003113471,IT 3003113472,3003115519,ES @@ -54100,7 +57746,10 @@ 3003154944,3003159039,AR 3003159040,3003159295,CO 3003159296,3003160575,AR -3003160576,3003161599,CL +3003160576,3003160831,CL +3003160832,3003161087,PE +3003161088,3003161343,CO +3003161344,3003161599,CL 3003161600,3003162623,UY 3003162624,3003170815,CR 3003170816,3003171071,GT @@ -54144,20 +57793,18 @@ 3005888256,3005890047,PA 3005890048,3005890303,CO 3005890304,3005890559,PA -3005890560,3005891327,CO -3005891328,3005893119,PA +3005890560,3005891583,CO +3005891584,3005891839,PA +3005891840,3005892095,CO +3005892096,3005893119,PA 3005893120,3005893631,CO 3005893632,3005893887,PA 3005893888,3005894911,CO 3005894912,3005895167,PA -3005895168,3005895423,CO -3005895424,3005896703,PA -3005896704,3005896959,CO -3005896960,3005897215,PA -3005897216,3005897727,CO -3005897728,3005897983,PA -3005897984,3005898239,CO -3005898240,3005899007,PA +3005895168,3005895935,CO +3005895936,3005896703,PA +3005896704,3005898495,CO +3005898496,3005899007,PA 3005899008,3005900543,CO 3005900544,3005901055,PA 3005901056,3005901311,CO @@ -54165,8 +57812,8 @@ 3005901568,3005901823,CO 3005901824,3005902591,PA 3005902592,3005903871,CO -3005903872,3005904895,PA -3005904896,3005905407,CO +3005903872,3005904639,PA +3005904640,3005905407,CO 3005905408,3005905663,PA 3005905664,3005906943,CO 3005906944,3005911039,PA @@ -54180,8 +57827,7 @@ 3005913088,3005913343,PA 3005913344,3005913599,CO 3005913600,3005913855,PA -3005913856,3005914879,CO -3005914880,3005915135,PA +3005913856,3005915135,CO 3005915136,3005918207,AR 3005918208,3005919231,CO 3005919232,3005923327,AR @@ -54213,12 +57859,8 @@ 3006279168,3006279423,NI 3006279424,3006283519,PA 3006283520,3006283775,NI -3006283776,3006284543,CR -3006284544,3006284799,PA -3006284800,3006285055,CR -3006285056,3006285311,PA -3006285312,3006286079,CR -3006286080,3006286847,PA +3006283776,3006286335,CR +3006286336,3006286847,PA 3006286848,3006287615,CR 3006287616,3006287871,PA 3006287872,3006288127,CR @@ -54226,7 +57868,9 @@ 3006288384,3006289151,CR 3006289152,3006289407,PA 3006289408,3006289919,CR -3006289920,3006291199,PA +3006289920,3006290175,PA +3006290176,3006290687,CR +3006290688,3006291199,PA 3006291200,3006291967,CR 3006291968,3006296575,PA 3006296576,3006296831,CR @@ -54236,29 +57880,27 @@ 3006309632,3006309887,CR 3006309888,3006310143,PA 3006310144,3006310655,CR -3006310656,3006311167,PA -3006311168,3006311423,CR -3006311424,3006311679,PA -3006311680,3006312447,CR +3006310656,3006310911,PA +3006310912,3006312447,CR 3006312448,3006312703,PA 3006312704,3006313471,CR 3006313472,3006313727,PA -3006313728,3006314495,CR -3006314496,3006315263,PA +3006313728,3006314751,CR +3006314752,3006315263,PA 3006315264,3006315775,CR 3006315776,3006316031,PA 3006316032,3006316287,CR 3006316288,3006320895,PA -3006320896,3006321151,CR -3006321152,3006321663,PA +3006320896,3006321407,CR +3006321408,3006321663,PA 3006321664,3006322175,CR 3006322176,3006322431,PA 3006322432,3006323199,CR 3006323200,3006323455,PA 3006323456,3006323711,CR -3006323712,3006324223,PA -3006324224,3006324479,CR -3006324480,3006328831,PA +3006323712,3006323967,PA +3006323968,3006324735,CR +3006324736,3006328831,PA 3006328832,3006330623,NI 3006330624,3006330879,PA 3006330880,3006331903,CR @@ -54311,11 +57953,14 @@ 3007086592,3007090687,PA 3007090688,3007091711,NL 3007091712,3007092223,RU -3007092224,3007092735,DE +3007092224,3007092479,VE +3007092480,3007092735,IR 3007092736,3007094783,AR 3007094784,3007096831,CR 3007096832,3007098879,AR -3007098880,3007100647,HN +3007098880,3007099463,HN +3007099464,3007099471,IN +3007099472,3007100647,HN 3007100648,3007100655,MX 3007100656,3007100887,HN 3007100888,3007100895,PH @@ -54363,12 +58008,11 @@ 3007155200,3007155215,CL 3007155216,3007155231,DE 3007155232,3007155327,CL -3007155328,3007155455,US -3007155456,3007155711,GB +3007155328,3007155711,US 3007155712,3007155727,CL 3007155728,3007155743,DE 3007155744,3007155967,CL -3007155968,3007156223,DE +3007155968,3007156223,US 3007156224,3007156239,CL 3007156240,3007156255,DE 3007156256,3007156351,CL @@ -54377,7 +58021,8 @@ 3007156496,3007156511,DE 3007156512,3007156543,CL 3007156544,3007156607,GB -3007156608,3007156751,CL +3007156608,3007156735,DE +3007156736,3007156751,CL 3007156752,3007156767,DE 3007156768,3007156991,CL 3007156992,3007157007,HR @@ -54551,20 +58196,66 @@ 3007168768,3007169023,CL 3007169024,3007169151,US 3007169152,3007169279,CL -3007169280,3007169535,US -3007169536,3007170047,CL +3007169280,3007169791,US +3007169792,3007170047,CL 3007170048,3007170303,MX 3007170304,3007170559,CL 3007170560,3007171071,DE -3007171072,3007171855,CL +3007171072,3007171327,US +3007171328,3007171583,ES +3007171584,3007171855,CL 3007171856,3007171871,US 3007171872,3007171873,BR 3007171874,3007171875,CL 3007171876,3007171903,BR -3007171904,3007172607,CL -3007172608,3007175679,BR +3007171904,3007172351,CL +3007172352,3007172383,FR +3007172384,3007172415,BE +3007172416,3007172607,CL +3007172608,3007172863,US +3007172864,3007172991,BR +3007172992,3007173023,IS +3007173024,3007173055,NZ +3007173056,3007173375,BR +3007173376,3007173407,NO +3007173408,3007173439,SE +3007173440,3007173631,BR +3007173632,3007173663,NO +3007173664,3007173695,NZ +3007173696,3007174015,BR +3007174016,3007174047,NL +3007174048,3007174079,FR +3007174080,3007174271,BR +3007174272,3007174303,FI +3007174304,3007174335,NL +3007174336,3007174399,BR +3007174400,3007174431,IS +3007174432,3007174463,IT +3007174464,3007175679,BR 3007175680,3007175935,GB -3007175936,3007183359,BR +3007175936,3007175967,NZ +3007175968,3007175999,BE +3007176000,3007176319,BR +3007176320,3007176351,SE +3007176352,3007176383,FR +3007176384,3007176703,BR +3007176704,3007177727,IN +3007177728,3007181183,BR +3007181184,3007181215,IT +3007181216,3007181247,IS +3007181248,3007181567,BR +3007181568,3007181599,NL +3007181600,3007181631,AU +3007181632,3007181823,BR +3007181824,3007181855,BE +3007181856,3007181887,NO +3007181888,3007182591,BR +3007182592,3007182623,SE +3007182624,3007182655,NL +3007182656,3007183231,BR +3007183232,3007183263,NZ +3007183264,3007183295,IT +3007183296,3007183359,BR 3007183360,3007183615,AU 3007183616,3007183871,IE 3007183872,3007184127,JO @@ -54591,10 +58282,8 @@ 3007280640,3007280895,PA 3007280896,3007281151,CR 3007281152,3007281919,PA -3007281920,3007283455,CR -3007283456,3007283711,PA -3007283712,3007283967,CR -3007283968,3007284479,PA +3007281920,3007283199,CR +3007283200,3007284479,PA 3007284480,3007285759,CR 3007285760,3007286271,PA 3007286272,3007286783,CR @@ -54629,22 +58318,26 @@ 3007313920,3007314943,AR 3007314944,3007315967,HN 3007315968,3019898879,BR -3019898880,3022682367,JP -3022682368,3022682623,US -3022682624,3024093183,JP +3019898880,3024093183,JP 3024093184,3024617471,KR 3024617472,3024879615,MY 3024879616,3025141759,CN 3025141760,3025403903,KR 3025403904,3025600511,CN -3025600512,3025603071,IN +3025600512,3025602047,IN +3025602048,3025602303,HK +3025602304,3025603071,IN 3025603072,3025603091,HK -3025603092,3025603103,IN -3025603104,3025603199,HK -3025603200,3025603839,IN +3025603092,3025603095,CN +3025603096,3025603103,IN +3025603104,3025603215,HK +3025603216,3025603327,IN +3025603328,3025603335,GU +3025603336,3025603583,IN +3025603584,3025603839,SG 3025603840,3025604095,HK -3025604096,3025604381,IN -3025604382,3025606655,SG +3025604096,3025604351,IN +3025604352,3025606655,SG 3025606656,3025606815,IN 3025606816,3025606831,SG 3025606832,3025607167,IN @@ -54652,23 +58345,32 @@ 3025607424,3025607679,HK 3025607680,3025608191,IN 3025608192,3025608203,JP -3025608204,3025610751,IN +3025608204,3025608447,IN +3025608448,3025608703,HK +3025608704,3025610751,IN 3025610752,3025612799,SG 3025612800,3025612815,IN 3025612816,3025612831,SG 3025612832,3025612895,IN -3025612896,3025613063,SG -3025613064,3025616895,IN -3025616896,3025617423,SG -3025617424,3025618943,IN -3025618944,3025619487,SG -3025619488,3025620991,IN +3025612896,3025613067,SG +3025613068,3025616895,IN +3025616896,3025617439,SG +3025617440,3025617447,IN +3025617448,3025617455,SG +3025617456,3025618943,IN +3025618944,3025619519,SG +3025619520,3025619583,IN +3025619584,3025619711,SG +3025619712,3025620991,IN 3025620992,3025621247,PH 3025621248,3025621503,IN 3025621504,3025621759,PH -3025621760,3025623295,IN +3025621760,3025623055,IN +3025623056,3025623103,SG +3025623104,3025623295,IN 3025623296,3025623551,JP -3025623552,3025625343,IN +3025623552,3025623807,SG +3025623808,3025625343,IN 3025625344,3025625375,SG 3025625376,3025625391,IN 3025625392,3025625395,CA @@ -54676,16 +58378,15 @@ 3025625400,3025625407,TH 3025625408,3025625471,SG 3025625472,3025625503,MY -3025625504,3025625519,SG -3025625520,3025625535,IN +3025625504,3025625535,SG 3025625536,3025625599,CA 3025625600,3025625855,SG -3025625856,3025626111,IN +3025625856,3025625887,IN +3025625888,3025625895,SG +3025625896,3025626111,IN 3025626112,3025626367,SG 3025626368,3025629439,IN -3025629440,3025629567,HK -3025629568,3025629695,IN -3025629696,3025629951,HK +3025629440,3025629951,HK 3025629952,3025630023,AU 3025630024,3025630207,IN 3025630208,3025630719,AU @@ -54693,22 +58394,24 @@ 3025630976,3025631239,IN 3025631240,3025631247,AU 3025631248,3025631747,IN -3025631748,3025631759,HK -3025631760,3025632255,IN -3025632256,3025632271,SG -3025632272,3025632287,IN -3025632288,3025632383,SG -3025632384,3025632511,IN +3025631748,3025631767,HK +3025631768,3025631999,IN +3025632000,3025632255,HK +3025632256,3025632399,SG +3025632400,3025632511,IN 3025632512,3025632767,SG 3025632768,3025633535,IN 3025633536,3025633791,HK -3025633792,3025633807,AU -3025633808,3025637151,IN +3025633792,3025633919,AU +3025633920,3025634047,MY +3025634048,3025637151,IN 3025637152,3025637183,MY 3025637184,3025637375,IN 3025637376,3025637631,HK 3025637632,3025637887,MY -3025637888,3025638279,IN +3025637888,3025638015,IN +3025638016,3025638023,HK +3025638024,3025638279,IN 3025638280,3025638287,SG 3025638288,3025638399,IN 3025638400,3025638655,SG @@ -54716,12 +58419,16 @@ 3025638784,3025638791,HK 3025638792,3025639167,IN 3025639168,3025639175,SG -3025639176,3025639423,IN +3025639176,3025639295,IN +3025639296,3025639327,AU +3025639328,3025639423,IN 3025639424,3025639535,SG 3025639536,3025639551,HK 3025639552,3025639679,SG -3025639680,3025639935,HK -3025639936,3025640191,IN +3025639680,3025639807,HK +3025639808,3025639839,IN +3025639840,3025639879,HK +3025639880,3025640191,IN 3025640192,3025640447,JP 3025640448,3025640799,MY 3025640800,3025641727,IN @@ -54744,9 +58451,11 @@ 3025647968,3025648079,IN 3025648080,3025648087,SG 3025648088,3025648091,US -3025648092,3025649151,IN +3025648092,3025648095,SG +3025648096,3025649151,IN 3025649152,3025649663,HK -3025649664,3025666047,IN +3025649664,3025649919,AE +3025649920,3025666047,IN 3025666048,3025928191,CN 3025928192,3025932287,TW 3025932288,3025944575,JP @@ -54755,11 +58464,7 @@ 3025969152,3025973247,IN 3025973248,3025974271,AU 3025974272,3025975295,HK -3025975296,3025975551,SG -3025975552,3025975583,IN -3025975584,3025975807,SG -3025975808,3025975839,AU -3025975840,3025977343,SG +3025975296,3025977343,SG 3025977344,3025979391,AU 3025979392,3025981439,IN 3025981440,3025982463,AU @@ -54769,28 +58474,21 @@ 3025989632,3025993727,KR 3025993728,3026059263,VN 3026059264,3026067455,PH +3026067456,3026068479,IN 3026068480,3026069503,PH 3026069504,3026071551,JP 3026071552,3026073599,HK 3026073600,3026075647,CN -3026075648,3026077183,AF -3026077184,3026077695,US -3026077696,3026077951,AF -3026077952,3026078207,US -3026078208,3026078463,AF -3026078464,3026078719,US -3026078720,3026078975,AF -3026078976,3026079231,US -3026079232,3026079487,AF +3026075648,3026078207,AF +3026078208,3026078463,US +3026078464,3026079487,AF 3026079488,3026079743,US 3026079744,3026080255,AF 3026080256,3026080511,US -3026080512,3026080769,AF -3026080770,3026080770,US -3026080771,3026081023,AF -3026081024,3026082047,US -3026082048,3026082815,AF -3026082816,3026083071,US +3026080512,3026081023,AF +3026081024,3026081279,US +3026081280,3026082559,AF +3026082560,3026083071,US 3026083072,3026083839,AF 3026083840,3026087935,CN 3026087936,3026089983,AU @@ -54814,10 +58512,23 @@ 3028521984,3028523007,LA 3028523008,3028525055,JP 3028525056,3028533247,HK -3028533248,3028537343,JP -3028537344,3028538317,US +3028533248,3028538111,JP +3028538112,3028538317,US 3028538318,3028538318,JP -3028538319,3028549631,US +3028538319,3028538367,US +3028538368,3028538879,JP +3028538880,3028539391,US +3028539392,3028541695,JP +3028541696,3028542463,US +3028542464,3028543487,JP +3028543488,3028543743,US +3028543744,3028543999,JP +3028544000,3028546559,US +3028546560,3028547583,JP +3028547584,3028548095,US +3028548096,3028548607,JP +3028548608,3028549119,US +3028549120,3028549631,JP 3028549632,3028811775,KR 3028811776,3029336063,CN 3029336064,3029598207,JP @@ -54913,7 +58624,9 @@ 3033710592,3033712639,KR 3033712640,3033714687,SG 3033714688,3033715711,NZ +3033715712,3033716735,CN 3033716736,3033717759,TH +3033717760,3033718783,BD 3033718784,3033726975,CN 3033726976,3033743359,KR 3033743360,3033745407,IN @@ -54945,15 +58658,9 @@ 3034456064,3034464255,JP 3034464256,3034466303,NZ 3034466304,3034472447,JP -3034472448,3034478591,IN -3034478592,3034480639,JP +3034472448,3034480639,IN 3034480640,3034482687,SG -3034482688,3034483199,AF -3034483200,3034483455,US -3034483456,3034483967,AF -3034483968,3034484223,US -3034484224,3034484479,AF -3034484480,3034484735,US +3034482688,3034484735,AF 3034484736,3034488831,TH 3034488832,3034492927,AU 3034492928,3034497023,JP @@ -54983,13 +58690,10 @@ 3035324416,3035326463,JP 3035326464,3035328511,AU 3035332608,3035333631,AU -3035333632,3035333887,JP -3035333888,3035334655,HK +3035333632,3035334655,HK 3035335680,3035337727,JP 3035337728,3035338751,ID -3035338752,3035339007,SG -3035339008,3035339263,IN -3035339264,3035339775,HK +3035338752,3035339775,SG 3035339776,3035340799,AU 3035340800,3035348991,MN 3035348992,3035357183,AU @@ -55010,26 +58714,33 @@ 3039166464,3039231999,PA 3039232000,3039297535,EC 3039297536,3039363071,PY -3039363072,3039411199,BZ -3039411200,3039412223,US +3039363072,3039379455,US +3039379456,3039395839,GY +3039395840,3039412223,US 3039412224,3039412735,CL -3039412736,3039414015,BR +3039412736,3039412991,BR +3039412992,3039413247,US +3039413248,3039414015,BR 3039414016,3039414271,CL -3039414272,3039414527,BR -3039414528,3039414783,CL -3039414784,3039415039,BR +3039414272,3039415039,BR 3039415040,3039415295,CL 3039415296,3039416319,BR -3039416320,3039416713,CL +3039416320,3039416591,CL +3039416592,3039416607,SG +3039416608,3039416713,CL 3039416714,3039416715,US -3039416716,3039416735,CL +3039416716,3039416719,SG +3039416720,3039416735,CL 3039416736,3039416739,US -3039416740,3039416831,CL +3039416740,3039416741,SG +3039416742,3039416831,CL 3039416832,3039417599,BR 3039417600,3039417855,CL -3039417856,3039418879,BR -3039418880,3039419135,CL -3039419136,3039420415,BR +3039417856,3039419583,BR +3039419584,3039419647,SG +3039419648,3039419839,BR +3039419840,3039419903,SG +3039419904,3039420415,BR 3039420416,3039428607,AR 3039428608,3039559679,CL 3039559680,3039821823,AR @@ -55038,7 +58749,9 @@ 3041132544,3041394687,CO 3041394688,3041656831,CL 3041656832,3041787903,BR -3041787904,3044016127,AR +3041787904,3041886463,AR +3041886464,3041886719,US +3041886720,3044016127,AR 3044016128,3044147199,EC 3044147200,3044155391,GT 3044155392,3044161535,AR @@ -55060,7 +58773,9 @@ 3044454400,3044482559,AR 3044482560,3044482687,CO 3044482688,3044503551,AR -3044503552,3044507647,US +3044503552,3044503807,US +3044503808,3044504319,AR +3044504320,3044507647,US 3044507648,3044540415,AR 3044540416,3045064703,PY 3045064704,3047161855,CO @@ -55083,8 +58798,42 @@ 3048210432,3048275967,PE 3048275968,3048292351,AR 3048292352,3048292607,BZ -3048292608,3048293375,HN -3048293376,3048308735,BZ +3048292608,3048292799,HN +3048292800,3048292807,ES +3048292808,3048293375,HN +3048293376,3048293599,BZ +3048293600,3048293615,ES +3048293616,3048295343,BZ +3048295344,3048295351,CA +3048295352,3048297407,BZ +3048297408,3048297423,CA +3048297424,3048298799,BZ +3048298800,3048298807,US +3048298808,3048299487,BZ +3048299488,3048299503,BR +3048299504,3048301935,BZ +3048301936,3048301951,CA +3048301952,3048302295,BZ +3048302296,3048302303,CA +3048302304,3048303303,BZ +3048303304,3048303311,NL +3048303312,3048304031,BZ +3048304032,3048304047,NL +3048304048,3048305063,BZ +3048305064,3048305071,CR +3048305072,3048305471,BZ +3048305472,3048305487,US +3048305488,3048305983,BZ +3048305984,3048305991,US +3048305992,3048307607,BZ +3048307608,3048307615,CA +3048307616,3048307967,BZ +3048307968,3048307983,CA +3048307984,3048308103,BZ +3048308104,3048308111,CA +3048308112,3048308295,BZ +3048308296,3048308303,CR +3048308304,3048308735,BZ 3048308736,3048325119,BO 3048325120,3048331263,AR 3048331264,3048332287,GY @@ -55130,205 +58879,271 @@ 3050569728,3050635263,CL 3050635264,3050700799,BR 3050700800,3050700815,JP -3050700816,3050700831,CL -3050700832,3050700832,BR -3050700833,3050700835,CL -3050700836,3050700847,BR -3050700848,3050701055,CL +3050700816,3050701055,BR 3050701056,3050701311,US 3050701312,3050701327,IE 3050701328,3050701343,US -3050701344,3050701344,BR -3050701345,3050701567,CL +3050701344,3050701567,BR 3050701568,3050701823,US 3050701824,3050701839,SG -3050701840,3050702079,CL +3050701840,3050702079,BR 3050702080,3050702335,US 3050702336,3050702351,DK -3050702352,3050702591,CL +3050702352,3050702591,BR 3050702592,3050702847,US 3050702848,3050702863,FR -3050702864,3050703103,CL +3050702864,3050703103,BR 3050703104,3050703359,US 3050703360,3050703375,AT -3050703376,3050703871,CL +3050703376,3050703615,BR +3050703616,3050703871,US 3050703872,3050703887,PE -3050703888,3050704127,CL +3050703888,3050704127,BR 3050704128,3050704383,US 3050704384,3050704399,KR -3050704400,3050704639,CL +3050704400,3050704639,BR 3050704640,3050704895,US 3050704896,3050704911,IT -3050704912,3050705151,CL +3050704912,3050705151,BR 3050705152,3050705407,US 3050705408,3050705423,JP -3050705424,3050705663,CL +3050705424,3050705663,BR 3050705664,3050705919,US 3050705920,3050705935,AU -3050705936,3050706175,CL +3050705936,3050706175,BR 3050706176,3050706431,US 3050706432,3050706447,NL -3050706448,3050706687,CL +3050706448,3050706687,BR 3050706688,3050706943,US 3050706944,3050706959,HK -3050706960,3050707199,CL +3050706960,3050707199,BR 3050707200,3050707455,US 3050707456,3050707471,IT -3050707472,3050707711,CL +3050707472,3050707711,BR 3050707712,3050707967,US 3050707968,3050707983,CH -3050707984,3050708223,CL +3050707984,3050708223,BR 3050708224,3050708479,US 3050708480,3050708495,FR -3050708496,3050708735,CL +3050708496,3050708735,BR 3050708736,3050708991,US 3050708992,3050709007,AT -3050709008,3050709023,BR -3050709024,3050709247,CL +3050709008,3050709119,BR +3050709120,3050709247,US 3050709248,3050709375,DE -3050709376,3050709503,CL +3050709376,3050709503,BR 3050709504,3050709519,TH -3050709520,3050710015,CL +3050709520,3050709759,BR +3050709760,3050710015,NL 3050710016,3050710031,ES -3050710032,3050710271,CL +3050710032,3050710271,BR 3050710272,3050710527,US 3050710528,3050710543,FR -3050710544,3050710783,CL -3050710784,3050711039,US +3050710544,3050710655,BR +3050710656,3050711039,US 3050711040,3050711055,AU -3050711056,3050711551,CL +3050711056,3050711295,BR +3050711296,3050711551,US 3050711552,3050711567,EE -3050711568,3050711807,CL +3050711568,3050711807,BR 3050711808,3050712063,US 3050712064,3050712079,FR -3050712080,3050712319,CL -3050712320,3050712575,US +3050712080,3050712127,BR +3050712128,3050712575,US 3050712576,3050712591,PL -3050712592,3050712831,CL +3050712592,3050712831,BR 3050712832,3050713087,US 3050713088,3050713103,LV -3050713104,3050713343,CL +3050713104,3050713343,BR 3050713344,3050713599,US 3050713600,3050713855,NL -3050713856,3050714367,CL +3050713856,3050714111,BR +3050714112,3050714367,US 3050714368,3050714623,GB 3050714624,3050714879,BR -3050714880,3050715647,CL -3050715648,3050725375,US -3050725376,3050749951,CL -3050749952,3050758143,US -3050758144,3050764287,CL -3050764288,3050766335,US +3050714880,3050715135,ES +3050715136,3050766335,US 3050766336,3050766351,NO -3050766352,3050766591,CL +3050766352,3050766591,BR 3050766592,3050766847,US 3050766848,3050766863,KR -3050766864,3050767359,CL +3050766864,3050767103,BR +3050767104,3050767359,AR 3050767360,3050767375,AT -3050767376,3050767615,CL +3050767376,3050767615,BR 3050767616,3050767871,US 3050767872,3050767887,MY -3050767888,3050768127,CL +3050767888,3050768127,BR 3050768128,3050768383,US 3050768384,3050768399,AT -3050768400,3050768639,CL -3050768640,3050768895,US +3050768400,3050768511,BR +3050768512,3050768895,US 3050768896,3050768911,CZ -3050768912,3050769151,CL +3050768912,3050769151,BR 3050769152,3050769407,US 3050769408,3050769423,AU -3050769424,3050769663,CL +3050769424,3050769663,BR 3050769664,3050769919,US 3050769920,3050769935,MY -3050769936,3050770175,CL +3050769936,3050770175,BR 3050770176,3050770431,US 3050770432,3050770447,LV -3050770448,3050770687,CL +3050770448,3050770687,BR 3050770688,3050770943,US 3050770944,3050770959,HK -3050770960,3050771199,CL +3050770960,3050771199,BR 3050771200,3050771455,US 3050771456,3050771471,SG -3050771472,3050771711,CL +3050771472,3050771711,BR 3050771712,3050771967,US 3050771968,3050771983,EE -3050771984,3050772223,CL +3050771984,3050772223,BR 3050772224,3050772479,US 3050772480,3050772495,MY -3050772496,3050772735,CL +3050772496,3050772735,BR 3050772736,3050772991,US 3050772992,3050773007,HK -3050773008,3050773247,CL +3050773008,3050773247,BR 3050773248,3050773503,US 3050773504,3050773519,NL -3050773520,3050773759,CL +3050773520,3050773759,BR 3050773760,3050774015,US 3050774016,3050774031,TR -3050774032,3050774271,CL +3050774032,3050774271,BR 3050774272,3050774527,US 3050774528,3050774543,ES -3050774544,3050774783,CL +3050774544,3050774783,BR 3050774784,3050775039,US 3050775040,3050775055,KR -3050775056,3050775295,CL +3050775056,3050775295,BR 3050775296,3050775551,US 3050775552,3050775567,FR -3050775568,3050775807,CL +3050775568,3050775807,BR 3050775808,3050776063,US 3050776064,3050776079,MY -3050776080,3050776319,CL +3050776080,3050776319,BR 3050776320,3050776575,US 3050776576,3050776591,TH -3050776592,3050776831,CL +3050776592,3050776831,BR 3050776832,3050777087,US 3050777088,3050777103,AU -3050777104,3050777343,CL +3050777104,3050777343,BR 3050777344,3050777599,US 3050777600,3050777615,HK -3050777616,3050777855,CL +3050777616,3050777855,BR 3050777856,3050778111,US 3050778112,3050778127,KR -3050778128,3050778367,CL +3050778128,3050778367,BR 3050778368,3050778623,US 3050778624,3050778639,TR -3050778640,3050778879,CL -3050778880,3050788863,US -3050788864,3050788991,CL -3050788992,3050789119,US -3050789120,3050789247,CL -3050789248,3050789375,US -3050789376,3050789503,CL -3050789504,3050789631,US -3050789632,3050789759,CL -3050789760,3050789887,US -3050789888,3050790015,CL -3050790016,3050790143,US -3050790144,3050790271,CL -3050790272,3050790399,US -3050790400,3050790527,CL -3050790528,3050790655,US -3050790656,3050790783,CL -3050790784,3050825215,US -3050825216,3050825471,CL -3050825472,3050825983,US -3050825984,3050827007,CL -3050827008,3050831871,US +3050778640,3050778879,BR +3050778880,3050800383,US +3050800384,3050800399,AL +3050800400,3050800415,AD +3050800416,3050800431,AI +3050800432,3050800447,AG +3050800448,3050800463,AR +3050800464,3050800479,AM +3050800480,3050800495,AZ +3050800496,3050800511,BS +3050800512,3050800639,US +3050800640,3050800655,BB +3050800656,3050800671,BY +3050800672,3050800687,BZ +3050800688,3050800703,BM +3050800704,3050800719,BO +3050800720,3050800735,BA +3050800736,3050800751,VG +3050800752,3050800767,KY +3050800768,3050800895,US +3050800896,3050800911,CN +3050800912,3050800927,CO +3050800928,3050800943,GG +3050800944,3050800959,CU +3050800960,3050800975,CY +3050800976,3050800991,DK +3050800992,3050801007,DO +3050801008,3050801023,EC +3050801024,3050801151,US +3050801152,3050801167,EG +3050801168,3050801175,GQ +3050801176,3050801183,NZ +3050801184,3050801199,GF +3050801200,3050801215,PF +3050801216,3050801231,GE +3050801232,3050801247,SV +3050801248,3050801263,GD +3050801264,3050801279,GT +3050801280,3050801407,US +3050801408,3050801423,HN +3050801424,3050801439,IR +3050801440,3050801455,JM +3050801456,3050801471,JO +3050801472,3050801487,KG +3050801488,3050801503,LB +3050801504,3050801519,LI +3050801520,3050801535,MG +3050801536,3050801663,US +3050801664,3050801679,MT +3050801680,3050801695,MQ +3050801696,3050801711,MU +3050801712,3050801727,MX +3050801728,3050801743,MC +3050801744,3050801759,ME +3050801760,3050801775,NC +3050801776,3050801791,NI +3050801792,3050802175,US +3050802176,3050802191,OM +3050802192,3050802207,PK +3050802208,3050802223,PE +3050802224,3050802239,PH +3050802240,3050802255,PR +3050802256,3050802271,QA +3050802272,3050802287,LC +3050802288,3050802303,RS +3050802304,3050802431,US +3050802432,3050802447,SC +3050802448,3050802463,SI +3050802464,3050802479,KR +3050802480,3050802495,LK +3050802496,3050802511,TW +3050802512,3050802527,TT +3050802528,3050802543,UY +3050802544,3050802559,VE +3050802560,3050802687,US +3050802688,3050802751,NZ +3050802752,3050802815,NO +3050802816,3050803199,US +3050803200,3050803263,NL +3050803264,3050803327,SE +3050803328,3050803711,US +3050803712,3050803775,IS +3050803776,3050803839,FR +3050803840,3050804223,US +3050804224,3050804287,BE +3050804288,3050804351,NZ +3050804352,3050805247,US +3050805248,3050805311,NL +3050805312,3050805375,FI +3050805376,3050805759,US +3050805760,3050805791,DK +3050805792,3050831871,US 3050831872,3051356159,BR 3051356160,3051372543,CR 3051372544,3051372799,PA 3051372800,3051373055,CR -3051373056,3051373311,PA -3051373312,3051374335,CR -3051374336,3051374591,PA +3051373056,3051374591,PA 3051374592,3051374847,CR -3051374848,3051375615,PA -3051375616,3051376895,CR +3051374848,3051375871,PA +3051375872,3051376895,CR 3051376896,3051377151,PA 3051377152,3051379455,CR 3051379456,3051379711,PA 3051379712,3051380735,CR 3051380736,3051388927,AR -3051388928,3051395071,US +3051388928,3051390719,US +3051390720,3051390975,NL +3051390976,3051395071,US 3051395072,3051395583,NL 3051395584,3051397119,PA 3051397120,3051398143,CO @@ -55444,7 +59259,6 @@ 3056795648,3056861183,CN 3056861184,3056992255,TH 3056992256,3057025023,CN -3057025024,3057033215,PH 3057033216,3057037311,NZ 3057037312,3057041407,JP 3057041408,3057049599,MY @@ -55539,7 +59353,6 @@ 3070170112,3070171135,MY 3070171136,3070172159,HK 3070172160,3070173183,AU -3070173184,3070181375,PH 3070181376,3070185471,JP 3070185472,3070197759,AU 3070197760,3070230527,KR @@ -55611,23 +59424,35 @@ 3082174464,3082178559,BZ 3082178560,3082178823,HK 3082178824,3082178824,SG -3082178825,3082179583,HK +3082178825,3082179047,HK +3082179048,3082179055,SG +3082179056,3082179583,HK 3082179584,3082181631,IN 3082181632,3082182655,ID 3082182656,3082190847,LA 3082190848,3082289151,JP 3082289152,3087007743,CN -3087007744,3088605183,US +3087007744,3088449535,US +3088449536,3088474111,TH +3088474112,3088478207,US +3088478208,3088506879,TH +3088506880,3088605183,US 3088605184,3088609279,NL 3088609280,3088629759,US 3088629760,3088633855,NL -3088633856,3088673535,US +3088633856,3088654335,US +3088654336,3088658431,NL +3088658432,3088673535,US 3088673536,3088673791,NL 3088673792,3088686591,US 3088686592,3088687103,NL 3088687104,3088701439,US 3088701440,3088702463,NL -3088702464,3088753919,US +3088702464,3088711167,US +3088711168,3088711423,AU +3088711424,3088752639,US +3088752640,3088752895,NL +3088752896,3088753919,US 3088753920,3088754175,NL 3088754176,3088785407,US 3088785408,3088786431,NL @@ -55651,10 +59476,10 @@ 3088864000,3088864255,NL 3088864256,3088866303,US 3088866304,3088866815,NL -3088866816,3088868607,US -3088868608,3088868863,NL -3088868864,3088869119,US -3088869120,3088870143,NL +3088866816,3088867839,US +3088867840,3088868351,NL +3088868352,3088868607,US +3088868608,3088870143,NL 3088870144,3088880639,US 3088880640,3088881663,NL 3088881664,3088888831,US @@ -55679,7 +59504,9 @@ 3090387968,3090388479,NL 3090388480,3090389503,US 3090389504,3090389631,CA -3090389632,3090415103,US +3090389632,3090401791,US +3090401792,3090402047,IN +3090402048,3090415103,US 3090415104,3090415615,NL 3090415616,3091202047,US 3091202048,3091726335,CA @@ -55687,19 +59514,25 @@ 3091955712,3091959807,CA 3091959808,3091976191,US 3091976192,3091980287,CA -3091980288,3092559359,US +3091980288,3092381695,US +3092381696,3092439039,TH +3092439040,3092559359,US 3092559360,3092559615,NL 3092559616,3092567039,US 3092567040,3092568063,NL -3092568064,3092572671,US +3092568064,3092569343,US +3092569344,3092569599,AU +3092569600,3092572671,US 3092572672,3092573183,NL -3092573184,3092578303,US +3092573184,3092573695,US +3092573696,3092573951,AU +3092573952,3092578303,US 3092578304,3092582399,NL 3092582400,3092615167,US 3092615168,3092619263,NL 3092619264,3092623359,US -3092623360,3092631551,NL -3092631552,3092635391,US +3092623360,3092627455,NL +3092627456,3092635391,US 3092635392,3092635647,NL 3092635648,3092640255,US 3092640256,3092640767,NL @@ -55723,13 +59556,16 @@ 3092688896,3092692991,NL 3092692992,3092697087,US 3092697088,3092697599,NL -3092697600,3092701183,US +3092697600,3092700927,US +3092700928,3092701183,AU 3092701184,3092703231,NL 3092703232,3092704255,US 3092704256,3092705279,NL 3092705280,3092754431,US 3092754432,3092759039,NL -3092759040,3093168127,US +3092759040,3092764671,US +3092764672,3092766719,NL +3092766720,3093168127,US 3093168128,3093200895,CA 3093200896,3093213183,US 3093213184,3093217279,CA @@ -55737,15 +59573,21 @@ 3093233664,3093237759,PR 3093237760,3093282815,US 3093282816,3093299199,CA -3093299200,3093835775,US -3093835776,3093838847,GB -3093838848,3093839871,US -3093839872,3093843455,NL -3093843456,3093850111,US -3093850112,3093855487,DE -3093855488,3093908991,US +3093299200,3093908991,US 3093908992,3093909247,PR -3093909248,3094020095,US +3093909248,3093909528,US +3093909529,3093909529,AT +3093909530,3093909597,US +3093909598,3093909598,DE +3093909599,3093909656,US +3093909657,3093909657,FR +3093909658,3093909812,US +3093909813,3093909813,AT +3093909814,3093943785,US +3093943786,3093943786,CZ +3093943787,3093945989,US +3093945990,3093945990,AT +3093945991,3094020095,US 3094020096,3094023303,CA 3094023304,3094023311,BD 3094023312,3094032759,CA @@ -55782,26 +59624,13 @@ 3098107136,3098107391,FR 3098107392,3098107647,EU 3098107648,3098107903,SE -3098107904,3098108159,ES -3098108160,3098108415,IL -3098108416,3098108671,US -3098108672,3098108927,SG -3098108928,3098109183,JP -3098109184,3098109439,AU -3098109440,3098109695,HK -3098109696,3098110719,QA -3098110720,3098111743,IT -3098111744,3098112767,US -3098112768,3098113791,AU -3098113792,3098148863,US +3098107904,3098148863,US 3098148864,3098165247,JM 3098165248,3098181631,US 3098181632,3098185727,CA 3098185728,3098263551,US 3098263552,3098271743,CA -3098271744,3098278847,US -3098278848,3098278911,CA -3098278912,3098411007,US +3098271744,3098411007,US 3098411008,3098415103,PK 3098415104,3098476543,US 3098476544,3098492927,CA @@ -55847,10 +59676,22 @@ 3103859712,3103859967,RO 3103859968,3103860223,PL 3103860224,3103860479,FR +3103860480,3103860735,UA 3103860736,3103860991,BG 3103860992,3103861247,RU 3103861248,3103861503,PL 3103861504,3103861759,AT +3103861760,3103862015,ME +3103862016,3103862271,MD +3103862272,3103862527,IT +3103862528,3103862783,FR +3103862784,3103863039,DE +3103863040,3103863295,RU +3103863296,3103863807,UA +3103863808,3103864063,RU +3103864064,3103864319,GB +3103864320,3103864575,DE +3103864832,3103865087,BG 3103916032,3103917055,CH 3103917056,3103918079,IT 3103918080,3103919103,DE @@ -55863,7 +59704,9 @@ 3103924224,3103924479,DE 3103924480,3103925247,RU 3103925248,3103926271,PL -3103926272,3103927295,CZ +3103926272,3103926783,CZ +3103926784,3103927039,SK +3103927040,3103927295,CZ 3103927296,3103929343,NL 3103929344,3103930367,BE 3103930368,3103931391,DE @@ -55943,7 +59786,7 @@ 3104004864,3104005119,EU 3104005120,3104006143,GB 3104006144,3104007167,DE -3104007168,3104008191,GB +3104007168,3104008191,GG 3104008192,3104009215,NL 3104009216,3104010239,IT 3104010240,3104011263,PL @@ -56040,6 +59883,7 @@ 3104103424,3104104447,IR 3104104448,3104105471,TR 3104105472,3104106495,FI +3104106496,3104107519,DE 3104107520,3104108543,UA 3104108544,3104109567,GB 3104109568,3104110591,ES @@ -56315,7 +60159,9 @@ 3104401408,3104403455,DE 3104403456,3104404479,SK 3104404480,3104405503,CZ -3104405504,3104406527,KZ +3104405504,3104405759,KZ +3104405760,3104406015,RU +3104406016,3104406527,KZ 3104406528,3104407551,PL 3104407552,3104408575,DE 3104408576,3104409599,AT @@ -56325,7 +60171,7 @@ 3104412672,3104413695,IT 3104413696,3104414719,FR 3104414720,3104415743,TR -3104415744,3104416767,UA +3104415744,3104416767,RU 3104416768,3104417791,SE 3104417792,3104418815,US 3104418816,3104419839,GB @@ -56360,22 +60206,15 @@ 3104451584,3104452607,RU 3104452608,3104453631,NL 3104453632,3104454655,CH -3104454656,3104454660,NL -3104454661,3104454782,SE -3104454783,3104455050,NL -3104455051,3104455082,SE -3104455083,3104455146,NL -3104455147,3104455162,SE -3104455163,3104455294,NL -3104455295,3104455423,SE -3104455424,3104455679,NL +3104454656,3104455294,NL +3104455295,3104455298,SE +3104455299,3104455679,NL 3104455680,3104456703,RU 3104456704,3104457727,IL 3104457728,3104458751,DE 3104458752,3104459775,IR 3104459776,3104460799,IT -3104460800,3104461823,ES -3104461824,3104462847,CZ +3104460800,3104462847,ES 3104462848,3104463871,GB 3104463872,3104464895,DE 3104464896,3104465919,NL @@ -56394,6 +60233,7 @@ 3104478208,3104479231,DE 3104479232,3104480255,RU 3104480256,3104483327,NL +3104483328,3104484351,ES 3104484352,3104485375,RU 3104485376,3104486399,FR 3104486400,3104488447,RU @@ -56645,7 +60485,9 @@ 3104750592,3104751615,CZ 3104751616,3104751871,UA 3104751872,3104752127,CA -3104752128,3104752639,UA +3104752128,3104752255,GB +3104752256,3104752383,RU +3104752384,3104752639,UA 3104752640,3104753663,SA 3104753664,3104754687,GR 3104754688,3104755711,MK @@ -56736,9 +60578,8 @@ 3104847872,3104848895,RU 3104848896,3104849919,DE 3104849920,3104850943,RU -3104850944,3104851199,JE -3104851200,3104851455,GB -3104851456,3104851711,GG +3104850944,3104851199,GB +3104851200,3104851711,JE 3104851712,3104851967,GB 3104851968,3104852991,DE 3104852992,3104854015,AT @@ -56889,7 +60730,24 @@ 3105008640,3105009663,CH 3105009664,3105010687,PL 3105010688,3105011711,AT -3105011712,3105012735,CY +3105011712,3105012229,CY +3105012230,3105012230,US +3105012231,3105012231,CY +3105012232,3105012235,US +3105012236,3105012257,CY +3105012258,3105012258,US +3105012259,3105012259,CY +3105012260,3105012267,US +3105012268,3105012485,CY +3105012486,3105012486,GB +3105012487,3105012487,CY +3105012488,3105012491,GB +3105012492,3105012543,CY +3105012544,3105012557,DE +3105012558,3105012559,US +3105012560,3105012560,CY +3105012561,3105012563,DE +3105012564,3105012735,CY 3105012736,3105013759,GL 3105013760,3105014783,SE 3105014784,3105015807,ES @@ -56932,7 +60790,8 @@ 3105053696,3105054719,TR 3105054720,3105055743,GE 3105055744,3105056767,NL -3105056768,3105058815,GB +3105056768,3105057791,SC +3105057792,3105058815,GB 3105058816,3105059839,JO 3105059840,3105060863,PL 3105060864,3105061887,CH @@ -57159,7 +61018,8 @@ 3105299456,3105300479,IT 3105300480,3105301503,RU 3105301504,3105302527,ES -3105302528,3105303551,FR +3105302528,3105302783,GB +3105302784,3105303551,FR 3105303552,3105304575,IE 3105304576,3105305599,GE 3105305600,3105308671,GB @@ -57364,7 +61224,8 @@ 3105517568,3105518591,RU 3105518592,3105519615,RS 3105519616,3105520639,RU -3105520640,3105521663,FR +3105520640,3105521151,LU +3105521152,3105521663,FR 3105521664,3105522687,NO 3105522688,3105523711,LT 3105523712,3105524735,ES @@ -57378,8 +61239,7 @@ 3105531904,3105532927,RU 3105532928,3105533951,RS 3105533952,3105534975,BA -3105534976,3105535231,GB -3105535232,3105535999,EU +3105534976,3105535999,EU 3105536000,3105537023,AZ 3105537024,3105538047,AT 3105538048,3105539071,RU @@ -57458,7 +61318,8 @@ 3105614848,3105615871,NL 3105615872,3105616895,SE 3105616896,3105617919,GB -3105617920,3105618687,US +3105617920,3105618431,NL +3105618432,3105618687,US 3105618688,3105618943,NL 3105618944,3105619967,DE 3105619968,3105620991,TR @@ -57503,14 +61364,14 @@ 3105655808,3105656831,ES 3105656832,3105657855,SK 3105657856,3105658879,NL -3105658880,3105659135,GB -3105659136,3105659903,IL +3105658880,3105659903,IL 3105659904,3105660927,DE 3105660928,3105661951,TR 3105661952,3105662975,GB 3105662976,3105663999,ES 3105664000,3105665023,DE 3105665024,3105666047,PL +3105666048,3105667071,NL 3105667072,3105668095,DE 3105668096,3105668131,US 3105668132,3105668159,NL @@ -57740,8 +61601,12 @@ 3105896448,3105897471,RU 3105897472,3105898495,UA 3105898496,3105898751,CZ -3105898752,3105900543,RU -3105900544,3105902591,GB +3105898752,3105899263,RU +3105899264,3105899519,CZ +3105899520,3105900543,RU +3105900544,3105901567,GB +3105901568,3105901823,US +3105901824,3105902591,GB 3105902592,3105903615,DE 3105903616,3105904639,RU 3105904640,3105905663,NO @@ -57773,11 +61638,7 @@ 3105932288,3105933311,SE 3105933312,3105933351,GB 3105933352,3105933359,IT -3105933360,3105933463,GB -3105933464,3105933471,IT -3105933472,3105933871,GB -3105933872,3105933879,IT -3105933880,3105934215,GB +3105933360,3105934215,GB 3105934216,3105934223,IT 3105934224,3105934231,GB 3105934232,3105934239,IT @@ -57819,7 +61680,9 @@ 3105966080,3105967103,FI 3105967104,3105968127,GB 3105968128,3105969151,HU -3105969152,3105970175,GB +3105969152,3105969663,GB +3105969664,3105969695,DE +3105969696,3105970175,GB 3105970176,3105971199,FR 3105971200,3105972223,GB 3105972224,3105973247,FI @@ -57874,7 +61737,9 @@ 3106021376,3106022399,FR 3106022400,3106023423,IT 3106023424,3106023679,NL -3106023680,3106024319,US +3106023680,3106023807,US +3106023808,3106023935,AE +3106023936,3106024319,US 3106024320,3106024447,DE 3106024448,3106025471,GB 3106025472,3106026495,PL @@ -57961,12 +61826,12 @@ 3106103296,3106104319,NL 3106104320,3106105343,UA 3106105344,3106106367,AE -3106106368,3106107391,CZ +3106106368,3106107391,DE 3106107392,3106108415,NL 3106108416,3106110463,RU 3106110464,3106111487,GB 3106111488,3106112511,RU -3106112512,3106113535,CZ +3106112512,3106113535,DE 3106113536,3106114559,NL 3106114560,3106115583,ES 3106115584,3106116607,DE @@ -58003,7 +61868,9 @@ 3106146304,3106147327,GB 3106147328,3106148351,FR 3106148352,3106149375,AT -3106149376,3106150399,EU +3106149376,3106149631,EU +3106149632,3106149887,DE +3106149888,3106150399,EU 3106150400,3106151423,GB 3106151424,3106152447,NO 3106152448,3106153471,GB @@ -58117,7 +61984,16 @@ 3106263040,3106264063,PT 3106264064,3106265087,ES 3106265088,3106266111,GB -3106266112,3106267135,FR +3106266112,3106266367,FR +3106266368,3106266399,HK +3106266400,3106266431,SG +3106266432,3106266719,FR +3106266720,3106266751,US +3106266752,3106266927,FR +3106266928,3106266943,AU +3106266944,3106266975,FR +3106266976,3106267007,US +3106267008,3106267135,FR 3106267136,3106269183,ES 3106269184,3106270207,IS 3106270208,3106271231,GB @@ -58142,7 +62018,9 @@ 3106291712,3106292735,CH 3106292736,3106293759,NO 3106293760,3106294783,UA -3106294784,3106295807,DE +3106294784,3106295039,DE +3106295040,3106295295,US +3106295296,3106295807,DE 3106295808,3106296831,GB 3106296832,3106297855,RU 3106297856,3106298879,NL @@ -58150,7 +62028,8 @@ 3106299904,3106300927,GB 3106300928,3106301951,NL 3106301952,3106302975,GB -3106302976,3106303999,CZ +3106302976,3106303231,A2 +3106303232,3106303999,CZ 3106304000,3106305023,GB 3106305024,3106306047,DE 3106306048,3106307071,NO @@ -58201,7 +62080,17 @@ 3106351104,3106352127,ES 3106352128,3106353151,NL 3106353152,3106354175,DE -3106354176,3106355199,NL +3106354176,3106354316,NL +3106354317,3106354317,BE +3106354318,3106354943,NL +3106354944,3106354951,GB +3106354952,3106354959,AT +3106354960,3106355023,NL +3106355024,3106355031,GB +3106355032,3106355039,AT +3106355040,3106355051,NL +3106355052,3106355103,GB +3106355104,3106355199,NL 3106355200,3106356223,DE 3106356224,3106357247,ES 3106357248,3106358271,DE @@ -58219,7 +62108,7 @@ 3106372608,3106373631,SE 3106373632,3106374655,FI 3106374656,3106375679,RU -3106375680,3106376703,SA +3106375680,3106376703,ES 3106376704,3106377727,FR 3106377728,3106378751,SE 3106378752,3106379775,RU @@ -58288,7 +62177,6 @@ 3106449408,3106450431,AT 3106450432,3106451455,DE 3106451456,3106452479,AZ -3106452480,3106453503,UA 3106453504,3106454527,SE 3106454528,3106455551,ME 3106455552,3106456575,PS @@ -58354,7 +62242,7 @@ 3106491392,3106492415,CH 3106492416,3106493439,PL 3106493440,3106494463,SY -3106494464,3106495487,SA +3106494464,3106495487,IT 3106495488,3106496511,PL 3106496512,3106497535,ES 3106497536,3106498559,RU @@ -58448,7 +62336,10 @@ 3106599936,3106601983,CH 3106601984,3106603007,DE 3106603008,3106604031,BE -3106604032,3106606079,RU +3106604032,3106604543,DE +3106604544,3106604799,RU +3106604800,3106605055,DE +3106605056,3106606079,RU 3106606080,3106607103,AT 3106607104,3106608127,IT 3106608128,3106609151,NL @@ -58506,9 +62397,8 @@ 3106661376,3106662399,TR 3106662400,3106663423,IE 3106663424,3106664447,UA -3106664448,3106665727,FR -3106665728,3106665983,CH -3106665984,3106666495,FR +3106664448,3106665471,FR +3106665472,3106666495,CH 3106666496,3106667519,UA 3106667520,3106668543,ES 3106668544,3106669567,RU @@ -58539,9 +62429,9 @@ 3106697216,3106698239,IR 3106698240,3106698303,BG 3106698304,3106698367,GE -3106698368,3106698559,BG -3106698560,3106698623,GE -3106698624,3106699263,BG +3106698368,3106698495,BG +3106698496,3106698751,GE +3106698752,3106699263,BG 3106699264,3106700287,RU 3106700288,3106701311,BG 3106701312,3106702335,NL @@ -58562,7 +62452,13 @@ 3106716672,3106717695,CZ 3106717696,3106718719,TR 3106718720,3106719743,CH -3106719744,3106720767,DE +3106719744,3106719999,DE +3106720000,3106720016,US +3106720017,3106720017,DE +3106720018,3106720159,US +3106720160,3106720160,DE +3106720161,3106720255,US +3106720256,3106720767,DE 3106720768,3106722815,AT 3106722816,3106723839,IT 3106723840,3106724863,PL @@ -58575,7 +62471,8 @@ 3106731008,3106732031,NL 3106732032,3106735167,GB 3106735168,3106735199,IE -3106735200,3106736127,GB +3106735200,3106735231,DE +3106735232,3106736127,GB 3106736128,3106737151,IE 3106737152,3106738175,RO 3106738176,3106739199,DE @@ -58587,7 +62484,8 @@ 3106744320,3106745343,SM 3106745344,3106746367,NL 3106746368,3106747391,DK -3106747392,3106748415,BE +3106747392,3106747903,US +3106747904,3106748415,BE 3106748416,3106749439,CZ 3106749440,3106750463,RU 3106750464,3106751487,BG @@ -58601,7 +62499,6 @@ 3106758656,3106759679,GB 3106759680,3106760703,RU 3106760704,3106761727,IE -3106761728,3106762751,GB 3106762752,3106763775,DE 3106763776,3106764799,NL 3106764800,3106765823,SE @@ -58692,8 +62589,7 @@ 3106850816,3106851839,GB 3106851840,3106852863,PL 3106852864,3106853887,GB -3106853888,3106854015,EU -3106854016,3106854143,NL +3106853888,3106854143,NL 3106854144,3106854911,CH 3106854912,3106855935,IR 3106855936,3106856959,UA @@ -58715,7 +62611,7 @@ 3106873344,3106874367,ES 3106874368,3106875391,RU 3106875392,3106876415,NO -3106876416,3106877439,CZ +3106876416,3106877439,DE 3106877440,3106878463,IR 3106878464,3106879487,RU 3106879488,3106880511,MK @@ -58781,11 +62677,12 @@ 3106941952,3106943999,FR 3106944000,3106945023,IT 3106945024,3106946047,NL -3106946048,3106947071,GB +3106946048,3106947071,JE 3106947072,3106948095,AE 3106948096,3106949119,NL 3106949120,3106950143,RU -3106950144,3106951167,GB +3106950144,3106950399,IM +3106950400,3106951167,GB 3106951168,3106952191,SE 3106952192,3106954239,ES 3106954240,3106955263,DE @@ -58824,7 +62721,9 @@ 3106992128,3106993151,AM 3106993152,3106994175,DE 3106994176,3106995199,SK -3106995200,3106996223,FR +3106995200,3106995711,FR +3106995712,3106995967,US +3106995968,3106996223,FR 3106996224,3106997247,SI 3106997248,3106998271,NO 3106998272,3106999295,IT @@ -58892,8 +62791,8 @@ 3107067904,3107068927,RU 3107068928,3107069951,HU 3107069952,3107070975,FR -3107070976,3107071487,SE -3107071488,3107071999,IR +3107070976,3107071231,SE +3107071232,3107071999,IR 3107072000,3107073023,SE 3107073024,3107074047,ES 3107074048,3107075071,PL @@ -58909,7 +62808,7 @@ 3107085312,3107086335,NL 3107086336,3107087359,EE 3107087360,3107088383,IE -3107088384,3107089407,NL +3107088384,3107089407,BR 3107089408,3107090431,IT 3107090432,3107091455,FR 3107091456,3107092479,ES @@ -58921,7 +62820,9 @@ 3107097600,3107098623,DE 3107098624,3107099647,ES 3107099648,3107099903,UA -3107099904,3107101695,CZ +3107099904,3107100159,CZ +3107100160,3107100415,RU +3107100416,3107101695,CZ 3107101696,3107102719,RU 3107102720,3107103743,GB 3107103744,3107104767,PL @@ -58946,7 +62847,7 @@ 3107124224,3107125247,FI 3107125248,3107126271,UA 3107126272,3107127295,FR -3107127296,3107128319,SA +3107127296,3107128319,SE 3107128320,3107129343,US 3107129344,3107130367,AT 3107130368,3107131391,IT @@ -58954,7 +62855,7 @@ 3107132416,3107133439,RU 3107133440,3107134463,CY 3107134464,3107135487,CZ -3107135488,3107136511,SA +3107135488,3107136511,DE 3107136512,3107137535,TR 3107137536,3107138559,IR 3107138560,3107139583,ES @@ -58980,7 +62881,7 @@ 3107161088,3107162111,GR 3107162112,3107163135,IT 3107163136,3107164159,RU -3107164160,3107165183,SA +3107164160,3107165183,FR 3107165184,3107166207,NL 3107166208,3107167231,AE 3107167232,3107168255,RU @@ -59002,6 +62903,7 @@ 3107183616,3107184639,IQ 3107184640,3107185663,SE 3107185664,3107186687,CZ +3107186688,3107187711,NO 3107187712,3107188735,MT 3107188736,3107189759,CZ 3107189760,3107190783,NL @@ -59020,7 +62922,7 @@ 3107204096,3107205119,FR 3107205120,3107206143,BG 3107206144,3107207167,NL -3107207168,3107208191,DE +3107207168,3107207423,AT 3107208192,3107209215,NL 3107209216,3107210239,IT 3107210240,3107213311,RU @@ -59034,7 +62936,9 @@ 3107220480,3107221503,GB 3107221504,3107222527,IT 3107222528,3107223551,IQ -3107223552,3107224575,AT +3107223552,3107224063,AT +3107224064,3107224319,DE +3107224320,3107224575,AT 3107224576,3107225599,FR 3107225600,3107226623,AZ 3107226624,3107227647,RU @@ -59120,7 +63024,9 @@ 3107316736,3107317759,KG 3107317760,3107318783,RU 3107318784,3107318799,IE -3107318800,3107319807,NL +3107318800,3107319039,NL +3107319040,3107319295,GB +3107319296,3107319807,NL 3107319808,3107320831,OM 3107320832,3107321855,SA 3107321856,3107322879,NL @@ -59266,7 +63172,9 @@ 3107473408,3107474431,IL 3107474432,3107475455,ES 3107475456,3107476479,NL -3107476480,3107477503,BG +3107476480,3107476765,BG +3107476766,3107476766,US +3107476767,3107477503,BG 3107477504,3107478527,AE 3107478528,3107480575,IR 3107480576,3107481599,DK @@ -59298,14 +63206,15 @@ 3107496320,3107496447,NL 3107496448,3107496463,CL 3107496464,3107496479,ES -3107496480,3107496511,GB +3107496480,3107496495,RO +3107496496,3107496511,IN 3107496512,3107496703,NL 3107496704,3107496719,PE 3107496720,3107496735,PK 3107496736,3107496751,FJ 3107496752,3107496783,PA -3107496784,3107496799,AQ -3107496800,3107496815,MX +3107496784,3107496799,BE +3107496800,3107496815,IL 3107496816,3107496831,CN 3107496832,3107496847,BR 3107496848,3107496863,KP @@ -59403,7 +63312,7 @@ 3107589120,3107590143,IQ 3107590144,3107591167,IE 3107591168,3107592191,BG -3107592192,3107593215,NL +3107592192,3107593215,GB 3107593216,3107594239,DE 3107594240,3107595263,FI 3107595264,3107596287,DE @@ -59430,7 +63339,7 @@ 3107618816,3107619839,CH 3107619840,3107620863,IT 3107620864,3107621887,NO -3107621888,3107622911,SA +3107621888,3107622911,JP 3107622912,3107623935,SE 3107623936,3107624959,NL 3107624960,3107625983,RU @@ -59538,7 +63447,8 @@ 3107733504,3107734527,BG 3107734528,3107735551,HU 3107735552,3107737599,DE -3107737600,3107738623,NL +3107737600,3107737855,GB +3107737856,3107738623,NL 3107738624,3107738879,DE 3107738880,3107739135,DK 3107739136,3107739391,RO @@ -59629,8 +63539,7 @@ 3107826688,3107827711,RU 3107827712,3107828735,FR 3107828736,3107829759,IT -3107829760,3107830783,FR -3107830784,3107831807,GB +3107829760,3107831807,FR 3107831808,3107832831,RU 3107832832,3107833855,NL 3107833856,3107834879,PS @@ -59672,7 +63581,8 @@ 3107874816,3107875839,CH 3107875840,3107876863,CZ 3107876864,3107877887,RS -3107877888,3107878911,NL +3107877888,3107878143,GB +3107878144,3107878911,NL 3107878912,3107879935,IL 3107879936,3107880959,DE 3107880960,3107881983,HU @@ -59761,7 +63671,7 @@ 3107971072,3107972095,UZ 3107972096,3107973119,IT 3107973120,3107974143,SA -3107974144,3107976191,IR +3107974144,3107975167,IR 3107976192,3107977215,NL 3107977216,3107978239,AT 3107978240,3107979263,NL @@ -59791,7 +63701,8 @@ 3108002816,3108003839,RO 3108003840,3108004863,DE 3108004864,3108005887,RU -3108005888,3108006911,LT +3108005888,3108006910,US +3108006911,3108006911,LT 3108006912,3108007935,NL 3108007936,3108008959,DE 3108008960,3108009983,CH @@ -59833,6 +63744,7 @@ 3108047872,3108050943,RU 3108050944,3108051967,GB 3108051968,3108052991,FR +3108052992,3108054015,GB 3108054016,3108055039,LV 3108055040,3108056063,GB 3108056064,3108057087,IT @@ -59872,8 +63784,7 @@ 3108092928,3108093951,SE 3108093952,3108095999,DE 3108096000,3108096511,LT -3108096512,3108096767,RU -3108096768,3108097023,ES +3108096512,3108097023,RU 3108097024,3108098047,TR 3108098048,3108099071,DE 3108099072,3108100095,NL @@ -60047,7 +63958,7 @@ 3108278272,3108279295,RU 3108279296,3108280319,FR 3108280320,3108281343,RU -3108281344,3108282367,CZ +3108281344,3108282367,DE 3108282368,3108283391,NL 3108283392,3108284415,CZ 3108284416,3108285439,NO @@ -60119,6 +64030,7 @@ 3108356096,3108358143,PL 3108358144,3108359167,DE 3108359168,3108360191,NL +3108360192,3108361215,SA 3108361216,3108362239,IE 3108362240,3108363263,LU 3108363264,3108364287,RU @@ -60210,7 +64122,7 @@ 3108457472,3108459519,RU 3108459520,3108460543,DE 3108460544,3108461567,RO -3108461568,3108462591,GB +3108461568,3108462591,DE 3108462592,3108463615,RU 3108463616,3108464639,GB 3108464640,3108465663,HU @@ -60266,7 +64178,7 @@ 3108517888,3108518911,BG 3108518912,3108519935,SI 3108519936,3108520959,CH -3108520960,3108521983,CZ +3108520960,3108521983,DE 3108521984,3108523007,AT 3108523008,3108524031,IT 3108524032,3108525055,FR @@ -60435,7 +64347,7 @@ 3108717568,3108718591,FR 3108718592,3108719615,DE 3108719616,3108720639,IT -3108720640,3108721663,MD +3108720640,3108721663,GI 3108721664,3108723711,RU 3108723712,3108724735,GB 3108724736,3108725759,IQ @@ -60510,7 +64422,7 @@ 3108797440,3108798463,NL 3108798464,3108799487,AE 3108799488,3108800511,NL -3108800512,3108801535,RO +3108800512,3108801535,SA 3108801536,3108802559,TR 3108802560,3108803583,RU 3108803584,3108804607,GB @@ -60553,7 +64465,9 @@ 3108846592,3108847615,BE 3108847616,3108847639,GB 3108847640,3108847647,IT -3108847648,3108848639,GB +3108847648,3108847959,GB +3108847960,3108847967,IT +3108847968,3108848639,GB 3108848640,3108849663,CH 3108849664,3108850687,GB 3108850688,3108851711,PL @@ -60684,7 +64598,7 @@ 3108969472,3108970495,ES 3108970496,3108971519,PL 3108971520,3108972543,ES -3108972544,3108973567,MD +3108972544,3108973567,NL 3108973568,3108974591,DE 3108974592,3108975615,RU 3108975616,3108976639,IT @@ -60804,7 +64718,7 @@ 3109098496,3109099519,HU 3109099520,3109100543,RU 3109100544,3109101567,SI -3109101568,3109102591,CY +3109101568,3109102591,TR 3109102592,3109103615,DK 3109103616,3109104639,IR 3109104640,3109105663,FR @@ -60823,12 +64737,39 @@ 3109118976,3109119999,DE 3109120000,3109121023,PL 3109121024,3109122047,SE -3109122048,3109123071,NL +3109122048,3109122559,GB +3109122560,3109123071,NL 3109123072,3109124095,DK 3109124096,3109126143,ES 3109126144,3109127167,LV 3109127168,3109128191,ES -3109128192,3109129215,NL +3109128192,3109128207,NL +3109128208,3109128215,GB +3109128216,3109128223,AT +3109128224,3109128231,DK +3109128232,3109128239,SE +3109128240,3109128247,IS +3109128248,3109128319,NL +3109128320,3109128383,GB +3109128384,3109128503,NL +3109128504,3109128511,IE +3109128512,3109128719,NL +3109128720,3109128727,GB +3109128728,3109128735,AT +3109128736,3109128743,DK +3109128744,3109128751,SE +3109128752,3109128759,IE +3109128760,3109128760,IT +3109128761,3109128831,NL +3109128832,3109128895,BE +3109128896,3109128975,NL +3109128976,3109128983,DK +3109128984,3109128991,SE +3109128992,3109128999,IT +3109129000,3109129007,DK +3109129008,3109129015,SE +3109129016,3109129023,IE +3109129024,3109129215,NL 3109129216,3109130239,LB 3109130240,3109131263,RU 3109131264,3109132287,DE @@ -60978,7 +64919,9 @@ 3109289984,3109291007,NL 3109291008,3109292031,CH 3109292032,3109293055,IE -3109293056,3109295103,GB +3109293056,3109294591,GB +3109294592,3109294847,FR +3109294848,3109295103,GB 3109295104,3109296127,DE 3109296128,3109297151,BE 3109297152,3109298175,SE @@ -61127,7 +65070,8 @@ 3109455872,3109456895,FR 3109456896,3109457919,PS 3109457920,3109458943,RU -3109458944,3109459967,SE +3109458944,3109459711,SE +3109459712,3109459967,GB 3109459968,3109460991,TR 3109460992,3109462015,DE 3109462016,3109463039,LB @@ -61136,7 +65080,11 @@ 3109465088,3109466111,DE 3109466112,3109467135,FR 3109467136,3109468159,IR -3109468160,3109469183,GB +3109468160,3109468351,GB +3109468352,3109468415,ES +3109468416,3109468671,GB +3109468672,3109468799,ES +3109468800,3109469183,GB 3109469184,3109470207,DE 3109470208,3109471231,AM 3109471232,3109472255,FR @@ -61295,7 +65243,8 @@ 3109640192,3109641215,IQ 3109641216,3109642239,NO 3109642240,3109643263,US -3109643264,3109644287,UA +3109643264,3109643775,EU +3109643776,3109644287,UA 3109644288,3109646335,RU 3109646336,3109647359,IR 3109647360,3109648383,CZ @@ -61322,7 +65271,10 @@ 3109669888,3109670911,GB 3109670912,3109671935,DE 3109671936,3109672959,HR -3109672960,3109673983,GB +3109672960,3109673215,GB +3109673216,3109673471,NL +3109673472,3109673727,SG +3109673728,3109673983,GB 3109673984,3109675007,FR 3109675008,3109677055,DE 3109677056,3109678079,BE @@ -61348,7 +65300,8 @@ 3109697536,3109698559,PT 3109698560,3109698815,GB 3109698816,3109699071,FI -3109699072,3109699583,GB +3109699072,3109699327,DE +3109699328,3109699583,CA 3109699584,3109700607,DK 3109700608,3109701631,IT 3109701632,3109702655,KZ @@ -61391,7 +65344,8 @@ 3109741568,3109743615,DE 3109743616,3109744639,HU 3109744640,3109745663,TR -3109745664,3109746687,DE +3109745664,3109746431,DE +3109746432,3109746687,US 3109746688,3109747711,AZ 3109747712,3109748735,ES 3109748736,3109749759,MT @@ -61406,7 +65360,8 @@ 3109757952,3109758975,FR 3109758976,3109759999,GB 3109760000,3109762047,DE -3109762048,3109765119,RU +3109762048,3109763071,RU +3109763072,3109765119,IT 3109765120,3109766143,NO 3109766144,3109767167,ES 3109767168,3109768191,UA @@ -61470,37 +65425,45 @@ 3109834752,3109835775,ES 3109835776,3109836799,AM 3109836800,3109837823,SY -3109837824,3109838847,NL +3109837824,3109838847,ES 3109838848,3109839871,PT 3109839872,3109840895,AT 3109840896,3109841919,IT 3109841920,3109842943,ES 3109842944,3109843967,FI 3109843968,3109844991,HU -3109844992,3109846015,DE +3109844992,3109845503,DE +3109845504,3109845759,GB +3109845760,3109846015,DE 3109846016,3109847039,GB 3109847040,3109848063,IE 3109848064,3109849087,BG -3109849088,3109852159,RU +3109849088,3109850111,UA +3109850112,3109851135,RU +3109851136,3109852159,UA 3109852160,3109853183,NL -3109853184,3109854207,RU +3109853184,3109854207,DE 3109854208,3109855231,PL -3109855232,3109856255,RU +3109855232,3109856255,DE 3109856256,3109857279,IT -3109857280,3109858303,RU +3109857280,3109858303,DE 3109858304,3109859327,GB 3109859328,3109860351,SI -3109860352,3109863423,RU +3109860352,3109861375,DE +3109861376,3109862399,RU +3109862400,3109863423,DE 3109863424,3109864447,RO 3109864448,3109865471,BE 3109865472,3109866495,AT -3109866496,3109867519,RU +3109866496,3109867519,DE 3109867520,3109868543,CH 3109868544,3109869567,TR 3109869568,3109870591,CZ 3109870592,3109871615,NL 3109871616,3109872639,AZ -3109872640,3109874687,SI +3109872640,3109872895,SI +3109872896,3109873151,SE +3109873152,3109874687,SI 3109874688,3109875711,ES 3109875712,3109876735,DK 3109876736,3109877759,ES @@ -61572,9 +65535,39 @@ 3109946368,3109947391,CZ 3109947392,3109948415,CH 3109948416,3109949439,SE -3109949440,3109951487,IT +3109949440,3109949695,IT +3109949696,3109950207,GB +3109950208,3109950463,DE +3109950464,3109951487,IT 3109951488,3109952511,DE -3109952512,3109953535,GB +3109952512,3109952767,US +3109952768,3109953023,NL +3109953024,3109953279,CA +3109953280,3109953280,GB +3109953281,3109953281,US +3109953282,3109953284,GB +3109953285,3109953285,IT +3109953286,3109953288,GB +3109953289,3109953289,US +3109953290,3109953291,GB +3109953292,3109953292,HK +3109953293,3109953319,GB +3109953320,3109953320,MX +3109953321,3109953359,GB +3109953360,3109953360,SG +3109953361,3109953375,GB +3109953376,3109953376,US +3109953377,3109953379,GB +3109953380,3109953380,US +3109953381,3109953471,GB +3109953472,3109953472,HK +3109953473,3109953483,GB +3109953484,3109953484,AU +3109953485,3109953491,GB +3109953492,3109953492,AU +3109953493,3109953531,GB +3109953532,3109953532,CA +3109953533,3109953535,GB 3109953536,3109954559,RU 3109954560,3109955583,DE 3109955584,3109956607,BE @@ -61586,7 +65579,7 @@ 3109961728,3109962751,RU 3109962752,3109963775,PL 3109963776,3109964799,SE -3109964800,3109965823,ES +3109964800,3109965823,GI 3109965824,3109966847,IT 3109966848,3109967871,NL 3109967872,3109968895,IT @@ -61612,7 +65605,1768 @@ 3109989376,3109990399,RU 3109990400,3109991423,GB 3109991424,3109992447,NL -3109992448,3109993471,GB +3109992448,3109995519,GB +3109995520,3109996543,NL +3109996544,3109997567,IE +3109997568,3109998591,GB +3109998592,3109999615,NL +3109999616,3110001663,UA +3110001664,3110002687,FR +3110002688,3110003711,RU +3110003712,3110004735,FR +3110004736,3110005759,GB +3110005760,3110006783,NL +3110006784,3110007807,NO +3110007808,3110008831,NL +3110008832,3110009855,ES +3110009856,3110010879,DE +3110010880,3110011903,TR +3110011904,3110012927,KW +3110012928,3110013951,FR +3110013952,3110014975,RU +3110014976,3110015999,GB +3110016000,3110017023,UA +3110017024,3110018047,RU +3110018048,3110019071,NL +3110019072,3110020095,DE +3110020096,3110021119,IT +3110021120,3110022143,IE +3110022144,3110023167,NL +3110023168,3110024191,GB +3110024192,3110025215,IT +3110025216,3110026239,ES +3110026240,3110027263,IR +3110027264,3110028287,BE +3110028288,3110029311,NL +3110029312,3110030335,BE +3110030336,3110031359,GB +3110031360,3110032383,DE +3110032384,3110033407,TR +3110033408,3110035455,SE +3110035456,3110036479,DE +3110036480,3110038527,RU +3110038528,3110039551,GB +3110039552,3110040575,DE +3110040576,3110041599,CZ +3110041600,3110042623,TR +3110042624,3110043647,LB +3110043648,3110044671,DE +3110044672,3110046719,IT +3110046720,3110047743,SA +3110047744,3110048767,IT +3110048768,3110049791,SE +3110049792,3110050815,IR +3110050816,3110051839,BG +3110051840,3110052863,SE +3110052864,3110053887,NL +3110053888,3110054911,TR +3110054912,3110055935,GB +3110055936,3110056959,NL +3110056960,3110057983,IR +3110057984,3110059007,IQ +3110059008,3110060031,RU +3110060032,3110061055,DE +3110061056,3110062079,PL +3110062080,3110063103,DE +3110063104,3110064127,IQ +3110064128,3110065151,AT +3110065152,3110066175,DE +3110066176,3110067199,CH +3110067200,3110068223,PT +3110068224,3110069247,IT +3110069248,3110070271,RU +3110070272,3110073343,IT +3110073344,3110074367,GB +3110074368,3110075391,BG +3110075392,3110076415,LB +3110076416,3110077439,RU +3110077440,3110078463,NL +3110078464,3110079487,PL +3110079488,3110080511,DE +3110080512,3110081535,GB +3110081536,3110082559,IT +3110082560,3110083583,ES +3110083584,3110084607,NL +3110084608,3110085631,GR +3110085632,3110086655,RU +3110086656,3110087679,NO +3110087680,3110088703,NL +3110088704,3110089727,GB +3110089728,3110090751,TR +3110090752,3110091775,DE +3110091776,3110093823,GB +3110093824,3110094847,JO +3110094848,3110095871,NO +3110095872,3110096895,CH +3110096896,3110098943,RU +3110098944,3110099967,DK +3110099968,3110100991,GB +3110100992,3110102015,IT +3110102016,3110103039,AT +3110103040,3110104063,FR +3110104064,3110105087,IR +3110105088,3110106111,TR +3110106112,3110107135,IT +3110107136,3110108159,PL +3110108160,3110109183,AZ +3110109184,3110110207,IT +3110110208,3110111231,RU +3110111232,3110112255,AE +3110112256,3110113279,NL +3110113280,3110114303,SE +3110114304,3110115327,NL +3110115328,3110116351,SE +3110116352,3110117375,FR +3110117376,3110118399,RO +3110118400,3110119423,BG +3110119424,3110120447,TR +3110120448,3110121471,PT +3110121472,3110122495,MD +3110122496,3110123519,DK +3110123520,3110124543,FR +3110124544,3110125567,UA +3110125568,3110126591,TR +3110126592,3110127615,DE +3110127616,3110128639,GB +3110128640,3110129663,IT +3110129664,3110130687,RS +3110130688,3110131711,DE +3110131712,3110132735,IT +3110132736,3110133759,GB +3110133760,3110134783,QA +3110134784,3110135807,KW +3110135808,3110136831,ES +3110136832,3110137855,DE +3110137856,3110138879,IR +3110138880,3110139903,GB +3110139904,3110140927,SE +3110140928,3110141951,BG +3110141952,3110142975,RU +3110142976,3110143999,DE +3110144000,3110145023,TR +3110145024,3110146047,IT +3110146048,3110147071,PL +3110147072,3110148095,GB +3110148096,3110149119,CZ +3110149120,3110150143,GB +3110150144,3110151167,SE +3110151168,3110152191,EE +3110152192,3110153215,DE +3110153216,3110154239,LT +3110154240,3110155263,LB +3110155264,3110156287,SI +3110156288,3110157311,RU +3110157312,3110158335,GB +3110158336,3110159359,PS +3110159360,3110160383,SI +3110160384,3110161407,BG +3110161408,3110162431,RU +3110162432,3110163455,IE +3110163456,3110164479,FR +3110164480,3110165503,SE +3110165504,3110166527,LB +3110166528,3110167551,DE +3110167552,3110168575,CH +3110168576,3110169599,LB +3110169600,3110170623,IT +3110170624,3110171647,KZ +3110171648,3110172671,IR +3110172672,3110173695,IT +3110173696,3110174719,IL +3110174720,3110175743,SE +3110175744,3110176767,PS +3110176768,3110177791,CH +3110177792,3110178815,FR +3110178816,3110179839,GB +3110179840,3110180863,LT +3110180864,3110181887,GB +3110181888,3110182911,IT +3110182912,3110183935,GB +3110183936,3110184959,RU +3110184960,3110185983,ES +3110185984,3110187007,DE +3110187008,3110187263,BE +3110187264,3110189055,DE +3110189056,3110190079,FR +3110190080,3110193151,NO +3110193152,3110194175,RU +3110194176,3110195199,FR +3110195200,3110196223,HU +3110196224,3110196479,LT +3110196480,3110196735,GB +3110196736,3110196991,SE +3110196992,3110197247,NO +3110197248,3110199295,IT +3110199296,3110200319,DE +3110200320,3110201343,NL +3110201344,3110202367,IT +3110202368,3110203391,IE +3110203392,3110204415,DE +3110204416,3110205439,BE +3110205440,3110206463,EE +3110206464,3110207487,RU +3110207488,3110208511,BA +3110208512,3110209535,KZ +3110209536,3110210559,IT +3110210560,3110211583,HR +3110211584,3110212607,ES +3110212608,3110213631,FR +3110213632,3110214655,IQ +3110214656,3110215679,CH +3110215680,3110216703,ES +3110216704,3110217727,DK +3110217728,3110218751,RU +3110218752,3110219775,GB +3110219776,3110220799,DE +3110220800,3110221823,NL +3110221824,3110222847,DE +3110222848,3110223871,TR +3110223872,3110224895,FR +3110224896,3110225919,AT +3110225920,3110226943,CH +3110226944,3110227967,KZ +3110227968,3110231039,RU +3110231040,3110232063,DE +3110232064,3110233087,DK +3110233088,3110234111,NL +3110234112,3110234879,EU +3110234880,3110235135,CY +3110235136,3110236159,GB +3110236160,3110237183,IR +3110237184,3110238207,FR +3110238208,3110239231,CH +3110239232,3110240255,NL +3110240256,3110241279,FR +3110241280,3110242303,GR +3110242304,3110243327,TR +3110243328,3110244351,DE +3110244352,3110245375,NL +3110245376,3110246399,GB +3110246400,3110247423,CH +3110247424,3110248447,SE +3110248448,3110249471,GB +3110249472,3110250495,IT +3110250496,3110254591,GB +3110254592,3110255615,DE +3110255616,3110256639,GB +3110256640,3110257663,SE +3110257664,3110259711,GB +3110259712,3110260735,LB +3110260736,3110261759,SK +3110261760,3110262783,GB +3110262784,3110263807,TR +3110263808,3110265855,JO +3110265856,3110266879,FI +3110266880,3110267903,ES +3110267904,3110269951,DE +3110269952,3110270975,SE +3110270976,3110271999,PT +3110272000,3110273023,TR +3110273024,3110274047,BA +3110274048,3110277119,RU +3110277120,3110278143,LB +3110278144,3110279167,TR +3110279168,3110279183,PL +3110279184,3110279199,GB +3110279200,3110279215,DE +3110279216,3110279423,GB +3110279424,3110279439,ES +3110279440,3110279455,GB +3110279456,3110279471,NL +3110279472,3110279679,GB +3110279680,3110279695,ES +3110279696,3110279711,GB +3110279712,3110279727,NL +3110279728,3110279935,GB +3110279936,3110279951,PL +3110279952,3110279967,GB +3110279968,3110279983,DE +3110279984,3110280191,GB +3110280192,3110281215,RU +3110281216,3110282239,LB +3110282240,3110283263,SE +3110284288,3110285311,PS +3110285312,3110286335,BE +3110286336,3110288383,DE +3110288384,3110289407,ES +3110289408,3110291455,CZ +3110291456,3110292479,AT +3110292480,3110293503,GB +3110293504,3110294527,AT +3110294528,3110295551,GB +3110295552,3110296575,RO +3110296576,3110297599,RU +3110297600,3110298623,NL +3110298624,3110299647,RO +3110299648,3110300671,PL +3110300672,3110301695,IE +3110301696,3110302719,FR +3110302720,3110303743,CZ +3110303744,3110304767,DK +3110304768,3110305791,KZ +3110305792,3110306815,NL +3110306816,3110307327,NZ +3110307328,3110307839,BY +3110307840,3110308863,IE +3110308864,3110309887,RS +3110309888,3110310911,DE +3110310912,3110311935,FR +3110311936,3110315007,RU +3110315008,3110316031,GB +3110316032,3110317055,RU +3110317056,3110318079,PL +3110318080,3110319103,CZ +3110319104,3110320127,US +3110320128,3110321151,NL +3110321152,3110322175,SE +3110322176,3110323199,PL +3110323200,3110324223,IT +3110324224,3110325247,GB +3110325248,3110326271,NL +3110326272,3110327295,DE +3110327296,3110328319,IR +3110328320,3110329343,FR +3110329344,3110330367,LB +3110330368,3110331391,IT +3110331392,3110332415,DE +3110332416,3110333439,PT +3110333440,3110334463,GB +3110334464,3110335487,ES +3110335488,3110336511,GB +3110336512,3110337535,GE +3110337536,3110338559,PT +3110338560,3110339583,CH +3110339584,3110340607,FR +3110340608,3110341631,DE +3110341632,3110343679,IT +3110343680,3110344703,IQ +3110344704,3110345727,RU +3110345728,3110346751,FR +3110346752,3110347775,IT +3110347776,3110348799,NL +3110348800,3110349823,US +3110349824,3110350847,IR +3110350848,3110351871,DE +3110351872,3110353919,RU +3110353920,3110354943,GB +3110354944,3110355967,KZ +3110355968,3110356991,GB +3110356992,3110358015,ES +3110358016,3110359039,GE +3110359040,3110360063,IT +3110360064,3110360575,RO +3110360576,3110361087,FI +3110361088,3110362111,ES +3110362112,3110363135,CZ +3110363136,3110364159,KW +3110364160,3110366207,RU +3110366208,3110371327,IT +3110371328,3110372351,NL +3110372352,3110373375,LU +3110373376,3110374399,ES +3110374400,3110375423,NL +3110375424,3110376447,AT +3110376448,3110377471,GB +3110377472,3110378495,SA +3110378496,3110379519,RU +3110379520,3110380543,DE +3110380544,3110381567,IT +3110381568,3110382591,LB +3110382592,3110383615,GB +3110383616,3110384639,IT +3110384640,3110385663,ES +3110385664,3110386687,FR +3110386688,3110387711,GB +3110387712,3110388735,NL +3110388736,3110389759,CZ +3110389760,3110390783,LB +3110390784,3110391807,NO +3110391808,3110392831,AE +3110392832,3110393087,GB +3110393088,3110393343,IE +3110393344,3110393599,GB +3110393600,3110393855,IE +3110393856,3110394879,LB +3110394880,3110395903,DE +3110395904,3110396927,KZ +3110396928,3110397951,PL +3110397952,3110398975,NL +3110398976,3110399999,IT +3110400000,3110401023,AT +3110401024,3110402047,MK +3110402048,3110403071,GB +3110403072,3110404095,IT +3110404096,3110405119,NO +3110405120,3110406143,DE +3110406144,3110407167,LI +3110407168,3110408191,GB +3110408192,3110409215,LB +3110409216,3110411263,RU +3110411264,3110412287,FR +3110412288,3110413311,NO +3110413312,3110414335,IT +3110414336,3110415359,NL +3110415360,3110416383,GB +3110416384,3110417407,LI +3110417408,3110418431,DE +3110418432,3110419455,SE +3110419456,3110420479,NL +3110420480,3110421503,FR +3110421504,3110422015,RU +3110422016,3110422271,US +3110422272,3110422527,RU +3110422528,3110423551,PL +3110423552,3110425599,GB +3110425600,3110426623,IE +3110426624,3110427647,DK +3110427648,3110428671,DE +3110428672,3110428927,NL +3110428928,3110429183,US +3110429184,3110429695,NL +3110429696,3110430719,DE +3110430720,3110431743,RO +3110431744,3110432767,NL +3110432768,3110433791,DE +3110433792,3110434815,CH +3110434816,3110435839,GB +3110435840,3110436863,IS +3110436864,3110437887,PL +3110437888,3110438911,DE +3110438912,3110439935,GE +3110439936,3110440959,SK +3110440960,3110441983,BE +3110441984,3110443007,GB +3110443008,3110444031,DK +3110444032,3110445055,CH +3110445056,3110447103,ES +3110447104,3110448127,RO +3110448128,3110449151,DE +3110449152,3110450175,PT +3110450176,3110451199,FR +3110451200,3110452223,DE +3110452224,3110453247,PL +3110453248,3110454271,GB +3110454272,3110455295,NL +3110455296,3110457343,RU +3110457344,3110458367,FR +3110458368,3110459391,IT +3110459392,3110460415,RU +3110460416,3110461439,CZ +3110461440,3110462463,GB +3110462464,3110463487,IR +3110463488,3110464511,PL +3110464512,3110465535,RU +3110465536,3110466559,IE +3110466560,3110467583,RU +3110467584,3110468607,DE +3110468608,3110469631,RU +3110469632,3110470655,IL +3110470656,3110472703,RU +3110472704,3110473727,AT +3110473728,3110474751,SE +3110474752,3110475775,CZ +3110475776,3110476799,NL +3110476800,3110477823,NO +3110477824,3110478847,SE +3110478848,3110479871,TR +3110479872,3110480895,IT +3110480896,3110481919,NL +3110481920,3110482943,RO +3110482944,3110483967,NO +3110483968,3110487039,DE +3110487040,3110488063,NL +3110488064,3110489087,KZ +3110489088,3110490111,CZ +3110490112,3110491135,FR +3110491136,3110492159,GB +3110492160,3110493183,UA +3110493184,3110494207,DE +3110494208,3110495231,CZ +3110495232,3110496255,SE +3110496256,3110497279,DE +3110497280,3110498303,NO +3110498304,3110499839,RU +3110499840,3110500351,KZ +3110500352,3110501375,RU +3110501376,3110502399,RS +3110502400,3110503423,RU +3110503424,3110504447,GB +3110504448,3110505471,RU +3110505472,3110506495,IT +3110506496,3110507519,GE +3110507520,3110508543,GB +3110508544,3110509567,DE +3110509568,3110510591,RO +3110510592,3110511615,FR +3110511616,3110512639,UA +3110512640,3110514687,NL +3110514688,3110515711,FR +3110515712,3110516735,RU +3110516736,3110517759,UA +3110517760,3110518783,PL +3110518784,3110521855,GB +3110521856,3110523903,ES +3110523904,3110524927,SE +3110524928,3110525951,US +3110525952,3110526975,GB +3110526976,3110527999,DE +3110528000,3110529023,AT +3110529024,3110530047,FI +3110530048,3110531071,RS +3110531072,3110532095,DE +3110532096,3110534143,GB +3110534144,3110535167,DE +3110535168,3110536191,LU +3110536192,3110537215,GB +3110537216,3110538239,ES +3110538240,3110539263,LB +3110539264,3110540287,NL +3110540288,3110541311,LB +3110541312,3110542335,RU +3110542336,3110543359,HK +3110543360,3110545407,NL +3110545408,3110546431,UA +3110546432,3110547455,DE +3110547456,3110548479,SE +3110548480,3110549503,IT +3110549504,3110550527,NL +3110550528,3110551551,RU +3110551552,3110552575,FR +3110552576,3110553599,RU +3110553600,3110554623,DE +3110554624,3110555647,NL +3110555648,3110556671,IT +3110556672,3110557695,IR +3110557696,3110558719,LB +3110558720,3110559743,DE +3110559744,3110560767,GB +3110560768,3110561791,RU +3110561792,3110562815,IE +3110562816,3110563839,RU +3110563840,3110564863,IT +3110564864,3110565887,GB +3110565888,3110566911,DK +3110566912,3110567935,ES +3110567936,3110568959,IR +3110568960,3110569983,RU +3110569984,3110571007,RS +3110571008,3110572031,FR +3110572032,3110573055,SK +3110573056,3110574079,ES +3110574080,3110575103,PL +3110575104,3110576127,LU +3110576128,3110578175,RU +3110578176,3110579199,KZ +3110579200,3110580223,NL +3110580224,3110581247,KZ +3110581248,3110582271,ES +3110582272,3110583295,KZ +3110583296,3110584319,SE +3110584320,3110585343,DE +3110585344,3110586367,TR +3110586368,3110587391,NL +3110587392,3110588415,ES +3110588416,3110590463,SE +3110590464,3110591487,HR +3110591488,3110592511,GB +3110592512,3110593535,DE +3110593536,3110594303,GB +3110594304,3110594559,SE +3110594560,3110595583,DE +3110595584,3110596607,NL +3110596608,3110597631,SE +3110597632,3110599679,IR +3110599680,3110600703,RU +3110600704,3110601727,GR +3110601728,3110602751,RU +3110602752,3110603775,NL +3110603776,3110604799,RU +3110604800,3110605823,CH +3110605824,3110606847,TR +3110606848,3110607871,IT +3110607872,3110608895,NL +3110608896,3110611967,RO +3110611968,3110612991,GB +3110612992,3110615039,RO +3110615040,3110616063,QA +3110616064,3110617087,ES +3110617088,3110618111,PL +3110618112,3110619135,LB +3110619136,3110620159,DE +3110620160,3110621183,FR +3110621184,3110622207,GB +3110622208,3110623231,CH +3110623232,3110624255,DE +3110624256,3110625279,RU +3110625280,3110626303,GB +3110626304,3110627327,NL +3110627328,3110628351,RU +3110628352,3110629375,LU +3110629376,3110630399,UA +3110630400,3110631423,IT +3110631424,3110632447,GB +3110632448,3110633471,IT +3110633472,3110636543,NL +3110636544,3110637567,DE +3110637568,3110638591,GR +3110638592,3110639615,RU +3110639616,3110640639,ES +3110640640,3110640895,IQ +3110640896,3110641151,US +3110641152,3110641663,IQ +3110641664,3110642687,DE +3110642688,3110643711,ES +3110643712,3110644735,RO +3110644736,3110645759,RU +3110645760,3110646783,LT +3110646784,3110647807,RO +3110647808,3110648831,GB +3110648832,3110649855,NL +3110649856,3110650879,IR +3110650880,3110651903,RO +3110651904,3110652927,GG +3110652928,3110653951,DE +3110653952,3110654975,NO +3110654976,3110655999,UA +3110656000,3110657023,GB +3110657024,3110658047,GI +3110658048,3110659071,AT +3110659072,3110661119,IR +3110661120,3110662143,ES +3110662144,3110663167,IR +3110663168,3110664191,LB +3110664192,3110665215,RU +3110665216,3110666239,LB +3110666240,3110667263,DK +3110667264,3110668287,RO +3110668288,3110669311,PL +3110669312,3110671359,ES +3110671360,3110672383,AT +3110672384,3110673407,ES +3110673408,3110674431,FR +3110674432,3110676479,RO +3110676480,3110677503,DE +3110677504,3110679551,RU +3110679552,3110680575,BE +3110680576,3110681599,GB +3110681600,3110682623,SE +3110682624,3110683647,GB +3110683648,3110684671,TR +3110684672,3110685695,GB +3110685696,3110686719,NL +3110686720,3110687743,BE +3110687744,3110688767,RO +3110688768,3110689791,RU +3110689792,3110690815,IT +3110690816,3110691839,GB +3110691840,3110692863,RU +3110692864,3110693887,IT +3110693888,3110694911,UA +3110694912,3110695935,DE +3110695936,3110696959,RU +3110696960,3110697983,IR +3110697984,3110699007,GB +3110699008,3110700031,IT +3110700032,3110701055,CH +3110701056,3110702079,FR +3110702080,3110703103,PL +3110703104,3110704127,CH +3110704128,3110705151,GE +3110705152,3110706175,FR +3110706176,3110707199,BE +3110707200,3110708223,CZ +3110708224,3110709247,GB +3110709248,3110710271,RU +3110710272,3110711295,CY +3110711296,3110712319,IL +3110712320,3110713343,CZ +3110713344,3110714367,IR +3110714368,3110715391,RO +3110715392,3110716415,NL +3110716416,3110717439,AZ +3110717440,3110718463,BE +3110718464,3110719487,NL +3110719488,3110721535,IT +3110721536,3110723087,NL +3110723088,3110723103,DE +3110723104,3110723583,NL +3110723584,3110724607,RU +3110724608,3110725631,TJ +3110725632,3110726655,ES +3110726656,3110727679,IR +3110727680,3110728703,IT +3110728704,3110729727,SE +3110729728,3110730751,NL +3110730752,3110731775,DE +3110731776,3110733823,ES +3110733824,3110734847,DE +3110734848,3110735871,IQ +3110735872,3110736895,GR +3110736896,3110737919,TR +3110737920,3110738943,LU +3110738944,3110739967,IQ +3110739968,3110740991,IL +3110740992,3110742015,ES +3110742016,3110743039,RU +3110743040,3110744063,ES +3110744064,3110745087,AT +3110745088,3110746111,NL +3110746112,3110747135,IT +3110747136,3110748159,CZ +3110748160,3110749183,CH +3110749184,3110750207,BE +3110750208,3110751231,NL +3110751232,3110752255,DE +3110752256,3110753279,RO +3110753280,3110754303,DE +3110754304,3110755327,IE +3110755328,3110756351,RU +3110756352,3110757375,HU +3110757376,3110758399,CY +3110758400,3110759423,RU +3110759424,3110760447,AT +3110760448,3110761471,HU +3110761472,3110762495,IQ +3110762496,3110763007,NL +3110763008,3110763263,RO +3110763264,3110763519,NL +3110763520,3110764543,AD +3110764544,3110765567,RU +3110765568,3110766591,PL +3110766592,3110767615,IR +3110767616,3110768639,RS +3110768640,3110769663,IR +3110769664,3110770687,DE +3110770688,3110771711,NL +3110771712,3110772735,KZ +3110772736,3110773759,AT +3110773760,3110774783,DE +3110774784,3110775807,RE +3110775808,3110776831,RU +3110776832,3110777855,GB +3110777856,3110778879,SE +3110778880,3110779903,DE +3110779904,3110780927,AT +3110780928,3110781951,PS +3110781952,3110782975,RU +3110782976,3110783999,IR +3110784000,3110785023,RU +3110785024,3110786047,TR +3110786048,3110787071,AT +3110787072,3110788095,FR +3110788096,3110790143,NL +3110790144,3110791167,IR +3110791168,3110792191,DE +3110792192,3110793215,BE +3110793216,3110794239,NL +3110794240,3110795263,DE +3110795264,3110796287,AT +3110796288,3110797311,DE +3110797312,3110798335,ES +3110798336,3110799359,DE +3110799360,3110800383,GB +3110800384,3110801407,DK +3110801408,3110802431,ES +3110802432,3110803455,DE +3110803456,3110804479,NL +3110804480,3110806527,IR +3110806528,3110809599,NL +3110809600,3110810623,LB +3110810624,3110811647,DE +3110811648,3110812671,NL +3110812672,3110813695,IS +3110813696,3110814719,PL +3110814720,3110815743,NL +3110815744,3110816767,RU +3110816768,3110817791,QA +3110817792,3110818815,NL +3110818816,3110819839,FR +3110819840,3110821887,NL +3110821888,3110822911,DE +3110822912,3110823935,NL +3110823936,3110825983,ES +3110825984,3110829055,NL +3110829056,3110831103,RU +3110831104,3110832127,TR +3110832128,3110833151,RU +3110833152,3110834175,PL +3110834176,3110836223,IT +3110836224,3110837247,ES +3110837248,3110838271,RU +3110838272,3110839295,ES +3110839296,3110840319,RU +3110840320,3110841343,DK +3110841344,3110842367,KZ +3110842368,3110843391,DK +3110843392,3110845439,IT +3110845440,3110846463,NL +3110846464,3110847487,DE +3110847488,3110848511,GB +3110848512,3110849535,DK +3110849536,3110850559,IT +3110850560,3110851583,BE +3110851584,3110852607,NL +3110852608,3110853631,MK +3110853632,3110854655,DE +3110854656,3110855679,NL +3110855680,3110856703,GB +3110856704,3110857727,FR +3110857728,3110858751,IT +3110858752,3110859775,RU +3110859776,3110861823,IR +3110861824,3110862847,UA +3110862848,3110864895,RU +3110864896,3110865919,DE +3110865920,3110866943,GB +3110866944,3110868991,RU +3110868992,3110870015,PS +3110870016,3110871039,CZ +3110871040,3110872063,FR +3110872064,3110873087,MD +3110873088,3110874111,IE +3110874112,3110875135,GB +3110875136,3110876159,PL +3110876160,3110878207,GB +3110878208,3110879231,CZ +3110879232,3110880255,LV +3110880256,3110881279,PL +3110881280,3110883327,DE +3110883328,3110884351,IL +3110884352,3110886399,RU +3110886400,3110887423,GB +3110887424,3110888447,IR +3110888448,3110889471,DK +3110889472,3110890495,PT +3110890496,3110891519,DK +3110891520,3110892543,RO +3110892544,3110893567,NL +3110893568,3110894591,CZ +3110894592,3110895615,TR +3110895616,3110896639,IE +3110896640,3110897663,GB +3110897664,3110898687,MD +3110898688,3110899711,BG +3110899712,3110900735,MD +3110900736,3110901759,TR +3110901760,3110902783,MD +3110902784,3110903807,TR +3110903808,3110904831,RU +3110904832,3110905855,IR +3110905856,3110906879,GB +3110906880,3110907903,DE +3110907904,3110908927,GB +3110908928,3110909951,MD +3110909952,3110910975,DE +3110910976,3110911999,BG +3110912000,3110914047,RU +3110914048,3110915071,AT +3110915072,3110916095,ES +3110916096,3110917119,RU +3110917120,3110918143,UA +3110918144,3110919167,DE +3110919168,3110920191,RU +3110920192,3110921215,NL +3110921216,3110922239,DE +3110922240,3110923263,GB +3110923264,3110924287,FR +3110924288,3110925311,SA +3110925312,3110926335,CH +3110926336,3110927359,LU +3110927360,3110928383,DK +3110928384,3110929407,CH +3110929408,3110930431,IE +3110930432,3110931455,GB +3110931456,3110932479,DK +3110932480,3110933503,IE +3110933504,3110934527,RU +3110934528,3110935551,IT +3110935552,3110936575,TR +3110936576,3110937599,DE +3110937600,3110938623,CH +3110938624,3110941695,GB +3110941696,3110942719,UA +3110942720,3110943743,IT +3110943744,3110944767,IR +3110944768,3110945791,DK +3110945792,3110946815,IT +3110946816,3110947839,IR +3110947840,3110948863,DK +3110948864,3110949887,IR +3110949888,3110950911,SE +3110950912,3110951935,DK +3110951936,3110952959,GB +3110952960,3110953983,NL +3110953984,3110955007,IS +3110955008,3110956031,GB +3110956032,3110957055,DE +3110957056,3110958079,RU +3110958080,3110959103,GB +3110959104,3110960127,JO +3110960128,3110961151,GB +3110961152,3110962175,IR +3110962176,3110963199,DK +3110963200,3110965247,GB +3110965248,3110966271,NL +3110966272,3110967295,IL +3110967296,3110968319,GB +3110968320,3110969343,DE +3110969344,3110970367,NL +3110970368,3110971391,CH +3110971392,3110972415,GB +3110972416,3110973439,FR +3110973440,3110974463,SA +3110974464,3110975487,DE +3110975488,3110977535,IT +3110977536,3110978559,JO +3110978560,3110979583,DE +3110979584,3110980607,FR +3110980608,3110982655,UA +3110982656,3110983679,RO +3110983680,3110984703,PL +3110984704,3110985727,IT +3110985728,3110986751,IE +3110986752,3110987775,GB +3110987776,3110988799,NL +3110988800,3110989823,DE +3110989824,3110990847,CH +3110990848,3110992895,IR +3110992896,3110993919,RO +3110993920,3110994943,GB +3110994944,3110995967,PL +3110995968,3110996991,RU +3110996992,3110998015,DE +3110998016,3110999039,ES +3110999040,3111000063,IT +3111000064,3111001087,RO +3111001088,3111002111,IR +3111002112,3111003135,DE +3111003136,3111004159,GG +3111004160,3111005183,DE +3111005184,3111006207,RU +3111006208,3111007231,PL +3111007232,3111008255,GB +3111008256,3111009279,RU +3111009280,3111010303,BG +3111010304,3111012351,ES +3111012352,3111013375,CH +3111013376,3111014399,ES +3111014400,3111015423,DK +3111015424,3111016447,FR +3111016448,3111017471,CH +3111017472,3111018495,NL +3111018496,3111019519,FR +3111019520,3111020543,CH +3111020544,3111021567,SY +3111021568,3111022591,IL +3111022592,3111023615,NL +3111023616,3111024639,IT +3111024640,3111025663,AT +3111025664,3111026687,DE +3111026688,3111027711,RU +3111027712,3111028735,UA +3111028736,3111029759,AT +3111029760,3111031807,SK +3111031808,3111032831,NO +3111032832,3111033855,DE +3111033856,3111035903,ES +3111035904,3111036927,GE +3111036928,3111037951,RU +3111037952,3111038975,NL +3111038976,3111041023,GB +3111041024,3111042047,CH +3111042048,3111043071,GB +3111043072,3111044095,FR +3111044096,3111045119,CH +3111045120,3111046143,NL +3111046144,3111047167,CZ +3111047168,3111048191,RU +3111048192,3111049215,ES +3111049216,3111050239,IR +3111050240,3111051263,CH +3111051264,3111052287,ES +3111052288,3111053311,IR +3111053312,3111054335,SA +3111054336,3111055359,IR +3111055360,3111056383,TR +3111056384,3111057407,IR +3111057408,3111058431,GB +3111058432,3111059455,IR +3111059456,3111060479,ES +3111060480,3111061503,LB +3111061504,3111063551,IR +3111063552,3111064575,FR +3111064576,3111065599,GB +3111065600,3111066623,RU +3111066624,3111067647,NL +3111067648,3111068671,DE +3111068672,3111069695,IS +3111069696,3111070719,IR +3111070720,3111071743,FR +3111071744,3111072767,UA +3111072768,3111074815,FR +3111074816,3111075839,DE +3111075840,3111076863,IR +3111076864,3111077887,AZ +3111077888,3111078911,NL +3111078912,3111079935,IT +3111079936,3111080959,NL +3111080960,3111081983,RU +3111081984,3111083007,HU +3111083008,3111084031,UA +3111084032,3111085055,CZ +3111085056,3111086079,RU +3111086080,3111087103,KZ +3111087104,3111088127,CZ +3111088128,3111089151,IE +3111089152,3111090175,UA +3111090176,3111091199,NL +3111091200,3111092223,AT +3111092224,3111093247,IR +3111093248,3111094271,PL +3111094272,3111095295,IR +3111095296,3111096319,IE +3111096320,3111097343,AT +3111097344,3111098367,ES +3111098368,3111099391,SE +3111099392,3111100415,CH +3111100416,3111101439,LB +3111101440,3111102463,UA +3111102464,3111103487,DE +3111103488,3111104511,DK +3111104512,3111105535,CH +3111105536,3111106559,LT +3111106560,3111107583,ES +3111107584,3111108607,HR +3111108608,3111109631,DE +3111109632,3111110655,BE +3111110656,3111111679,NL +3111111680,3111112703,BE +3111112704,3111113727,HU +3111113728,3111114751,BG +3111114752,3111115775,RU +3111115776,3111116799,DE +3111116800,3111117823,GB +3111117824,3111117824,ES +3111117825,3111118079,FR +3111118080,3111118847,ES +3111118848,3111119871,TR +3111119872,3111120895,FR +3111120896,3111121919,SE +3111121920,3111122943,TR +3111122944,3111123967,IT +3111123968,3111126015,ES +3111126016,3111127039,IT +3111127040,3111128063,CH +3111128064,3111129087,UA +3111129088,3111130111,FR +3111130112,3111131135,RS +3111131136,3111132159,NO +3111132160,3111133183,CZ +3111133184,3111135231,IR +3111135232,3111136255,PL +3111136256,3111137279,DE +3111137280,3111138303,LI +3111138304,3111139327,CH +3111139328,3111140351,RU +3111140352,3111141375,IT +3111141376,3111142399,NL +3111142400,3111143423,DE +3111143424,3111144447,CH +3111144448,3111145471,ES +3111145472,3111146495,RU +3111146496,3111149567,IT +3111149568,3111150591,GB +3111150592,3111151615,RU +3111151616,3111152639,OM +3111152640,3111153663,NL +3111153664,3111154687,SE +3111154688,3111155711,PL +3111155712,3111156735,UA +3111156736,3111157759,DE +3111157760,3111158783,IR +3111158784,3111159807,CH +3111159808,3111160831,SE +3111160832,3111161855,RU +3111161856,3111162879,IS +3111162880,3111163903,IR +3111163904,3111164927,DE +3111164928,3111165951,HU +3111165952,3111166975,GB +3111166976,3111167999,CZ +3111168000,3111169023,IR +3111169024,3111170047,UA +3111170048,3111171071,DE +3111171072,3111172095,PL +3111172096,3111173119,RO +3111173120,3111174143,IQ +3111174144,3111175167,AZ +3111175168,3111176191,IT +3111176192,3111177215,YE +3111177216,3111178239,IS +3111178240,3111179263,DK +3111179264,3111180287,IT +3111180288,3111181311,DE +3111181312,3111182335,GB +3111182336,3111183359,RU +3111183360,3111184383,FR +3111184384,3111185407,IQ +3111185408,3111186431,UA +3111186432,3111189503,GB +3111189504,3111190527,DE +3111190528,3111191551,GB +3111191552,3111192575,DE +3111192576,3111193599,TR +3111193600,3111194623,RU +3111194624,3111195647,GB +3111195648,3111196671,CH +3111196672,3111197695,GB +3111197696,3111198719,RU +3111198720,3111199743,PL +3111199744,3111200767,KZ +3111200768,3111201791,ES +3111201792,3111202815,SK +3111202816,3111203839,FR +3111203840,3111204863,NL +3111204864,3111205887,IR +3111205888,3111206911,GB +3111206912,3111207935,FR +3111207936,3111208959,GB +3111208960,3111211007,RU +3111211008,3111212031,GB +3111212032,3111214079,NL +3111214080,3111215103,GB +3111215104,3111216127,SE +3111216128,3111217151,AT +3111217152,3111218175,IR +3111218176,3111219199,RU +3111219200,3111220223,IR +3111220224,3111221247,RU +3111221248,3111223295,DE +3111223296,3111224319,GB +3111224320,3111225343,KZ +3111225344,3111226367,RU +3111226368,3111227391,PT +3111227392,3111228415,DE +3111228416,3111230463,IR +3111230464,3111231487,PT +3111231488,3111232511,FR +3111232512,3111233535,DE +3111233536,3111234559,LV +3111234560,3111235583,NL +3111235584,3111236607,SE +3111236608,3111237631,GB +3111237632,3111238655,ES +3111238656,3111239679,GB +3111239680,3111240703,ES +3111240704,3111241727,NL +3111241728,3111242751,RU +3111242752,3111243775,GB +3111243776,3111244799,RU +3111244800,3111245823,NL +3111245824,3111246847,GB +3111246848,3111247871,TR +3111247872,3111248895,NL +3111248896,3111249919,DK +3111249920,3111250943,IE +3111250944,3111251967,ES +3111251968,3111252991,GB +3111252992,3111254015,RU +3111254016,3111255039,IE +3111255040,3111256063,EE +3111256064,3111257087,IT +3111257088,3111259135,FR +3111259136,3111261183,DE +3111261184,3111262207,TR +3111262208,3111266303,NL +3111266304,3111267327,DE +3111267328,3111268351,DK +3111268352,3111269375,BE +3111269376,3111270399,RO +3111270400,3111271423,NO +3111271424,3111272447,NL +3111272448,3111273471,ES +3111273472,3111274495,SA +3111274496,3111275519,IR +3111275520,3111276543,NL +3111276544,3111277567,IT +3111277568,3111278591,RO +3111278592,3111279615,LB +3111279616,3111280639,PL +3111280640,3111281663,GB +3111281664,3111282687,FR +3111282688,3111283711,SE +3111283712,3111284735,IT +3111284736,3111285759,AL +3111285760,3111286783,IT +3111286784,3111287807,IL +3111287808,3111288831,DE +3111288832,3111289855,FR +3111289856,3111290879,DE +3111290880,3111291903,UA +3111291904,3111292927,NL +3111292928,3111293951,SI +3111293952,3111294975,GB +3111294976,3111295999,US +3111296000,3111297023,NL +3111297024,3111298047,IE +3111298048,3111299071,NL +3111299072,3111300095,DE +3111300096,3111301119,ES +3111301120,3111302143,EE +3111302144,3111303167,BG +3111303168,3111304191,NL +3111304192,3111305215,IR +3111305216,3111306239,TR +3111306240,3111307263,NL +3111307264,3111308287,DE +3111308288,3111309311,GB +3111309312,3111310335,CH +3111310336,3111313407,DE +3111313408,3111313663,GB +3111313664,3111314431,AT +3111314432,3111315455,GB +3111315456,3111316479,IT +3111316480,3111317503,NL +3111317504,3111318527,SY +3111318528,3111319551,RU +3111319552,3111320575,SE +3111320576,3111321599,LB +3111321600,3111322623,CZ +3111322624,3111323647,GE +3111323648,3111324671,CZ +3111324672,3111325695,MT +3111325696,3111326719,FI +3111326720,3111327743,HU +3111327744,3111328767,DE +3111328768,3111329791,RO +3111329792,3111330815,NL +3111330816,3111331839,UA +3111331840,3111332863,TR +3111332864,3111333887,PL +3111333888,3111334911,DE +3111334912,3111335935,ES +3111335936,3111336959,HR +3111336960,3111337983,GB +3111337984,3111339007,RO +3111339008,3111340031,GB +3111340032,3111341055,CZ +3111341056,3111342079,IR +3111342080,3111343103,DE +3111343104,3111344127,GB +3111344128,3111345151,NL +3111345152,3111346175,RO +3111346176,3111347199,RU +3111347200,3111348223,LB +3111348224,3111349247,DE +3111349248,3111350271,GB +3111350272,3111351295,PL +3111351296,3111353343,GB +3111353344,3111354111,DE +3111354112,3111355391,GB +3111355392,3111356415,IT +3111356416,3111357439,GE +3111357440,3111358463,RU +3111358464,3111359487,NL +3111359488,3111360511,IR +3111360512,3111361535,PL +3111361536,3111363583,RU +3111363584,3111365631,IR +3111365632,3111367679,DE +3111367680,3111368703,CZ +3111368704,3111369727,AT +3111369728,3111370751,FR +3111370752,3111371775,DE +3111371776,3111373823,GB +3111373824,3111374847,GR +3111374848,3111375871,TR +3111375872,3111376895,IL +3111376896,3111377919,BE +3111377920,3111378943,RO +3111378944,3111379967,IL +3111379968,3111380991,GB +3111380992,3111382015,ES +3111382016,3111383039,DE +3111383040,3111383295,FI +3111383296,3111383551,FR +3111383552,3111383807,CH +3111383808,3111384063,FI +3111384064,3111387135,NO +3111387136,3111388159,IT +3111388160,3111389183,NO +3111389184,3111390207,DK +3111390208,3111391231,NL +3111391232,3111392255,DE +3111392256,3111394303,IR +3111394304,3111395327,AT +3111395328,3111396351,FI +3111396352,3111397375,DE +3111397376,3111399423,NL +3111399424,3111400447,CZ +3111400448,3111402495,GB +3111402496,3111403519,BE +3111403520,3111404543,IE +3111404544,3111405567,GB +3111405568,3111406591,BE +3111406592,3111407615,CZ +3111407616,3111408639,NL +3111408640,3111409663,IT +3111409664,3111410687,FR +3111410688,3111411711,BG +3111411712,3111412735,AT +3111412736,3111413759,IL +3111413760,3111414783,FR +3111414784,3111416831,GB +3111416832,3111417855,LB +3111417856,3111418879,SE +3111418880,3111419903,NL +3111419904,3111421951,FR +3111421952,3111422975,PL +3111422976,3111423999,KZ +3111424000,3111425023,NL +3111425024,3111426047,DK +3111426048,3111427071,TR +3111427072,3111428095,DE +3111428096,3111429119,IR +3111429120,3111430143,NL +3111430144,3111431167,IE +3111431168,3111432191,GB +3111432192,3111433215,FR +3111433216,3111434239,ES +3111434240,3111436287,DK +3111436288,3111437311,KZ +3111437312,3111439359,RU +3111439360,3111440383,BG +3111440384,3111441407,DE +3111441408,3111442431,GB +3111442432,3111443455,NL +3111443456,3111444479,DE +3111444480,3111445503,SA +3111445504,3111446527,RU +3111446528,3111447551,DE +3111447552,3111447791,GB +3111447792,3111447807,AT +3111447808,3111448575,GB +3111448576,3111449599,NO +3111449600,3111451647,DE +3111451648,3111452671,PL +3111452672,3111453695,MY +3111453696,3111454719,NL +3111454720,3111455743,IQ +3111455744,3111456255,CH +3111456256,3111456767,DE +3111456768,3111457791,FR +3111457792,3111458303,GB +3111458304,3111458815,FR +3111458816,3111459839,NL +3111459840,3111460863,RU +3111460864,3111461887,GR +3111461888,3111462911,FR +3111462912,3111463935,AT +3111463936,3111464959,ES +3111464960,3111465983,IR +3111465984,3111467007,DE +3111467008,3111469055,FR +3111469056,3111470079,EE +3111470080,3111471103,AE +3111471104,3111471359,NL +3111471360,3111471615,RO +3111471616,3111473151,NL +3111473152,3111474175,BG +3111474176,3111475199,PL +3111475200,3111476223,NL +3111476224,3111477247,FR +3111477248,3111478271,IR +3111478272,3111479295,UA +3111479296,3111480319,SE +3111480320,3111481343,NL +3111481344,3111482367,GB +3111482368,3111483391,RU +3111483392,3111484415,TR +3111484416,3111485439,NL +3111485440,3111486463,SA +3111486464,3111487487,CY +3111487488,3111488511,IR +3111488512,3111490559,RU +3111490560,3111491583,KG +3111491584,3111493631,RU +3111493632,3111494655,DE +3111494656,3111495679,LI +3111495680,3111496703,CH +3111496704,3111498751,ES +3111498752,3111499775,DE +3111499776,3111500799,IT +3111500800,3111501823,BG +3111501824,3111502847,NO +3111502848,3111504895,GB +3111504896,3111505919,IR +3111505920,3111506943,NL +3111506944,3111507967,DE +3111507968,3111508991,IT +3111508992,3111510015,FI +3111510016,3111511039,LB +3111511040,3111512063,DE +3111512064,3111513087,RU +3111513088,3111514111,GB +3111514112,3111515135,UA +3111515136,3111516159,RU +3111516160,3111519231,DE +3111519232,3111520255,RO +3111520256,3111521279,IQ +3111521280,3111522303,IR +3111522304,3111523327,FR +3111523328,3111524351,DE +3111524352,3111525375,LB +3111525376,3111526399,GB +3111526400,3111527423,IS +3111527424,3111528447,SE +3111528448,3111529471,DK +3111529472,3111530495,IQ +3111530496,3111531519,AZ +3111531520,3111533567,ES +3111533568,3111534591,NL +3111534592,3111535615,RU +3111535616,3111536639,FR +3111536640,3111537663,IT +3111537664,3111538687,LV +3111538688,3111539711,CZ +3111539712,3111540735,GE +3111540736,3111541759,NL +3111541760,3111542783,FR +3111542784,3111543807,IQ +3111543808,3111544831,DE +3111544832,3111546879,US +3111546880,3111547903,PT +3111547904,3111548927,FR +3111548928,3111549951,SA +3111549952,3111550975,NL +3111550976,3111551999,IQ +3111552000,3111553023,NL +3111553024,3111554047,IR +3111554048,3111555071,TR +3111555072,3111556095,DE +3111556096,3111557119,AL +3111557120,3111558143,IR +3111558144,3111559167,ES +3111559168,3111560191,EE +3111560192,3111561215,RU +3111561216,3111562239,RS +3111562240,3111563263,DE +3111564288,3111565311,DK +3111565312,3111566335,IT +3111566336,3111567359,ES +3111567360,3111568383,TR +3111568384,3111569407,DE +3111569408,3111570431,RO +3111570432,3111571455,IE +3111571456,3111572479,DE +3111572480,3111573503,PL +3111573504,3111574527,LU +3111574528,3111575551,LB +3111575552,3111576575,FI +3111576576,3111577599,IE +3111577600,3111578623,FI +3111578624,3111579647,US +3111579648,3111580671,BG +3111580672,3111581695,AT +3111581696,3111582719,DK +3111582720,3111583743,IL +3111583744,3111584767,RU +3111584768,3111585791,IR +3111585792,3111586815,DE +3111586816,3111587839,PL +3111587840,3111588863,DE +3111588864,3111589887,GB +3111589888,3111590911,FR +3111590912,3111591935,NL +3111591936,3111592959,DE +3111592960,3111593983,CH +3111593984,3111595007,US +3111595008,3111596031,AT +3111596032,3111597055,ES +3111597056,3111598079,GB +3111598080,3111599103,RU +3111599104,3111600127,GB +3111600128,3111601151,RU +3111601152,3111602175,GB +3111602176,3111603199,DE +3111603200,3111604223,UA +3111604224,3111605247,TR +3111605248,3111606271,CH +3111606272,3111607295,RS +3111607296,3111608319,DE +3111608320,3111609343,CZ +3111609344,3111610367,SE +3111610368,3111611391,CH +3111611392,3111612415,GB +3111612416,3111613439,ES +3111613440,3111614463,AT +3111614464,3111615487,PL +3111615488,3111616511,IS +3111616512,3111617535,FI +3111617536,3111618559,GB +3111618560,3111619583,DE +3111619584,3111621631,GB +3111621632,3111622655,PL +3111622656,3111623679,GB +3111623680,3111624703,BE +3111624704,3111625727,AT +3111625728,3111626751,IR +3111626752,3111627775,FR +3111627776,3111628799,GB +3111628800,3111629823,CH +3111629824,3111630847,HU +3111630848,3111631871,PL +3111631872,3111633919,NL +3111633920,3111636991,FR +3111636992,3111638015,PL +3111638016,3111639039,UA +3111639040,3111640063,CZ +3111640064,3111641087,NL +3111641088,3111643135,IT +3111643136,3111644159,GB +3111644160,3111645183,ES +3111645184,3111646207,IR +3111646208,3111647231,IT +3111647232,3111648255,ES +3111648256,3111651327,GB +3111651328,3111652351,RO +3111652352,3111653375,GB +3111653376,3111654399,RO +3111654400,3111655423,GB +3111655424,3111656447,NO +3111656448,3111657471,LB +3111657472,3111658495,GB +3111658496,3111659519,AL +3111659520,3111660543,IT +3111660544,3111661567,ES +3111661568,3111662591,FI +3111662592,3111663615,GB +3111663616,3111664639,RU +3111664640,3111665663,DE +3111665664,3111666687,PL +3111666688,3111667711,CZ +3111667712,3111668735,GB +3111668736,3111669759,KZ +3111669760,3111670783,IT +3111670784,3111671807,ES +3111671808,3111672831,RU +3111672832,3111673855,MK +3111673856,3111674879,GI +3111674880,3111675903,NO +3111675904,3111676927,ES +3111676928,3111677951,AE +3111677952,3111678975,ES +3111678976,3111679999,GB +3111680000,3111681023,IR +3111681024,3111682047,IL +3111682048,3111683071,GB +3111683072,3111684095,UA +3111684096,3111685119,IR +3111685120,3111686143,CH +3111686144,3111687167,RO +3111687168,3111688191,DE +3111688192,3111689215,GB +3111689216,3111690239,DE +3111690240,3111691263,IR +3111691264,3111692287,BE +3111692288,3111693311,IR +3111693312,3111694335,GB +3111694336,3111695359,FR +3111695360,3111696383,RU +3111696384,3111697407,CY +3111697408,3111698431,RU +3111698432,3111701503,IR +3111701504,3111702527,GB +3111702528,3111713791,IR +3111713792,3111714815,RU +3111714816,3111715839,TJ +3111715840,3111716863,GB +3111716864,3111717887,NL +3111717888,3111718911,AD +3111718912,3111719935,GB +3111719936,3111720959,CY +3111720960,3111721983,GB +3111721984,3111723007,SE +3111723008,3111725055,IT +3111725056,3111726079,AT +3111726080,3111727103,SE +3111727104,3111728127,HR +3111728128,3111729151,AT +3111729152,3111730175,IR +3111730176,3111731199,DK +3111731200,3111732223,SK +3111732224,3111733247,DE +3111733248,3111734271,RU +3111734272,3111735295,GB +3111735296,3111736319,KZ +3111736320,3111737343,RU +3111737344,3111738367,GB +3111738368,3111739391,NL +3111739392,3111740415,DE +3111740416,3111741439,IT +3111741440,3111743487,UA +3111743488,3111744511,NL +3111744512,3111745535,UA +3111745536,3111746559,MD +3111746560,3111747583,TR +3111747584,3111748607,IR +3111748608,3111749631,GB +3111749632,3111750655,DE +3111750656,3111751679,FR +3111751680,3111752703,GB +3111752704,3111753727,IT +3111753728,3111754751,BG +3111754752,3111755775,IT +3111755776,3111756799,NO +3111756800,3111757823,NL +3111757824,3111758335,NZ +3111758336,3111758847,HR +3111758848,3111759871,DK +3111759872,3111760895,IS +3111760896,3111761919,NL +3111761920,3111762943,SY +3111762944,3111763967,NL +3111763968,3111766015,DE +3111766016,3111767039,HR +3111767040,3111768063,SE +3111768064,3111769087,IT +3111769088,3111770111,DE +3111770112,3111771135,FI +3111771136,3111772159,GB +3111772160,3111773183,NL +3111773184,3111774207,IQ +3111774208,3111775231,ES +3111775232,3111776255,AM +3111776256,3111778303,RU +3111778304,3111779327,GB +3111779328,3111780351,SA +3111780352,3111781375,GB +3111781376,3111782399,DE +3111782400,3111783423,IL +3111783424,3111784447,TR +3111784448,3111785471,GB +3111785472,3111786495,NL +3111786496,3111787519,IT +3111787520,3111788543,RU +3111788544,3111789567,KZ +3111789568,3111790591,GB +3111790592,3111791615,CZ +3111791616,3111792639,IT +3111792640,3111793663,CH +3111793664,3111794687,SK +3111794688,3111795711,GB +3111795712,3111796735,PL +3111796736,3111798783,GB +3111798784,3111799807,SE +3111799808,3111800831,CH +3111800832,3111801855,IR +3111801856,3111802879,DE +3111802880,3111803903,PL +3111803904,3111804927,LB +3111804928,3111805951,PL +3111805952,3111806975,FR +3111806976,3111807999,PL +3111808000,3111809023,FI +3111809024,3111810047,NO +3111810048,3111811071,NL +3111811072,3111812095,SA +3111812096,3111814143,GB +3111814144,3111815167,IE +3111815168,3111816191,PL +3111816192,3111817215,LT +3111817216,3111819263,PL +3111819264,3111821311,NL +3111821312,3111822335,FR +3111822336,3111824383,NL +3111824384,3111825407,PL +3111825408,3111826431,RU +3111826432,3111827455,DE +3111827456,3111828479,ES +3111828480,3111829503,DK +3111829504,3111830527,NL +3111830528,3111831551,NO +3111831552,3111832575,TR +3111832576,3111835647,GB +3111835648,3111836671,CZ +3111836672,3111837695,RO +3111837696,3111838719,IT +3111838720,3111839743,AL +3111839744,3111840767,GB +3111840768,3111841791,CH +3111841792,3111842815,DE +3111842816,3111843839,CH +3111843840,3111844863,BE +3111844864,3111845887,IQ +3111845888,3111846911,TR +3111846912,3111847935,GB +3111847936,3111848959,IT +3111848960,3111849983,RU +3111849984,3111851007,KZ +3111851008,3111852031,SA +3111852032,3111853055,FR +3111853056,3111854079,GP +3111854080,3111855103,NO +3111855104,3111856127,IT +3111856128,3111857151,KZ +3111857152,3111858175,RU +3111858176,3111859199,PL +3111859200,3111860223,EE +3111860224,3111861247,ES +3111861248,3111862271,NL +3111862272,3111864319,IR +3111864320,3111865343,FR +3111865344,3111866367,RU +3111866368,3111867391,GB +3111867392,3111868415,FR +3111868416,3111869439,DE +3111869440,3111870463,NO +3111870464,3111871487,GB +3111871488,3111873535,TR +3111873536,3111874559,AT +3111874560,3111875583,GB +3111875584,3111876607,FI +3111876608,3111877631,ES +3111877632,3111878655,PL +3111878656,3111879679,CZ +3111879680,3111880703,FI +3111880704,3111881727,ES +3111881728,3111882751,RO +3111882752,3111886847,GB +3111886848,3111887871,PL +3111887872,3111888895,RU +3111888896,3111889919,IE +3111889920,3111890943,RU +3111890944,3111891967,AT +3111891968,3111892991,FR +3111892992,3111894015,BY +3111894016,3111895039,BG +3111895040,3111896063,RU +3111896064,3111897087,IS +3111897088,3111899135,ES +3111899136,3111900159,IR +3111900160,3111901183,IT +3111901184,3111902207,LU +3111902208,3111903231,RO +3111903232,3111904255,DE +3111904256,3111905279,SE +3111905280,3111906303,IT +3111906304,3111908351,GB +3111908352,3111909375,RO +3111909376,3111912447,GB +3111912448,3111913471,ES +3111913472,3111914495,UA +3111914496,3111915519,RU +3111915520,3111916543,DE +3111916544,3111919615,ES +3111919616,3111920639,RO +3111920640,3111921663,ES +3111921664,3111922687,RU +3111922688,3111923711,IT +3111923712,3111924735,DE +3111924736,3111925759,NO +3111925760,3111927807,GB +3111927808,3111930879,DE +3111930880,3111931903,NO 3113710318,3113710318,CA 3120562176,3120594943,CO 3120594944,3120599039,AR @@ -61634,7 +67388,9 @@ 3120693248,3120726015,BO 3120726016,3120734207,HN 3120734208,3120735999,RU -3120736000,3120738303,BZ +3120736000,3120736255,BZ +3120736256,3120736511,EC +3120736512,3120738303,BZ 3120738304,3120742399,CW 3120742400,3120754687,PY 3120754688,3120755711,CR @@ -61712,11 +67468,7 @@ 3123445760,3123576831,TT 3123576832,3123707903,EC 3123707904,3124232191,UY -3124232192,3124760751,AR -3124760752,3124760759,MX -3124760760,3124765183,AR -3124765184,3124765439,MX -3124765440,3124783103,AR +3124232192,3124783103,AR 3124783104,3124785151,GT 3124785152,3124788223,CL 3124788224,3124789247,PE @@ -61754,14 +67506,20 @@ 3126857856,3126857983,US 3126857984,3126858495,AR 3126858496,3126858623,US -3126858624,3126861311,AR +3126858624,3126860415,AR +3126860416,3126860543,US +3126860544,3126860671,AR +3126860672,3126860799,US +3126860800,3126861311,AR 3126861312,3126861439,US 3126861440,3126862591,AR 3126862592,3126862719,US 3126862720,3126863999,AR 3126864000,3126864127,US 3126864128,3126870015,AR -3126870016,3126874111,VE +3126870016,3126873343,VE +3126873344,3126873599,PA +3126873600,3126874111,VE 3126874112,3126878207,CR 3126878208,3126882303,PA 3126882304,3126886399,US @@ -61785,7 +67543,8 @@ 3130284032,3130286079,DO 3130286080,3130290175,PA 3130290176,3130302463,AR -3130302464,3130312703,PA +3130302464,3130302975,CY +3130302976,3130312703,PA 3130312704,3130314751,AR 3130314752,3130315775,CL 3130315776,3130316799,CR @@ -61828,13 +67587,19 @@ 3132948480,3133014015,AR 3133014016,3133046783,HT 3133046784,3133067263,AR -3133067264,3133073407,PA -3133073408,3133074431,CW +3133067264,3133071359,PA +3133071360,3133071871,CY +3133071872,3133073407,PA +3133073408,3133073663,CW +3133073664,3133073919,AW +3133073920,3133074431,CW 3133074432,3133075455,CL 3133075456,3133079551,CW 3133079552,3133145087,AR -3133145088,3136985343,BR -3136985344,3136986111,AR +3133145088,3133311999,BR +3133312000,3133313023,MX +3133313024,3136985087,BR +3136985088,3136986111,AR 3136986112,3140614143,BR 3140614144,3140616191,CR 3140616192,3145727999,BR @@ -61872,16 +67637,16 @@ 3156541440,3156606975,PT 3156606976,3156672511,TR 3156672512,3156738047,GB -3156738048,3156759431,DE -3156759432,3156759432,GB -3156759433,3156803583,DE +3156738048,3156803583,DE 3156803584,3156869119,TR 3156869120,3156924415,LU 3156924416,3156926463,SG 3156926464,3156928511,NL 3156928512,3156930559,LU 3156930560,3156933631,US -3156933632,3156934655,SG +3156933632,3156933887,SG +3156933888,3156934143,CN +3156934144,3156934655,SG 3156934656,3157000191,RU 3157000192,3157008383,MK 3157008384,3157016575,RU @@ -61941,8 +67706,7 @@ 3158401024,3158403071,GB 3158403072,3158405119,RU 3158405120,3158407167,GB -3158407168,3158407423,US -3158407424,3158409215,FR +3158407168,3158409215,FR 3158409216,3158411263,RU 3158411264,3158413311,FI 3158413312,3158415359,DE @@ -61950,8 +67714,9 @@ 3158417408,3158419455,NL 3158419456,3158421503,FR 3158421504,3158423551,GB -3158423552,3158425567,MT -3158425568,3158425599,IE +3158423552,3158425159,MT +3158425160,3158425167,IE +3158425168,3158425599,MT 3158425600,3158427647,NL 3158427648,3158429695,DE 3158429696,3158431743,RU @@ -61974,7 +67739,9 @@ 3158616064,3158630399,RU 3158630400,3158638591,PL 3158638592,3158704127,LT -3158704128,3158835199,KW +3158704128,3158719487,KW +3158719488,3158719743,US +3158719744,3158835199,KW 3158835200,3158851583,IQ 3158851584,3158859775,RU 3158859776,3158859903,NL @@ -61986,7 +67753,7 @@ 3158861056,3158861311,UA 3158861312,3158861567,IE 3158861568,3158861823,AE -3158861824,3158862079,IN +3158861824,3158862079,DE 3158862080,3158862335,GB 3158862336,3158862591,NL 3158862592,3158862847,FR @@ -62016,13 +67783,7 @@ 3158891776,3158892031,PL 3158892032,3158893567,DE 3158893568,3158893823,GB -3158893824,3158897727,DE -3158897728,3158897791,RU -3158897792,3158897855,DE -3158897856,3158897919,UA -3158897920,3158898207,DE -3158898208,3158898271,CZ -3158898272,3158898431,DE +3158893824,3158898431,DE 3158898432,3158898687,US 3158898688,3158900735,DE 3158900736,3158917119,FR @@ -62168,36 +67929,39 @@ 3161571328,3161587711,UZ 3161587712,3161604095,RU 3161604096,3161612287,PL -3161612288,3161616383,EU +3161612288,3161613055,EU +3161613056,3161613311,BR +3161613312,3161616127,EU +3161616128,3161616383,ES 3161616384,3161618431,GB 3161618432,3161620479,IQ 3161620480,3161636863,DK -3161636864,3161653247,RU +3161636864,3161641215,RU +3161641216,3161641983,UA +3161641984,3161642239,RU +3161642240,3161645055,UA +3161645056,3161653247,RU 3161653248,3161669631,LU -3161669632,3161669887,RE -3161669888,3161671167,FR -3161671168,3161671423,RE -3161671424,3161672959,FR -3161672960,3161673215,RE -3161673216,3161673471,FR -3161673472,3161673727,RE -3161673728,3161677823,FR -3161677824,3161678079,MQ -3161678080,3161678847,FR -3161678848,3161679103,MQ -3161679104,3161679871,FR -3161679872,3161680639,GP -3161680640,3161681151,FR -3161681152,3161681663,GP -3161681664,3161682431,FR -3161682432,3161682943,GF -3161682944,3161683711,MQ -3161683712,3161684735,FR -3161684736,3161684991,MQ -3161684992,3161686015,FR +3161669632,3161670143,FR +3161670144,3161670399,RE +3161670400,3161671423,FR +3161671424,3161671679,RE +3161671680,3161671935,FR +3161671936,3161672191,RE +3161672192,3161678335,FR +3161678336,3161678591,MQ +3161678592,3161679871,FR +3161679872,3161680127,GP +3161680128,3161680383,FR +3161680384,3161680895,GP +3161680896,3161681151,FR +3161681152,3161681407,GP +3161681408,3161686015,FR 3161686016,3161702399,UA 3161702400,3161718783,AM -3161718784,3161735167,PL +3161718784,3161727999,PL +3161728000,3161728255,A1 +3161728256,3161735167,PL 3161735168,3161751551,CZ 3161751552,3161767935,RU 3161767936,3161784319,BH @@ -62218,7 +67982,11 @@ 3161948160,3161964543,RO 3161964544,3161980927,ES 3161980928,3161989119,SK -3161989120,3161997311,RU +3161989120,3161989631,TR +3161989632,3161990143,NL +3161990144,3161991167,TR +3161991168,3161993215,NL +3161993216,3161997311,RU 3161997312,3162005503,DK 3162005504,3162013695,RS 3162013696,3162021887,IL @@ -62232,13 +68000,7 @@ 3162087424,3162095615,SK 3162095616,3162103807,GE 3162103808,3162104831,FR -3162104832,3162105343,NL -3162105344,3162105599,FR -3162105600,3162107391,NL -3162107392,3162107647,FR -3162107648,3162108415,NL -3162108416,3162108671,FR -3162108672,3162111103,NL +3162104832,3162111103,NL 3162111104,3162111167,FR 3162111168,3162111999,NL 3162112000,3162120191,PL @@ -62271,7 +68033,9 @@ 3162316800,3162324991,PL 3162324992,3162327039,IE 3162327040,3162329087,CH -3162329088,3162331135,IE +3162329088,3162329225,IR +3162329226,3162329226,IE +3162329227,3162331135,IR 3162331136,3162333183,GB 3162333184,3162341375,IT 3162341376,3162349567,PL @@ -62299,9 +68063,11 @@ 3162570752,3162603519,HR 3162603520,3162636287,GE 3162636288,3162669055,FR -3162669056,3162681343,RU +3162669056,3162676223,RU +3162676224,3162677247,KZ +3162677248,3162681343,RU 3162681344,3162682367,UA -3162682368,3162682879,RU +3162682368,3162682879,MD 3162682880,3162683135,IE 3162683136,3162683391,ES 3162683392,3162685439,RU @@ -62354,8 +68120,7 @@ 3164667904,3164733439,PS 3164733440,3164798975,RU 3164798976,3164864511,UA -3164864512,3164864703,GB -3164864704,3164864735,ZA +3164864512,3164864735,ZA 3164864736,3164864767,IE 3164864768,3164897279,GB 3164897280,3164899327,IT @@ -62379,11 +68144,11 @@ 3164937751,3164938239,LT 3164938240,3164946727,FR 3164946728,3164946731,NL -3164946732,3164947579,FR +3164946732,3164947067,FR +3164947068,3164947071,IT +3164947072,3164947579,FR 3164947580,3164947583,IT -3164947584,3164949135,FR -3164949136,3164949151,NL -3164949152,3164950695,FR +3164947584,3164950695,FR 3164950696,3164950703,NL 3164950704,3164951663,FR 3164951664,3164951671,PL @@ -62401,9 +68166,13 @@ 3164953584,3164953599,ES 3164953600,3164954511,FR 3164954512,3164954515,IT -3164954516,3164959551,FR +3164954516,3164958895,FR +3164958896,3164958911,PT +3164958912,3164959551,FR 3164959552,3164959583,DE -3164959584,3164960263,FR +3164959584,3164960247,FR +3164960248,3164960255,DE +3164960256,3164960263,FR 3164960264,3164960267,ES 3164960268,3164960439,FR 3164960440,3164960443,DE @@ -62438,7 +68207,9 @@ 3164969020,3164969023,BE 3164969024,3164969039,FR 3164969040,3164969047,NL -3164969048,3164970413,FR +3164969048,3164969207,FR +3164969208,3164969211,NL +3164969212,3164970413,FR 3164970414,3164970415,IT 3164970416,3164970923,FR 3164970924,3164970927,LT @@ -62449,7 +68220,9 @@ 3164973424,3164973663,FR 3164973664,3164973695,GB 3164973696,3164974335,FR -3164974336,3164974463,GB +3164974336,3164974437,GB +3164974438,3164974438,IT +3164974439,3164974463,GB 3164974464,3164974527,FR 3164974528,3164974559,ES 3164974560,3164974651,FR @@ -62459,7 +68232,8 @@ 3164976160,3164976295,FR 3164976296,3164976303,IT 3164976304,3164995583,FR -3164995584,3165061119,NL +3164995584,3165052927,NL +3165052928,3165061119,SG 3165061120,3165126655,SK 3165126656,3165192191,RU 3165192192,3165257727,GE @@ -62468,8 +68242,7 @@ 3165388800,3165417471,MT 3165417472,3165421567,DE 3165421568,3165425663,IE -3165425664,3165429759,GB -3165429760,3165437951,RO +3165425664,3165437951,GB 3165437952,3165439487,AT 3165439488,3165439743,GB 3165439744,3165439999,AT @@ -62486,7 +68259,10 @@ 3165444096,3165444351,BR 3165444352,3165444607,ZA 3165444608,3165444863,IT -3165444864,3165454335,AT +3165444864,3165445119,NL +3165445120,3165445375,AT +3165445376,3165445631,CA +3165445632,3165454335,AT 3165454336,3165519871,RO 3165519872,3165585407,DE 3165585408,3165650943,CZ @@ -62525,11 +68301,11 @@ 3166695424,3166697471,RU 3166697472,3166699519,RO 3166699520,3166961663,DE -3166961664,3167098367,SI -3167098368,3167098623,US -3167098624,3167223807,SI +3166961664,3167223807,SI 3167223808,3167748095,NL -3167748096,3167760383,RO +3167748096,3167758335,RO +3167758336,3167758463,NL +3167758464,3167760383,RO 3167760384,3167762431,GB 3167762432,3167764479,MD 3167764480,3167772671,IR @@ -62547,10 +68323,9 @@ 3167784960,3167797247,IR 3167797248,3167798271,MD 3167798272,3167799295,RO -3167799296,3167800319,MD -3167800320,3167801343,RO -3167801344,3167803391,MD -3167803392,3167804415,RO +3167799296,3167803391,MD +3167803392,3167804159,RO +3167804160,3167804415,ES 3167804416,3167805439,GB 3167805440,3167813631,IR 3167813632,3167815679,MD @@ -62562,15 +68337,22 @@ 3167842304,3167843327,ES 3167843328,3167844351,RO 3167844352,3167846399,GB -3167846400,3167850495,RO -3167850496,3167851519,IR -3167851520,3167853055,RO -3167853056,3167853567,IR -3167853568,3167854591,RO -3167854592,3167866879,IR -3167866880,3167868927,RO -3167868928,3167879167,MD -3167879168,3167895551,DE +3167846400,3167866879,IR +3167866880,3167870975,RO +3167870976,3167879167,MD +3167879168,3167880703,DE +3167880704,3167880959,US +3167880960,3167882751,DE +3167882752,3167883007,US +3167883008,3167883775,DE +3167883776,3167884031,US +3167884032,3167884543,DE +3167884544,3167885311,US +3167885312,3167885823,DE +3167885824,3167886079,US +3167886080,3167888895,DE +3167888896,3167889151,US +3167889152,3167895551,DE 3167895552,3167899647,IR 3167899648,3167902719,RO 3167902720,3167902975,BE @@ -62605,12 +68387,14 @@ 3168002048,3168005887,RO 3168005888,3168006143,NL 3168006144,3168008191,SE -3168008192,3168010239,RO -3168010240,3168011263,MD -3168011264,3168012287,RO +3168008192,3168011263,RO +3168011264,3168011519,MD +3168011520,3168011775,RO +3168011776,3168012287,IR 3168012288,3168014335,MD 3168014336,3168015359,ES -3168015360,3168015871,RO +3168015360,3168015615,BE +3168015616,3168015871,RO 3168015872,3168016127,US 3168016128,3168016383,GB 3168016384,3168018431,MD @@ -62618,7 +68402,10 @@ 3168018688,3168020479,RO 3168020480,3168022527,MD 3168022528,3168034815,IR -3168034816,3168039935,RO +3168034816,3168037887,RO +3168037888,3168038399,SE +3168038400,3168038911,RO +3168038912,3168039935,MD 3168039936,3168040959,BE 3168040960,3168050431,RO 3168050432,3168050687,MD @@ -62642,13 +68429,15 @@ 3168100352,3168108543,IR 3168108544,3168110335,RO 3168110336,3168110591,GB -3168110592,3168111615,RO +3168110592,3168110847,IT +3168110848,3168111359,RO +3168111360,3168111615,IT 3168111616,3168112639,FR 3168112640,3168116735,IR 3168116736,3168120831,RO 3168120832,3168126975,IR 3168126976,3168127999,RO -3168128000,3168128255,NL +3168128000,3168128255,MX 3168128256,3168128511,RO 3168128512,3168129023,GB 3168129024,3168130047,MD @@ -62660,11 +68449,24 @@ 3168131840,3168135679,RO 3168135680,3168136191,CZ 3168136192,3168137471,RO -3168137472,3168137983,EU +3168137472,3168137727,MD +3168137728,3168137983,RO 3168137984,3168138239,NL -3168138240,3168139263,RO +3168138240,3168139263,MD 3168139264,3168141311,GB -3168141312,3168156671,RO +3168141312,3168143615,RO +3168143616,3168143871,UA +3168143872,3168144383,RO +3168144384,3168144639,SG +3168144640,3168145151,RO +3168145152,3168145407,UA +3168145408,3168147455,RO +3168147456,3168147967,FR +3168147968,3168154111,RO +3168154112,3168154367,SG +3168154368,3168155135,RO +3168155136,3168155391,IT +3168155392,3168156671,RO 3168156672,3168157695,MD 3168157696,3168161791,IR 3168161792,3168164351,RO @@ -62693,27 +68495,37 @@ 3168202752,3168203775,ES 3168203776,3168211455,RO 3168211456,3168211967,CZ -3168211968,3168212223,RO +3168211968,3168212223,NL 3168212224,3168212479,US 3168212480,3168212735,RO 3168212736,3168212991,FR 3168212992,3168215551,RO 3168215552,3168215807,TH -3168215808,3168237567,RO +3168215808,3168223743,RO +3168223744,3168224255,MD +3168224256,3168237567,RO 3168237568,3168239615,PS 3168239616,3168243711,IR 3168243712,3168247807,RO 3168247808,3168264191,IR -3168264192,3168268287,RO -3168268288,3168269311,MD -3168269312,3168271359,RO +3168264192,3168265727,RO +3168265728,3168265855,FR +3168265856,3168265983,RO +3168265984,3168266239,GR +3168266240,3168267263,RO +3168267264,3168269311,MD +3168269312,3168270591,RO +3168270592,3168270847,MD +3168270848,3168271359,RO 3168271360,3168272383,MD 3168272384,3168534527,IT 3168534528,3168796671,GB 3168796672,3168829439,FR 3168829440,3168862207,RO 3168862208,3168894975,RU -3168894976,3168927743,PS +3168894976,3168927231,PS +3168927232,3168927487,IL +3168927488,3168927743,PS 3168927744,3168960511,RU 3168960512,3168993279,NL 3168993280,3169026047,RU @@ -62743,8 +68555,8 @@ 3169714176,3169779711,FI 3169779712,3169845247,UA 3169845248,3169854463,RO -3169854464,3169855487,IR -3169855488,3169863167,RO +3169854464,3169854719,ES +3169854720,3169863167,RO 3169863168,3169863423,MD 3169863424,3169869823,RO 3169869824,3169878015,MD @@ -62752,18 +68564,27 @@ 3169882112,3169886207,SE 3169886208,3169894399,GB 3169894400,3169895423,ES -3169895424,3169899263,RO +3169895424,3169895679,IR +3169895680,3169897471,RO +3169897472,3169898495,ES +3169898496,3169899263,RO 3169899264,3169899391,CN 3169899392,3169899519,TW -3169899520,3169921023,RO -3169921024,3169921791,GB -3169921792,3169922047,RO -3169922048,3169922303,GB -3169922304,3169922559,RO -3169922560,3169923071,GB +3169899520,3169899775,IR +3169899776,3169902079,RO +3169902080,3169902591,SE +3169902592,3169905663,RO +3169905664,3169906687,ES +3169906688,3169913855,RO +3169913856,3169914111,GB +3169914112,3169920767,RO +3169920768,3169921023,BZ +3169921024,3169923071,GB 3169923072,3169927423,RO 3169927424,3169927679,NL -3169927680,3169935359,RO +3169927680,3169928191,RO +3169928192,3169928447,SE +3169928448,3169935359,RO 3169935360,3169937407,ES 3169937408,3169951743,RO 3169951744,3169955839,SE @@ -62790,7 +68611,9 @@ 3170295808,3170303999,RU 3170304000,3170312191,SY 3170312192,3170320383,RU -3170320384,3170327593,JO +3170320384,3170321423,JO +3170321424,3170321663,US +3170321664,3170327593,JO 3170327594,3170327594,US 3170327595,3170328575,JO 3170328576,3170336767,UA @@ -62838,10 +68661,13 @@ 3187824640,3187826687,CL 3187826688,3187834879,AR 3187834880,3187843071,CW -3187843072,3187845119,AW -3187845120,3187851263,CW +3187843072,3187846143,AW +3187846144,3187849215,CW +3187849216,3187849471,CO +3187849472,3187851263,CW 3187851264,3187855359,PY -3187855360,3187857407,PA +3187855360,3187855871,CY +3187855872,3187857407,PA 3187857408,3187859455,CR 3187859456,3187863551,PA 3187863552,3187908607,AR @@ -62854,11 +68680,15 @@ 3187933342,3187933342,HN 3187933343,3187935519,GT 3187935520,3187935527,HN -3187935528,3187935607,GT +3187935528,3187935543,GT +3187935544,3187935551,HN +3187935552,3187935607,GT 3187935608,3187935615,HN 3187935616,3187936047,GT 3187936048,3187936063,HN -3187936064,3187936711,GT +3187936064,3187936583,GT +3187936584,3187936591,HN +3187936592,3187936711,GT 3187936712,3187936719,HN 3187936720,3187937799,GT 3187937800,3187937807,HN @@ -62870,33 +68700,43 @@ 3187940964,3187940967,HN 3187940968,3187941207,GT 3187941208,3187941215,HN -3187941216,3187943055,GT +3187941216,3187941647,GT +3187941648,3187941655,HN +3187941656,3187942563,GT +3187942564,3187942567,HN +3187942568,3187943055,GT 3187943056,3187943063,HN 3187943064,3187943127,GT 3187943128,3187943135,HN 3187943136,3187943399,GT 3187943400,3187943403,HN -3187943404,3187944671,GT +3187943404,3187943551,GT +3187943552,3187943679,HN +3187943680,3187944383,GT +3187944384,3187944399,HN +3187944400,3187944671,GT 3187944672,3187944679,HN 3187944680,3187944773,GT 3187944774,3187944774,HN -3187944775,3187945971,GT +3187944775,3187944831,GT +3187944832,3187944835,HN +3187944836,3187945971,GT 3187945972,3187945975,HN 3187945976,3187946111,GT 3187946112,3187946239,HN 3187946240,3187946495,GT -3187946496,3187946511,HN -3187946512,3187946639,GT -3187946640,3187946647,HN -3187946648,3187947983,GT +3187946496,3187946751,HN +3187946752,3187947983,GT 3187947984,3187947987,HN 3187947988,3187948031,GT -3187948032,3187948159,HN -3187948160,3187948479,GT +3187948032,3187948287,HN +3187948288,3187948479,GT 3187948480,3187948543,HN 3187948544,3187948799,GT 3187948800,3187948927,HN -3187948928,3187949567,GT +3187948928,3187949311,GT +3187949312,3187949439,HN +3187949440,3187949567,GT 3187949568,3187950126,BQ 3187950127,3187950127,CW 3187950128,3187953663,BQ @@ -62927,7 +68767,9 @@ 3188125696,3188137175,AR 3188137176,3188137183,DE 3188137184,3188146175,AR -3188146176,3188170751,CO +3188146176,3188152171,CO +3188152172,3188152175,PE +3188152176,3188170751,CO 3188170752,3188174847,CR 3188174848,3188178943,BR 3188178944,3188187135,CR @@ -62937,21 +68779,24 @@ 3188211712,3188228095,CL 3188228096,3188236287,PE 3188236288,3188237311,PA -3188237312,3188239359,VE -3188239360,3188239615,BR -3188239616,3188240383,PE +3188237312,3188238847,VE +3188238848,3188239103,US +3188239104,3188239359,VE +3188239360,3188240383,PE 3188240384,3188241407,CO 3188241408,3188242431,EC 3188242432,3188244479,AR -3188244480,3188260863,CO +3188244480,3188248575,CO +3188248576,3188248703,CL +3188248704,3188260863,CO 3188260864,3188269055,AR -3188269056,3188269311,MX -3188269312,3188269439,VE +3188269056,3188269439,MX 3188269440,3188269567,CO 3188269568,3188269823,MX -3188269824,3188270079,VE +3188269824,3188270079,PA 3188270080,3188270335,MX -3188270336,3188270847,VE +3188270336,3188270719,PA +3188270720,3188270847,MX 3188270848,3188271103,BR 3188271104,3188273151,MX 3188273152,3188275199,PA @@ -62971,7 +68816,9 @@ 3188473856,3188482047,PE 3188482048,3188490239,AR 3188490240,3188498431,CO -3188498432,3188512127,AR +3188498432,3188511103,AR +3188511104,3188511231,US +3188511232,3188512127,AR 3188512128,3188512255,US 3188512256,3188513407,AR 3188513408,3188513535,US @@ -62986,7 +68833,8 @@ 3188518400,3188523007,AR 3188523008,3188539391,CO 3188539392,3188543487,CL -3188543488,3188545535,PA +3188543488,3188543999,CY +3188544000,3188545535,PA 3188545536,3188547583,AR 3188547584,3188551679,CO 3188551680,3188552703,AR @@ -63035,9 +68883,7 @@ 3191108640,3191108959,PE 3191108960,3191108991,CO 3191108992,3191109119,PE -3191109120,3191109631,MX -3191109632,3191110655,PE -3191110656,3191111167,MX +3191109120,3191111167,MX 3191111168,3191111679,PE 3191111680,3191128063,PY 3191128064,3191132159,EC @@ -63052,9 +68898,7 @@ 3191193600,3191209983,HN 3191209984,3191275519,CL 3191275520,3191341055,AR -3191341056,3191406079,GT -3191406080,3191406335,SV -3191406336,3191406591,GT +3191341056,3191406591,GT 3191406592,3191439359,SV 3191439360,3191455743,EC 3191455744,3191472127,AR @@ -63071,7 +68915,9 @@ 3191611392,3191619583,VE 3191619584,3191619903,CL 3191619904,3191619935,VE -3191619936,3191635967,CL +3191619936,3191624191,CL +3191624192,3191624447,CO +3191624448,3191635967,CL 3191635968,3191637759,CO 3191637760,3191638015,AR 3191638016,3191647743,CO @@ -63082,7 +68928,9 @@ 3191650304,3191650815,US 3191650816,3191651071,CO 3191651072,3191651839,US -3191651840,3191670015,CO +3191651840,3191668991,CO +3191668992,3191669247,PY +3191669248,3191670015,CO 3191670016,3191670271,AR 3191670272,3191670783,CO 3191670784,3191672831,CL @@ -63109,9 +68957,7 @@ 3191696128,3191696383,CO 3191696384,3191701503,US 3191701504,3191702527,CL -3191702528,3191703039,US -3191703040,3191704063,CO -3191704064,3191704575,US +3191702528,3191704575,US 3191704576,3191704831,CO 3191704832,3191705343,US 3191705344,3191705599,CO @@ -63122,18 +68968,24 @@ 3191722496,3191725055,CL 3191725056,3191725311,AR 3191725312,3191725567,CL -3191725568,3191726079,CO +3191725568,3191725823,CO +3191725824,3191726079,CL 3191726080,3191726335,AR 3191726336,3191726591,CL 3191726592,3191726847,AR 3191726848,3191727103,CL 3191727104,3191727359,AR -3191727360,3191729919,CO +3191727360,3191727871,CO +3191727872,3191728127,CL +3191728128,3191729407,CO +3191729408,3191729663,CL +3191729664,3191729919,CO 3191729920,3191730431,CL 3191730432,3191730687,AR 3191730688,3191730943,CL 3191730944,3191731199,AR -3191731200,3191731711,CO +3191731200,3191731455,CL +3191731456,3191731711,CO 3191731712,3191731967,AR 3191731968,3191732223,CO 3191732224,3191732479,CL @@ -63153,16 +69005,18 @@ 3193143296,3193176063,TT 3193176064,3193307135,CO 3193307136,3193438207,SV -3193438208,3193450495,CW -3193450496,3193450751,SR -3193450752,3193569279,CW +3193438208,3193569279,CW 3193569280,3193573087,CO 3193573088,3193573095,US -3193573096,3193579263,CO +3193573096,3193575311,CO +3193575312,3193575327,PE +3193575328,3193579263,CO 3193579264,3193579519,EC 3193579520,3193582591,CO 3193582592,3193583103,EC -3193583104,3193592319,CO +3193583104,3193589503,CO +3193589504,3193589759,EC +3193589760,3193592319,CO 3193592320,3193592575,EC 3193592576,3193595391,CO 3193595392,3193595647,EC @@ -63178,9 +69032,11 @@ 3193617152,3193617407,EC 3193617408,3193621759,CO 3193621760,3193622015,EC -3193622016,3193622527,CO -3193622528,3193623551,EC -3193623552,3193625599,CO +3193622016,3193622271,CO +3193622272,3193623551,EC +3193623552,3193624063,CO +3193624064,3193624575,EC +3193624576,3193625599,CO 3193625600,3193625855,EC 3193625856,3193626111,CO 3193626112,3193626623,US @@ -63197,35 +69053,27 @@ 3193724928,3193729023,AR 3193729024,3193733119,CU 3193733120,3193735167,AR -3193735168,3193735679,US -3193735680,3193736191,AR -3193736192,3193736447,US -3193736448,3193737215,AR +3193735168,3193735935,US +3193735936,3193736191,AR +3193736192,3193736959,US +3193736960,3193737215,AR 3193737216,3193739007,US 3193739008,3193739263,AR -3193739264,3193740799,US -3193740800,3193741311,AR -3193741312,3193742335,US +3193739264,3193742335,US 3193742336,3193742591,AR 3193742592,3193742847,US 3193742848,3193743231,AR 3193743232,3193743359,US 3193743360,3193743743,AR -3193743744,3193743871,US -3193743872,3193743999,AR -3193744000,3193744127,US +3193743744,3193744127,US 3193744128,3193744639,AR -3193744640,3193744895,US -3193744896,3193745151,AR -3193745152,3193745407,US +3193744640,3193745407,US 3193745408,3193746431,AR 3193746432,3193746687,US 3193746688,3193746751,AR 3193746752,3193746815,US 3193746816,3193746879,AR -3193746880,3193747455,US -3193747456,3193747583,AR -3193747584,3193748479,US +3193746880,3193748479,US 3193748480,3193748863,AR 3193748864,3193750271,US 3193750272,3193750527,AR @@ -63238,13 +69086,13 @@ 3193753088,3193753343,US 3193753344,3193753471,AR 3193753472,3193753599,US -3193753600,3193754239,AR -3193754240,3193754367,US +3193753600,3193754111,AR +3193754112,3193754367,US 3193754368,3193754623,AR 3193754624,3193754751,US -3193754752,3193755135,AR -3193755136,3193755263,US -3193755264,3193755647,AR +3193754752,3193755007,AR +3193755008,3193755519,US +3193755520,3193755647,AR 3193755648,3193755775,US 3193755776,3193756415,AR 3193756416,3193756543,US @@ -63261,7 +69109,9 @@ 3193778176,3193782271,AR 3193782272,3193798655,TT 3193798656,3193806847,CO -3193806848,3193810943,CR +3193806848,3193808895,CR +3193808896,3193809663,US +3193809664,3193810943,CR 3193810944,3193815039,PY 3193815040,3193823231,AR 3193823232,3193827327,CL @@ -63281,9 +69131,7 @@ 3194028032,3194044415,AR 3194044416,3194052607,CO 3194052608,3194056703,TT -3194056704,3194057727,BQ -3194057728,3194057983,CA -3194057984,3194058751,BQ +3194056704,3194058751,BQ 3194058752,3194060799,AR 3194060800,3194068991,CO 3194068992,3194071039,PA @@ -63292,11 +69140,16 @@ 3194077184,3194085375,CO 3194085376,3194093567,VE 3194093568,3194126335,SR -3194126336,3194127359,GT +3194126336,3194126911,GT +3194126912,3194126975,PE +3194126976,3194127103,GT +3194127104,3194127359,BR 3194127360,3194128383,PE 3194128384,3194129407,NI 3194129408,3194129663,AR -3194129664,3194130047,BR +3194129664,3194129671,BR +3194129672,3194129919,AR +3194129920,3194130047,BR 3194130048,3194130175,CO 3194130176,3194130431,AR 3194130432,3194134527,BR @@ -63334,7 +69187,9 @@ 3194428416,3194437631,VE 3194437632,3194441727,BO 3194441728,3194445823,AR -3194445824,3194454015,CO +3194445824,3194449175,CO +3194449176,3194449183,PE +3194449184,3194454015,CO 3194454016,3194458111,AR 3194458112,3194462207,CL 3194462208,3194466303,BR @@ -63432,7 +69287,11 @@ 3194806272,3194814463,AR 3194814464,3194818559,PA 3194818560,3194830847,AR -3194830848,3194839039,PA +3194830848,3194832895,BR +3194832896,3194833919,PA +3194833920,3194835967,BR +3194835968,3194838015,PA +3194838016,3194839039,MX 3194839040,3194863615,CO 3194863616,3194871807,HN 3194871808,3194879999,BO @@ -63448,7 +69307,11 @@ 3194953216,3194953343,NI 3194953344,3194953727,GT 3194953728,3194959871,AR -3194959872,3194961919,US +3194959872,3194960383,US +3194960384,3194960895,AR +3194960896,3194961151,US +3194961152,3194961407,AR +3194961408,3194961919,US 3194961920,3194970111,EC 3194970112,3194974207,PA 3194974208,3194976255,AR @@ -63518,8 +69381,12 @@ 3195203584,3195205631,VE 3195205632,3195206655,PE 3195206656,3195207679,CL -3195207680,3195211775,GT -3195211776,3195215871,BZ +3195207680,3195209687,GT +3195209688,3195209695,PR +3195209696,3195211775,GT +3195211776,3195214988,BZ +3195214989,3195214989,RU +3195214990,3195215871,BZ 3195215872,3195224063,AR 3195224064,3195232255,PA 3195232256,3195234559,CR @@ -63574,8 +69441,8 @@ 3195740416,3195740927,PA 3195740928,3195741055,US 3195741056,3195741087,HN -3195741088,3195741951,US -3195741952,3195744255,PA +3195741088,3195741695,US +3195741696,3195744255,PA 3195744256,3195748351,EC 3195748352,3195752447,CL 3195752448,3195763711,AR @@ -63584,21 +69451,35 @@ 3195768832,3195772927,AR 3195772928,3195781119,VE 3195781120,3195785215,PA -3195785216,3195789311,HN +3195785216,3195786191,HN +3195786192,3195786199,US +3195786200,3195786991,HN +3195786992,3195787007,CA +3195787008,3195787127,HN +3195787128,3195787135,DE +3195787136,3195787215,HN +3195787216,3195787231,US +3195787232,3195788159,HN +3195788160,3195788167,CA +3195788168,3195789311,HN 3195789312,3195793407,PA 3195793408,3195801599,AR 3195801600,3195803647,HN 3195803648,3195804671,CL 3195804672,3195805695,VE 3195805696,3195807743,NI -3195807744,3195808639,BZ -3195808640,3195808767,CO -3195808768,3195809151,BZ +3195807744,3195808383,BZ +3195808384,3195808511,US +3195808512,3195808639,BZ +3195808640,3195808895,US +3195808896,3195809151,BZ 3195809152,3195809279,US 3195809280,3195809791,BZ 3195809792,3195811839,PE 3195811840,3195813887,AR -3195813888,3195822079,DO +3195813888,3195814655,DO +3195814656,3195814911,GP +3195814912,3195822079,DO 3195822080,3195830271,CO 3195830272,3195838463,AR 3195838464,3195840511,HN @@ -63616,12 +69497,16 @@ 3196190720,3196207103,HN 3196207104,3196223487,CO 3196223488,3196305407,EC -3196305408,3196321791,CO +3196305408,3196316183,CO +3196316184,3196316191,CW +3196316192,3196321791,CO 3196321792,3196583935,UY 3196583936,3196690687,AR 3196690688,3196690943,UY 3196690944,3196846079,AR -3196846080,3196977151,PA +3196846080,3196874431,PA +3196874432,3196874447,PG +3196874448,3196977151,PA 3196977152,3197042687,VE 3197042688,3197075455,CO 3197075456,3197108223,GT @@ -63661,7 +69546,9 @@ 3199565824,3199582207,NI 3199582208,3199598591,HN 3199598592,3199631359,CO -3199631360,3199729663,AR +3199631360,3199719167,AR +3199719168,3199719423,DE +3199719424,3199729663,AR 3199729664,3199762431,NI 3199762432,3199778815,CO 3199778816,3199779839,AR @@ -63671,7 +69558,9 @@ 3199782912,3199784959,AR 3199784960,3199785983,EC 3199785984,3199795199,AR -3199795200,3199819775,CW +3199795200,3199811583,CW +3199811584,3199817727,SX +3199817728,3199819775,CW 3199819776,3199820799,CR 3199820800,3199822847,AR 3199822848,3199827967,HN @@ -63710,7 +69599,8 @@ 3201562624,3201563647,CL 3201563648,3201564287,PA 3201564288,3201564415,GB -3201564416,3201564671,PA +3201564416,3201564543,PA +3201564544,3201564671,GB 3201564672,3201630207,NI 3201630208,3201695743,TT 3201695744,3201761279,EC @@ -63721,17 +69611,7 @@ 3201859584,3201863679,CO 3201863680,3201865727,CL 3201865728,3201867775,CO -3201867776,3201869823,PE -3201869824,3201869855,AR -3201869856,3201869871,PE -3201869872,3201869919,AR -3201869920,3201869935,PE -3201869936,3201871743,AR -3201871744,3201871807,PE -3201871808,3201871811,AR -3201871812,3201871815,PE -3201871816,3201871871,AR -3201871872,3201875967,PE +3201867776,3201875967,PE 3201875968,3201880063,CO 3201880064,3201884159,EC 3201884160,3201894399,VE @@ -63739,21 +69619,22 @@ 3201925120,3201957887,CL 3201957888,3202088959,PA 3202088960,3202220031,AR -3202220032,3202351103,PE +3202220032,3202280447,PE +3202280448,3202280575,SE +3202280576,3202351103,PE 3202351104,3202875391,AR 3202875392,3203399679,PE 3203399680,3203465215,CO -3203465216,3203530751,CR +3203465216,3203494143,CR +3203494144,3203494271,CO +3203494272,3203530751,CR 3203530752,3203531519,CO 3203531520,3203531775,PA 3203531776,3203532287,CO 3203532288,3203532543,PA 3203532544,3203532799,CO 3203532800,3203534847,PA -3203534848,3203535103,CW -3203535104,3203535359,CO -3203535360,3203535615,CW -3203535616,3203535871,CO +3203534848,3203535871,CO 3203535872,3203536383,PA 3203536384,3203536895,CO 3203536896,3203537919,HN @@ -63773,15 +69654,15 @@ 3203561472,3203562495,SV 3203562496,3203563775,CO 3203563776,3203564287,PA -3203564288,3203564799,CO -3203564800,3203565055,DO +3203564288,3203564543,CO +3203564544,3203565055,DO 3203565056,3203566591,CO 3203566592,3203566847,PA 3203566848,3203568639,CO 3203568640,3203569663,SV -3203569664,3203570609,CO -3203570610,3203570610,CR -3203570611,3203661823,CO +3203569664,3203570431,CO +3203570432,3203570687,CR +3203570688,3203661823,CO 3203661824,3203923967,AR 3203923968,3204448255,CO 3204448256,3208642559,BR @@ -63816,10 +69697,15 @@ 3210743568,3210743583,US 3210743584,3210744063,CL 3210744064,3210744079,TR -3210744080,3210744319,CL -3210744320,3210744575,US +3210744080,3210744191,CL +3210744192,3210744575,US 3210744576,3210744591,BE -3210744592,3210745343,CL +3210744592,3210744703,BR +3210744704,3210744831,US +3210744832,3210744863,NZ +3210744864,3210744895,IS +3210744896,3210745087,CL +3210745088,3210745343,US 3210745344,3210745359,RU 3210745360,3210745375,US 3210745376,3210745599,CL @@ -63827,16 +69713,18 @@ 3210745856,3210745871,IT 3210745872,3210746367,BR 3210746368,3210746383,SE -3210746384,3210746879,CL +3210746384,3210746623,BR +3210746624,3210746879,US 3210746880,3210746895,CH 3210746896,3210747135,CL 3210747136,3210747903,US 3210747904,3210748159,BR 3210748160,3210748175,JP -3210748176,3210748415,BR -3210748416,3210749951,CL -3210749952,3210752255,US -3210752256,3210752511,CL +3210748176,3210748287,BR +3210748288,3210748927,US +3210748928,3210749439,CL +3210749440,3210752255,US +3210752256,3210752511,SG 3210752512,3210755839,US 3210755840,3210755855,MY 3210755856,3210755871,US @@ -63845,28 +69733,41 @@ 3210756608,3210756863,DE 3210756864,3210757119,RU 3210757120,3210758911,US -3210758912,3210759167,CL -3210759168,3210759423,US -3210759424,3210762495,CL -3210762496,3210762751,US -3210762752,3210763007,CL -3210763008,3210764031,US +3210758912,3210759167,GH +3210759168,3210764031,US 3210764032,3210764047,IE 3210764048,3210764063,US 3210764064,3210764287,CL -3210764288,3210764543,US -3210764544,3210765055,CL +3210764288,3210764799,US +3210764800,3210765055,CL 3210765056,3210765071,SE 3210765072,3210765311,BR -3210765312,3210769919,CL -3210769920,3210770175,US -3210770176,3210771199,CL +3210765312,3210765567,CL +3210765568,3210766079,US +3210766080,3210766335,CL +3210766336,3210766591,US +3210766592,3210766847,CL +3210766848,3210767103,US +3210767104,3210767359,CL +3210767360,3210768127,US +3210768128,3210768383,MY +3210768384,3210768639,NL +3210768640,3210769151,CL +3210769152,3210769407,NL +3210769408,3210769663,CL +3210769664,3210770431,US +3210770432,3210770687,CL +3210770688,3210770943,US +3210770944,3210771199,CL 3210771200,3210771215,TH -3210771216,3210772991,CL +3210771216,3210771711,CL +3210771712,3210772479,US +3210772480,3210772991,CL 3210772992,3210773247,US 3210773248,3210773503,BR 3210773504,3210773519,PL -3210773520,3210774015,CL +3210773520,3210773759,BR +3210773760,3210774015,CL 3210774016,3210774271,US 3210774272,3210774287,NO 3210774288,3210774783,BR @@ -63875,15 +69776,22 @@ 3210775040,3210775295,US 3210775296,3210775311,CH 3210775312,3210775551,BR -3210775552,3210776319,CL +3210775552,3210775807,US +3210775808,3210776319,CL 3210776320,3210776575,US 3210776576,3210776831,CL 3210776832,3210777087,US -3210777088,3210778367,CL +3210777088,3210777599,CL +3210777600,3210777855,US +3210777856,3210778367,CL 3210778368,3210778623,US -3210778624,3210779903,CL -3210779904,3210780159,US -3210780160,3210782719,CL +3210778624,3210779135,CL +3210779136,3210779391,US +3210779392,3210779647,CL +3210779648,3210780927,US +3210780928,3210781183,CL +3210781184,3210781439,US +3210781440,3210782719,CL 3210782720,3210782975,US 3210782976,3210782991,TR 3210782992,3210783487,CL @@ -63892,7 +69800,9 @@ 3210784000,3210784015,JP 3210784016,3210784511,CL 3210784512,3210784527,BE -3210784528,3210785791,CL +3210784528,3210785279,CL +3210785280,3210785535,US +3210785536,3210785791,CL 3210785792,3210786047,BR 3210786048,3210786063,AU 3210786064,3210786303,CL @@ -63907,30 +69817,33 @@ 3210789376,3210790143,CL 3210790144,3210790399,US 3210790400,3210790655,CL -3210790656,3210790911,US -3210790912,3210791679,CL +3210790656,3210791423,US +3210791424,3210791679,CL 3210791680,3210791935,US 3210791936,3210792447,CL 3210792448,3210792703,US -3210792704,3210794239,CL -3210794240,3210794751,US -3210794752,3210796287,CL +3210792704,3210793471,CL +3210793472,3210793727,US +3210793728,3210793983,CL +3210793984,3210794751,US +3210794752,3210795007,CL +3210795008,3210796031,US +3210796032,3210796287,CL 3210796288,3210797055,US 3210797056,3210797311,CL -3210797312,3210797567,US -3210797568,3210797823,CL -3210797824,3210798079,US -3210798080,3210799103,CL +3210797312,3210798591,US +3210798592,3210798847,CL +3210798848,3210799103,ES 3210799104,3210799359,US 3210799360,3210799615,CL 3210799616,3210800639,US 3210800640,3210800895,CL -3210800896,3210801151,US -3210801152,3210801663,CL -3210801664,3210802431,US +3210800896,3210802431,US 3210802432,3210802687,CL 3210802688,3210802943,US -3210802944,3210803071,CL +3210802944,3210803039,CL +3210803040,3210803055,AU +3210803056,3210803071,CL 3210803072,3210803087,US 3210803088,3210803199,CL 3210803200,3210803201,US @@ -63956,7 +69869,9 @@ 3210831872,3210832895,DO 3210832896,3210835967,AR 3210835968,3210838015,PY -3210838016,3210870783,AR +3210838016,3210868735,AR +3210868736,3210869759,US +3210869760,3210870783,AR 3210870784,3210903551,CO 3210903552,3210919935,PE 3210919936,3210920959,GT @@ -63971,42 +69886,46 @@ 3211071744,3211071999,DE 3211072000,3211072027,US 3211072028,3211072057,BR -3211072058,3211072511,US +3211072058,3211072287,US +3211072288,3211072319,NZ +3211072320,3211072511,US 3211072512,3211073023,NL 3211073024,3211073279,GB -3211073280,3211073791,US +3211073280,3211073535,FR +3211073536,3211073791,US 3211073792,3211074047,LT -3211074048,3211074815,NL -3211074816,3211075327,DK +3211074048,3211074303,NL +3211074304,3211074559,ES +3211074560,3211074815,NL +3211074816,3211075071,US +3211075072,3211075327,DK 3211075328,3211075583,NL 3211075584,3211075839,US 3211075840,3211076095,CL 3211076096,3211076607,LT -3211076608,3211078655,US -3211078656,3211079167,CL -3211079168,3211079423,NL -3211079424,3211079679,CL +3211076608,3211079679,US 3211079680,3211079935,GB -3211079936,3211080703,CL +3211079936,3211080191,NG +3211080192,3211080703,US 3211080704,3211080959,GB 3211080960,3211081215,CL 3211081216,3211081727,CH -3211081728,3211082239,US -3211082240,3211082751,GB +3211081728,3211082495,US +3211082496,3211082751,GB 3211082752,3211083007,SG 3211083008,3211083519,US 3211083520,3211083775,HK 3211083776,3211083791,RU 3211083792,3211083839,CL 3211083840,3211083855,GB -3211083856,3211083871,DE -3211083872,3211084031,CL +3211083856,3211083903,DE +3211083904,3211084031,CL 3211084032,3211084287,DE 3211084288,3211084303,NL -3211084304,3211084351,CL +3211084304,3211084351,DE 3211084352,3211084367,GB -3211084368,3211084383,DE -3211084384,3211084559,CL +3211084368,3211084543,DE +3211084544,3211084559,CL 3211084560,3211084575,DE 3211084576,3211084671,CL 3211084672,3211084799,BY @@ -64015,7 +69934,7 @@ 3211084864,3211084879,GB 3211084880,3211084895,DE 3211084896,3211084927,CL -3211084928,3211085055,US +3211084928,3211085055,DE 3211085056,3211085071,CL 3211085072,3211085087,DE 3211085088,3211085311,CL @@ -64034,27 +69953,19 @@ 3211086336,3211086351,FR 3211086352,3211086367,DE 3211086368,3211086463,CL -3211086464,3211086591,US -3211086592,3211086607,CL -3211086608,3211086623,DE -3211086624,3211086847,CL +3211086464,3211086847,DE 3211086848,3211086863,PL 3211086864,3211086879,DE 3211086880,3211087119,CL 3211087120,3211087135,DE 3211087136,3211087359,CL 3211087360,3211087375,GB -3211087376,3211087391,DE -3211087392,3211087631,CL -3211087632,3211087647,DE -3211087648,3211087871,CL +3211087376,3211087871,DE 3211087872,3211087887,ES 3211087888,3211087903,DE 3211087904,3211087999,CL 3211088000,3211088127,US -3211088128,3211088143,CL -3211088144,3211088159,DE -3211088160,3211088383,CL +3211088128,3211088383,DE 3211088384,3211088399,BE 3211088400,3211088415,DE 3211088416,3211088655,CL @@ -64074,76 +69985,47 @@ 3211090944,3211090959,TR 3211090960,3211091071,DE 3211091072,3211091199,US -3211091200,3211091215,CL -3211091216,3211091231,DE -3211091232,3211091455,CL +3211091200,3211091455,DE 3211091456,3211091471,FI 3211091472,3211091487,DE 3211091488,3211091727,CL 3211091728,3211091743,DE 3211091744,3211091967,CL 3211091968,3211091983,RU -3211091984,3211091999,DE -3211092000,3211092239,CL -3211092240,3211092255,DE -3211092256,3211092479,CL +3211091984,3211092479,DE 3211092480,3211092495,BE -3211092496,3211092511,DE -3211092512,3211092607,CL +3211092496,3211092607,DE 3211092608,3211092735,US -3211092736,3211092751,CL -3211092752,3211092767,DE -3211092768,3211092991,CL +3211092736,3211092991,DE 3211092992,3211093007,SK -3211093008,3211093023,DE -3211093024,3211093263,CL -3211093264,3211093279,DE -3211093280,3211093503,CL +3211093008,3211093503,DE 3211093504,3211093519,HR -3211093520,3211093535,DE -3211093536,3211093775,CL -3211093776,3211093791,DE -3211093792,3211094015,CL +3211093520,3211094015,DE 3211094016,3211094031,CZ -3211094032,3211094047,DE -3211094048,3211094143,CL +3211094032,3211094143,DE 3211094144,3211094271,US -3211094272,3211094287,CL -3211094288,3211094303,DE -3211094304,3211094527,CL +3211094272,3211094527,DE 3211094528,3211094543,HR 3211094544,3211095039,DE 3211095040,3211095055,ES -3211095056,3211095071,DE -3211095072,3211095311,CL -3211095312,3211095327,DE -3211095328,3211095551,CL +3211095056,3211095551,DE 3211095552,3211095567,GB -3211095568,3211095583,DE -3211095584,3211095679,CL +3211095568,3211095679,DE 3211095680,3211095807,US 3211095808,3211096063,DE 3211096064,3211096079,GB -3211096080,3211096095,DE -3211096096,3211096335,CL -3211096336,3211096351,DE -3211096352,3211096575,CL -3211096576,3211096831,DE -3211096832,3211096847,CL -3211096848,3211096863,DE -3211096864,3211097087,CL -3211097088,3211097103,DE +3211096080,3211097103,DE 3211097104,3211097151,GB 3211097152,3211097215,CL 3211097216,3211097343,GB 3211097344,3211097359,CL 3211097360,3211097375,DE 3211097376,3211097599,CL -3211097600,3211097855,US +3211097600,3211097855,RU 3211097856,3211097871,CL 3211097872,3211097887,DE 3211097888,3211098111,CL -3211098112,3211098367,US +3211098112,3211098367,RU 3211098368,3211098383,CL 3211098384,3211098399,DE 3211098400,3211098623,CL @@ -64157,34 +70039,26 @@ 3211099776,3211099903,GB 3211099904,3211099919,CL 3211099920,3211099935,DE -3211099936,3211101183,CL -3211101184,3211101951,US -3211101952,3211102207,AR +3211099936,3211100159,CL +3211100160,3211101951,US +3211101952,3211102207,SG 3211102208,3211104767,AU -3211104768,3211106303,CL -3211106304,3211108351,US -3211108352,3211113471,CL +3211104768,3211105791,US +3211105792,3211106303,ES +3211106304,3211112959,US +3211112960,3211113471,CL 3211113472,3211113727,GB 3211113728,3211113983,LT -3211113984,3211114495,CL -3211114496,3211114751,IT -3211114752,3211115007,US -3211115008,3211115263,NO -3211115264,3211115519,BE -3211115520,3211115775,DK -3211115776,3211116287,RU -3211116288,3211116543,US -3211116544,3211116799,CL -3211116800,3211117055,US -3211117056,3211117567,CL -3211117568,3211122687,US -3211122688,3211124735,CL -3211124736,3211128831,US -3211128832,3211129343,CL +3211113984,3211114239,US +3211114240,3211114495,CL +3211114496,3211116031,US +3211116032,3211116287,RU +3211116288,3211129087,US +3211129088,3211129343,CL 3211129344,3211129599,SG 3211129600,3211129855,NL -3211129856,3211130367,CL -3211130368,3211132927,US +3211129856,3211130111,CL +3211130112,3211132927,US 3211132928,3211137023,CO 3211137024,3211141119,AR 3211141120,3211142143,CL @@ -64229,7 +70103,9 @@ 3219658752,3219673183,US 3219673184,3219673343,BR 3219673344,3219673599,US -3219673600,3219685375,BR +3219673600,3219673951,BR +3219673952,3219673983,IE +3219673984,3219685375,BR 3219685376,3219726335,US 3219726336,3219734527,JP 3219734528,3219750911,NL @@ -64299,7 +70175,9 @@ 3220163584,3220164607,BR 3220164608,3220168703,IE 3220168704,3220172799,US -3220172800,3221225471,BR +3220172800,3221196100,BR +3221196101,3221196101,US +3221196102,3221225471,BR 3221225480,3221225727,US 3221226240,3221226495,US 3221226496,3221227519,KY @@ -64312,7 +70190,9 @@ 3221258240,3221291007,CA 3221291008,3221334269,US 3221334270,3221334270,DZ -3221334271,3221469175,US +3221334271,3221415935,US +3221415936,3221416191,RU +3221416192,3221469175,US 3221469176,3221469183,CA 3221469184,3221560319,US 3221560320,3221561087,GB @@ -64349,9 +70229,9 @@ 3221618176,3221618431,NL 3221618432,3221618687,US 3221618688,3221618943,GB -3221618944,3221633791,US -3221633792,3221634047,FR -3221634048,3221647103,US +3221618944,3221621247,US +3221621248,3221621503,GB +3221621504,3221647103,US 3221647104,3221647359,FR 3221647360,3221656831,US 3221656832,3221657087,AU @@ -64360,15 +70240,13 @@ 3221664512,3221757951,US 3221757952,3221761023,IN 3221761024,3221790719,US -3221790720,3221794815,IN -3221794816,3221795583,US +3221790720,3221795071,IN +3221795072,3221795583,US 3221795584,3221796095,IN 3221796096,3221796351,US 3221796352,3221796607,IN 3221796608,3221796863,US -3221796864,3221808895,IN -3221808896,3221809151,US -3221809152,3221815295,IN +3221796864,3221815295,IN 3221815296,3221843967,US 3221843968,3221844223,EU 3221844224,3221946367,US @@ -64376,9 +70254,7 @@ 3221964288,3221964543,US 3221964544,3221985791,FR 3221985792,3221986047,US -3221986048,3221991167,FR -3221991168,3221991423,NZ -3221991424,3221993727,FR +3221986048,3221993727,FR 3221993728,3221993983,EU 3221993984,3222003967,FR 3222003968,3222004223,AP @@ -64437,9 +70313,7 @@ 3222320896,3222326015,NL 3222326016,3222326527,US 3222326528,3222339583,CA -3222339584,3222405375,US -3222405376,3222405631,GB -3222405632,3222406143,US +3222339584,3222406143,US 3222406144,3222406399,EU 3222406400,3222407167,US 3222407168,3222407423,EU @@ -64467,9 +70341,7 @@ 3222868992,3222872319,US 3222872320,3222872575,CA 3222872576,3222874623,US -3222874624,3222874848,AP -3222874849,3222874849,MY -3222874850,3222874879,AP +3222874624,3222874879,AP 3222874880,3222876159,US 3222876160,3222876415,AP 3222876416,3222890751,US @@ -64501,18 +70373,20 @@ 3222989312,3222989567,NL 3222989568,3222989823,CA 3222989824,3222990079,PT -3222990080,3222990335,NL -3222990336,3222990591,AT +3222990080,3222990591,AT 3222990592,3222990847,PT 3222990848,3223077119,US 3223077120,3223077375,EU -3223077376,3223201791,US +3223077376,3223091199,US +3223091200,3223092223,AU +3223092224,3223092479,GB +3223092480,3223201791,US 3223201792,3223202815,PR -3223202816,3223214079,US +3223202816,3223204863,US +3223204864,3223205119,CA +3223205120,3223214079,US 3223214080,3223214591,CA -3223214592,3223215103,US -3223215104,3223215359,AU -3223215360,3223216383,US +3223214592,3223216383,US 3223216384,3223217151,CA 3223217152,3223223295,US 3223223296,3223223551,AI @@ -64597,9 +70471,7 @@ 3223437312,3223447551,CH 3223447552,3223447807,US 3223447808,3223448063,NL -3223448064,3223449087,US -3223449088,3223449343,NL -3223449344,3223453183,US +3223448064,3223453183,US 3223453184,3223453439,NL 3223453440,3223458559,US 3223458560,3223458815,NL @@ -64627,15 +70499,13 @@ 3223499520,3223499775,FI 3223499776,3223500031,US 3223500032,3223503871,CA -3223504384,3223504639,US +3223503872,3223504639,US 3223504640,3223504895,CA 3223504896,3223508991,US 3223508992,3223513087,CA 3223513088,3223519231,US 3223519232,3223524351,DE -3223524352,3223528233,US -3223528234,3223528234,GB -3223528235,3223534335,US +3223524352,3223534335,US 3223534336,3223534591,AU 3223534592,3223535359,US 3223535360,3223537919,DE @@ -64698,7 +70568,9 @@ 3223610880,3223611135,NO 3223611136,3223611647,SE 3223611648,3223611903,GB -3223611904,3223615999,SE +3223611904,3223612927,SE +3223612928,3223613183,FR +3223613184,3223615999,SE 3223616000,3223616767,GB 3223616768,3223617535,SE 3223617536,3223617791,NO @@ -64709,7 +70581,8 @@ 3223627776,3223628031,DE 3223628032,3223628287,SE 3223628288,3223628543,ES -3223628544,3223630591,SE +3223628544,3223630079,SE +3223630080,3223630591,FR 3223630592,3223630847,GB 3223630848,3223634431,SE 3223634432,3223634687,US @@ -64723,7 +70596,8 @@ 3223640832,3223641087,GB 3223641088,3223644415,SE 3223644416,3223644671,DE -3223644672,3223646207,SE +3223644672,3223644927,FR +3223644928,3223646207,SE 3223646208,3223646463,IT 3223646464,3223646975,SE 3223646976,3223647231,IT @@ -64745,7 +70619,9 @@ 3223867648,3223867903,CA 3223867904,3223868415,US 3223868416,3223869439,BM -3223869440,3223871487,US +3223869440,3223869695,NO +3223869696,3223869951,DK +3223869952,3223871487,US 3223871488,3223873535,CA 3223873536,3223881727,US 3223881728,3223882751,CA @@ -64755,7 +70631,7 @@ 3223902464,3223902719,CA 3223902720,3223905279,US 3223905280,3223905535,FI -3223905536,3223905791,US +3223905536,3223906303,US 3223906304,3223909375,CA 3223909376,3223911935,US 3223911936,3223912191,CA @@ -64827,9 +70703,7 @@ 3224030720,3224030975,CA 3224030976,3224038655,US 3224038656,3224038911,AU -3224038912,3224042751,US -3224042752,3224043007,DE -3224043008,3224084991,US +3224038912,3224084991,US 3224084992,3224087551,SE 3224087552,3224088063,US 3224088064,3224088319,AU @@ -64995,9 +70869,7 @@ 3224834560,3224834815,TH 3224834816,3224839423,US 3224839424,3224839679,EU -3224839680,3224850175,US -3224850176,3224850431,IN -3224850432,3224851455,US +3224839680,3224851455,US 3224851456,3224851711,NL 3224851712,3224852735,US 3224852736,3224852991,NL @@ -65024,9 +70896,7 @@ 3224863744,3224863999,GB 3224864000,3224870143,US 3224870144,3224870399,EU -3224870400,3224870655,US -3224870656,3224870911,IT -3224870912,3224878079,US +3224870400,3224878079,US 3224878080,3224878335,NL 3224878336,3224878591,US 3224878592,3224878847,AU @@ -65116,9 +70986,7 @@ 3225452544,3225456639,CA 3225456640,3225459711,US 3225459712,3225459967,CA -3225459968,3225460479,US -3225460480,3225460735,CA -3225460736,3225460991,US +3225459968,3225460991,US 3225460992,3225462015,CA 3225462016,3225468927,US 3225468928,3225470463,CA @@ -65290,7 +71158,7 @@ 3225747712,3225747967,CA 3225747968,3225757695,US 3225757696,3225758719,CA -3225759232,3225763839,US +3225758720,3225763839,US 3225763840,3225764095,BE 3225764096,3225764863,US 3225764864,3225765887,CA @@ -65337,21 +71205,30 @@ 3225873920,3225874943,US 3225874944,3225875199,GB 3225875200,3225878527,US -3225878528,3225880319,SE -3225880320,3225880575,US -3225880576,3225881343,SE +3225878528,3225881343,SE 3225881344,3225881599,IT 3225881600,3225882367,SE 3225882368,3225882623,DE 3225882624,3225882879,SE 3225882880,3225883391,DE -3225883392,3225885183,SE +3225883392,3225884927,SE +3225884928,3225885183,NL 3225885184,3225885695,AT -3225885696,3225887999,SE +3225885696,3225886719,SE +3225886720,3225886975,NO +3225886976,3225887231,SE +3225887232,3225887487,DK +3225887488,3225887999,SE 3225888000,3225888255,GB -3225888256,3225894399,SE +3225888256,3225892351,SE +3225892352,3225892863,FR +3225892864,3225894399,SE 3225894400,3225895423,GB -3225895424,3225905407,SE +3225895424,3225902335,SE +3225902336,3225902591,NL +3225902592,3225902847,SE +3225902848,3225903103,NL +3225903104,3225905407,SE 3225905408,3225905663,IT 3225905664,3225913855,SE 3225913856,3225914111,DE @@ -65391,7 +71268,9 @@ 3225938688,3225940991,SE 3225940992,3225941247,IL 3225941248,3225941503,IT -3225941504,3225942038,SE +3225941504,3225941759,SE +3225941760,3225942015,AT +3225942016,3225942038,SE 3225942039,3225942039,EU 3225942040,3225942271,SE 3225942272,3225942527,BE @@ -65425,7 +71304,9 @@ 3226141696,3226141951,US 3226141952,3226143487,CA 3226143488,3226143743,US -3226143744,3226156543,CA +3226143744,3226146559,CA +3226146560,3226146815,US +3226146816,3226156543,CA 3226156544,3226156799,US 3226156800,3226157567,CA 3226157568,3226157823,US @@ -65455,8 +71336,8 @@ 3226237696,3226240255,DE 3226240256,3226240511,US 3226240512,3226241535,DE -3226241536,3226241791,AT -3226241792,3226248447,DE +3226241536,3226241791,NL +3226241792,3226248191,DE 3226248448,3226248703,IE 3226248704,3226250495,DE 3226250496,3226251263,US @@ -65587,7 +71468,7 @@ 3226658304,3226658559,AU 3226658560,3226661119,US 3226661120,3226661375,NL -3226661888,3226664959,US +3226661376,3226664959,US 3226664960,3226690815,FI 3226690816,3226691071,CA 3226691072,3226691327,NL @@ -65598,7 +71479,15 @@ 3226695680,3226695935,US 3226695936,3226696191,CA 3226696192,3226696703,AU -3226696704,3226705151,US +3226696704,3226697727,US +3226697728,3226697983,CA +3226697984,3226698495,US +3226698496,3226698751,CA +3226698752,3226700287,US +3226700288,3226700799,CA +3226700800,3226701055,US +3226701056,3226701567,CA +3226701568,3226705151,US 3226705152,3226705407,AU 3226705408,3226705919,US 3226705920,3226706175,FR @@ -65613,7 +71502,7 @@ 3226716672,3226716927,GB 3226716928,3226718207,US 3226720768,3226721279,JP -3226721280,3226721791,US +3226721280,3226722047,US 3226722048,3226722303,NL 3226722304,3226722559,AU 3226722560,3226723583,US @@ -65908,7 +71797,7 @@ 3227446784,3227447039,AU 3227447040,3227447295,NL 3227447296,3227447807,MU -3227447808,3227448063,ZA +3227447808,3227448063,US 3227448064,3227448575,AU 3227448576,3227448831,US 3227448832,3227449087,MU @@ -65941,7 +71830,9 @@ 3227461960,3227461963,US 3227461964,3227464447,CA 3227464448,3227464575,US -3227464576,3227465147,CA +3227464576,3227464663,CA +3227464664,3227464667,US +3227464668,3227465147,CA 3227465148,3227465151,US 3227465152,3227466135,CA 3227466136,3227466143,US @@ -65996,7 +71887,9 @@ 3227566336,3227567103,MU 3227567104,3227568127,ZA 3227568128,3227574271,US -3227574272,3227579391,MU +3227574272,3227576575,MU +3227576576,3227576831,US +3227576832,3227579391,MU 3227579392,3227579647,US 3227579648,3227580159,MU 3227580160,3227580927,ZA @@ -66021,7 +71914,9 @@ 3227756506,3227756506,US 3227756507,3227762655,CA 3227762656,3227762671,US -3227762672,3227765503,CA +3227762672,3227765480,CA +3227765481,3227765482,US +3227765483,3227765503,CA 3227765504,3227765759,US 3227765760,3227777759,CA 3227777760,3227777763,US @@ -66061,9 +71956,7 @@ 3227805696,3227806463,US 3227806464,3227806719,FI 3227806720,3227807743,US -3227807744,3227809023,FI -3227809024,3227809279,IN -3227809280,3227812351,FI +3227807744,3227812351,FI 3227812352,3227812607,EU 3227812608,3227813375,FI 3227813376,3227813631,US @@ -66113,7 +72006,7 @@ 3227852032,3227853311,US 3227853312,3227853567,GB 3227853568,3227860991,US -3227863552,3227863807,US +3227863296,3227863807,US 3227863808,3227864063,NL 3227864064,3227865343,US 3227865344,3227867647,NL @@ -66144,7 +72037,9 @@ 3227893760,3227894015,NL 3227894016,3227895039,US 3227895040,3227895551,DE -3227895552,3227909631,US +3227895552,3227909119,US +3227909120,3227909375,NL +3227909376,3227909631,US 3227909632,3227909887,AU 3227909888,3227910399,US 3227910400,3227910655,NL @@ -66164,7 +72059,7 @@ 3227932672,3227932927,US 3227932928,3227933183,DE 3227933184,3227933695,US -3227933696,3227933951,AU +3227933696,3227933951,NZ 3227933952,3227934463,US 3227934464,3227934719,CH 3227934720,3227947519,US @@ -66172,7 +72067,8 @@ 3227955712,3227964927,US 3227964928,3227965183,NL 3227965184,3227967487,US -3227967488,3227967999,NL +3227967488,3227967743,FR +3227967744,3227967999,NL 3227968000,3227968255,US 3227968256,3227968767,GB 3227968768,3227969023,RU @@ -66218,6 +72114,7 @@ 3228048384,3228048895,NL 3228048896,3228050175,US 3228050176,3228050943,PT +3228050944,3228051199,CA 3228051200,3228051455,US 3228051456,3228051711,AU 3228051712,3228051967,CH @@ -66254,7 +72151,9 @@ 3228100608,3228101119,AU 3228101120,3228102143,US 3228102144,3228102399,NL -3228102400,3228103935,US +3228102400,3228103423,US +3228103424,3228103679,CA +3228103680,3228103935,US 3228103936,3228104191,FR 3228104192,3228104703,AU 3228104704,3228104959,DK @@ -66290,6 +72189,7 @@ 3228264448,3228264703,NI 3228264704,3228265983,US 3228265984,3228266239,IE +3228266240,3228266495,PR 3228266496,3228267007,AU 3228267008,3228267263,NL 3228267264,3228269055,US @@ -66362,39 +72262,42 @@ 3228353280,3228358399,SE 3228358400,3228362239,US 3228362240,3228362495,AU -3228362496,3228362751,US -3228363008,3228363263,US +3228362496,3228363263,US 3228363264,3228363519,CH 3228363520,3228364287,US 3228364288,3228364543,NL -3228364800,3228368895,US -3228368896,3228380415,DE +3228364544,3228368895,US +3228368896,3228379135,DE +3228379648,3228380415,DE 3228380416,3228380671,US 3228380672,3228380927,DE -3228381184,3228388095,DE +3228381184,3228387839,DE 3228388096,3228388351,US -3228388352,3228393727,DE -3228393984,3228394239,DE +3228388352,3228392447,DE +3228392448,3228392959,US +3228392960,3228393727,DE 3228394240,3228394495,US 3228394752,3228395263,DE 3228395264,3228395775,US 3228395776,3228399615,DE 3228399616,3228399871,US -3228399872,3228404735,DE +3228399872,3228400383,DE +3228400640,3228403711,DE +3228403968,3228404223,DE 3228404736,3228404863,FR 3228404864,3228404895,EU -3228404896,3228405247,FR -3228405248,3228405503,KR -3228405504,3228405759,SG -3228405760,3228406015,IN +3228404896,3228405503,FR +3228405504,3228405759,DE +3228405760,3228406015,FR 3228406016,3228406271,US 3228406272,3228406527,IN 3228406528,3228407039,FR -3228407040,3228424703,DE +3228407296,3228424447,DE 3228424704,3228424959,US -3228425216,3228430847,DE +3228425216,3228430335,DE +3228430592,3228430847,DE 3228430848,3228431103,MU -3228431104,3228434431,DE +3228431872,3228434431,DE 3228434432,3228456191,US 3228456192,3228456447,CA 3228456448,3228457471,US @@ -66434,12 +72337,10 @@ 3228558592,3228559103,BR 3228559104,3228564479,US 3228564480,3228564735,AT -3228564736,3228565247,US -3228565504,3228572927,US +3228564736,3228572927,US 3228572928,3228573183,CA 3228573184,3228573951,PT -3228573952,3228574463,US -3228574720,3228577023,US +3228573952,3228577023,US 3228577024,3228577279,NL 3228577280,3228578047,US 3228578048,3228578303,NL @@ -66468,9 +72369,7 @@ 3228631040,3228696575,NL 3228696576,3228714764,IL 3228714765,3228714765,CA -3228714766,3228826371,IL -3228826372,3228826372,US -3228826373,3228830719,IL +3228714766,3228830719,IL 3228830720,3228833791,PS 3228833792,3229024255,IL 3229024256,3229024511,CA @@ -66494,7 +72393,9 @@ 3229160960,3229161471,DE 3229161472,3229161727,SE 3229161728,3229161983,GB -3229161984,3229164287,SE +3229161984,3229163263,SE +3229163264,3229163519,ES +3229163520,3229164287,SE 3229164288,3229164543,DK 3229164544,3229165055,GB 3229165056,3229165311,NO @@ -66502,15 +72403,23 @@ 3229167104,3229167615,IT 3229167616,3229171711,SE 3229171712,3229172223,GB -3229172224,3229182463,SE +3229172224,3229173503,SE +3229173504,3229173759,IT +3229173760,3229182463,SE 3229182464,3229182975,GB 3229182976,3229183999,SE 3229184000,3229184511,GB -3229184512,3229186815,SE +3229184512,3229186559,SE +3229186560,3229186815,IT 3229186816,3229187327,ES -3229187328,3229187583,SE +3229187328,3229187583,IT 3229187584,3229187839,DK -3229187840,3229195263,SE +3229187840,3229192959,SE +3229192960,3229193727,FR +3229193728,3229194239,SE +3229194240,3229194495,FR +3229194496,3229195007,SE +3229195008,3229195263,NL 3229195264,3229196287,DE 3229196288,3229196799,SE 3229196800,3229197311,NL @@ -66523,15 +72432,23 @@ 3229199360,3229200383,SE 3229200384,3229200895,GB 3229200896,3229201151,DE -3229201152,3229201407,SE -3229201408,3229201663,IT +3229201152,3229201663,SE 3229201664,3229201919,DK -3229201920,3229202943,SE -3229202944,3229203199,NL +3229201920,3229202431,SE +3229202432,3229202687,ES +3229202688,3229203199,NL 3229203200,3229203967,GB -3229203968,3229205503,SE +3229203968,3229204223,SE +3229204224,3229204479,IT +3229204480,3229205503,SE 3229205504,3229206015,GB -3229206016,3229220863,SE +3229206016,3229211647,SE +3229211648,3229211903,IT +3229211904,3229212927,SE +3229212928,3229213183,DE +3229213184,3229219583,SE +3229219584,3229219839,DE +3229219840,3229220863,SE 3229220864,3229221119,US 3229221120,3229245439,GB 3229245440,3229246463,US @@ -66566,8 +72483,7 @@ 3229360128,3229360383,AT 3229360384,3229361919,US 3229361920,3229362175,BE -3229362176,3229363199,US -3229363456,3229363711,US +3229362176,3229363711,US 3229363712,3229363967,GB 3229363968,3229380607,US 3229380608,3229380863,NL @@ -66580,24 +72496,24 @@ 3229391104,3229391359,US 3229391360,3229391615,AU 3229391616,3229391871,NL -3229391872,3229392895,US -3229392896,3229393151,NZ -3229393152,3229395455,US +3229391872,3229395455,US 3229395456,3229408255,RU 3229408256,3229412095,US 3229412096,3229412351,NL -3229412352,3229414911,DE +3229412352,3229412607,US +3229412608,3229414911,DE 3229414912,3229415167,US 3229415168,3229415679,NL -3229415680,3229415935,CA +3229415680,3229415935,US 3229415936,3229483007,DE -3229483008,3229499647,FI +3229483008,3229483263,US +3229483264,3229499647,FI 3229499648,3229614847,US 3229614848,3229615103,GB 3229615104,3229679103,US 3229679104,3229679359,EU -3229679360,3229679615,US -3229679616,3229695487,DE +3229679360,3229679871,US +3229679872,3229695487,DE 3229695488,3229700095,US 3229700096,3229700351,AT 3229700352,3229701887,US @@ -66610,12 +72526,15 @@ 3229814016,3229814271,AU 3229814272,3229815807,US 3229815808,3229816063,NL -3229816320,3229817087,US -3229817088,3229817599,NL +3229816064,3229817087,US +3229817088,3229817343,AU +3229817344,3229817599,NL 3229817600,3229818623,AU 3229818624,3229818879,US 3229818880,3229820927,JM -3229820928,3229830911,US +3229820928,3229821951,US +3229821952,3229822207,CA +3229822208,3229830911,US 3229830912,3229831167,NL 3229831168,3229833471,US 3229833472,3229833727,NL @@ -66627,20 +72546,23 @@ 3229835520,3229835775,CA 3229835776,3229838335,US 3229838336,3229838591,NL -3229838592,3229838847,US -3229839104,3229844479,US +3229838592,3229844479,US 3229844480,3229844735,BE 3229844736,3229844991,US +3229844992,3229845247,BL 3229845248,3229845503,US 3229845504,3229846527,CA 3229847296,3229849599,US 3229849600,3229849855,AU 3229849856,3229864703,US 3229864704,3229864959,AP -3229864960,3229874943,US +3229864960,3229870335,US +3229870592,3229870847,CA +3229870848,3229874943,US 3229874944,3229875455,AU -3229875456,3229875967,US -3229876224,3229878271,US +3229875456,3229876223,US +3229876224,3229876479,CA +3229876480,3229878527,US 3229878528,3229878783,GB 3229878784,3229879039,IT 3229879040,3229879295,NO @@ -66648,8 +72570,7 @@ 3229880064,3229880319,AU 3229880320,3229881087,US 3229881088,3229881343,CA -3229881344,3229883391,US -3229883648,3229883903,US +3229881344,3229884159,US 3229884160,3229884415,AU 3229884416,3229884927,US 3229884928,3229885183,NL @@ -66662,7 +72583,7 @@ 3229890304,3229890559,PT 3229890560,3229891583,US 3229891584,3229891839,CA -3229892096,3229900031,US +3229891840,3229900031,US 3229900032,3229900287,AU 3229900288,3229901567,US 3229901568,3229901823,GB @@ -66672,17 +72593,17 @@ 3229937408,3229937663,GB 3229937664,3229937919,US 3229937920,3229938175,CA -3229938176,3229938431,US +3229938176,3229938687,US 3229938688,3229939199,NL 3229939200,3229939455,US 3229939456,3229940735,KR 3229940736,3229940991,CH 3229940992,3229941247,AU -3229941248,3229941503,US +3229941248,3229941759,US 3229941760,3229942271,CA 3229942272,3229944319,US 3229944320,3229944575,AU -3229944576,3229945087,US +3229944576,3229945343,US 3229945344,3229945599,AU 3229945600,3229945855,NL 3229945856,3229947135,US @@ -66696,7 +72617,9 @@ 3229950976,3229951231,NL 3229951232,3229952255,US 3229952256,3229952511,AU -3229952512,3229955327,US +3229952512,3229953279,US +3229953280,3229953535,CA +3229953536,3229955327,US 3229955328,3229955583,NL 3229955584,3229956095,PT 3229956096,3229956607,US @@ -66717,23 +72640,22 @@ 3229975296,3229975551,GB 3229975552,3230004223,US 3230004224,3230004479,GB -3230004480,3230004991,US -3230005248,3230005759,US +3230004480,3230005759,US 3230005760,3230006015,MU -3230006016,3230007295,US +3230006016,3230007039,US +3230007040,3230007295,CA 3230007296,3230072831,FR 3230072832,3230074623,US 3230074624,3230074879,DE 3230074880,3230082559,IT -3230082560,3230082815,US -3230083072,3230084607,US +3230082560,3230084607,US 3230084608,3230084863,NL 3230084864,3230085119,US 3230085120,3230085375,CA -3230085376,3230085631,US +3230085376,3230085887,US 3230085888,3230086143,DE 3230086144,3230086655,GB -3230086656,3230088703,US +3230086656,3230088959,US 3230088960,3230089215,NL 3230089216,3230089727,US 3230089728,3230089983,NL @@ -66746,9 +72668,15 @@ 3230094080,3230094335,CA 3230094336,3230095615,US 3230095616,3230095871,JP -3230096384,3230100735,JP +3230096384,3230096639,JP +3230096640,3230096895,US +3230096896,3230097151,JP +3230097408,3230100735,JP +3230100736,3230100991,US 3230100992,3230101503,PR -3230101504,3230105855,US +3230101504,3230104319,US +3230104320,3230104575,CA +3230104576,3230105855,US 3230105856,3230106111,NL 3230106112,3230106879,US 3230106880,3230107135,NL @@ -66765,22 +72693,23 @@ 3230120192,3230120447,NL 3230120448,3230120703,US 3230120704,3230120959,PT -3230120960,3230125055,US -3230125312,3230125567,US +3230120960,3230125823,US 3230125824,3230126335,AU 3230126336,3230126591,US 3230126592,3230126847,AU -3230126848,3230128639,US +3230126848,3230128895,US 3230128896,3230129151,NL 3230129152,3230129663,US 3230129664,3230129919,AU +3230129920,3230130431,US 3230130432,3230130687,NL 3230130688,3230131711,US +3230131712,3230131967,CA 3230131968,3230132991,GB 3230132992,3230137599,US 3230137600,3230137855,NL 3230137856,3230138111,PL -3230138368,3230140159,US +3230138112,3230140159,US 3230140160,3230140415,MT 3230140416,3230140671,US 3230140672,3230140927,FI @@ -66794,8 +72723,7 @@ 3230145792,3230146047,GB 3230146048,3230146303,FR 3230146304,3230146559,PT -3230146560,3230147583,US -3230147840,3230148351,US +3230146560,3230148351,US 3230148352,3230148607,AU 3230148608,3230149119,NL 3230149120,3230150655,NI @@ -66804,6 +72732,7 @@ 3230151168,3230151423,US 3230151424,3230151679,NL 3230151680,3230151935,PT +3230151936,3230152191,CA 3230152192,3230152447,FR 3230152448,3230153215,BF 3230153216,3230153471,FR @@ -66811,13 +72740,13 @@ 3230153728,3230153983,US 3230153984,3230154239,NL 3230154240,3230156543,US -3230156544,3230164991,FI -3230164992,3230167295,US +3230156544,3230164735,FI +3230164736,3230167551,US 3230167552,3230168063,CA 3230168064,3230177791,US 3230177792,3230178303,GB 3230178304,3230178559,CH -3230178816,3230210047,US +3230178560,3230210047,US 3230210048,3230210303,CA 3230210304,3230211839,US 3230211840,3230212095,CN @@ -66878,9 +72807,9 @@ 3230264320,3230266111,CH 3230266112,3230267135,US 3230267136,3230267903,CA -3230267904,3230269439,US -3230269440,3230271743,GB -3230272000,3230291455,US +3230267904,3230269695,US +3230269696,3230271743,GB +3230271744,3230291455,US 3230291456,3230291711,NL 3230291712,3230295039,US 3230295040,3230295295,AU @@ -66896,12 +72825,11 @@ 3230316800,3230317311,CA 3230317312,3230317567,US 3230317568,3230317823,AU -3230318080,3230318591,US +3230317824,3230318591,US 3230318592,3230318847,NL 3230318848,3230321663,US 3230321664,3230321919,PT -3230321920,3230322175,US -3230322432,3230327807,US +3230321920,3230327807,US 3230327808,3230328063,AT 3230328064,3230328319,GB 3230328320,3230329087,CH @@ -66909,22 +72837,41 @@ 3230332928,3230333183,GB 3230333184,3230333695,US 3230333696,3230333951,AU -3230333952,3230334975,US -3230334976,3230354943,CA +3230333952,3230335231,US +3230335232,3230335743,CA +3230335744,3230335999,US +3230336000,3230336255,CA +3230336256,3230336511,US +3230336512,3230339583,CA +3230339584,3230339839,US +3230339840,3230340095,CA +3230340096,3230340351,US +3230340352,3230350847,CA +3230350848,3230351103,US +3230351104,3230354943,CA 3230354944,3230355199,FR 3230355200,3230365183,CA 3230365184,3230365439,US -3230365440,3230368767,CA -3230368768,3230370303,US +3230365440,3230367743,CA +3230367744,3230367999,US +3230368000,3230368511,CA +3230368512,3230370303,US 3230370304,3230370559,CA -3230370816,3230390015,CA -3230390016,3230390271,US -3230390272,3230400511,CA +3230370560,3230370815,US +3230370816,3230372607,CA +3230372608,3230372863,US +3230372864,3230383359,CA +3230383360,3230383615,US +3230383616,3230384127,CA +3230384128,3230384383,MF +3230384384,3230387455,CA +3230387456,3230387711,US +3230387712,3230400255,CA +3230400256,3230400767,US 3230681088,3230683135,FR -3230785536,3230797311,US -3230797312,3230797567,SG -3230797568,3230823679,US +3230785536,3230823679,US 3230823680,3230823935,NL +3230823936,3230824191,US 3230824192,3230824447,NL 3230824448,3230825215,US 3230825216,3230825471,GB @@ -66951,10 +72898,11 @@ 3230840576,3230840831,US 3230840832,3230841087,AU 3230841088,3230841343,NL +3230841344,3230841599,US 3230841600,3230841855,NL 3230841856,3230842111,US 3230842112,3230842367,AU -3230842624,3230843135,US +3230842368,3230843135,US 3230843136,3230843391,NL 3230843392,3230844927,US 3230844928,3230845183,AU @@ -66975,18 +72923,15 @@ 3230855680,3230855935,NL 3230855936,3230857983,US 3230857984,3230858751,AU -3230858752,3230859007,US -3230859264,3230865151,US +3230858752,3230865151,US 3230865152,3230865407,GB 3230865408,3230867967,US 3230867968,3230868223,NL 3230868224,3230868479,US 3230868480,3230868735,NL -3230868992,3230870015,US +3230868736,3230870015,US 3230870016,3230870271,NL -3230870272,3230873343,US -3230873344,3230873599,HK -3230873600,3230878719,US +3230870272,3230878719,US 3230878720,3230879487,PT 3230879488,3230879743,FR 3230879744,3230888447,US @@ -67011,6 +72956,7 @@ 3230915584,3230917631,US 3230917632,3230917887,NL 3230917888,3230918399,US +3230918400,3230918655,LC 3230918656,3230919423,US 3230919424,3230919679,AU 3230919680,3230922239,US @@ -67020,18 +72966,16 @@ 3230923520,3230923775,EU 3230923776,3230924031,US 3230924032,3230924287,AU -3230924288,3230924543,US -3230924800,3230933247,US +3230924288,3230933247,US 3230933248,3230948607,SE 3230948608,3230951167,US 3230951168,3230951423,NL -3230951424,3230953471,US -3230953472,3230954495,CA +3230951424,3230953215,US +3230953216,3230954495,CA 3230954496,3230967295,AU 3230967296,3230967551,RU 3230967552,3230967807,ES -3230967808,3230969087,US -3230969344,3230969599,US +3230967808,3230969599,US 3230969600,3230969855,MX 3230969856,3230970111,US 3230970112,3230972671,GB @@ -67045,23 +72989,22 @@ 3230976256,3230980095,ES 3230980096,3230980351,GB 3230980352,3230980607,CA -3230980608,3230980863,US +3230980608,3230981119,US 3230981120,3230981375,NL 3230981376,3230981631,AU 3230981632,3230981887,US 3230981888,3230983935,AU -3230983936,3230990335,US -3230990592,3230991103,US +3230983936,3230991103,US 3230991104,3230991359,PL 3230991360,3230991615,US 3230991616,3230991871,FI 3230991872,3230994175,US 3230994176,3230994431,NL -3230994432,3230994687,US -3230994944,3230995199,US +3230994432,3230995199,US 3230995200,3230995455,NL 3230995456,3230995711,AU 3230995712,3230996223,US +3230996224,3230996479,CA 3230996480,3230997247,US 3230997248,3230997503,NL 3230997504,3230997759,US @@ -67069,31 +73012,31 @@ 3230999040,3230999295,US 3230999296,3230999551,NL 3230999552,3230999807,AU -3230999808,3231000319,US -3231000576,3231000831,US +3230999808,3231000831,US 3231000832,3231001087,FR 3231001088,3231003903,US 3231003904,3231004159,CA 3231004160,3231004415,AU -3231004672,3231004927,US +3231004416,3231004927,US 3231004928,3231005183,GB +3231005184,3231005439,US 3231005440,3231005695,FR 3231005696,3231005951,GB -3231005952,3231009791,US +3231005952,3231010047,US 3231010048,3231010303,FR 3231010304,3231010815,NO 3231010816,3231011071,CA -3231011328,3231012863,US -3231013120,3231013375,US +3231011328,3231013375,US 3231013376,3231013887,CA -3231013888,3231014911,US -3231015168,3231015423,US +3231013888,3231015423,US 3231015424,3231015679,CA 3231015680,3231015935,US 3231015936,3231016191,NO 3231016192,3231016447,US 3231016448,3231016703,NO -3231016704,3231018495,US +3231016704,3231016959,US +3231016960,3231017215,CA +3231017216,3231018495,US 3231018496,3231018751,NL 3231018752,3231019007,GB 3231019008,3231020287,US @@ -67110,12 +73053,11 @@ 3231042048,3231042303,GU 3231042304,3231043839,US 3231043840,3231044095,AU -3231044352,3231048447,US +3231044096,3231048447,US 3231048448,3231048703,NL 3231048704,3231049727,US 3231049728,3231049983,AT -3231049984,3231050239,US -3231050496,3231051263,US +3231049984,3231051263,US 3231051264,3231051519,GB 3231051520,3231051775,AU 3231051776,3231057151,US @@ -67124,13 +73066,16 @@ 3231057920,3231058175,EU 3231058176,3231060991,US 3231060992,3231061247,EU -3231061248,3231070463,US -3231070720,3231075327,SE +3231061248,3231070719,US +3231070720,3231074559,SE +3231074560,3231075071,US +3231075072,3231075327,SE 3231075328,3231075583,NL +3231075584,3231075839,US 3231075840,3231077119,SE 3231077120,3231077375,PL 3231077376,3231077631,SE -3231078144,3231078655,US +3231077632,3231078655,US 3231078656,3231078911,NL 3231078912,3231079423,CA 3231079424,3231079679,NL @@ -67150,13 +73095,13 @@ 3231088384,3231088895,US 3231088896,3231091711,AU 3231091712,3231091967,NL -3231091968,3231092223,US -3231092480,3231092735,US +3231091968,3231092735,US 3231092736,3231092991,AU 3231092992,3231093247,US 3231093248,3231093503,NL 3231093504,3231101183,US 3231101184,3231103231,GB +3231103232,3231103487,CA 3231103488,3231103999,US 3231104000,3231104255,NO 3231104256,3231104767,DE @@ -67172,11 +73117,10 @@ 3231107840,3231108095,AT 3231108096,3231108351,GB 3231108352,3231108607,RU -3231108608,3231108863,US +3231108608,3231109119,US 3231109120,3231109375,GB 3231109376,3231109631,NO -3231109632,3231109887,US -3231110144,3231111679,US +3231109632,3231111679,US 3231111680,3231112191,NZ 3231112448,3231112959,US 3231112960,3231113215,NO @@ -67184,8 +73128,7 @@ 3231113984,3231115775,GB 3231115776,3231116799,AU 3231116800,3231117055,HU -3231117056,3231118335,US -3231118592,3231118847,US +3231117056,3231118847,US 3231118848,3231119103,AU 3231119104,3231119359,US 3231119360,3231119615,GB @@ -67193,7 +73136,7 @@ 3231120384,3231120639,NO 3231120640,3231120895,US 3231120896,3231121151,NO -3231121408,3231149311,US +3231121152,3231149311,US 3231149312,3231149567,CA 3231149568,3231154431,US 3231154432,3231154687,AU @@ -67227,19 +73170,23 @@ 3231203328,3231204351,US 3231204352,3231204607,FI 3231204608,3231204863,AU -3231204864,3231207935,US +3231204864,3231207167,US +3231207168,3231207423,CA +3231207424,3231207935,US 3231207936,3231208191,DE 3231208192,3231208959,US 3231208960,3231209471,AU -3231209472,3231211775,US +3231209472,3231210239,US +3231210240,3231210495,CA +3231210496,3231211775,US 3231211776,3231212031,CA 3231212032,3231212287,CH 3231212288,3231214335,US 3231214336,3231214591,CA -3231214592,3231215103,US +3231214592,3231215359,US 3231215360,3231215615,NO 3231215616,3231215871,GB -3231215872,3231217151,US +3231215872,3231217407,US 3231217408,3231217663,AU 3231217664,3231218175,US 3231218176,3231218431,GB @@ -67255,6 +73202,8 @@ 3231225600,3231225855,DE 3231225856,3231226879,US 3231226880,3231227135,GB +3231227136,3231227391,US +3231227392,3231227647,CA 3231227648,3231228927,US 3231228928,3231229183,PR 3231229184,3231229439,CA @@ -67270,7 +73219,10 @@ 3231237376,3231237631,AU 3231237632,3231241215,US 3231241216,3231241471,AU -3231241984,3231248639,US +3231241472,3231241727,CA +3231241728,3231244287,US +3231244288,3231244543,CA +3231244544,3231248639,US 3231248640,3231248895,NL 3231248896,3231249407,US 3231249408,3231249663,GB @@ -67279,13 +73231,13 @@ 3231250688,3231251711,US 3231251712,3231251967,GB 3231251968,3231252223,AT -3231252736,3231252991,US +3231252224,3231252991,US 3231252992,3231253503,NL 3231253504,3231254783,US 3231254784,3231255039,AU 3231255040,3231255551,US 3231255808,3231256063,PT -3231256320,3231257087,US +3231256064,3231257087,US 3231257088,3231257599,HU 3231257600,3231275007,US 3231275008,3231275263,BR @@ -67296,7 +73248,7 @@ 3231276800,3231281919,JP 3231281920,3231282175,US 3231282176,3231282431,HU -3231282688,3231282943,US +3231282432,3231282943,US 3231282944,3231283199,CL 3231283200,3231283455,BR 3231283456,3231284991,US @@ -67315,7 +73267,9 @@ 3231296256,3231296511,NL 3231296512,3231296767,US 3231296768,3231299327,AT -3231299328,3231300607,US +3231299328,3231300095,US +3231300096,3231300351,CA +3231300352,3231300607,US 3231300608,3231301119,NL 3231301120,3231302143,US 3231302144,3231302399,NL @@ -67329,7 +73283,9 @@ 3231308800,3231309055,CA 3231309824,3231316735,US 3231316736,3231316991,AU -3231316992,3231322111,US +3231316992,3231321343,US +3231321344,3231321599,CA +3231321600,3231322111,US 3231322112,3231324671,SG 3231324672,3231325183,US 3231325184,3231326207,CA @@ -67338,8 +73294,11 @@ 3231358976,3231369215,US 3231369216,3231369471,TW 3231369472,3231383551,US -3231383552,3231385599,NO -3231385600,3231423999,US +3231383552,3231383807,CA +3231383808,3231385343,NO +3231385344,3231401215,US +3231401216,3231401471,CA +3231401472,3231423999,US 3231424000,3231424511,PR 3231424512,3231477759,US 3231477760,3231478015,CA @@ -67348,18 +73307,18 @@ 3231483136,3231484927,US 3231484928,3231487999,JP 3231488512,3231488767,JP +3231489280,3231489535,US 3231489536,3231489791,JP 3231489792,3231490047,AU 3231490048,3231490559,US 3231490560,3231490815,GB -3231490816,3231491071,US +3231490816,3231491327,US 3231491328,3231491583,AU 3231491584,3231491839,US 3231491840,3231492095,GB 3231492096,3231493631,US 3231493632,3231493887,CH -3231493888,3231499263,US -3231499520,3231500031,US +3231493888,3231500031,US 3231500032,3231500287,BM 3231500288,3231502079,US 3231502080,3231502591,AU @@ -67369,24 +73328,32 @@ 3231503616,3231503871,IT 3231503872,3231504383,US 3231504640,3231504895,NL -3231505152,3231505407,US +3231504896,3231505407,US 3231505408,3231505663,AU 3231505664,3231506687,US 3231506688,3231506943,AU 3231506944,3231507199,US 3231507200,3231507455,BE -3231507456,3231510015,US +3231507456,3231510271,US 3231510272,3231510527,NL 3231510528,3231512575,US 3231512576,3231512831,LU 3231512832,3231513087,AU -3231513088,3231513343,US -3231513600,3231514623,US -3231514624,3231515647,NO +3231513088,3231514879,US +3231514880,3231515647,NO 3231515648,3231516671,US 3231516672,3231519231,SE -3231519232,3231526911,US -3231526912,3231528959,A2 +3231519232,3231526935,US +3231526936,3231526943,CA +3231526944,3231527119,US +3231527120,3231527127,CA +3231527128,3231527679,US +3231527680,3231527967,CA +3231527968,3231528191,US +3231528192,3231528447,IN +3231528448,3231528471,US +3231528472,3231528487,CA +3231528488,3231528959,US 3231528960,3231528975,CA 3231528976,3231528983,US 3231528984,3231528991,CA @@ -67437,17 +73404,15 @@ 3231588864,3231589119,GB 3231589120,3231591679,US 3231591680,3231591935,AU -3231591936,3231594239,US -3231594240,3231594495,GB -3231594496,3231596031,US +3231591936,3231596031,US 3231596032,3231596543,PR 3231596544,3231634943,US 3231634944,3231635455,CA 3231635456,3231641855,US 3231641856,3231642111,SG 3231642112,3231649791,US -3231649792,3231653887,SG -3231653888,3231663615,US +3231649792,3231653631,SG +3231653632,3231663615,US 3231663616,3231663871,NL 3231663872,3231664127,CA 3231664128,3231664383,US @@ -67458,7 +73423,7 @@ 3231667200,3231667711,NL 3231667712,3231668735,US 3231668736,3231668991,BE -3231669248,3231669503,US +3231668992,3231669759,US 3231669760,3231670015,CA 3231670016,3231670271,NL 3231670272,3231671039,US @@ -67472,8 +73437,9 @@ 3231674368,3231675391,US 3231675392,3231675903,BR 3231675904,3231676159,NL -3231676416,3231677439,NL -3231677440,3231694847,US +3231676160,3231676671,US +3231676672,3231677183,NL +3231677184,3231694847,US 3231694848,3231711231,CA 3231711232,3231713023,US 3231713024,3231713279,CA @@ -67488,7 +73454,7 @@ 3231716608,3231716863,TR 3231716864,3231717119,LU 3231717120,3231717375,NO -3231717632,3231718143,US +3231717376,3231718143,US 3231718144,3231718399,IT 3231718400,3231718655,US 3231718656,3231718911,AU @@ -67498,21 +73464,22 @@ 3231720704,3231720959,NL 3231720960,3231722751,US 3231722752,3231723007,BR -3231723008,3231723519,US -3231723776,3231724031,US +3231723008,3231724031,US 3231724032,3231724287,BR 3231724288,3231727871,US 3231727872,3231728127,NL +3231728128,3231728383,US 3231728384,3231728639,NL 3231728640,3231729407,US 3231729408,3231729663,AU 3231729664,3231735551,US 3231735552,3231736063,CH -3231736064,3231738367,US +3231736064,3231737343,US +3231737344,3231737599,CA +3231737600,3231738367,US 3231738368,3231738623,NL 3231738624,3231739135,US -3231739136,3231739391,GB -3231739392,3231739647,NL +3231739136,3231739647,NL 3231739648,3231739903,BR 3231739904,3231742719,US 3231742720,3231742975,NL @@ -67555,8 +73522,11 @@ 3231770880,3231771135,RU 3231771136,3231773951,US 3231773952,3231775231,PT -3231775488,3231775999,NL +3231775232,3231775487,KY +3231775488,3231775743,PT +3231775744,3231775999,NL 3231776000,3231776511,US +3231776512,3231776767,CA 3231776768,3231793151,US 3231793152,3231793663,NL 3231793664,3231800319,US @@ -67619,9 +73589,11 @@ 3231903744,3231905791,RU 3231905792,3231906047,PL 3231906048,3231907839,RU -3231907840,3231912959,US +3231907840,3231911423,US +3231911424,3231911935,AP +3231911936,3231912959,US 3231912960,3231913215,AP -3231913472,3231916031,US +3231913216,3231916031,US 3231916032,3231948799,FI 3231948800,3231973375,US 3231973376,3232038911,AT @@ -67632,18 +73604,25 @@ 3232047360,3232048639,GB 3232048640,3232049151,SE 3232049152,3232049407,GB -3232049408,3232051967,SE +3232049408,3232051199,SE +3232051200,3232051455,AT +3232051456,3232051967,SE 3232051968,3232052991,GB 3232052992,3232053247,US 3232053248,3232056063,SE 3232056064,3232056319,IT 3232056320,3232060415,SE 3232060416,3232060671,IE -3232060672,3232065791,SE +3232060672,3232060927,IT +3232060928,3232065791,SE 3232065792,3232066303,GB 3232066304,3232066559,SE 3232066560,3232066815,NO -3232066816,3232070399,SE +3232066816,3232067839,SE +3232067840,3232068095,PL +3232068096,3232069887,SE +3232069888,3232070143,CH +3232070144,3232070399,SE 3232070400,3232070655,ES 3232070656,3232079871,SE 3232079872,3232080895,GB @@ -67657,10 +73636,9 @@ 3232089088,3232089343,ES 3232089344,3232090367,SE 3232090368,3232090623,IT -3232090624,3232093439,SE -3232093440,3232093675,GB +3232090624,3232093675,SE 3232093676,3232093676,EU -3232093677,3232093695,GB +3232093677,3232093695,SE 3232093696,3232093951,AP 3232093952,3232095231,SE 3232095232,3232096255,GB @@ -67669,11 +73647,9 @@ 3232098304,3232100095,SE 3232100096,3232100351,IE 3232100352,3232101119,GB -3232101120,3232102143,SE -3232102144,3232102144,DK +3232101120,3232102144,SE 3232102145,3232102145,EU -3232102146,3232102399,DK -3232102400,3232104447,SE +3232102146,3232104447,SE 3232104448,3232106495,DE 3232107520,3232108543,RU 3232108544,3232112639,DE @@ -67704,28 +73680,33 @@ 3232309248,3232311807,SG 3232311808,3232407039,US 3232407040,3232407551,SG -3232407552,3232432127,US -3232432128,3232433663,EU -3232433920,3232440319,US +3232407552,3232432383,US +3232432384,3232433407,EU +3232433408,3232433663,IT +3232433664,3232440319,US 3232440320,3232448511,CA 3232448512,3232461311,US 3232461312,3232461823,CA 3232461824,3232462847,US 3232462848,3232464895,BB 3232464896,3232483327,GB -3232483328,3232555007,US -3232555264,3232555775,US +3232483328,3232555775,US 3232555776,3232557055,JP 3232557056,3232557311,AU -3232557568,3232560127,JP +3232557312,3232557567,US +3232557568,3232559103,JP +3232559104,3232559359,US +3232559360,3232560127,JP 3232560896,3232561663,US 3232561664,3232561919,CA 3232561920,3232562431,US 3232562432,3232562687,NL 3232562688,3232562943,CA -3232563200,3232564479,GB -3232564736,3232567295,US +3232562944,3232563455,US +3232563456,3232564479,GB +3232564480,3232567295,US 3232567296,3232569599,NZ +3232569600,3232570367,US 3232570368,3232571391,CA 3232571392,3232595967,US 3232595968,3232598015,GB @@ -67733,7 +73714,7 @@ 3232629760,3232630783,CA 3232630784,3232645119,US 3232645120,3232646399,AT -3232646656,3232661503,US +3232646400,3232661503,US 3232661504,3232694271,JP 3232694272,3232695807,US 3232695808,3232696319,CA @@ -67750,15 +73731,21 @@ 3232727040,3232759807,US 3232759808,3232765951,SE 3232765952,3232766207,NO -3232766208,3232774911,SE +3232766208,3232766463,SE +3232766464,3232766719,NO +3232766720,3232767231,DE +3232767232,3232774911,SE 3232774912,3232775167,IE -3232775168,3232794879,SE +3232775168,3232792319,SE +3232792320,3232792575,DK +3232792576,3232794879,SE 3232794880,3232795135,DE 3232795136,3232802559,SE 3232802560,3232802815,DK 3232802816,3232803071,SE 3232803072,3232803327,IE -3232803328,3232804607,SE +3232803328,3232804351,SE +3232804352,3232804607,DK 3232804608,3232804863,IT 3232804864,3232812031,SE 3232812032,3232812543,GB @@ -67771,30 +73758,26 @@ 3233288192,3233292287,CA 3233292288,3233431551,US 3233431552,3233447935,CA -3233447936,3233449095,US -3233449096,3233449103,GB -3233449104,3233449207,US -3233449208,3233449215,GB -3233449216,3233449359,US -3233449360,3233449367,GB -3233449368,3233450199,US -3233450200,3233450207,GB -3233450208,3233451519,US +3233447936,3233451519,US 3233451520,3233451775,GB 3233451776,3233453567,US -3233453568,3233453823,IT -3233453824,3233456127,US -3233456128,3233456383,LV -3233456384,3233456639,UA +3233453568,3233453631,IT +3233453632,3233456191,US +3233456192,3233456255,LV +3233456256,3233456383,US +3233456384,3233456447,UA +3233456448,3233456639,US 3233456640,3233457151,CA 3233457152,3233458687,US 3233458688,3233458943,HU -3233458944,3233459199,BG -3233459200,3233484799,US +3233458944,3233459007,BG +3233459008,3233484799,US 3233484800,3233487359,ES 3233487360,3233487871,US 3233487872,3233488895,CA -3233488896,3233548799,US +3233488896,3233546751,US +3233546752,3233547007,CA +3233547008,3233548799,US 3233548800,3233549055,NL 3233549056,3233549311,BR 3233549312,3233557247,US @@ -67809,10 +73792,13 @@ 3233564416,3233564671,AU 3233564672,3233564927,US 3233564928,3233566719,JP -3233567744,3233568767,JP -3233568768,3233569791,AU +3233567744,3233567999,US +3233568000,3233568767,JP +3233568768,3233569023,CA +3233569024,3233569535,AU +3233569536,3233569791,US 3233569792,3233570047,JP -3233570048,3233570559,US +3233570048,3233570815,US 3233570816,3233571071,GB 3233571072,3233572095,US 3233572096,3233572351,AU @@ -67824,9 +73810,9 @@ 3233575680,3233575935,AU 3233575936,3233576191,RU 3233576192,3233576447,GB -3233576448,3233576959,US -3233576960,3233577983,NL -3233577984,3233578239,US +3233576448,3233577215,US +3233577216,3233577727,NL +3233577728,3233578239,US 3233578240,3233578495,NL 3233578496,3233578751,US 3233578752,3233579007,NL @@ -67840,16 +73826,19 @@ 3233583360,3233583615,NL 3233583616,3233584895,US 3233584896,3233585151,AU -3233585152,3233586175,US +3233585152,3233586431,US 3233586432,3233586943,GB 3233586944,3233588223,US 3233588224,3233589247,GA 3233589248,3233589759,CA 3233589760,3233590015,CN +3233590016,3233590271,TW +3233590272,3233590527,TH 3233590528,3233590783,PR 3233590784,3233591295,AU 3233591296,3233593599,US -3233593600,3233594111,AU +3233593600,3233593855,NZ +3233593856,3233594111,AU 3233594112,3233594367,RU 3233594368,3233594623,US 3233594624,3233594879,RU @@ -67860,21 +73849,21 @@ 3233607168,3233607935,US 3233607936,3233608191,AU 3233608192,3233609727,HU -3233609728,3233611775,US +3233609728,3233612031,US 3233612032,3233612287,NL -3233612544,3233613823,US +3233612288,3233613823,US 3233613824,3233614847,GB -3233615104,3233615359,US +3233614848,3233615359,US 3233615360,3233615615,NL -3233615616,3233617151,US +3233615616,3233617407,US 3233617408,3233617663,CA 3233617664,3233617919,NL 3233617920,3233618175,AU -3233618432,3233618943,US -3233619456,3233620479,US +3233618176,3233620479,US 3233620480,3233620735,AU 3233620736,3233620991,US 3233620992,3233622015,CA +3233622016,3233622271,US 3233622272,3233622527,NL 3233622528,3233624831,US 3233624832,3233625343,NL @@ -67891,8 +73880,7 @@ 3233630720,3233630975,US 3233630976,3233631231,MU 3233631232,3233631487,NL -3233631488,3233631743,US -3233632000,3233635839,US +3233631488,3233635839,US 3233635840,3233636095,AU 3233636096,3233642239,US 3233642240,3233642495,GB @@ -67904,6 +73892,7 @@ 3233649664,3233649919,AU 3233649920,3233650431,US 3233650432,3233650687,NL +3233650688,3233651199,US 3233651200,3233651455,NL 3233651456,3233651967,US 3233651968,3233652223,NL @@ -67912,18 +73901,20 @@ 3233652736,3233652991,NL 3233652992,3233654271,US 3233654272,3233655551,GB -3233655552,3233662975,US +3233655552,3233663487,US 3233663488,3233663999,NL -3233664000,3233665023,US +3233664000,3233664255,CA +3233664256,3233665023,US 3233665024,3233666047,AU 3233666048,3233668863,US 3233668864,3233669119,AU 3233669120,3233670399,US 3233670400,3233670655,AU -3233671168,3233675263,US -3233675520,3233676031,US +3233671168,3233676031,US 3233676032,3233676287,NL -3233676288,3233684991,US +3233676288,3233677311,US +3233677312,3233677567,CA +3233677568,3233684991,US 3233684992,3233685247,MX 3233685248,3233685503,BR 3233685504,3233688575,US @@ -67941,7 +73932,7 @@ 3233694976,3233695231,FR 3233695232,3233696511,US 3233696512,3233696767,CA -3233696768,3233701375,US +3233696768,3233701631,US 3233701632,3233701887,NL 3233701888,3233704959,US 3233704960,3233705215,NZ @@ -67953,13 +73944,12 @@ 3233722112,3233723391,US 3233723392,3233723903,AU 3233723904,3233724415,NL -3233724416,3233725439,US +3233724416,3233725951,US 3233725952,3233726975,NO 3233726976,3233728767,US 3233728768,3233729279,GB 3233729280,3233729535,US -3233729536,3233729791,SG -3233729792,3233730047,AU +3233729536,3233730047,AU 3233730048,3233730559,US 3233730560,3233732607,AU 3233732608,3233736959,US @@ -68026,33 +74016,33 @@ 3233808384,3233873919,TW 3233873920,3233874175,US 3233874176,3233874687,AU -3233874688,3233903743,US +3233874688,3233903615,US +3233903616,3233903743,GB 3233903744,3233903807,EU -3233903808,3233907711,US +3233903808,3233903871,GB +3233903872,3233907711,US 3233907712,3233907967,AP 3233907968,3233914879,US 3233914880,3233915135,AP 3233915136,3233915903,US 3233915904,3233916159,AP -3233916160,3233926294,US -3233926295,3233926295,MX -3233926296,3233936639,US +3233916160,3233936639,US 3233936640,3233936895,EU 3233936896,3233939455,US 3233939456,3234004991,FI +3234004992,3234005247,US 3234005248,3234005503,GB 3234005504,3234005759,AU -3234006528,3234007039,US +3234005760,3234006015,CA +3234006016,3234007039,US 3234007040,3234007295,NL 3234007296,3234007551,US 3234007552,3234007807,AU 3234007808,3234008063,US 3234008064,3234008831,NZ -3234008832,3234013183,US -3234013440,3234013695,US +3234008832,3234013695,US 3234013696,3234013951,AU -3234013952,3234014207,US -3234014464,3234014975,US +3234013952,3234014975,US 3234014976,3234015487,AU 3234015488,3234015743,US 3234015744,3234015999,IE @@ -68067,7 +74057,7 @@ 3234031360,3234031871,US 3234031872,3234032127,GB 3234032128,3234032383,NL -3234032384,3234032895,US +3234032384,3234033151,US 3234033152,3234033407,NL 3234033408,3234033663,US 3234033664,3234033919,AU @@ -68089,15 +74079,21 @@ 3234054912,3234055167,NL 3234055168,3234055423,US 3234055424,3234055679,AU -3234055680,3234061055,US +3234055680,3234056959,US +3234056960,3234057215,CA +3234057216,3234061055,US 3234061056,3234061311,AU 3234061312,3234064639,US 3234064640,3234064895,AU 3234064896,3234065407,US 3234065408,3234065663,NL 3234065664,3234065919,BR -3234065920,3234070527,US -3234070528,3234110463,FR +3234065920,3234069247,US +3234069248,3234069503,CA +3234069504,3234070271,US +3234070272,3234070527,CA +3234070528,3234070783,US +3234070784,3234110463,FR 3234110464,3234128455,US 3234128456,3234128463,GB 3234128464,3234130695,US @@ -68105,18 +74101,30 @@ 3234130704,3234131183,US 3234131184,3234131191,GB 3234131192,3234136063,US -3234136064,3234164991,CA +3234136064,3234150911,CA +3234150912,3234151423,US +3234151424,3234158847,CA +3234158848,3234159103,US +3234159104,3234159615,CA +3234159616,3234160127,US +3234160128,3234164991,CA 3234164992,3234165247,US -3234165248,3234172927,CA +3234165248,3234167295,CA +3234167296,3234167807,US +3234167808,3234172927,CA 3234172928,3234173951,US 3234173952,3234175999,CA 3234176000,3234177279,US 3234177280,3234187007,CA 3234187008,3234187519,US -3234187520,3234192383,CA +3234187520,3234189055,CA +3234189056,3234189311,US +3234189312,3234192383,CA 3234192384,3234193663,US -3234193664,3234201599,CA -3234201600,3234203647,US +3234193664,3234198783,CA +3234198784,3234199039,US +3234199040,3234201343,CA +3234201344,3234203647,US 3234203648,3234205183,BR 3234205184,3234205439,AR 3234205440,3234205695,BR @@ -68127,20 +74135,16 @@ 3234227712,3234228223,US 3234228224,3234228351,CA 3234228352,3234230015,US -3234230016,3234230271,ES -3234230272,3234232319,US +3234230016,3234230207,ES +3234230208,3234232319,US 3234232320,3234232575,EG 3234232576,3234238975,US -3234238976,3234239231,MY -3234239232,3234239327,US -3234239328,3234239329,MY -3234239330,3234240255,US -3234240256,3234240383,EU -3234240384,3234240387,IE -3234240388,3234240511,EU -3234240512,3234240607,US -3234240608,3234240611,IL -3234240612,3234269695,US +3234238976,3234239487,MY +3234239488,3234240255,US +3234240256,3234240511,EU +3234240512,3234267135,US +3234267136,3234267391,CA +3234267392,3234270207,US 3234270208,3234271231,CA 3234271232,3234275327,PT 3234275328,3234279423,AU @@ -68156,9 +74160,13 @@ 3234340096,3234340351,IN 3234340352,3234349055,US 3234349056,3234353151,NZ -3234353152,3234549759,US +3234353152,3234529279,US +3234529280,3234529535,PR +3234529536,3234538751,US +3234538752,3234539007,TC +3234539520,3234549759,US 3234549760,3234550015,RU -3234553856,3234554367,US +3234553856,3234554623,US 3234554624,3234554879,AU 3234554880,3234556415,US 3234556416,3234556927,CA @@ -68185,58 +74193,62 @@ 3234583808,3234584063,AU 3234584064,3234584575,US 3234584576,3234584831,AU -3234584832,3234585343,US -3234585600,3234587391,US +3234584832,3234587391,US 3234587392,3234587647,NL 3234587648,3234588671,US 3234588672,3234588927,AU 3234588928,3234589439,US 3234589440,3234589695,AU -3234589696,3234592511,US +3234589696,3234590463,US +3234590464,3234590719,CA +3234590720,3234592511,US 3234592512,3234592767,AU -3234592768,3234725887,US +3234592768,3234726143,US 3234726144,3234726399,CA 3234726400,3234726911,US 3234726912,3234727935,CA 3234727936,3234733055,US 3234733056,3234733311,CA -3234733312,3234744319,US -3234744832,3234745599,US +3234733312,3234739711,US +3234739712,3234740223,CA +3234740224,3234745599,US 3234745600,3234746879,GB 3234746880,3234747903,US 3234747904,3234748159,NL -3234748160,3234749439,US -3234749440,3234750463,CA -3234750464,3234751999,US +3234748160,3234749695,US +3234749696,3234750207,CA +3234750208,3234751999,US 3234752000,3234752255,AU 3234752256,3234753535,US 3234753536,3234753791,AU -3234753792,3234754047,US -3234754560,3234755839,US +3234753792,3234755839,US 3234755840,3234756095,AU 3234756096,3234762751,US 3234762752,3234764799,CA 3234764800,3234766335,NZ 3234766336,3234772223,US 3234772224,3234772479,CA -3234772480,3234772735,US -3234772992,3234781439,US +3234772480,3234781439,US 3234781440,3234781951,CA 3234781952,3234782719,US 3234782720,3234783999,IL 3234784000,3234794495,US +3234794496,3234794751,CA 3234794752,3234795007,US 3234795008,3234795263,NL 3234795264,3234799359,US 3234799360,3234799615,NL 3234799616,3234799871,US 3234799872,3234800127,AU +3234800128,3234800639,US 3234800640,3234800895,AU 3234800896,3234801663,US 3234801664,3234802431,EC 3234802432,3234803711,US 3234803712,3234803967,PR -3234804224,3234807807,US +3234803968,3234806783,US +3234806784,3234807295,CA +3234807296,3234807807,US 3234807808,3234808063,AU 3234808064,3234809087,EC 3234809088,3234810879,US @@ -68247,8 +74259,7 @@ 3234816000,3234816767,AU 3234816768,3234820351,US 3234820352,3234820607,AU -3234820608,3234820863,US -3234821120,3234821887,US +3234820608,3234821887,US 3234821888,3234822655,AU 3234822656,3234826751,US 3234826752,3234827007,CA @@ -68280,23 +74291,27 @@ 3234853888,3234854143,EC 3234854144,3234854911,US 3234854912,3234855167,AU -3234855168,3234855935,US -3234856192,3234856447,US +3234855168,3234856447,US 3234856448,3234856703,AU -3234856960,3234861055,CA -3234861056,3234988031,US -3234988032,3234991103,CA -3234991104,3235004415,US +3234856704,3234857215,US +3234857216,3234861055,CA +3234861056,3234988287,US +3234988288,3234990847,CA +3234990848,3235004415,US 3235004416,3235021823,CA 3235021824,3235026943,US 3235026944,3235027967,CA -3235027968,3235045375,US +3235027968,3235044375,US +3235044376,3235044383,GB +3235044384,3235045375,US 3235045376,3235045887,CA -3235045888,3235085311,US +3235045888,3235065343,US +3235065344,3235065855,CA +3235065856,3235085311,US 3235085312,3235086335,CA 3235086336,3235184639,US 3235184640,3235184895,CA -3235184896,3235275007,US +3235184896,3235275775,US 3235275776,3235276799,CA 3235276800,3235278847,US 3235278848,3235282943,BB @@ -68305,20 +74320,28 @@ 3235389440,3235389951,VE 3235389952,3235512319,US 3235512320,3235577855,JP -3235577856,3235643391,CA -3235643392,3235774463,US -3235774464,3235776767,CA -3235777536,3235807231,US +3235577856,3235643135,CA +3235643136,3235745791,US +3235745792,3235745792,DE +3235745793,3235747839,US +3235747840,3235748095,GB +3235748096,3235748351,US +3235748352,3235748607,GB +3235748608,3235774719,US +3235774720,3235776767,CA +3235776768,3235800575,US +3235800576,3235801087,CA +3235801088,3235807231,US 3235807232,3235839999,CA -3235840000,3235842303,US +3235840000,3235843071,US 3235843072,3235844095,CA 3235844096,3235856383,US 3235856384,3235872767,BR 3235872768,3235876607,US 3235876608,3235876863,AP -3235876864,3235880447,US -3235880448,3235880703,GB -3235880704,3235906303,US +3235876864,3235877375,US +3235877376,3235877631,AU +3235877632,3235906303,US 3235906304,3235906559,CA 3235906560,3235908863,US 3235908864,3235909119,CA @@ -68382,11 +74405,14 @@ 3235968512,3235968767,CA 3235968768,3235970559,US 3235970560,3235970815,CA -3235970816,3236044799,US +3235970816,3235971071,US +3235971072,3235971327,CA +3235971328,3236044799,US 3236044800,3236052991,CA 3236052992,3236069375,US 3236069376,3236102143,CA -3236102144,3236106239,PH +3236102144,3236102399,US +3236102400,3236106239,PH 3236106240,3236140031,US 3236140032,3236142079,CA 3236142080,3236142335,US @@ -68395,13 +74421,15 @@ 3236142848,3236143005,CA 3236143006,3236143006,US 3236143007,3236143103,CA -3236143104,3236167679,US -3236167680,3236175871,CA +3236143104,3236163519,US +3236163520,3236163583,IE +3236163584,3236167935,US +3236167936,3236175871,CA 3236175872,3236200447,US 3236200448,3236233215,MY 3236233216,3236237567,US 3236237568,3236237936,EU -3236237937,3236238591,US +3236237937,3236239359,US 3236239360,3236241407,CA 3236241408,3236291071,US 3236291072,3236291327,GB @@ -68411,21 +74439,24 @@ 3236312320,3236312575,GH 3236312576,3236312831,GR 3236312832,3236313087,QA -3236313088,3236368127,US +3236313088,3236365567,US +3236365568,3236365823,CA +3236365824,3236368127,US 3236368128,3236368383,AU 3236368384,3236372991,US 3236372992,3236373247,AU -3236373504,3236379391,US +3236373248,3236373503,US +3236373504,3236373759,BS +3236373760,3236379391,US 3236379392,3236379647,AU -3236379648,3236380927,US +3236379648,3236381183,US 3236381184,3236381439,CA 3236381440,3236381695,NL 3236381696,3236383999,US 3236384000,3236384255,AU 3236384256,3236385279,US 3236385280,3236385535,NL -3236385536,3236385791,US -3236386304,3236387071,US +3236385536,3236387071,US 3236387072,3236387327,CA 3236387328,3236387839,US 3236387840,3236389375,PR @@ -68437,7 +74468,7 @@ 3236395008,3236395519,BR 3236395520,3236396799,US 3236396800,3236397055,AU -3236397056,3236398591,US +3236397056,3236398847,US 3236398848,3236399359,AU 3236399616,3236400127,US 3236400128,3236400383,CL @@ -68451,14 +74482,15 @@ 3236409088,3236409599,BR 3236409600,3236411135,US 3236411136,3236411391,AU -3236411392,3236413695,US +3236411392,3236412415,US +3236412416,3236412671,CA +3236412672,3236413695,US 3236413696,3236413951,AU 3236413952,3236416255,US 3236416256,3236416511,AU 3236416512,3236418303,US 3236418304,3236418815,AU -3236418816,3236419071,US -3236419328,3236419583,US +3236418816,3236419583,US 3236419584,3236419839,AU 3236419840,3236420095,US 3236420096,3236420351,AU @@ -68467,16 +74499,18 @@ 3236425216,3236427519,US 3236427520,3236427775,CA 3236427776,3236428031,AU -3236428800,3236429311,US +3236428032,3236429311,US 3236429312,3236429567,MU -3236429824,3236438015,US +3236429568,3236438015,US 3236446208,3236447487,US 3236447488,3236447743,AP 3236447744,3236450047,US 3236450048,3236450303,EU 3236450304,3236462591,US 3236462592,3236470783,AU -3236470784,3236566783,US +3236470784,3236560895,US +3236560896,3236561151,CA +3236561152,3236566783,US 3236566784,3236567039,CA 3236567040,3236575743,US 3236575744,3236575999,AU @@ -68487,8 +74521,9 @@ 3236604928,3236610047,US 3236610560,3236611071,US 3236611072,3236612095,CA -3236612096,3236617471,US -3236617728,3236617983,US +3236612096,3236613119,US +3236613120,3236613375,CA +3236613376,3236617983,US 3236617984,3236619775,CA 3236619776,3236620031,US 3236620032,3236620287,AU @@ -68496,11 +74531,11 @@ 3236623616,3236623871,AU 3236623872,3236625919,US 3236625920,3236626175,CA -3236626432,3236638719,US +3236626176,3236638719,US 3236638720,3236642815,BB 3236642816,3236659199,US 3236659200,3236691967,CA -3236691968,3236694271,US +3236691968,3236695039,US 3236695040,3236696063,CA 3236696064,3236757503,US 3236757504,3236765695,CA @@ -68530,9 +74565,9 @@ 3236787968,3236788223,JP 3236788224,3236788479,US 3236788480,3236789503,GB -3236789504,3236823039,US -3236823040,3236826111,CH -3236826112,3236827135,CA +3236789504,3236823295,US +3236823296,3236825855,CH +3236825856,3236827135,CA 3236827136,3236828415,US 3236828416,3236828671,A1 3236828672,3236958207,US @@ -68541,21 +74576,23 @@ 3237038080,3237038335,CA 3237038336,3237043967,US 3237043968,3237044223,CH -3237044224,3237046015,US -3237046016,3237046271,RO -3237046272,3237047039,US +3237044224,3237047039,US 3237047040,3237047295,FR 3237047296,3237050111,US 3237050112,3237050367,GB 3237050368,3237051903,US 3237051904,3237052159,TR 3237052160,3237052287,CA -3237052288,3237154815,US +3237052288,3237125295,US +3237125296,3237125311,CR +3237125312,3237154815,US 3237154816,3237155839,ES 3237155840,3237156863,AU 3237156864,3237182463,US 3237182464,3237183487,NL -3237183488,3237216255,US +3237183488,3237205503,US +3237205504,3237206015,CA +3237206016,3237216255,US 3237216256,3237281791,JP 3237281792,3237284607,US 3237284608,3237284863,AU @@ -68586,19 +74623,19 @@ 3237320704,3237320959,UA 3237320960,3237321471,US 3237321472,3237321727,AU -3237321728,3237321983,US -3237322752,3237325055,US +3237321728,3237322751,US +3237322752,3237323263,CA +3237323264,3237325055,US 3237325056,3237325311,NL 3237325312,3237325823,US 3237325824,3237326079,CA -3237326080,3237328127,US -3237328384,3237328639,US +3237326080,3237328639,US 3237328640,3237328895,CA 3237328896,3237329151,US 3237329152,3237329407,NZ 3237329664,3237330943,US 3237330944,3237331199,AU -3237331456,3237331711,US +3237331200,3237331711,US 3237331968,3237332223,AU 3237332224,3237335039,US 3237335040,3237335295,AU @@ -68615,7 +74652,9 @@ 3237346304,3237366015,US 3237366016,3237366271,AU 3237366272,3237412863,US -3237412864,3237415935,GB +3237412864,3237413119,CA +3237413120,3237415679,GB +3237415680,3237415935,US 3237415936,3237416959,CA 3237416960,3237478399,US 3237478400,3237511167,LK @@ -68635,19 +74674,19 @@ 3237576704,3237609471,CA 3237609472,3237613567,US 3237613568,3237614591,CA -3237615104,3237615615,US +3237614592,3237615615,US 3237615616,3237616895,CA -3237617152,3237622015,US +3237616896,3237622015,US 3237622016,3237622271,AP -3237622272,3237634309,US -3237634310,3237634310,GB -3237634311,3237634601,US +3237622272,3237634601,US 3237634602,3237634603,EU 3237634604,3237647103,US 3237647104,3237647359,AU -3237647360,3237648639,US -3237648640,3237648895,AU -3237648896,3237681663,US +3237647360,3237655039,US +3237655040,3237655551,IN +3237655552,3237675007,US +3237675008,3237675263,CA +3237675264,3237681663,US 3237681664,3237682943,CA 3237682944,3237684991,US 3237684992,3237685247,CL @@ -68667,6 +74706,8 @@ 3237724928,3237725183,AU 3237725184,3237725439,CA 3237725440,3237725695,US +3237725696,3237726207,CA +3237726208,3237726463,US 3237726464,3237726719,AU 3237726720,3237726975,GH 3237726976,3237727231,US @@ -68680,12 +74721,14 @@ 3237781504,3237785599,CA 3237785600,3237797887,US 3237797888,3237801983,CA -3237801984,3237857535,US +3237801984,3237858303,US 3237858304,3237863423,CA 3237863424,3237867519,US 3237867520,3237867775,HK 3237867776,3237868031,GB -3237868032,3237869311,US +3237868032,3237868159,US +3237868160,3237868287,AU +3237868288,3237869311,US 3237869312,3237869439,KR 3237869440,3237869567,JP 3237869568,3237869823,AU @@ -68696,7 +74739,7 @@ 3237870592,3237870847,DE 3237870848,3237870975,KR 3237870976,3237871103,JP -3237871104,3237871231,PH +3237871104,3237871231,TH 3237871232,3237871359,TW 3237871360,3237871487,SG 3237871488,3237871615,MY @@ -68721,7 +74764,7 @@ 3237961472,3237961727,HT 3237961728,3238002687,US 3238002688,3238008831,NL -3238008832,3238010879,GB +3238008832,3238010879,RO 3238010880,3238017023,CH 3238017024,3238018303,DK 3238018304,3238018559,UA @@ -68732,7 +74775,8 @@ 3238037504,3238039039,LV 3238039040,3238039551,UA 3238039552,3238039807,PL -3238039808,3238042623,RU +3238039808,3238040063,RU +3238040576,3238042623,RU 3238042624,3238042879,IR 3238042880,3238043135,IT 3238043136,3238043647,GB @@ -68809,36 +74853,33 @@ 3238541568,3238541823,PL 3238541824,3238542591,CH 3238542592,3238542847,PL -3238542848,3238543103,CH 3238543360,3238545407,CH 3238545920,3238546431,RU 3238546432,3238546943,CH 3238546944,3238547455,UA -3238548480,3238548991,CH 3238548992,3238549503,CZ -3238549504,3238559231,CH +3238549504,3238557695,CH 3238559232,3238559487,SE -3238559744,3238562559,CH +3238559744,3238562303,CH 3238562560,3238562815,IR 3238562816,3238573567,CH 3238573568,3238574079,PL -3238574080,3238574591,CH 3238575104,3238575615,DE 3238575616,3238578431,CH 3238578432,3238578687,UA -3238578688,3238578943,CH 3238578944,3238579199,RU 3238579200,3238579455,CH -3238580224,3238589951,CH +3238580224,3238588415,CH +3238589696,3238589951,CH 3238589952,3238590207,LT -3238590208,3238590719,CH +3238590464,3238590719,CH 3238590976,3238591231,SA 3238591232,3238592511,CH 3238592512,3238594559,GB 3238594560,3238595583,BE 3238595584,3238595839,SI 3238595840,3238596095,EU -3238596096,3238596607,GB +3238596096,3238596351,GB 3238596608,3238596863,BG 3238596864,3238597119,RU 3238597120,3238597375,DE @@ -69001,7 +75042,6 @@ 3239120896,3239121663,DE 3239121664,3239121919,FR 3239121920,3239123967,DE -3239124992,3239127039,DE 3239127296,3239127551,PL 3239127552,3239127807,IL 3239127808,3239128063,RU @@ -69042,7 +75082,6 @@ 3239161344,3239161599,PL 3239161600,3239161855,HU 3239162368,3239162623,DE -3239162624,3239162879,BE 3239163904,3239164159,PL 3239164160,3239164671,DE 3239164672,3239164927,GB @@ -69122,9 +75161,7 @@ 3239292928,3239293951,CZ 3239293952,3239294975,DE 3239294976,3239295999,UA -3239296000,3239296511,GB -3239296512,3239296767,LB -3239296768,3239297023,GB +3239296000,3239297023,GB 3239297024,3239298047,RO 3239298048,3239299071,GB 3239301120,3239302143,FR @@ -69186,7 +75223,6 @@ 3239506432,3239506687,RU 3239506688,3239506943,GB 3239507200,3239507455,GB -3239507456,3239507967,DE 3239507968,3239508223,BG 3239508224,3239508479,SA 3239508480,3239508735,NO @@ -69223,7 +75259,6 @@ 3239541248,3239541503,UA 3239541504,3239541759,FR 3239541760,3239542015,GB -3239542272,3239542527,RU 3239543808,3239544831,DE 3239544832,3239545087,GB 3239545088,3239545343,SI @@ -69269,8 +75304,7 @@ 3239582976,3239583231,IT 3239583232,3239583487,UA 3239583744,3239591935,DE -3239591936,3239592191,FI -3239592192,3239592447,CN +3239591936,3239592447,FI 3239592448,3239592703,US 3239592704,3239592959,FI 3239592960,3239593215,EU @@ -69366,7 +75400,8 @@ 3239740416,3239740671,DK 3239740928,3239741183,UA 3239741184,3239741439,RU -3239741440,3239759871,DE +3239741440,3239744511,DE +3239747584,3239759871,DE 3239760128,3239760383,UA 3239761408,3239761663,RU 3239761920,3239762175,BG @@ -69479,10 +75514,8 @@ 3239878656,3239882751,DE 3239882752,3239883007,GB 3239883008,3239883263,UA -3239883264,3239883316,EU -3239883317,3239883317,GB -3239883318,3239883519,EU -3239883520,3239883775,RU +3239883264,3239883519,EU +3239883520,3239883775,CZ 3239883776,3239884031,DE 3239884032,3239884287,RU 3239884544,3239884799,FR @@ -69518,14 +75551,11 @@ 3239899136,3239901695,DE 3239901696,3239901951,BG 3239901952,3239902207,DE -3239902464,3239902719,RU 3239902720,3239902975,EE -3239903232,3239904255,DE -3239904512,3239904767,GB -3239905536,3239905791,DE +3239903232,3239907327,DE 3239907328,3239907583,UA 3239908096,3239908351,RU -3239908352,3239910399,DE +3239908864,3239910399,DE 3239912960,3239913215,DE 3239913216,3239913471,LT 3239914240,3239914495,DE @@ -69562,7 +75592,6 @@ 3239968512,3239968767,PL 3239968768,3239969023,NO 3239969536,3239970047,DE -3239970816,3239971839,DE 3239972864,3239974911,DE 3239974912,3239975935,GB 3239975936,3239976191,RO @@ -69603,7 +75632,7 @@ 3240034560,3240035327,DE 3240036096,3240037375,DE 3240037888,3240038143,AT -3240038400,3240040447,DE +3240038912,3240039423,DE 3240049664,3240050687,DE 3240054784,3240058879,DE 3240067072,3240083455,DE @@ -69642,7 +75671,9 @@ 3240116224,3240116479,DE 3240116480,3240116735,DK 3240116736,3240117247,GB -3240117248,3240118271,EU +3240117248,3240117260,EU +3240117261,3240117261,UA +3240117262,3240118271,EU 3240118272,3240120319,ES 3240120320,3240120831,IR 3240120832,3240121343,GB @@ -69863,7 +75894,7 @@ 3240312320,3240312575,IR 3240312576,3240312831,RU 3240312832,3240316927,GB -3240321024,3240321791,RU +3240321024,3240321535,RU 3240321792,3240322047,PL 3240322048,3240322303,RU 3240322560,3240324095,CZ @@ -69910,9 +75941,7 @@ 3240423424,3240435711,GB 3240436480,3240436735,GB 3240436736,3240437759,DE -3240450048,3240454911,GB -3240454912,3240455167,IN -3240456192,3240460287,GB +3240443904,3240460287,GB 3240460288,3240461055,IL 3240461056,3240461567,DE 3240461568,3240461823,UA @@ -69949,12 +75978,7 @@ 3240505344,3240505599,PL 3240505600,3240505855,GB 3240506368,3240506623,GB -3240507392,3240525823,GB -3240529408,3240529919,GB -3240534016,3240536640,GB -3240536641,3240536641,US -3240536642,3240550399,GB -3240558592,3240575487,GB +3240507392,3240575487,GB 3240575488,3240575743,RO 3240575744,3240575999,GB 3240576000,3240576255,DE @@ -69967,7 +75991,8 @@ 3240577792,3240578559,UA 3240578560,3240578815,RU 3240578816,3240579071,IL -3240579072,3240587263,GB +3240579072,3240581119,GB +3240583168,3240587263,GB 3240587264,3240587519,NL 3240587520,3240587775,RU 3240587776,3240588031,UA @@ -69979,12 +76004,14 @@ 3240589312,3240593407,SE 3240593408,3240593663,GB 3240594176,3240594431,DK -3240594432,3240607743,GB +3240594432,3240594943,GB +3240595456,3240607743,GB 3240609792,3240611839,DE 3240611840,3240613887,GB -3240615936,3240622079,GB +3240615936,3240620031,GB +3240621824,3240622079,GB 3240622080,3240622591,RU -3240622592,3240623103,GB +3240622848,3240623103,GB 3240624128,3240689663,EE 3240689664,3240690175,GB 3240690176,3240690687,TR @@ -70016,7 +76043,6 @@ 3240710912,3240711167,FR 3240711168,3240711679,IT 3240711680,3240711935,RU -3240711936,3240712191,DE 3240712192,3240712447,UA 3240712448,3240712703,SI 3240712704,3240712959,CH @@ -70067,7 +76093,6 @@ 3240742656,3240742911,AT 3240742912,3240743423,IL 3240743424,3240743935,PL -3240743936,3240744447,DE 3240744448,3240744959,SE 3240744960,3240745471,RO 3240745472,3240745983,UA @@ -70128,7 +76153,7 @@ 3240820864,3240820991,PL 3240820992,3240822783,IT 3240823808,3240824319,PL -3240824320,3240825855,IT +3240824576,3240825855,IT 3240826880,3240827135,IT 3240827136,3240827391,FR 3240827392,3240827647,BG @@ -70146,14 +76171,13 @@ 3240844544,3240844799,CH 3240845056,3240845311,UA 3240845312,3240845823,IT -3240846336,3240846847,IT +3240846592,3240846847,IT 3240846848,3240847359,VA 3240847360,3240852735,IT 3240852736,3240852991,GB 3240853248,3240853503,RU 3240853504,3240854527,VA 3240854528,3240855039,IT -3240855040,3240855295,RU 3240855552,3240857599,IT 3240857600,3240857855,PL 3240858624,3240858879,PL @@ -70188,7 +76212,7 @@ 3240955904,3240961151,SE 3240961152,3240961279,GB 3240961280,3241017343,SE -3241017344,3241017855,AT +3241017600,3241017855,AT 3241017856,3241018111,RU 3241018112,3241018367,FR 3241018368,3241022463,AT @@ -70249,12 +76273,11 @@ 3241078016,3241078271,PL 3241078272,3241078527,ES 3241078528,3241078783,DE -3241078784,3241082879,AT +3241080832,3241082879,AT 3241082880,3241083135,FR 3241083136,3241084927,CH 3241084928,3241085183,AP 3241085184,3241091071,CH -3241099264,3241100287,CH 3241101056,3241101311,DK 3241101312,3241101567,RO 3241101568,3241101823,DE @@ -70316,9 +76339,7 @@ 3241146368,3241146623,IL 3241146624,3241146879,RO 3241146880,3241148415,CH -3241148416,3241416767,FR -3241416768,3241416831,US -3241416832,3241476095,FR +3241148416,3241476095,FR 3241476864,3241477375,BE 3241477632,3241477887,GB 3241478144,3241481727,BE @@ -70339,29 +76360,27 @@ 3241499648,3241499903,BE 3241499904,3241500159,DE 3241500160,3241500671,GB -3241500672,3241501439,BE 3241501440,3241501440,GB 3241501441,3241501695,EU 3241501696,3241501696,GB -3241501697,3241502463,BE +3241501697,3241501951,EU +3241501952,3241502463,BE 3241503232,3241503487,RS 3241503488,3241508095,BE 3241508096,3241508351,NL -3241508352,3241508607,BE 3241508864,3241539839,BE -3241540864,3241541119,BE 3241541376,3241541631,PL 3241541632,3241689087,FR 3241693184,3241699327,FR 3241699840,3241700095,SE 3241700352,3241721855,FR 3241722112,3241722367,FR -3241724160,3241724415,FR 3241724416,3241724671,RU -3241724672,3241724927,FR +3241724672,3241724927,RE 3241725952,3241742335,FR 3241743360,3241743615,DE -3241744128,3241763071,FR +3241744384,3241745407,FR +3241746432,3241763071,FR 3241763072,3241763327,DE 3241764864,3241803775,FR 3241803776,3241803823,CY @@ -70374,7 +76393,6 @@ 3241822208,3241824255,CZ 3241824256,3241840639,BE 3241841664,3241842175,BE -3241842688,3241843455,BE 3241843456,3241843711,CH 3241843712,3241848831,BE 3241852928,3241854463,SK @@ -70383,10 +76401,7 @@ 3241856000,3241857279,NL 3241857280,3241857535,CH 3241857536,3241859071,AT -3241859072,3241859651,US -3241859652,3241859652,MY -3241859653,3241860863,US -3241860864,3241861119,FR +3241859072,3241861119,US 3241861120,3241863167,BE 3241863168,3241863423,PL 3241863424,3241863679,FR @@ -70427,9 +76442,7 @@ 3242950656,3242983423,BE 3242983424,3243048959,IT 3243048960,3243114495,SI -3243114496,3243238143,NL -3243238144,3243238399,US -3243238400,3243245567,NL +3243114496,3243245567,NL 3243245568,3243376639,AT 3243376640,3243442175,GB 3243442176,3243507711,AT @@ -70499,7 +76512,6 @@ 3243565056,3243569151,GB 3243570432,3243570687,CZ 3243570688,3243570943,PL -3243571456,3243571711,CZ 3243571968,3243572223,GR 3243572224,3243572479,CZ 3243572992,3243573247,RU @@ -70508,7 +76520,9 @@ 3243769856,3243900927,DK 3243900928,3243966463,NO 3243966464,3243974655,PL -3243974656,3243978751,LU +3243974656,3243975423,LU +3243975424,3243975679,FR +3243975680,3243978751,LU 3243978752,3243982847,NL 3243982848,3243991039,HU 3243991040,3243999231,BE @@ -70649,7 +76663,6 @@ 3244838144,3244838399,IL 3244838400,3244838655,GB 3244838656,3244838911,BG -3244838912,3244839167,TR 3244839168,3244839423,GB 3244839424,3244839679,AT 3244839680,3244839935,DK @@ -70737,7 +76750,6 @@ 3244862720,3244862975,RO 3244862976,3244863231,DE 3244863232,3244863487,GB -3244863488,3244863743,KZ 3244863744,3244863999,RU 3244864000,3244864255,UA 3244864256,3244864511,GB @@ -70756,7 +76768,6 @@ 3244868352,3244868607,RU 3244868608,3244868863,FI 3244868864,3244869119,RU -3244869120,3244869375,GB 3244869376,3244869631,FR 3244869632,3244869887,GR 3244869888,3244870143,TR @@ -70836,7 +76847,6 @@ 3244890880,3244891135,RU 3244891392,3244891647,PL 3244891648,3244891903,UA -3244891904,3244892159,RO 3244892160,3244892415,PL 3244892416,3244892671,NL 3244892672,3244892927,ES @@ -70883,13 +76893,11 @@ 3244903936,3244904191,RO 3244904192,3244904447,IT 3244904448,3244904703,GR -3244904704,3244904959,FR 3244904960,3244905215,BY 3244905216,3244905471,MD -3244905472,3244905727,GB 3244905728,3244905983,GR 3244905984,3244906239,AT -3244906240,3244906751,DE +3244906240,3244906495,DE 3244906752,3244907007,SA 3244907008,3244907263,FR 3244907264,3244907519,RO @@ -70937,7 +76945,6 @@ 3244919296,3244919551,SE 3244919552,3244919807,DE 3244919808,3244920063,RO -3244920064,3244920319,RU 3244920320,3244920575,SK 3244920576,3244920831,PL 3244920832,3244921087,NL @@ -70949,7 +76956,7 @@ 3244922368,3244922623,GB 3244922880,3244923135,UA 3244923136,3244923391,AT -3244923392,3244923647,EU +3244923392,3244923647,RU 3244923648,3244923903,LV 3244923904,3244924159,RU 3244924160,3244924927,CZ @@ -70974,7 +76981,6 @@ 3244930304,3244930559,AT 3244930560,3244930815,GB 3244930816,3244931071,NL -3244931072,3244931327,RU 3244931328,3244931583,RO 3244931584,3244931839,FR 3244931840,3244932095,NL @@ -70993,8 +76999,7 @@ 3244935424,3244935679,UA 3244935680,3244935935,PL 3244935936,3244936191,IL -3244936192,3244936959,AT -3244936960,3244937215,KZ +3244936192,3244937215,AT 3244937216,3244937471,TR 3244937472,3244937727,GB 3244937728,3244937983,UA @@ -71004,7 +77009,6 @@ 3244938752,3244939007,AT 3244939008,3244939263,NL 3244939264,3244939519,UA -3244939520,3244939775,FR 3244939776,3244940031,GB 3244940032,3244940287,UA 3244940288,3244940543,DK @@ -71043,8 +77047,8 @@ 3244951552,3244952575,FI 3244952576,3244953599,GB 3244953600,3244954623,DE -3244955648,3244956671,UA -3244956672,3244957695,LT +3244955648,3244957695,UA +3244957696,3244958719,RU 3244958720,3244959743,FR 3244959744,3244960767,RU 3244960768,3244961791,RO @@ -71099,11 +77103,11 @@ 3245015040,3245016063,RU 3245016064,3245017087,RS 3245017088,3245018111,PL -3245018112,3245019391,RU -3245019392,3245019462,SC +3245018112,3245019135,RU +3245019136,3245019462,SC 3245019463,3245019463,A1 -3245019464,3245019647,SC -3245019648,3245021183,RU +3245019464,3245020159,SC +3245020160,3245021183,RU 3245021184,3245022207,UA 3245022208,3245023231,NO 3245023232,3245024255,PL @@ -71121,7 +77125,8 @@ 3245038592,3245039615,RU 3245039616,3245040639,MD 3245040640,3245041663,RU -3245041664,3245044735,UA +3245041664,3245043711,UA +3245043712,3245044735,RU 3245044736,3245045759,GB 3245045760,3245046783,DE 3245046784,3245047807,FR @@ -71193,9 +77198,7 @@ 3245117440,3245118463,LV 3245118464,3245119487,GB 3245119488,3245120511,EU -3245120512,3245121093,GB -3245121094,3245121095,US -3245121096,3245121535,GB +3245120512,3245121535,GB 3245121536,3245122047,GR 3245122048,3245122559,UA 3245122560,3245123071,DE @@ -71354,7 +77357,7 @@ 3245221888,3245223935,DE 3245223936,3245225471,NL 3245225472,3245225727,EU -3245225728,3245225983,GB +3245225728,3245225983,NL 3245225984,3245228031,HU 3245228032,3245229055,FI 3245229056,3245230079,DE @@ -71387,7 +77390,7 @@ 3245243392,3245244415,UA 3245244416,3245244671,ES 3245244672,3245244927,AT -3245244928,3245245183,US +3245244928,3245245183,BE 3245245440,3245245695,BG 3245245696,3245245951,DE 3245246720,3245246975,PL @@ -71445,7 +77448,6 @@ 3245283328,3245283839,GB 3245283840,3245284351,PL 3245284352,3245284863,GB -3245285376,3245285631,NL 3245285632,3245285887,GB 3245285888,3245286143,DE 3245286144,3245286399,GB @@ -71470,11 +77472,10 @@ 3245298688,3245298943,GB 3245298944,3245299199,UA 3245299456,3245299711,AT -3245299712,3245299967,DE 3245299968,3245300223,BG 3245300736,3245300991,RU 3245300992,3245301247,FI -3245301248,3245301503,DK +3245301248,3245301503,NL 3245301504,3245301759,BE 3245301760,3245302783,SK 3245302784,3245303807,DE @@ -71489,7 +77490,6 @@ 3245312000,3245314047,DE 3245314048,3245315071,PL 3245317120,3245318143,UA -3245318144,3245318399,IT 3245318400,3245318655,RO 3245318656,3245318911,DK 3245318912,3245319167,DE @@ -71539,7 +77539,9 @@ 3246370816,3246371073,ES 3246371074,3246371074,PT 3246371075,3246374911,ES -3246374912,3246378751,EU +3246374912,3246376959,EU +3246376960,3246377215,ES +3246377216,3246378751,EU 3246378752,3246379007,ES 3246379008,3246381055,GB 3246381056,3246387199,EU @@ -71549,9 +77551,7 @@ 3246547200,3246547455,EU 3246547456,3246613503,GB 3246613504,3246614527,HU -3246614528,3246744543,GB -3246744544,3246744559,NG -3246744560,3246784511,GB +3246614528,3246784511,GB 3246784512,3246825983,CH 3246825984,3246826239,US 3246826240,3246828066,CH @@ -71916,12 +77916,16 @@ 3248603136,3248603391,BG 3248603392,3248603647,RU 3248603648,3248604159,NO -3248606208,3248619519,NO +3248606976,3248619519,NO 3248619520,3248624383,DK 3248624384,3248624639,US 3248624640,3248624895,DK 3248624896,3248625151,AP -3248625152,3248719871,DK +3248625152,3248626175,DK +3248626176,3248626176,EU +3248626177,3248626190,DK +3248626191,3248626191,US +3248626192,3248719871,DK 3248719872,3248720127,EU 3248720128,3248748543,DK 3248748544,3248748573,EU @@ -71960,7 +77964,15 @@ 3248791296,3248791551,DE 3248791552,3248792063,GB 3248792064,3248792319,EU -3248792320,3248792575,GB +3248792320,3248792343,GB +3248792344,3248792351,EU +3248792352,3248792407,GB +3248792408,3248792415,EU +3248792416,3248792439,GB +3248792440,3248792455,EU +3248792456,3248792463,GB +3248792464,3248792479,EU +3248792480,3248792575,GB 3248792576,3248796607,EU 3248796608,3248796863,GB 3248796864,3248798975,EU @@ -72113,9 +78125,7 @@ 3249279744,3249279999,EU 3249280000,3249313279,NL 3249313280,3249313535,EU -3249313536,3249369855,NL -3249369856,3249370111,EU -3249370112,3249405951,NL +3249313536,3249405951,NL 3249405952,3249521279,DE 3249521280,3249521343,UA 3249521344,3249537023,DE @@ -72130,11 +78140,10 @@ 3249569792,3249574143,NL 3249574144,3249574399,RU 3249574400,3249574655,SE +3249574656,3249574911,RU 3249574912,3249590527,NL 3249590528,3249590783,FR 3249592320,3249598463,NL -3249598976,3249599743,NL -3249600000,3249600255,NL 3249600256,3249600511,AT 3249600512,3249601535,UA 3249601536,3249601791,RU @@ -72146,7 +78155,7 @@ 3249677056,3249677311,SE 3249678336,3249678847,IE 3249679104,3249679359,CH -3249679360,3249682431,IE +3249681664,3249681919,IE 3249683456,3249684479,SE 3249684480,3249696767,IE 3249697280,3249697535,IE @@ -72226,7 +78235,8 @@ 3249829888,3249830143,GB 3249830144,3249830399,SE 3249830400,3249830655,IT -3249830656,3249844479,SE +3249830656,3249830911,DK +3249830912,3249844479,SE 3249844480,3249844735,AT 3249844736,3249844991,AU 3249844992,3249845759,SE @@ -72249,7 +78259,9 @@ 3249863680,3249863935,ES 3249863936,3249865471,SE 3249865472,3249865727,GB -3249865728,3249868543,SE +3249865728,3249868031,SE +3249868032,3249868287,DK +3249868288,3249868543,SE 3249868544,3249868799,DE 3249868800,3249869823,NL 3249869824,3249871103,SE @@ -72260,13 +78272,16 @@ 3249872384,3249872639,GB 3249872640,3249910271,SE 3249910272,3249910783,NL -3249910784,3249926143,SE +3249910784,3249924607,SE +3249924608,3249924863,NO +3249924864,3249926143,SE 3249926144,3249926399,AU 3249926400,3249926655,SE 3249926656,3249926911,BE 3249926912,3249929471,SE 3249929472,3249929983,CA -3249929984,3249931263,SE +3249929984,3249930239,NO +3249930240,3249931263,SE 3249931264,3249931775,NL 3249931776,3249932287,SE 3249932288,3249934335,US @@ -72375,7 +78390,8 @@ 3250245632,3250245887,TR 3250245888,3250246143,AT 3250246144,3250246399,GB -3250246656,3250257663,AT +3250246656,3250257151,AT +3250257408,3250257663,AT 3250257664,3250257919,PL 3250257920,3250258175,EU 3250258432,3250271231,AT @@ -72399,7 +78415,6 @@ 3250324992,3250325247,AE 3250325248,3250325503,MA 3250326528,3250327039,BH -3250327040,3250327295,SA 3250331648,3250335743,MT 3250335744,3250339839,KW 3250339840,3250348031,JO @@ -72454,7 +78469,8 @@ 3250413568,3250414079,UA 3250414080,3250414591,RO 3250414592,3250415103,SE -3250415104,3250415615,NL +3250415104,3250415359,NL +3250415360,3250415615,PL 3250415616,3250416127,FR 3250416128,3250417663,DE 3250417664,3250418175,IT @@ -72552,10 +78568,8 @@ 3250748416,3250749439,UA 3250749440,3250749695,GH 3250749696,3250749951,EU -3250750464,3250750537,FR -3250750538,3250750541,EU -3250750542,3250751487,FR -3250751488,3250751999,DE +3250750464,3250751487,FR +3250751488,3250751743,DE 3250752000,3250752511,CH 3250752512,3250753023,BG 3250753536,3250754047,DE @@ -72602,7 +78616,6 @@ 3251121664,3251122175,PL 3251122176,3251122687,CH 3251122688,3251123199,PL -3251123200,3251123711,FR 3251123712,3251124223,RU 3251124736,3251125247,FR 3251125248,3251125759,BE @@ -72633,7 +78646,6 @@ 3251142144,3251142655,RO 3251142656,3251142911,DE 3251142912,3251143167,RU -3251143168,3251143423,AM 3251143424,3251143679,LV 3251143680,3251143935,NL 3251143936,3251144191,PL @@ -72663,7 +78675,6 @@ 3251151360,3251151615,DE 3251151872,3251152127,NL 3251152128,3251152639,RO -3251152640,3251152895,UA 3251152896,3251153151,RU 3251153408,3251153663,TR 3251153664,3251153919,FR @@ -72822,7 +78833,7 @@ 3251216256,3251216383,RU 3251216384,3251216639,GB 3251216640,3251216895,RO -3251216896,3251217151,BE +3251216896,3251217151,NL 3251217152,3251217407,GB 3251217408,3251217663,PL 3251217664,3251217919,SI @@ -72865,17 +78876,14 @@ 3251256832,3251257343,GB 3251257344,3251259903,BE 3251260416,3251261439,FR -3251261440,3251264255,CH -3251264256,3251265535,FR +3251263488,3251265535,FR 3251265536,3251267839,NL 3251267840,3251268351,GB 3251268352,3251268607,NL 3251268608,3251268863,BG 3251268864,3251269119,NL -3251269120,3251269215,DK -3251269216,3251269270,NL -3251269271,3251269271,DK -3251269272,3251269759,NL +3251269120,3251269375,DK +3251269376,3251269631,FR 3251269888,3251270143,GB 3251270144,3251270399,PL 3251270400,3251270655,NO @@ -72889,12 +78897,13 @@ 3251272448,3251272703,AT 3251272704,3251272959,DE 3251272960,3251273471,FR -3251273472,3251290111,DE +3251273472,3251286015,DE +3251286016,3251288063,US +3251288064,3251290111,SG 3251290112,3251302399,GB 3251302400,3251306239,LI 3251306240,3251306495,EU 3251306496,3251307007,AT -3251307520,3251307775,MK 3251307776,3251308031,GB 3251308032,3251308543,RS 3251311104,3251311615,RS @@ -72908,9 +78917,7 @@ 3251320832,3251321855,PL 3251321856,3251322879,RU 3251322880,3251331071,GB -3251331072,3251331262,FR -3251331263,3251331263,GB -3251331264,3251331321,FR +3251331072,3251331321,FR 3251331322,3251331322,GB 3251331323,3251331583,FR 3251331584,3251332095,PL @@ -73039,7 +79046,6 @@ 3252379648,3252379903,ES 3252379904,3252380159,GB 3252380160,3252380415,BE -3252380416,3252380671,UA 3252380672,3252380927,SI 3252381184,3252381439,IT 3252381440,3252381695,ES @@ -73068,9 +79074,7 @@ 3252404224,3252405759,NO 3252405760,3252406271,FR 3252406272,3252407295,NO -3252407296,3252409663,FR -3252409664,3252409679,CD -3252409680,3252415487,FR +3252407296,3252415487,FR 3252415488,3252415743,US 3252415744,3252420607,FR 3252420608,3252424703,NO @@ -73084,9 +79088,7 @@ 3252449792,3252450047,DK 3252450048,3252452543,FR 3252452544,3252452551,SS -3252452552,3252455679,FR -3252455680,3252455807,BI -3252455808,3252461567,FR +3252452552,3252461567,FR 3252461568,3252469759,NO 3252469760,3252473855,NL 3252473856,3252475903,NO @@ -73125,7 +79127,6 @@ 3252518912,3252527103,NL 3252527104,3252535295,BE 3252541952,3252542207,CI -3252542208,3252542719,BE 3252543488,3252551679,BE 3252551680,3252563967,CH 3252563968,3252564479,RU @@ -73159,7 +79160,7 @@ 3252587264,3252587519,AT 3252587520,3252587775,UA 3252587776,3252588031,SE -3252588032,3252599807,CH +3252588544,3252599807,CH 3252600320,3252600575,NL 3252600576,3252600831,RU 3252600832,3252616703,CH @@ -73171,13 +79172,14 @@ 3252636672,3252636927,TR 3252636928,3252637183,DE 3252637184,3252637695,GB -3252637696,3252642303,CH +3252637696,3252641791,CH 3252642304,3252642559,UA 3252642560,3252642815,DK 3252642816,3252643071,NL 3252643072,3252643327,RO 3252643328,3252643583,CH -3252643840,3252682751,CH +3252645120,3252645375,CH +3252645888,3252682751,CH 3252682752,3252813823,HU 3252813824,3252830207,RO 3252830208,3252830719,MD @@ -73242,7 +79244,8 @@ 3252944896,3252945151,AT 3252945152,3252945407,GB 3252945408,3252945663,UA -3252945920,3252977663,AT +3252945920,3252947455,AT +3252948992,3252977663,AT 3252980992,3252981247,GB 3252981248,3252981503,RU 3252981504,3252981759,SE @@ -73258,15 +79261,23 @@ 3252984832,3252985087,FR 3252985088,3252985343,SE 3252985344,3252985855,RU -3252985856,3252989183,AT +3252988416,3252988927,AT 3252989440,3252989695,PL -3252989952,3253004799,AT +3252989952,3252994303,AT +3252995072,3252996095,CH +3252996096,3253002239,AT +3253003008,3253003263,AT +3253004288,3253004799,AT 3253004800,3253005055,CZ 3253005056,3253006335,AT 3253006336,3253010431,DE 3253010432,3253075967,FI -3253075968,3253207039,RO -3253207040,3253270527,RU +3253075968,3253139455,RO +3253139456,3253139711,MD +3253139712,3253207039,RO +3253207040,3253230591,RU +3253230592,3253230847,BY +3253230848,3253270527,RU 3253270528,3253271551,BY 3253271552,3253338111,RU 3253338112,3253338367,PL @@ -73305,7 +79316,9 @@ 3253409792,3253410047,GB 3253410048,3253411327,SE 3253411328,3253411583,NO -3253411584,3253412351,SE +3253411584,3253411839,SE +3253411840,3253412095,US +3253412096,3253412351,SE 3253412352,3253412607,US 3253412608,3253416447,SE 3253416448,3253416703,GB @@ -73316,7 +79329,9 @@ 3253428480,3253429247,SE 3253429248,3253429759,JP 3253429760,3253430015,ES -3253430016,3253433087,SE +3253430016,3253430783,SE +3253430784,3253431039,BE +3253431040,3253433087,SE 3253433088,3253433343,DE 3253433344,3253434111,SE 3253434112,3253434367,GB @@ -73338,7 +79353,13 @@ 3253453568,3253454079,SE 3253454080,3253454335,GB 3253454336,3253454591,EU -3253454592,3253460735,SE +3253454592,3253454847,SE +3253454848,3253454848,NL +3253454849,3253455615,SE +3253455616,3253455871,US +3253455872,3253456383,SE +3253456384,3253456639,US +3253456640,3253460735,SE 3253460736,3253460991,IT 3253460992,3253461759,SE 3253461760,3253462015,PL @@ -73411,7 +79432,6 @@ 3253670912,3253671935,CH 3253671936,3253672959,UA 3253672960,3253673983,DE -3253674752,3253675007,GB 3253675008,3253676031,PL 3253676032,3253677055,AT 3253677056,3253678079,PL @@ -73485,7 +79505,11 @@ 3253730304,3253730815,RO 3253730816,3253731327,UA 3253731328,3253731583,DE -3253731584,3253737823,GB +3253731584,3253735679,GB +3253735680,3253735935,FR +3253735936,3253736959,GB +3253736960,3253737215,FR +3253737216,3253737823,GB 3253737824,3253737831,PL 3253737832,3253737839,AT 3253737840,3253737847,GB @@ -73495,13 +79519,13 @@ 3253738568,3253738569,BE 3253738570,3253738570,US 3253738571,3253738575,BE -3253738576,3253739263,GB -3253739264,3253739519,FR -3253739520,3253741055,GB -3253741056,3253741311,BE -3253741312,3253741679,GB +3253738576,3253741567,GB +3253741568,3253741679,SE 3253741680,3253741695,RU -3253741696,3253744415,GB +3253741696,3253741816,SE +3253741817,3253741817,GB +3253741818,3253741823,SE +3253741824,3253744415,GB 3253744416,3253744447,CH 3253744448,3253745983,GB 3253745984,3253745999,SE @@ -73517,8 +79541,13 @@ 3253760512,3253760767,FR 3253760768,3253761407,GB 3253761408,3253761471,ES -3253761472,3253762559,GB -3253762560,3253762815,IT +3253761472,3253761535,GB +3253761536,3253761791,US +3253761792,3253762303,GB +3253762304,3253762559,DE +3253762560,3253762753,IT +3253762754,3253762754,ES +3253762755,3253762815,IT 3253762816,3253762943,CH 3253762944,3253763071,GB 3253763072,3253763327,SE @@ -73529,18 +79558,38 @@ 3253765280,3253765295,NL 3253765296,3253765311,BE 3253765312,3253765375,TR -3253765376,3253767615,GB +3253765376,3253766463,GB +3253766464,3253766527,NL +3253766528,3253767615,GB 3253767616,3253767675,IE 3253767676,3253767679,DE 3253767680,3253767711,GB 3253767712,3253767743,DE -3253767744,3253770983,GB +3253767744,3253768191,GB +3253768192,3253768447,ES +3253768448,3253768565,GB +3253768566,3253768566,DE +3253768567,3253768959,GB +3253768960,3253769215,DE +3253769216,3253770983,GB 3253770984,3253770984,DE 3253770985,3253771199,GB 3253771200,3253771263,IE -3253771264,3253773055,GB +3253771264,3253772063,GB +3253772064,3253772095,DE +3253772096,3253772519,GB +3253772520,3253772527,DE +3253772528,3253773055,GB 3253773056,3253773311,DE -3253773312,3253796863,GB +3253773312,3253774583,GB +3253774584,3253774591,DE +3253774592,3253775183,GB +3253775184,3253775191,FR +3253775192,3253775807,GB +3253775808,3253775823,DE +3253775824,3253776159,GB +3253776160,3253776175,DE +3253776176,3253796863,GB 3253796864,3253862399,SE 3253862400,3253862655,GB 3253862656,3253882879,FR @@ -73609,7 +79658,7 @@ 3253912576,3253913599,RO 3253913600,3253915647,RU 3253915648,3253916159,IR -3253916160,3253916671,DE +3253916160,3253916671,NL 3253916672,3253917183,PL 3253917184,3253917439,CY 3253917440,3253917695,PL @@ -73631,7 +79680,6 @@ 3253967872,3253968895,UA 3253968896,3253969151,DE 3253969408,3253969919,AT -3253970432,3253970687,RU 3253970688,3253970943,UA 3253970944,3253971967,RS 3253971968,3253972991,RU @@ -73640,11 +79688,9 @@ 3253975040,3253977087,DE 3253977088,3253985279,TR 3253985280,3253993471,GB -3253993472,3254001919,BE -3254001920,3254002175,NL -3254002176,3254079743,BE -3254079744,3254079999,HU -3254080000,3254124543,BE +3253993472,3254067711,BE +3254067712,3254067967,CZ +3254067968,3254124543,BE 3254124544,3254255615,CH 3254255616,3254256127,RE 3254256128,3254256639,GP @@ -73693,23 +79739,14 @@ 3254508800,3254508831,MQ 3254508832,3254509412,FR 3254509413,3254509413,GQ -3254509414,3254521855,FR -3254521856,3254522111,GB -3254522112,3254608895,FR -3254608896,3254609151,RE -3254609152,3254609407,FR -3254609408,3254609663,RE -3254609664,3254609919,FR -3254609920,3254610431,RE +3254509414,3254607871,FR +3254607872,3254608895,RE +3254608896,3254609151,FR +3254609152,3254610431,RE 3254610432,3254610687,FR -3254610688,3254610943,RE -3254610944,3254611199,FR -3254611200,3254611455,RE +3254610688,3254611455,RE 3254611456,3254611967,YT -3254611968,3254612991,FR -3254612992,3254613247,RE -3254613248,3254615039,FR -3254615040,3254615551,RE +3254611968,3254615551,RE 3254615552,3254616063,YT 3254616064,3254648831,FR 3254648832,3254649855,AL @@ -73937,7 +79974,6 @@ 3254891776,3254892031,DE 3254892032,3254892287,GB 3254892288,3254892543,BE -3254892544,3254892799,RU 3254892800,3254893055,SK 3254893568,3254894079,CZ 3254894080,3254894335,CH @@ -73979,20 +80015,22 @@ 3254962381,3254962381,NL 3254962382,3254962421,FR 3254962422,3254962422,NL -3254962423,3255119871,FR +3254962423,3255015423,FR +3255015424,3255015679,MQ +3255015680,3255117823,FR 3255120640,3255120895,DE -3255120896,3255121919,FR -3255123200,3255123711,FR +3255121664,3255121919,FR 3255123712,3255123967,DE 3255123968,3255124991,FR 3255126016,3255126527,FR 3255126528,3255127551,EU -3255127808,3255128575,FR +3255128064,3255128575,FR 3255129856,3255130111,HR -3255130112,3255169023,FR +3255130112,3255130623,FR +3255132160,3255160831,FR +3255166976,3255169023,FR 3255172352,3255172607,DE -3255172608,3255173119,FR -3255173120,3255173631,SH +3255173120,3255173631,GB 3255173632,3255173647,EU 3255173648,3255173711,GB 3255173712,3255173759,EU @@ -74084,7 +80122,9 @@ 3255237120,3255237375,AT 3255237888,3255238143,ES 3255238400,3255238655,QA -3255238656,3255280018,BE +3255238656,3255272191,BE +3255272192,3255272447,US +3255272448,3255280018,BE 3255280019,3255280019,EU 3255280020,3255292311,BE 3255292312,3255292319,LU @@ -74226,9 +80266,7 @@ 3255496704,3255498751,EU 3255498752,3255500799,FR 3255500800,3255504895,CH -3255504896,3255505151,RU -3255505152,3255505663,GB -3255505920,3255506431,RU +3255504896,3255505919,GB 3255506432,3255506687,PL 3255506688,3255506943,PT 3255506944,3255507199,PL @@ -74243,7 +80281,8 @@ 3255544576,3255544831,AT 3255544832,3255558143,CH 3255558400,3255558655,UA -3255558912,3255563263,CH +3255558912,3255559679,CH +3255560192,3255563263,CH 3255563776,3255564031,CH 3255564032,3255564287,RU 3255565312,3255565955,DE @@ -74257,16 +80296,24 @@ 3255599104,3255615487,CH 3255615488,3255623679,DE 3255623680,3255631871,BG -3255631872,3255660287,NL +3255631872,3255659519,NL 3255660288,3255660543,GR 3255660544,3255666175,NL 3255666432,3255666687,DE -3255667712,3255697407,NL +3255668224,3255697407,NL 3255697408,3255699711,SE 3255699712,3255699967,EU -3255699968,3255710719,SE +3255699968,3255704575,SE +3255704576,3255705087,FR +3255705088,3255710719,SE 3255710720,3255710975,ES -3255710976,3255724543,SE +3255710976,3255716351,SE +3255716352,3255716863,CH +3255716864,3255719167,SE +3255719168,3255719423,NO +3255719424,3255719679,SE +3255719680,3255719935,IT +3255719936,3255724543,SE 3255724544,3255725055,US 3255725056,3255725311,ES 3255725312,3255730943,SE @@ -74279,7 +80326,8 @@ 3255745536,3255745791,DK 3255745792,3255752959,SE 3255752960,3255753215,LI -3255753216,3255762943,SE +3255753216,3255762431,SE +3255762432,3255762943,BE 3255762944,3255771135,DE 3255779328,3255791615,DE 3255791616,3255792639,UA @@ -74288,17 +80336,16 @@ 3255794944,3255795711,RU 3255795712,3255798783,DE 3255799040,3255799295,SE -3255799296,3255800575,DE +3255799296,3255800319,DE 3255800576,3255800831,UA -3255800832,3255817215,DE +3255800832,3255801855,DE +3255802880,3255817215,DE 3255817216,3255817471,SE 3255817472,3255817727,ES 3255817728,3255820287,DE 3255821312,3255822335,CH 3255822336,3255828479,DE -3255828480,3255939623,SE -3255939624,3255939624,GB -3255939625,3255947484,SE +3255828480,3255947484,SE 3255947485,3255947485,EU 3255947486,3256025087,SE 3256025088,3256057855,NO @@ -74350,7 +80397,8 @@ 3256489472,3256489983,GR 3256489984,3256490239,BE 3256490496,3256490751,CH -3256490752,3256524287,NL +3256491008,3256491263,NL +3256492032,3256524287,NL 3256524288,3256524799,DE 3256524800,3256549375,NL 3256549376,3256614911,TR @@ -74412,12 +80460,11 @@ 3256695808,3256696831,UA 3256696832,3256698367,EU 3256698368,3256698623,NL -3256698624,3256699135,EU +3256698624,3256698879,GB +3256698880,3256699135,EU 3256699136,3256699391,NL 3256699392,3256699647,GB -3256699648,3256705023,EU -3256705024,3256705279,IE -3256705280,3256705535,EU +3256699648,3256705535,EU 3256705536,3256705791,BE 3256705792,3256710655,EU 3256710656,3256710911,SE @@ -74502,11 +80549,10 @@ 3256898048,3256898303,GB 3256898560,3256899071,TR 3256899072,3256899583,RU -3256905216,3256905471,GB -3256909824,3256915455,GB 3256915456,3256915711,RS 3256915712,3256915967,SE -3256918016,3256944639,GB +3256918016,3256934399,GB +3256942592,3256944639,GB 3256945408,3256945663,GB 3256945664,3256945919,SI 3256945920,3256946175,GB @@ -74514,7 +80560,7 @@ 3256946432,3256946687,UA 3256946944,3256947199,EU 3256947200,3256947711,DE -3256947712,3256958975,GB +3256948736,3256958975,GB 3256958976,3256959999,RO 3256960000,3256960255,SA 3256960256,3256960511,HU @@ -74562,7 +80608,6 @@ 3257059328,3257065471,GB 3257073664,3257092351,GB 3257092608,3257092863,RO -3257092864,3257093119,GB 3257093888,3257098239,GB 3257106432,3257139199,GB 3257139200,3257139455,DK @@ -74574,7 +80619,7 @@ 3257144576,3257144831,GB 3257144832,3257145087,FR 3257145088,3257145343,GB -3257147392,3257180159,GB +3257151488,3257180159,GB 3257180160,3257180415,TR 3257180416,3257180671,RU 3257180672,3257180927,EE @@ -74583,7 +80628,6 @@ 3257181440,3257181695,PL 3257181696,3257181951,FR 3257182208,3257182463,PL -3257184256,3257186303,GB 3257192448,3257196543,GB 3257196544,3257200639,LU 3257200640,3257204735,GB @@ -74592,7 +80636,6 @@ 3257229312,3257268223,AT 3257268224,3257268479,UA 3257268480,3257268735,SE -3257268992,3257269247,AT 3257269248,3257269503,IT 3257269504,3257269759,AT 3257270016,3257270271,DE @@ -74609,9 +80652,8 @@ 3257372672,3257382911,DE 3257382912,3257383167,NL 3257383168,3257383679,DE -3257383936,3257389055,DE +3257383936,3257385983,DE 3257390592,3257390847,DE -3257391104,3257391615,DE 3257391616,3257391871,EU 3257391872,3257401343,DE 3257401344,3257453567,CH @@ -74629,9 +80671,7 @@ 3257472000,3257472511,SG 3257472512,3257475071,FI 3257476864,3257477119,DE -3257481216,3257481471,GB 3257481472,3257481727,DE -3257481728,3257481983,FI 3257482240,3257482751,GB 3257482752,3257483007,NL 3257483008,3257491455,CH @@ -74656,7 +80696,9 @@ 3257551624,3257551647,BE 3257551648,3257551711,GB 3257551712,3257551719,BE -3257551720,3257556991,GB +3257551720,3257552732,GB +3257552733,3257552733,SE +3257552734,3257556991,GB 3257557504,3257558015,LU 3257558016,3257559039,RO 3257559552,3257560063,UA @@ -74688,7 +80730,9 @@ 3257729024,3257730047,DE 3257730048,3257740799,NL 3257740800,3257741055,FR -3257741056,3257742335,NL +3257741056,3257741311,NL +3257741312,3257741567,DE +3257741568,3257742335,NL 3257742336,3257743359,DE 3257743360,3257748479,NL 3257748480,3257749503,DE @@ -74697,31 +80741,7 @@ 3257767936,3257782271,NL 3257782272,3257784319,DE 3257784320,3257794559,NL -3257794560,3257835519,GB -3257835520,3257836287,IE -3257836288,3257836543,GB -3257836544,3257836799,IE -3257836800,3257837055,GB -3257837056,3257837311,IE -3257837312,3257837567,GB -3257837568,3257837823,IE -3257837824,3257838335,GB -3257838336,3257838591,IE -3257838592,3257839103,GB -3257839104,3257839359,IE -3257839360,3257839615,GB -3257839616,3257839871,IE -3257839872,3257840127,GB -3257840128,3257840383,IE -3257840384,3257840639,GB -3257840640,3257840895,IE -3257840896,3257841151,GB -3257841152,3257841407,IE -3257841408,3257841663,GB -3257841664,3257841919,IE -3257841920,3257842943,GB -3257842944,3257843199,IE -3257843200,3257843711,GB +3257794560,3257843711,GB 3257843712,3257860095,IE 3257860096,3257925631,SE 3257925632,3257925887,AT @@ -74747,10 +80767,15 @@ 3257987328,3257987583,CZ 3257987840,3257988095,AT 3257990656,3257990911,AT -3257991168,3258003967,DE +3257991168,3257995263,DE +3257996032,3257996287,DE +3257996544,3257996799,CH +3257996800,3258003967,DE 3258003968,3258004479,RU -3258004992,3258005503,DE -3258006528,3258021887,DE +3258004992,3258005247,DE +3258006528,3258015743,DE +3258019328,3258019583,DE +3258019840,3258021887,DE 3258021888,3258022911,RU 3258022912,3258023167,PL 3258023168,3258023423,DE @@ -74875,12 +80900,10 @@ 3258103552,3258103807,AE 3258104320,3258104575,PL 3258104576,3258104831,DE -3258105088,3258105343,CZ 3258105600,3258105855,DE 3258105856,3258109951,CZ 3258109952,3258110207,DK -3258110208,3258110975,CZ -3258111232,3258111487,CZ +3258110464,3258110975,CZ 3258111488,3258111743,PL 3258111744,3258118399,CZ 3258118400,3258118655,UA @@ -74894,7 +80917,9 @@ 3258230784,3258232831,NO 3258232832,3258249215,SE 3258249216,3258253311,NO -3258253312,3258269695,NL +3258253312,3258253567,DE +3258254080,3258254335,NL +3258255360,3258269695,NL 3258271744,3258272767,NL 3258272768,3258273791,FR 3258273792,3258288127,NL @@ -74902,7 +80927,7 @@ 3258297344,3258297599,BE 3258297600,3258298111,NL 3258298112,3258298367,GB -3258298368,3258318847,NL +3258302464,3258318847,NL 3258318848,3258320895,DE 3258320896,3258321919,GB 3258321920,3258322943,RU @@ -74939,17 +80964,17 @@ 3258428416,3258449919,DE 3258449920,3258486783,CH 3258486784,3258487807,LI -3258488832,3258503935,CH +3258488832,3258499071,CH +3258501120,3258503935,CH 3258503936,3258504191,PL -3258504192,3258504703,CH 3258504704,3258504959,DE 3258504960,3258505215,IL -3258505216,3258506495,CH +3258505728,3258506495,CH 3258506496,3258506751,DE -3258507008,3258515455,CH +3258507264,3258515455,CH 3258515456,3258580991,FR 3258580992,3258646527,RU -3258646528,3258689535,DE +3258646528,3258688511,DE 3258689792,3258690047,DE 3258690560,3258690815,EU 3258690816,3258691583,DE @@ -75000,7 +81025,7 @@ 3258776064,3258776319,GE 3258776320,3258776575,PL 3258776576,3258777599,UA -3258777600,3258789887,GB +3258785792,3258789887,GB 3258789888,3258790911,CZ 3258790912,3258792191,RU 3258792192,3258792447,PL @@ -75011,10 +81036,11 @@ 3258794496,3258794751,PL 3258794752,3258795007,RU 3258795008,3258796031,PL -3258797568,3258802175,GB +3258797568,3258798079,GB +3258801152,3258802175,GB 3258802176,3258806271,LU 3258808832,3258809343,GB -3258812416,3258813439,GB +3258814464,3258816511,GB 3258818048,3258818303,SE 3258818560,3258843135,GB 3258843136,3258843391,RU @@ -75025,13 +81051,14 @@ 3258849280,3258859519,GB 3258859520,3258859775,BY 3258859776,3258860031,GB -3258860288,3258900479,GB -3258901504,3258902783,GB +3258860544,3258900479,GB +3258902528,3258902783,GB 3258903040,3258903295,FR 3258903296,3258903551,GB 3258903552,3258903807,DE 3258903808,3258904063,AT -3258904064,3258941439,GB +3258904064,3258904575,GB +3258908672,3258941439,GB 3258941440,3258943487,PL 3258943488,3258944511,BG 3258944512,3258945535,RU @@ -75049,7 +81076,9 @@ 3259226112,3259227391,RU 3259227392,3259227647,KZ 3259227648,3259236351,RU -3259236352,3259237887,SE +3259236352,3259236863,SE +3259236864,3259237119,CH +3259237120,3259237887,SE 3259237888,3259238143,FR 3259238144,3259243007,SE 3259243008,3259243519,AT @@ -75067,9 +81096,13 @@ 3259252480,3259252735,EU 3259252736,3259258623,SE 3259258624,3259258879,ES -3259258880,3259262719,SE +3259258880,3259260927,SE +3259260928,3259261183,DK +3259261184,3259262719,SE 3259262720,3259262975,DK -3259262976,3259276287,SE +3259262976,3259265023,SE +3259265024,3259265535,DE +3259265536,3259276287,SE 3259276288,3259276543,ES 3259276544,3259280639,SE 3259280640,3259280895,US @@ -75118,7 +81151,9 @@ 3259435264,3259435519,IT 3259435520,3259438079,SE 3259438080,3259438335,ES -3259438336,3259454719,SE +3259438336,3259438591,SE +3259438592,3259439103,NO +3259439104,3259454719,SE 3259454720,3259454975,EU 3259454976,3259457279,SE 3259457280,3259457535,IT @@ -75130,23 +81165,30 @@ 3259479808,3259480063,DK 3259480064,3259480831,SE 3259480832,3259481087,ES -3259481088,3259490303,SE +3259481088,3259484671,SE +3259484672,3259485183,ES +3259485184,3259490303,SE 3259490304,3259490815,IN 3259490816,3259491071,SE 3259491072,3259491327,LI -3259491328,3259498495,SE +3259491328,3259495935,SE +3259495936,3259496447,DK +3259496448,3259498495,SE 3259498496,3259541503,GB 3259541504,3259543551,NL 3259543552,3259760639,GB -3259760640,3259814399,DE +3259760640,3259811839,DE +3259813888,3259814399,DE 3259814400,3259814655,AT -3259814656,3259821055,DE +3259814656,3259817983,DE +3259819008,3259821055,DE 3259821824,3259822079,AT 3259822592,3259823103,DE 3259823104,3259823615,RO 3259823616,3259823871,NO 3259823872,3259824127,IE -3259824128,3259891711,DE +3259825408,3259825663,DE +3259826176,3259891711,DE 3259891712,3259893503,BE 3259893504,3259893759,EU 3259893760,3259900866,BE @@ -75172,9 +81214,7 @@ 3259972608,3259973631,UA 3259973632,3259981823,PT 3259981824,3259990015,EG -3259990016,3259995647,FR -3259995648,3259995903,MC -3259995904,3260006399,FR +3259990016,3260006399,FR 3260006400,3260014591,IT 3260014592,3260018687,NL 3260018688,3260019711,GB @@ -75281,10 +81321,12 @@ 3261213696,3261239237,FR 3261239238,3261239238,EU 3261239239,3261267967,FR -3261267968,3261280512,DE +3261267968,3261278207,DE +3261280256,3261280512,DE 3261280513,3261280513,EU 3261280514,3261280767,DE -3261281280,3261297663,DE +3261281280,3261296639,DE +3261296896,3261297151,DE 3261297664,3261297919,RU 3261297920,3261298175,PL 3261298176,3261333503,DE @@ -75297,7 +81339,9 @@ 3261532416,3261532671,GB 3261532672,3261532927,SE 3261532928,3261533183,GB -3261533184,3261534207,SE +3261533184,3261533439,SE +3261533440,3261533695,US +3261533696,3261534207,SE 3261534208,3261534463,NL 3261534464,3261534719,SE 3261534720,3261534975,US @@ -75321,9 +81365,7 @@ 3261689856,3261690351,GB 3261690352,3261690355,EU 3261690356,3261691903,GB -3261691904,3261692997,NL -3261692998,3261692998,US -3261692999,3261694463,NL +3261691904,3261694463,NL 3261694464,3261694975,RU 3261694976,3261695487,PL 3261695488,3261695999,GB @@ -75383,7 +81425,7 @@ 3261816832,3261820927,AT 3261820928,3261821183,RO 3261821184,3261821439,AT -3261821440,3261821695,GB +3261821440,3261821695,NL 3261821696,3261821951,UA 3261821952,3261822207,RU 3261822208,3261822463,UA @@ -75438,7 +81480,6 @@ 3262030848,3262031871,FR 3262033920,3262038015,AX 3262038016,3262038271,FR -3262038272,3262038527,RU 3262038528,3262038783,IL 3262038784,3262039039,NO 3262039040,3262039295,DE @@ -75539,17 +81580,17 @@ 3262185472,3262200319,DE 3262200576,3262200831,EU 3262200832,3262201087,DE -3262201856,3262224383,DE +3262201856,3262222335,DE +3262223360,3262223871,DE 3262224896,3262225151,AT 3262226432,3262227455,DE 3262227712,3262227967,RO -3262227968,3262228223,DE 3262228480,3262228735,DE -3262228992,3262229247,DE 3262229248,3262229503,NL -3262229504,3262283775,DE +3262229760,3262230015,DE +3262230528,3262283775,DE 3262283776,3262284799,RU -3262284800,3262286847,UA +3262284800,3262285823,UA 3262286848,3262287871,SE 3262287872,3262288127,MD 3262288128,3262288383,FR @@ -75598,7 +81639,8 @@ 3262436352,3262436863,SE 3262437888,3262438399,FR 3262438400,3262438911,NL -3262438912,3262439423,DK +3262438912,3262439167,DK +3262439168,3262439423,SE 3262439424,3262439935,AT 3262439936,3262440447,IL 3262440960,3262441471,IL @@ -75722,9 +81764,7 @@ 3262479429,3262479654,DE 3262479655,3262479655,NL 3262479656,3262479871,DE -3262479872,3262479881,EU -3262479882,3262479882,DE -3262479883,3262480127,EU +3262479872,3262480127,EU 3262480128,3262480282,DE 3262480283,3262480283,GB 3262480284,3262480317,DE @@ -75752,7 +81792,9 @@ 3262636032,3262644223,BE 3262644224,3262648319,NL 3262648320,3262648575,EU -3262648576,3262654463,NL +3262648576,3262650111,NL +3262650112,3262650367,DE +3262650368,3262654463,NL 3262654464,3262654719,DE 3262654720,3262664703,NL 3262664704,3262665727,DE @@ -75766,20 +81808,16 @@ 3262690816,3262691583,DE 3262691584,3262693375,NL 3262693376,3262701567,DE -3262701568,3262715135,NL -3262715136,3262715391,DE -3262715392,3262722815,NL +3262701568,3262722815,NL 3262722816,3262723071,DE -3262723072,3262732799,NL -3262732800,3262733055,DE -3262733056,3262753791,NL +3262723072,3262753791,NL 3262753792,3262754815,DE 3262754816,3262832639,NL 3262832640,3262840319,DE 3262840320,3262906367,NL 3262906368,3262954495,CH 3262954496,3262955519,LI -3262955520,3262964991,CH +3262955520,3262964735,CH 3262964992,3262965247,DE 3262965248,3262971903,CH 3262971904,3263029247,IE @@ -75843,7 +81881,6 @@ 3263096320,3263096575,TR 3263096576,3263096831,SA 3263096832,3263097087,PL -3263097088,3263097343,FR 3263097344,3263097599,DK 3263097600,3263097855,NL 3263097856,3263098111,FR @@ -75859,7 +81896,6 @@ 3263100928,3263101183,AT 3263101184,3263101439,SE 3263101440,3263101695,DK -3263101696,3263101951,RU 3263101952,3263102207,LT 3263102208,3263102463,GB 3263102464,3263102719,PL @@ -75869,20 +81905,23 @@ 3263104032,3263104040,DE 3263104041,3263104041,GB 3263104042,3263121407,DE -3263121408,3263121420,EU -3263121421,3263121421,BE -3263121422,3263121663,EU +3263121408,3263121663,EU 3263121664,3263137791,DE 3263137792,3263138303,PL -3263138304,3263138551,DE -3263138552,3263138815,AT +3263138304,3263138559,DE +3263138560,3263138815,AT 3263138816,3263168511,DE 3263168512,3263430655,GB -3263430656,3263436543,SE +3263430656,3263433471,SE +3263433472,3263433727,NO +3263433728,3263436543,SE 3263436544,3263436799,ES -3263436800,3263443455,SE +3263436800,3263438591,SE +3263438592,3263438847,IT +3263438848,3263443455,SE 3263443456,3263443967,NL -3263443968,3263446527,SE +3263443968,3263446271,SE +3263446272,3263446527,CH 3263446528,3263447039,DE 3263447040,3263458047,SE 3263458048,3263458303,DE @@ -75891,19 +81930,35 @@ 3263459840,3263460095,SE 3263460096,3263460351,GB 3263460352,3263469567,SE -3263469568,3263470591,SG +3263469568,3263469663,SG +3263469664,3263469695,US +3263469696,3263469855,SG +3263469856,3263469887,US +3263469888,3263470591,SG 3263470592,3263475711,SE -3263475712,3263476735,JP +3263475712,3263476159,JP +3263476160,3263476191,GB +3263476192,3263476255,JP +3263476256,3263476287,GB +3263476288,3263476415,JP +3263476416,3263476479,GB +3263476480,3263476671,JP +3263476672,3263476703,GB +3263476704,3263476735,JP 3263476736,3263478527,SE 3263478528,3263478783,ES 3263478784,3263480831,SE -3263480832,3263481855,JP +3263480832,3263481343,JP +3263481344,3263481359,GB +3263481360,3263481455,JP +3263481456,3263481471,GB +3263481472,3263481487,JP +3263481488,3263481503,GB +3263481504,3263481855,JP 3263481856,3263482879,SE 3263482880,3263483903,GB 3263483904,3263496191,SE -3263496192,3263501519,GB -3263501520,3263501527,IE -3263501528,3263503103,GB +3263496192,3263503103,GB 3263503104,3263503359,DE 3263503360,3263511551,GB 3263511552,3263512063,BE @@ -75911,16 +81966,32 @@ 3263512576,3263512831,ES 3263512832,3263513855,GB 3263513856,3263514111,RU -3263514112,3263518719,GB -3263518720,3263518751,IE -3263518752,3263520767,GB +3263514112,3263520767,GB 3263520768,3263525887,DE 3263525888,3263526143,ZA 3263526144,3263545343,DE 3263545344,3263561727,US 3263561728,3263627263,NL -3263627264,3263647743,RU -3263647744,3263651839,LT +3263627264,3263627519,RU +3263627520,3263628031,UA +3263628032,3263631359,RU +3263631360,3263632127,UA +3263632128,3263632383,RU +3263632384,3263632639,UA +3263632640,3263633151,RU +3263633152,3263633663,UA +3263633664,3263635455,RU +3263635456,3263636223,UA +3263636224,3263636479,RU +3263636480,3263636991,UA +3263636992,3263637247,RU +3263637248,3263637503,UA +3263637504,3263638527,RU +3263638528,3263639039,UA +3263639040,3263647743,RU +3263647744,3263651619,LT +3263651620,3263651620,RU +3263651621,3263651839,LT 3263651840,3263666175,RU 3263666176,3263676415,AZ 3263676416,3263678463,RU @@ -75929,13 +82000,7 @@ 3263692800,3263823871,FI 3263823872,3263826943,DE 3263826944,3263827199,AT -3263827200,3263833855,DE -3263833856,3263833903,GB -3263833904,3263833919,DE -3263833920,3263834111,GB -3263834112,3263878145,DE -3263878146,3263878146,US -3263878147,3263886079,DE +3263827200,3263886079,DE 3263886080,3263886335,SG 3263886336,3263954943,DE 3263954944,3263979519,ES @@ -75989,9 +82054,7 @@ 3264282624,3264290815,GB 3264290816,3264296191,FI 3264296192,3264297727,FR -3264297728,3264297983,DE -3264297984,3264298239,PT -3264298240,3264298751,DE +3264297728,3264298751,DE 3264298752,3264299007,BG 3264299008,3264307199,DE 3264307200,3264311295,PL @@ -76055,8 +82118,7 @@ 3264345088,3264346111,NL 3264346112,3264347135,SE 3264347136,3264348159,DE -3264348160,3264356351,FR -3264356608,3264356863,FR +3264352256,3264356351,FR 3264357632,3264357887,DE 3264359936,3264360191,FR 3264360448,3264369151,FR @@ -76106,23 +82168,27 @@ 3264430592,3264430847,CH 3264431104,3264431615,LI 3264431616,3264431871,CH -3264432128,3264440831,CH +3264432128,3264440575,CH 3264441344,3264441599,PL -3264442368,3264446463,CH +3264442368,3264442879,CH 3264447488,3264447743,CH 3264447744,3264447999,DE 3264448000,3264448511,CH -3264449536,3264452607,CH -3264454656,3264457471,CH +3264449536,3264450559,CH +3264452352,3264452607,CH +3264454656,3264455679,CH +3264456704,3264457215,CH 3264457472,3264457727,AT -3264457728,3264463871,CH +3264457984,3264458239,CH +3264458752,3264463871,CH 3264463872,3264466943,LI 3264466944,3264475391,CH 3264476416,3264476671,CH 3264476672,3264477183,RU 3264477184,3264477439,PL 3264477440,3264477695,RU -3264477952,3264544767,CH +3264478720,3264478975,CH +3264479232,3264544767,CH 3264544768,3264556799,HU 3264556800,3264557055,BG 3264557056,3264557823,HU @@ -76159,7 +82225,9 @@ 3264613028,3264613031,FR 3264613032,3264614911,GB 3264614912,3264615167,SE -3264615168,3264617983,GB +3264615168,3264616263,GB +3264616264,3264616271,CH +3264616272,3264617983,GB 3264617984,3264618239,US 3264618240,3264619391,GB 3264619392,3264619519,BE @@ -76197,7 +82265,6 @@ 3264660992,3264661503,CH 3264661504,3264662015,GB 3264662016,3264662527,RU -3264662528,3264663039,UA 3264663040,3264663551,PL 3264663552,3264664063,NL 3264664064,3264664575,DE @@ -76297,17 +82364,14 @@ 3264846208,3264846335,AE 3264846336,3264846463,GB 3264846464,3264846591,NO -3264846720,3264846847,RU 3264846848,3264846911,DK 3264846912,3264847103,CY -3264847168,3264847199,IE 3264847232,3264847263,CH 3264847264,3264847295,LI 3264847296,3264847359,CY 3264847488,3264847615,RU 3264847616,3264847679,PL 3264847680,3264847743,FI -3264847808,3264847871,SE 3264847872,3264849919,DE 3264849920,3264850431,GB 3264850688,3264850943,LV @@ -76334,19 +82398,23 @@ 3264921600,3264929791,LU 3264929792,3264937983,SK 3264937984,3265003519,GB -3265003520,3265015807,DE +3265003520,3265005567,DE +3265007616,3265009663,DE +3265009664,3265009919,FR +3265009920,3265010175,DE +3265011712,3265015807,DE 3265015808,3265016063,EU 3265016064,3265018879,DE 3265018880,3265019903,HK 3265036288,3265044479,DE 3265044736,3265044991,DE 3265045760,3265046015,TR -3265046016,3265046271,DE 3265046528,3265048575,DE 3265050624,3265052671,DE -3265053696,3265054719,DE +3265053696,3265054207,DE 3265055232,3265055743,FR -3265055744,3265069055,DE +3265056256,3265056511,DE +3265056768,3265069055,DE 3265069056,3265134591,FI 3265134592,3265134863,CH 3265134864,3265134879,BE @@ -76367,10 +82435,8 @@ 3265141152,3265141551,CH 3265141552,3265141555,IE 3265141556,3265141759,CH -3265141760,3265141775,GB -3265141776,3265141791,CH -3265141792,3265141887,GB -3265141888,3265142783,CH +3265141760,3265142015,GB +3265142016,3265142783,CH 3265142784,3265150975,MT 3265150976,3265159167,AD 3265159168,3265167359,FR @@ -76414,9 +82480,7 @@ 3265392640,3265394687,EU 3265394688,3265396735,GB 3265396736,3265527807,DE -3265527808,3265582476,GB -3265582477,3265582477,LB -3265582478,3265593343,GB +3265527808,3265593343,GB 3265593344,3265594367,RU 3265594880,3265595391,UA 3265595392,3265595903,PL @@ -76424,7 +82488,6 @@ 3265596928,3265597439,FR 3265597440,3265597951,MC 3265597952,3265599999,RU -3265600000,3265600255,HU 3265600512,3265601023,GB 3265601024,3265601535,RU 3265601536,3265601791,SE @@ -76467,12 +82530,12 @@ 3265825024,3265867775,GB 3265868288,3265868543,GB 3265868800,3265869055,DE -3265869312,3265869823,GB -3265871872,3265886207,GB +3265871872,3265875967,GB +3265880064,3265886207,GB 3265887232,3265887487,GB 3265887488,3265887743,PT 3265887744,3265888255,PL -3265888256,3265902335,GB +3265888256,3265901567,GB 3265902336,3265902591,FR 3265904384,3265904639,RO 3265904640,3265904895,DE @@ -76589,25 +82652,21 @@ 3266384896,3266385919,RU 3266385920,3266386943,UA 3266386944,3266387967,PL -3266387968,3266395647,FR -3266395648,3266395903,NL -3266395904,3266396159,FR +3266387968,3266396159,FR 3266396160,3266412543,IT 3266412544,3266420735,AT 3266420736,3266428927,GB 3266428928,3266437119,GR 3266437120,3266445311,GL -3266445312,3266510847,NL +3266445312,3266472959,NL +3266472960,3266473215,SE +3266473216,3266510847,NL 3266510848,3266543615,ES 3266543616,3266576383,IT -3266576384,3266616831,DE -3266617088,3266617279,DE +3266576384,3266616575,DE 3266617328,3266617343,GB -3266617344,3266634271,DE -3266634368,3266634383,DE +3266617344,3266633727,DE 3266634392,3266634399,EE -3266634400,3266634431,DE -3266634496,3266634751,DE 3266635776,3266641919,DE 3266641920,3266707455,PL 3266707456,3266772991,DK @@ -76618,7 +82677,9 @@ 3266797824,3266798079,ES 3266798080,3266798847,GB 3266798848,3266798879,CZ -3266798880,3266805759,GB +3266798880,3266804639,GB +3266804640,3266804643,NL +3266804644,3266805759,GB 3266805760,3266813951,AT 3266813952,3266822143,UA 3266822144,3266830335,FR @@ -76649,7 +82710,8 @@ 3267059712,3267060735,NL 3267060736,3267061759,LV 3267061760,3267063807,UA -3267063808,3267064576,BE +3267063808,3267064063,DE +3267064064,3267064576,BE 3267064577,3267064577,EU 3267064578,3267064831,BE 3267064832,3267065855,PL @@ -76721,7 +82783,9 @@ 3267549184,3267550207,DK 3267550208,3267559423,EU 3267559424,3267624959,DE -3267624960,3267628399,EU +3267624960,3267627407,EU +3267627408,3267627411,GB +3267627412,3267628399,EU 3267628400,3267628415,FR 3267628416,3267630079,EU 3267630080,3267631095,GB @@ -76852,17 +82916,13 @@ 3268236032,3268236191,EU 3268236192,3268236207,GB 3268236208,3268236543,EU -3268236544,3268236799,GB +3268236544,3268236607,GB +3268236608,3268236671,EU +3268236672,3268236799,GB 3268236800,3268237823,EU 3268237824,3268237855,GB 3268237856,3268238335,EU -3268238336,3268238359,GB -3268238360,3268238367,EU -3268238368,3268238399,GB -3268238400,3268238471,EU -3268238472,3268238543,GB -3268238544,3268238551,EU -3268238552,3268238591,GB +3268238336,3268238591,GB 3268238592,3268238631,EU 3268238632,3268238783,GB 3268238784,3268238815,EU @@ -76914,8 +82974,10 @@ 3268251312,3268251327,IE 3268251328,3268251647,GB 3268251648,3268254463,EU -3268254464,3268254719,GB -3268254720,3268254895,EU +3268254464,3268254543,GB +3268254544,3268254623,EU +3268254624,3268254639,GB +3268254640,3268254895,EU 3268254896,3268254903,GB 3268254904,3268255823,EU 3268255824,3268255863,GB @@ -77068,7 +83130,8 @@ 3268765184,3268765695,RU 3268765696,3268766719,UA 3268766720,3268767231,IL -3268767232,3268767743,RU +3268767232,3268767487,UA +3268767488,3268767743,RU 3268767744,3268768255,NL 3268768256,3268768767,BE 3268768768,3268769279,RU @@ -77148,7 +83211,8 @@ 3269285336,3269285343,FR 3269285344,3269285344,GB 3269285345,3269285345,EU -3269285346,3269285631,GB +3269285346,3269285375,GB +3269285376,3269285631,FR 3269285632,3269285887,DE 3269285888,3269286399,EU 3269286400,3269286463,DE @@ -77261,9 +83325,9 @@ 3269918720,3269984255,DE 3269984256,3270049791,AT 3270049792,3270115327,DE -3270115328,3270140927,EU -3270140928,3270141183,NO -3270141184,3270148351,EU +3270115328,3270131711,EU +3270131712,3270148095,NO +3270148096,3270148351,EU 3270148352,3270149887,FI 3270149888,3270150655,EU 3270150656,3270151423,FI @@ -77331,10 +83395,8 @@ 3270903808,3270905855,SE 3270905856,3270906111,EU 3270906112,3270909951,IT -3270909952,3270911743,DE 3270911840,3270911871,PL 3270911872,3270911935,DE -3270911936,3270911967,PL 3270911968,3270911999,NL 3270913024,3270913535,DE 3270913536,3270913791,EU @@ -77343,7 +83405,7 @@ 3270921216,3270921471,DK 3270921472,3270921727,UA 3270921728,3270922239,GB -3270922240,3270924287,DE +3270923264,3270924287,DE 3270926336,3270926591,AT 3270926592,3270926847,CH 3270926848,3270927103,PL @@ -77531,7 +83593,6 @@ 3271916544,3271917311,UA 3271917312,3271925759,RU 3271925760,3271926015,DK -3271926016,3271926271,MD 3271926272,3271926527,RU 3271926528,3271926783,NL 3271926784,3271927295,SI @@ -77557,8 +83618,9 @@ 3271933184,3271933439,GB 3271933440,3271933695,SE 3271933696,3271933951,DE -3271933952,3272015871,FR -3272015872,3272019967,RO +3271933952,3271936767,FR +3271936768,3271937023,US +3271937024,3272015871,FR 3272019968,3272020991,IT 3272020992,3272024063,DK 3272024064,3272032255,IE @@ -77569,9 +83631,7 @@ 3272065024,3272073727,GB 3272073728,3272073855,IE 3272073856,3272081407,GB -3272081408,3272084025,PT -3272084026,3272084026,AO -3272084027,3272087551,PT +3272081408,3272087551,PT 3272087552,3272088575,MR 3272088576,3272089599,PT 3272089600,3272090111,NO @@ -77706,8 +83766,8 @@ 3272217152,3272217215,EU 3272217216,3272217279,BE 3272217280,3272217303,DE -3272217304,3272217319,BE -3272217320,3272217343,EU +3272217304,3272217327,BE +3272217328,3272217343,EU 3272217344,3272217599,GB 3272217600,3272217631,CH 3272217632,3272217855,EU @@ -77809,7 +83869,9 @@ 3272268288,3272268543,UA 3272268800,3272269055,IL 3272269056,3272269311,GB -3272269568,3272351743,GB +3272269568,3272293631,GB +3272293632,3272293887,AU +3272293888,3272351743,GB 3272351744,3272352767,PL 3272352768,3272353791,UA 3272353792,3272355839,CH @@ -77828,9 +83890,9 @@ 3272401216,3272401247,PL 3272401248,3272401279,EU 3272401280,3272401407,NL -3272401408,3272402431,EU -3272402432,3272402687,GB -3272402688,3272403071,EU +3272401408,3272402559,EU +3272402560,3272402623,GB +3272402624,3272403071,EU 3272403072,3272403199,NL 3272403200,3272403967,EU 3272403968,3272404991,FR @@ -77838,9 +83900,7 @@ 3272406016,3272407039,NL 3272407040,3272409087,EU 3272409088,3272417279,BE -3272417280,3272418303,FR -3272418304,3272418559,GB -3272418560,3272418687,FR +3272417280,3272418815,FR 3272418816,3272419327,PL 3272419328,3272420351,DE 3272420864,3272420991,PL @@ -78025,7 +84085,9 @@ 3273048064,3273056255,IT 3273056256,3273064447,MD 3273064448,3273129983,PT -3273129984,3273138175,DK +3273129984,3273132287,DK +3273132288,3273132543,GB +3273132544,3273138175,DK 3273138176,3273146367,BG 3273146368,3273148415,RU 3273148416,3273150463,LU @@ -78048,7 +84110,9 @@ 3273193984,3273194495,EU 3273194496,3273195007,UA 3273195008,3273195519,RU -3273195520,3273261055,FR +3273195520,3273207807,FR +3273207808,3273208063,RE +3273208064,3273261055,FR 3273261056,3273261567,NO 3273261568,3273262079,BE 3273262080,3273262591,LU @@ -78091,7 +84155,13 @@ 3273327584,3273327615,IE 3273327616,3273328511,EU 3273328512,3273328639,DE -3273328640,3273329423,GB +3273328640,3273329199,GB +3273329200,3273329215,DE +3273329216,3273329279,GB +3273329280,3273329311,EU +3273329312,3273329327,GB +3273329328,3273329407,EU +3273329408,3273329423,GB 3273329424,3273329439,DE 3273329440,3273330175,GB 3273330176,3273330183,IR @@ -78129,7 +84199,9 @@ 3273335432,3273335455,GB 3273335456,3273335511,EU 3273335512,3273335535,GB -3273335536,3273335935,EU +3273335536,3273335615,EU +3273335616,3273335623,GB +3273335624,3273335935,EU 3273335936,3273335999,DE 3273336000,3273336847,EU 3273336848,3273336863,DE @@ -78199,7 +84271,9 @@ 3273363208,3273363211,DE 3273363212,3273363327,EU 3273363328,3273363391,DE -3273363392,3273364607,EU +3273363392,3273363455,EU +3273363456,3273364479,GB +3273364480,3273364607,EU 3273364608,3273364735,DE 3273364736,3273364991,EU 3273364992,3273365247,DE @@ -78234,8 +84308,8 @@ 3273372928,3273373183,NL 3273373184,3273373455,GB 3273373456,3273373567,DE -3273373568,3273373695,GB -3273373696,3273375231,EU +3273373568,3273374719,GB +3273374720,3273375231,EU 3273375232,3273375551,DE 3273375552,3273375743,EU 3273375744,3273375871,DE @@ -78288,7 +84362,9 @@ 3273388912,3273388927,GB 3273388928,3273389055,DE 3273389056,3273390079,EU -3273390080,3273390207,DE +3273390080,3273390111,DE +3273390112,3273390143,US +3273390144,3273390207,DE 3273390208,3273390367,EU 3273390368,3273390463,DE 3273390464,3273391103,EU @@ -78319,21 +84395,18 @@ 3273436672,3273437183,DE 3273437184,3273437695,RO 3273438208,3273438719,IL -3273438720,3273439231,RU +3273438720,3273439231,GB 3273439232,3273439743,RO 3273439744,3273440255,DE 3273440256,3273440767,RO -3273440768,3273441023,AT -3273441024,3273441279,PL +3273440768,3273441279,PL 3273441280,3273449471,FR 3273449472,3273457663,CH 3273457664,3273523199,HR 3273523200,3273588735,DE 3273588736,3273687039,IT 3273687040,3273719807,DE -3273719808,3273720831,NL -3273720832,3273720847,IE -3273720848,3273727079,NL +3273719808,3273727079,NL 3273727080,3273727088,GB 3273727089,3273727095,ES 3273727096,3273727103,DE @@ -78473,7 +84546,6 @@ 3274172416,3274172927,UA 3274172928,3274173439,DE 3274173440,3274173951,GR -3274173952,3274174207,GB 3274174208,3274174463,CZ 3274174464,3274175487,UA 3274175488,3274175999,BE @@ -78592,8 +84664,16 @@ 3274448640,3274448895,EU 3274448896,3274449663,GB 3274449664,3274449919,EU -3274449920,3274450623,GB -3274450624,3274450655,EU +3274449920,3274450231,GB +3274450232,3274450247,EU +3274450248,3274450367,GB +3274450368,3274450375,EU +3274450376,3274450391,GB +3274450392,3274450407,EU +3274450408,3274450415,GB +3274450416,3274450431,EU +3274450432,3274450591,GB +3274450592,3274450655,EU 3274450656,3274450687,GB 3274450688,3274451199,EU 3274451200,3274452255,GB @@ -78912,7 +84992,11 @@ 3275423752,3275423807,EU 3275423808,3275423839,GB 3275423840,3275423871,EU -3275423872,3275424719,GB +3275423872,3275424303,GB +3275424304,3275424319,EU +3275424320,3275424487,GB +3275424488,3275424495,EU +3275424496,3275424719,GB 3275424720,3275424727,EU 3275424728,3275424735,GB 3275424736,3275424751,EU @@ -78922,7 +85006,11 @@ 3275425344,3275425535,EU 3275425536,3275426559,GB 3275426560,3275426575,EU -3275426576,3275428367,GB +3275426576,3275427599,GB +3275427600,3275427615,EU +3275427616,3275427715,GB +3275427716,3275427727,EU +3275427728,3275428367,GB 3275428368,3275428375,EU 3275428376,3275428407,GB 3275428408,3275428415,EU @@ -78956,13 +85044,7 @@ 3275441836,3275441839,EU 3275441840,3275442723,GB 3275442724,3275443199,EU -3275443200,3275443227,GB -3275443228,3275443231,EU -3275443232,3275443239,GB -3275443240,3275443247,EU -3275443248,3275443407,GB -3275443408,3275443423,EU -3275443424,3275443727,GB +3275443200,3275443727,GB 3275443728,3275443759,EU 3275443760,3275443775,GB 3275443776,3275443839,EU @@ -78978,15 +85060,7 @@ 3275447040,3275447055,EU 3275447056,3275447151,GB 3275447152,3275448319,EU -3275448320,3275449359,GB -3275449360,3275449375,EU -3275449376,3275449399,GB -3275449400,3275449407,EU -3275449408,3275449519,GB -3275449520,3275449527,FR -3275449528,3275449567,GB -3275449568,3275449583,EU -3275449584,3275450207,GB +3275448320,3275450207,GB 3275450208,3275450223,EU 3275450224,3275450879,GB 3275450880,3275451231,EU @@ -79002,15 +85076,7 @@ 3275451768,3275451775,EU 3275451776,3275451779,GB 3275451780,3275452415,EU -3275452416,3275453695,GB -3275453696,3275453823,EU -3275453824,3275453839,GB -3275453840,3275453847,EU -3275453848,3275454063,GB -3275454064,3275454079,EU -3275454080,3275454127,GB -3275454128,3275454143,EU -3275454144,3275455231,GB +3275452416,3275455231,GB 3275455232,3275455247,EU 3275455248,3275456407,GB 3275456408,3275456415,EU @@ -79025,7 +85091,15 @@ 3275460296,3275460351,EU 3275460352,3275460607,IE 3275460608,3275460863,HK -3275460864,3275468655,GB +3275460864,3275463423,GB +3275463424,3275463455,EU +3275463456,3275463495,GB +3275463496,3275463503,EU +3275463504,3275463523,GB +3275463524,3275463527,EU +3275463528,3275463635,GB +3275463636,3275463639,EU +3275463640,3275468655,GB 3275468656,3275468671,IE 3275468672,3275468735,GB 3275468736,3275468751,IE @@ -79041,7 +85115,15 @@ 3275475792,3275475799,EU 3275475800,3275475879,GB 3275475880,3275475967,EU -3275475968,3275476735,GB +3275475968,3275476223,GB +3275476224,3275476287,EU +3275476288,3275476479,GB +3275476480,3275476607,EU +3275476608,3275476631,GB +3275476632,3275476655,EU +3275476656,3275476687,GB +3275476688,3275476703,EU +3275476704,3275476735,GB 3275476736,3275476919,EU 3275476920,3275476927,GB 3275476928,3275476943,EU @@ -79092,7 +85174,6 @@ 3275510400,3275510463,NL 3275510464,3275510527,GB 3275510528,3275510559,PL -3275510560,3275510591,DE 3275510592,3275510623,CY 3275510624,3275510655,EE 3275510656,3275510687,FR @@ -79308,37 +85389,43 @@ 3275921920,3275922431,DE 3275922432,3275922943,UA 3275922944,3275923455,GR -3275923456,3275931647,ME +3275923456,3275924991,ME +3275924992,3275925759,RS +3275925760,3275928927,ME +3275928928,3275928943,RS +3275928944,3275931647,ME 3275931648,3275939839,UA 3275939840,3275948031,GB 3275948032,3276013567,SE -3276013568,3276014079,GB -3276014080,3276014335,FR -3276014336,3276014799,GB +3276013568,3276014239,GB +3276014240,3276014247,FR +3276014248,3276014335,GB +3276014336,3276014591,FR +3276014592,3276014799,GB 3276014800,3276014815,FR 3276014816,3276014951,GB 3276014952,3276014959,ES -3276014960,3276020129,GB -3276020130,3276020130,FR -3276020131,3276023039,GB -3276023040,3276023295,FR -3276023296,3276025159,GB +3276014960,3276020735,GB +3276020736,3276020991,FR +3276020992,3276021503,GB +3276021504,3276021759,FR +3276021760,3276025159,GB 3276025160,3276025167,FR -3276025168,3276026367,GB -3276026368,3276026623,FR -3276026624,3276027391,GB -3276027392,3276027647,FR -3276027648,3276028543,GB +3276025168,3276028543,GB 3276028544,3276028671,FR -3276028672,3276029183,GB -3276029184,3276029439,FR +3276028672,3276029375,GB +3276029376,3276029439,FR 3276029440,3276030591,GB 3276030592,3276030607,FR 3276030608,3276031479,GB 3276031480,3276031487,FR 3276031488,3276032311,GB 3276032312,3276032319,FR -3276032320,3276039263,GB +3276032320,3276033791,GB +3276033792,3276034047,FR +3276034048,3276036543,GB +3276036544,3276036607,FR +3276036608,3276039263,GB 3276039264,3276039279,FR 3276039280,3276040351,GB 3276040352,3276040367,FR @@ -79346,13 +85433,9 @@ 3276042016,3276042031,FR 3276042032,3276042079,GB 3276042080,3276042095,FR -3276042096,3276042751,GB -3276042752,3276043007,FR -3276043008,3276045247,GB +3276042096,3276045247,GB 3276045248,3276045255,FR -3276045256,3276045823,GB -3276045824,3276046079,FR -3276046080,3276046335,GB +3276045256,3276046335,GB 3276046336,3276062719,RU 3276062720,3276063231,PL 3276063232,3276063743,FR @@ -79415,7 +85498,7 @@ 3276128256,3276129279,AT 3276129280,3276131327,UA 3276131328,3276132351,RU -3276132352,3276133375,LB +3276132352,3276133375,PL 3276133376,3276134399,GB 3276134400,3276135423,RU 3276135424,3276136447,UA @@ -79501,24 +85584,23 @@ 3276473304,3276473311,AT 3276473312,3276474879,EU 3276474880,3276474927,IT -3276474928,3276478063,EU +3276474928,3276477975,EU +3276477976,3276477983,NL +3276477984,3276478063,EU 3276478064,3276478095,CH -3276478096,3276478719,EU -3276478720,3276478975,FR -3276478976,3276485631,EU +3276478096,3276485631,EU 3276485632,3276486655,GB 3276486656,3276490775,EU 3276490776,3276490776,NL 3276490777,3276490781,EU 3276490782,3276490782,AT 3276490783,3276490783,CH -3276490784,3276494335,EU -3276494336,3276494591,GB -3276494592,3276499503,EU +3276490784,3276499503,EU 3276499504,3276499567,DE 3276499568,3276503039,EU 3276503040,3276505087,DE -3276505088,3276509183,EU +3276505088,3276508927,EU +3276508928,3276509183,GB 3276509184,3276510207,IT 3276510208,3276512255,EU 3276512256,3276513023,ZA @@ -79652,15 +85734,21 @@ 3276874960,3276874975,NL 3276874976,3276876383,GB 3276876384,3276876415,NL -3276876416,3276882175,GB -3276882176,3276882687,IT +3276876416,3276880427,GB +3276880428,3276880431,DK +3276880432,3276881811,GB +3276881812,3276881815,FR +3276881816,3276882047,GB +3276882048,3276882687,IT 3276882688,3276883077,GB 3276883078,3276883078,IT 3276883079,3276883711,GB 3276883712,3276883839,IT 3276883840,3276886363,GB 3276886364,3276886367,DE -3276886368,3276890175,GB +3276886368,3276886649,GB +3276886650,3276886650,DE +3276886651,3276890175,GB 3276890176,3276890191,US 3276890192,3276892159,GB 3276892160,3276893183,IT @@ -79674,29 +85762,39 @@ 3276901614,3276901614,CH 3276901615,3276902141,GB 3276902142,3276902142,CH -3276902143,3276902655,GB +3276902143,3276902367,GB +3276902368,3276902399,CH +3276902400,3276902655,GB 3276902656,3276902911,SE -3276902912,3276907341,GB +3276902912,3276903423,GB +3276903424,3276903487,SE +3276903488,3276903551,GB +3276903552,3276903679,SE +3276903680,3276907341,GB 3276907342,3276907342,EU 3276907343,3276907519,GB 3276907520,3276907551,NL 3276907552,3276911167,GB 3276911168,3276911199,IT -3276911200,3276911615,GB -3276911616,3276911871,IT -3276911872,3276912207,GB +3276911200,3276911679,GB +3276911680,3276911711,IT +3276911712,3276912207,GB 3276912208,3276912215,IT 3276912216,3276912287,GB 3276912288,3276912319,IT 3276912320,3276912383,GB -3276912384,3276912511,IT -3276912512,3276912671,GB +3276912384,3276912639,IT +3276912640,3276912671,GB 3276912672,3276912687,IT 3276912688,3276912879,GB 3276912880,3276912895,IT 3276912896,3276917231,GB 3276917232,3276917247,FR -3276917248,3276919375,GB +3276917248,3276917735,GB +3276917736,3276917739,ES +3276917740,3276919061,GB +3276919062,3276919062,DE +3276919063,3276919375,GB 3276919376,3276919391,DE 3276919392,3276919471,GB 3276919472,3276919479,DE @@ -79867,12 +85965,10 @@ 3277373952,3277374463,FR 3277374464,3277375999,RU 3277376000,3277376511,NL -3277376512,3277377023,RO -3277377024,3277378559,RU +3277377024,3277378047,RU 3277378560,3277379071,HR 3277379072,3277379583,UZ 3277379584,3277380095,RS -3277380096,3277380607,RO 3277380608,3277381119,RU 3277381120,3277381631,KW 3277381632,3277382143,RU @@ -79891,25 +85987,16 @@ 3277389824,3277394943,GB 3277394944,3277395455,US 3277395456,3277403135,GB -3277403136,3277403215,FR -3277403216,3277403231,GB -3277403232,3277403279,FR -3277403280,3277403295,DE -3277403296,3277403311,FR -3277403312,3277403327,GB -3277403328,3277403359,FR -3277403360,3277403375,GB -3277403376,3277403471,FR +3277403136,3277403471,FR 3277403472,3277403647,GB -3277403648,3277403807,ES -3277403808,3277404159,GB +3277403648,3277403903,ES +3277403904,3277404159,GB 3277404160,3277404415,DE 3277404416,3277404655,IT 3277404656,3277404671,GB 3277404672,3277404735,CH 3277404736,3277404927,GB -3277404928,3277404975,NL -3277404976,3277405183,GB +3277404928,3277405183,NL 3277405184,3277405263,SE 3277405264,3277405439,GB 3277405440,3277405471,DE @@ -79933,7 +86020,6 @@ 3277483520,3277484031,RO 3277484032,3277484543,CH 3277486080,3277486591,GB -3277486592,3277487103,UA 3277487104,3277487615,RO 3277487616,3277488127,PL 3277488128,3277504511,RU @@ -79972,7 +86058,10 @@ 3277698560,3277699071,DE 3277699584,3277700607,RU 3277700608,3277701119,UA -3277701120,3277701631,DK +3277701120,3277701311,SE +3277701312,3277701313,DK +3277701314,3277701375,SE +3277701376,3277701631,DK 3277701632,3277702143,AT 3277702144,3277702655,EU 3277702656,3277703679,DE @@ -80033,7 +86122,7 @@ 3277821952,3277822207,RO 3277822208,3277822463,ES 3277822464,3277822719,PL -3277822976,3277823231,SG +3277822976,3277823231,ES 3277823232,3277823487,UA 3277823488,3277823743,SI 3277823744,3277823999,UA @@ -80092,9 +86181,7 @@ 3277873152,3277881343,NL 3277881344,3277886463,A2 3277886464,3277887487,IQ -3277887488,3277888255,A2 -3277888256,3277888767,LB -3277888768,3277889535,A2 +3277887488,3277889535,A2 3277889536,3277897727,RU 3277897728,3277905919,IT 3277905920,3277914111,BG @@ -80308,7 +86395,9 @@ 3279085568,3279089663,NL 3279089664,3279093759,KG 3279093760,3279123455,FR -3279123456,3279123967,RE +3279123456,3279123714,RE +3279123715,3279123715,FR +3279123716,3279123967,RE 3279123968,3279159295,FR 3279159296,3279290367,PL 3279290368,3279292415,EU @@ -80370,9 +86459,7 @@ 3279618048,3279683583,UA 3279683584,3279688191,DE 3279688192,3279688447,EU -3279688448,3279794943,DE -3279794944,3279795199,NO -3279795200,3279895295,DE +3279688448,3279895295,DE 3279895296,3279895551,EU 3279895552,3279946751,DE 3279946752,3279947775,SE @@ -80429,7 +86516,7 @@ 3279994368,3279994879,GB 3279994880,3280003071,CZ 3280003072,3280003583,BG -3280003584,3280004095,UA +3280003584,3280004095,GB 3280004096,3280004607,PL 3280004608,3280005119,UA 3280005120,3280005631,HU @@ -80449,7 +86536,6 @@ 3280093184,3280109567,GR 3280109568,3280117759,BE 3280117760,3280125951,CH -3280125952,3280126207,DE 3280126208,3280126463,IS 3280126464,3280126719,SI 3280126720,3280126975,IT @@ -80598,7 +86684,9 @@ 3280658176,3280658431,DE 3280658432,3280660479,MT 3280660480,3280662527,RU -3280662528,3280666623,DE +3280662528,3280664831,DE +3280664832,3280665087,CZ +3280665088,3280666623,DE 3280666624,3280732159,NO 3280732160,3280764927,DE 3280765952,3280766975,DK @@ -80635,7 +86723,9 @@ 3280928832,3280928847,RU 3280928848,3280928855,GB 3280928856,3280928863,RU -3280928864,3280955707,GB +3280928864,3280952783,GB +3280952784,3280952799,DE +3280952800,3280955707,GB 3280955708,3280955711,DE 3280955712,3280958919,GB 3280958920,3280958927,DE @@ -80674,7 +86764,18 @@ 3281002496,3281010687,CH 3281010688,3281018879,BE 3281018880,3281027071,CZ -3281027072,3281027327,GB +3281027072,3281027079,EU +3281027080,3281027087,GB +3281027088,3281027135,EU +3281027136,3281027151,GB +3281027152,3281027199,EU +3281027200,3281027215,GB +3281027216,3281027279,EU +3281027280,3281027287,GB +3281027288,3281027295,EU +3281027296,3281027311,GB +3281027312,3281027319,EU +3281027320,3281027327,GB 3281027328,3281027583,EU 3281027584,3281027615,GB 3281027616,3281027631,EU @@ -80774,7 +86875,9 @@ 3281387520,3281453055,PL 3281453056,3281518591,RU 3281518592,3281649663,GB -3281649664,3281715199,FR +3281649664,3281710335,FR +3281710336,3281710591,KP +3281710592,3281715199,FR 3281715200,3281780735,TR 3281780736,3281846271,FI 3281846272,3281911807,GB @@ -80797,7 +86900,9 @@ 3281975296,3281976319,RU 3281976320,3281976831,DE 3281976832,3281977343,RU -3281977344,3282042879,NO +3281977344,3282039039,NO +3282039040,3282039295,SE +3282039296,3282042879,NO 3282042880,3282083839,CH 3282083840,3282084351,DE 3282084352,3282084863,RO @@ -80980,7 +87085,8 @@ 3283248128,3283248639,DE 3283248640,3283249151,RO 3283249152,3283249663,UA -3283249664,3283250175,RO +3283249664,3283249919,MD +3283249920,3283250175,RO 3283250176,3283250687,RU 3283251200,3283251711,FR 3283251712,3283252223,PL @@ -81014,7 +87120,6 @@ 3283490560,3283490815,PL 3283491072,3283491327,TR 3283491328,3283491583,AT -3283491584,3283491839,RO 3283491840,3283492095,RU 3283492096,3283492351,AT 3283492352,3283492607,ES @@ -81215,7 +87320,9 @@ 3284016384,3284016639,CH 3284016640,3284017151,DK 3284017152,3284025343,GR -3284025344,3284028287,GB +3284025344,3284028139,GB +3284028140,3284028143,US +3284028144,3284028287,GB 3284028288,3284028319,US 3284028320,3284029183,GB 3284029184,3284029199,US @@ -81224,7 +87331,11 @@ 3284030480,3284030495,FR 3284030496,3284030615,GB 3284030616,3284030623,SE -3284030624,3284033535,GB +3284030624,3284030775,GB +3284030776,3284030783,SE +3284030784,3284030991,GB +3284030992,3284031007,FR +3284031008,3284033535,GB 3284033536,3284041727,RU 3284041728,3284041983,DK 3284041984,3284042239,SI @@ -81278,7 +87389,6 @@ 3284086784,3284087295,CZ 3284087296,3284087807,RU 3284087808,3284088319,IL -3284088320,3284088831,LV 3284088832,3284089855,UA 3284089856,3284090367,BG 3284090368,3284090879,PL @@ -81336,7 +87446,7 @@ 3284117504,3284118015,UA 3284118016,3284118527,PL 3284118528,3284119039,FR -3284119040,3284120063,RU +3284119040,3284119551,RU 3284120064,3284120575,UA 3284120576,3284121087,PL 3284121088,3284121599,RU @@ -81379,12 +87489,13 @@ 3284271104,3284402175,GB 3284402176,3284467711,SE 3284467712,3284533247,FI -3284533248,3284598783,SE +3284533248,3284588287,SE +3284588288,3284588543,DK +3284588544,3284598783,SE 3284598784,3284664319,HU 3284664320,3284672511,GB 3284672512,3284680703,DE 3284680704,3284681215,UA -3284681216,3284681727,RO 3284681728,3284682239,FI 3284682240,3284682751,DE 3284682752,3284683263,SE @@ -81472,10 +87583,8 @@ 3285090304,3285098495,DE 3285098496,3285114879,GB 3285114880,3285115903,RU -3285115904,3285116415,PL -3285116416,3285116927,CZ +3285115904,3285116415,SI 3285116928,3285117439,UA -3285117440,3285117951,RU 3285117952,3285118463,FR 3285118464,3285118975,UA 3285118976,3285119487,RU @@ -81484,7 +87593,8 @@ 3285120512,3285121023,RO 3285121024,3285121535,SE 3285121536,3285122047,CY -3285122048,3285123071,RU +3285122048,3285122559,GB +3285122560,3285123071,RU 3285123072,3285188607,BE 3285188608,3285319679,RU 3285319680,3285320191,HU @@ -81580,9 +87690,7 @@ 3285461808,3285461839,NL 3285461840,3285463167,EU 3285463168,3285463199,LU -3285463200,3285465599,EU -3285465600,3285465855,GB -3285465856,3285472255,EU +3285463200,3285472255,EU 3285472256,3285472271,US 3285472272,3285472287,DE 3285472288,3285472511,US @@ -81594,7 +87702,9 @@ 3285495296,3285495807,ES 3285495808,3285501327,EU 3285501328,3285501359,CZ -3285501360,3285510143,EU +3285501360,3285501743,EU +3285501744,3285501759,GB +3285501760,3285510143,EU 3285510144,3285512191,GB 3285512192,3285515775,EU 3285515776,3285515799,GR @@ -81713,18 +87823,17 @@ 3285912576,3285913647,EU 3285913648,3285913655,IE 3285913656,3285913703,GB -3285913704,3285913707,EU -3285913708,3285913711,FI +3285913704,3285913711,FI 3285913712,3285913863,GB -3285913864,3285917695,EU -3285917696,3285917703,GB -3285917704,3285917711,EU -3285917712,3285917807,GB -3285917808,3285917951,EU -3285917952,3285918207,GB +3285913864,3285913871,EU +3285913872,3285913903,GB +3285913904,3285917695,EU +3285917696,3285918207,GB 3285918208,3285919743,EU 3285919744,3285921791,QA -3285921792,3285924911,EU +3285921792,3285922047,EU +3285922048,3285922303,FR +3285922304,3285924911,EU 3285924912,3285924919,CH 3285924920,3285924927,FI 3285924928,3285924943,DE @@ -81733,7 +87842,10 @@ 3285924952,3285924955,CH 3285924956,3285924959,PL 3285924960,3285924991,DE -3285924992,3285925163,EU +3285924992,3285924995,FR +3285924996,3285924999,CZ +3285925000,3285925007,RU +3285925008,3285925163,EU 3285925164,3285925171,CH 3285925172,3285926431,EU 3285926432,3285926463,CH @@ -81744,14 +87856,12 @@ 3285928312,3285929215,EU 3285929216,3285929231,DE 3285929232,3285931527,EU -3285931528,3285931543,DE -3285931544,3285934591,EU -3285934592,3285934847,ES -3285934848,3285935871,EU +3285931528,3285931551,DE +3285931552,3285935871,EU 3285935872,3285936127,GB 3285936128,3285936135,EU -3285936136,3285936143,FR -3285936144,3285939135,EU +3285936136,3285936147,FR +3285936148,3285939135,EU 3285939136,3285939175,GB 3285939176,3285939183,EU 3285939184,3285939191,GB @@ -81759,7 +87869,9 @@ 3285939744,3285939759,GB 3285939760,3285939839,EU 3285939840,3285939967,GB -3285939968,3285941247,EU +3285939968,3285940735,EU +3285940736,3285940767,IT +3285940768,3285941247,EU 3285941248,3285941503,ES 3285941504,3285949603,EU 3285949604,3285949607,CH @@ -81769,11 +87881,10 @@ 3285950208,3285950463,IT 3285950464,3285951647,EU 3285951648,3285951679,ES -3285951680,3285953535,EU -3285953536,3285954047,PK +3285951680,3285954047,EU 3285954048,3285954303,AE 3285954304,3285954559,EU -3285954560,3285954567,GB +3285954560,3285954567,RO 3285954568,3285954575,PL 3285954576,3285954815,GB 3285954816,3285962751,EU @@ -81781,8 +87892,10 @@ 3285963776,3285964799,EU 3285964800,3285964935,DE 3285964936,3285965055,EU -3285965056,3285965311,DE -3285965312,3285975039,EU +3285965056,3285965823,DE +3285965824,3285968895,EU +3285968896,3285970943,GB +3285970944,3285975039,EU 3285975040,3286013695,FR 3286013696,3286013951,RE 3286013952,3286106111,FR @@ -81866,9 +87979,9 @@ 3286401024,3286403071,GB 3286403072,3286403327,GG 3286403328,3286404863,GB -3286404864,3286405375,GG -3286405376,3286406399,GB -3286406400,3286406911,GG +3286404864,3286405119,GG +3286405120,3286406655,GB +3286406656,3286406911,GG 3286406912,3286407167,GB 3286407168,3286407423,GG 3286407424,3286407679,GB @@ -81880,7 +87993,6 @@ 3286417920,3286418175,DE 3286418176,3286418431,AT 3286418432,3286418687,TR -3286418688,3286418943,UA 3286418944,3286419199,PL 3286419200,3286419455,DK 3286419456,3286419711,DE @@ -81901,7 +88013,7 @@ 3286423808,3286424063,CZ 3286424064,3286424319,LV 3286424320,3286424575,FR -3286424576,3286424831,UA +3286424576,3286424831,RU 3286424832,3286425087,TR 3286425088,3286425343,RU 3286425344,3286425599,IT @@ -81933,7 +88045,7 @@ 3286657024,3286657279,BE 3286657280,3286657535,ES 3286657536,3286657791,HU -3286658048,3286658303,US +3286658048,3286658303,DE 3286658304,3286658559,RU 3286658560,3286658815,NL 3286658816,3286659071,RU @@ -82058,7 +88170,6 @@ 3286937600,3286937855,CH 3286937856,3286938111,RO 3286938112,3286938367,DE -3286938368,3286938623,ES 3286938624,3286938879,CH 3286939136,3286939391,RO 3286939392,3286939647,DE @@ -82093,8 +88204,8 @@ 3287165440,3287165695,SA 3287165696,3287165951,US 3287165952,3287166207,SA -3287166208,3287166975,US -3287166976,3287167743,SA +3287166208,3287167487,US +3287167488,3287167743,SA 3287167744,3287168511,US 3287168512,3287168767,EU 3287168768,3287169279,SA @@ -82102,8 +88213,7 @@ 3287169536,3287169791,SA 3287169792,3287170303,US 3287170304,3287170559,DE -3287170560,3287170815,US -3287170816,3287171071,GB +3287170560,3287171071,US 3287171072,3287171583,LT 3287171584,3287172095,PL 3287172608,3287173119,PL @@ -82172,7 +88282,6 @@ 3287444480,3287444991,PL 3287445504,3287446527,UA 3287446528,3287447039,PL -3287447040,3287447551,IL 3287447552,3287448063,DK 3287448064,3287448575,GB 3287448576,3287449087,PL @@ -82268,7 +88377,7 @@ 3287640064,3287640575,PL 3287640576,3287641087,SI 3287641088,3287641599,EU -3287642112,3287642623,UA +3287642112,3287642623,NL 3287642624,3287643135,BE 3287643136,3287643647,IT 3287643648,3287644671,UA @@ -82278,7 +88387,7 @@ 3287662592,3287662847,DE 3287662848,3287663103,DK 3287663104,3287663359,LV -3287663616,3287663871,ES +3287663616,3287663871,NL 3287663872,3287664127,PT 3287664128,3287664383,PL 3287664384,3287664639,NL @@ -82340,8 +88449,7 @@ 3287706112,3287706623,RU 3287706624,3287707135,GB 3287707648,3287708159,BE -3287708160,3287708671,NL -3287708672,3287709183,EU +3287708160,3287709183,NL 3287709184,3287709695,RU 3287709696,3287710207,SE 3287710208,3287710719,RU @@ -82561,8 +88669,8 @@ 3288466432,3288467455,SY 3288467456,3288469503,BI 3288469504,3288481791,ZA -3288481792,3288482559,ZW -3288482560,3288485631,ZA +3288481792,3288482303,ZW +3288482304,3288485631,ZA 3288485632,3288485887,ZW 3288485888,3288489983,MA 3288489984,3288514559,ZA @@ -82572,9 +88680,7 @@ 3288532992,3288534527,PR 3288534528,3288535039,EG 3288535040,3288539135,CW -3288539136,3288540415,US -3288540416,3288540671,BR -3288540672,3288543487,US +3288539136,3288543487,US 3288543488,3288543743,AP 3288543744,3288543996,CH 3288543997,3288543997,EU @@ -82636,10 +88742,11 @@ 3288779008,3288779263,ZA 3288779264,3288779775,KE 3288779776,3288780799,NG -3288781824,3288782591,ZA +3288780800,3288782591,ZA 3288782592,3288782847,KE -3288783872,3288784127,KE -3288784128,3288784895,ZA +3288782848,3288783359,NG +3288783360,3288784127,KE +3288784128,3288785151,ZA 3288787968,3288788223,EG 3288788224,3288792831,ZA 3288792832,3288793087,AO @@ -82676,9 +88783,10 @@ 3289053952,3289055231,NG 3289055232,3289071103,ZA 3289071104,3289071359,SO -3289071616,3289074431,ZA +3289071360,3289074431,ZA 3289074432,3289074687,DZ 3289074688,3289075711,ZA +3289075712,3289077759,MW 3289077760,3289078271,KE 3289078272,3289078527,GH 3289078528,3289081855,ZA @@ -82712,13 +88820,23 @@ 3289137152,3289153535,BM 3289153536,3289156607,MU 3289156608,3289158655,RW -3289158656,3289161727,MU -3289161728,3289169919,PR +3289158656,3289159935,MU +3289159936,3289160191,RW +3289160192,3289161727,MU +3289161728,3289163263,PR +3289163264,3289163519,US +3289163520,3289169919,PR 3289169920,3289186303,MA 3289186304,3289212159,ZA 3289212160,3289212415,MZ 3289212416,3289212927,NG -3289214976,3289215231,NG +3289212928,3289213183,ZM +3289213184,3289213439,TZ +3289213440,3289213951,ZA +3289213952,3289214207,MA +3289214208,3289214463,AO +3289214464,3289214719,CD +3289214720,3289215231,NG 3289215232,3289217279,ZA 3289217280,3289217535,KE 3289217536,3289217791,UG @@ -82735,13 +88853,17 @@ 3289229312,3289229567,SZ 3289229568,3289230591,ZA 3289230592,3289230847,KE -3289233408,3289233919,ZA +3289230848,3289231359,GH +3289231360,3289233919,ZA 3289233920,3289234175,TZ 3289234176,3289235199,ZA 3289235200,3289235455,KE +3289235456,3289237503,GH 3289237504,3289237759,ZA 3289238528,3289238783,AO 3289238784,3289239039,ZA +3289239040,3289239295,EG +3289239296,3289239551,BF 3289239552,3289239807,SC 3289239808,3289240063,KE 3289240064,3289243391,ZA @@ -82749,7 +88871,13 @@ 3289243648,3289248255,ZA 3289248256,3289248511,NG 3289248512,3289248767,AO +3289248768,3289249023,EG +3289249024,3289249279,NG 3289249280,3289250815,ZA +3289250816,3289251071,GH +3289251072,3289251327,EG +3289251328,3289251583,ZA +3289251584,3289251839,KE 3289251840,3289319423,ZA 3289319424,3289319679,A2 3289319680,3289319935,ZA @@ -82787,14 +88915,15 @@ 3290031360,3290060287,ZA 3290060288,3290060543,SZ 3290060544,3290103807,ZA -3290103808,3290120191,CA +3290103808,3290110335,CA +3290110336,3290110367,US +3290110368,3290120191,CA 3290120192,3290128383,MU 3290128384,3290136575,ZW 3290136576,3290169343,NG 3290169344,3290171135,ZA 3290171136,3290171391,SZ -3290171392,3290171903,ZA -3290171904,3290172159,NG +3290171392,3290172159,ZA 3290172160,3290172415,KE 3290172416,3290181631,ZA 3290181632,3290181887,US @@ -82821,8 +88950,12 @@ 3290284032,3290288127,AO 3290288128,3290292223,NG 3290292224,3290296319,GH -3290296320,3290431487,ZA +3290296320,3290423295,ZA +3290423296,3290427391,NA +3290427392,3290431487,ZA 3290431488,3290433535,JM +3290433536,3290435583,ZA +3290435584,3290439679,DZ 3290439680,3290447871,TT 3290447872,3290456063,AR 3290456064,3290460159,MZ @@ -82854,10 +88987,10 @@ 3291078656,3291086847,DZ 3291086848,3291103231,PR 3291103232,3291123711,ZA -3291123712,3291127807,BG -3291127808,3291131903,ZA -3291131904,3291135999,BG -3291136000,3291148287,ZA +3291123712,3291135999,BG +3291136000,3291140095,ZA +3291140096,3291144191,BG +3291144192,3291148287,ZA 3291148288,3291152383,BG 3291152384,3291168767,ZA 3291168768,3291176959,TZ @@ -82985,8 +89118,7 @@ 3291432704,3291432959,NA 3291432960,3291434239,ZA 3291434240,3291434751,A2 -3291434752,3291435007,ZA -3291435008,3291439103,A2 +3291434752,3291439103,ZA 3291439104,3291447295,NG 3291447296,3291463679,CI 3291463680,3291480063,ZA @@ -83010,40 +89142,55 @@ 3291548672,3291548927,TZ 3291548928,3291549183,MG 3291549184,3291549439,GH +3291549440,3291549695,UG +3291549696,3291549951,LR +3291549952,3291550207,GA 3291611136,3291611391,ZA 3291742208,3292004351,US 3292004352,3292266495,SC 3292397568,3292528639,ZA +3300392960,3300655103,TN +3300655104,3300917247,ET 3300917248,3300921343,MU 3300921344,3300925439,BJ 3300925440,3300929535,MG 3300933632,3300950015,MU 3300953088,3300954111,MU -3300966400,3301113855,ZA -3301113856,3301146623,NG +3300954112,3300958207,NG +3300958208,3301113855,ZA +3301113856,3301138431,NG +3301138432,3301140479,ZA +3301140480,3301146623,NG 3301146624,3301171199,ZA 3301171200,3301172223,IN 3301172224,3301175295,ZA -3301175296,3301177343,AF -3301177344,3301177599,US -3301177600,3301179391,AF +3301175296,3301179391,AF 3301179392,3301181439,SC -3301181440,3301182463,SE -3301182464,3301191679,SC -3301191680,3301191680,CA -3301191681,3301193727,SC +3301181440,3301185535,US +3301185536,3301187583,GB +3301187584,3301189631,FR +3301189632,3301191679,US +3301191680,3301193727,CA 3301193728,3301195775,JP -3301195776,3301197823,SC +3301195776,3301197823,DE 3301197824,3301199871,GB -3301199872,3301203967,SC +3301199872,3301201919,US +3301201920,3301203967,NL 3301203968,3301204991,DK 3301204992,3301205247,SE 3301205248,3301206015,DK -3301206016,3301212159,SC -3301212160,3301216255,SE +3301206016,3301208063,SC +3301208064,3301214207,US +3301214208,3301216255,SE 3301216256,3301220351,SC -3301220352,3301224447,SE -3301224448,3301238783,SC +3301220352,3301222399,SE +3301222400,3301224447,BE +3301224448,3301226495,SC +3301226496,3301228543,US +3301228544,3301230591,IE +3301230592,3301232639,FI +3301232640,3301236735,SC +3301236736,3301238783,CA 3301238784,3301240831,US 3301240832,3301242879,SE 3301242880,3301244927,SC @@ -83061,13 +89208,11 @@ 3301457920,3301462015,NG 3301462016,3301466111,ML 3301466112,3301470207,ER -3301470208,3301471231,NG -3301471232,3301471487,GH -3301471488,3301474047,NG -3301474048,3301474303,GH +3301470208,3301474303,NG 3301474304,3301490687,MA 3301490688,3301494783,ZA 3301494784,3301498879,ZM +3301502976,3301507071,MA 3301507328,3301507583,MU 3301507584,3301507839,GH 3301507840,3301508095,EG @@ -83078,8 +89223,11 @@ 3301513216,3301515263,EG 3301515264,3301523455,GH 3301523456,3301531647,CI -3301539840,3301543935,A2 -3301543936,3301544191,KE +3301539840,3301540863,KE +3301540864,3301541119,A2 +3301541120,3301541631,KE +3301541632,3301541887,A2 +3301541888,3301544191,KE 3301544192,3301544959,DE 3301544960,3301545215,A2 3301545216,3301548031,KE @@ -83087,28 +89235,28 @@ 3301556224,3301557759,DJ 3301557760,3301558015,US 3301558016,3301560319,DJ -3301560320,3301565439,KE -3301565440,3301565695,MU -3301565696,3301565951,KE -3301565952,3301566463,MU +3301560320,3301565695,KE +3301565696,3301566463,MU 3301568512,3301570559,EG 3301570560,3301572607,KE 3301572608,3301605375,EG 3301605376,3301613567,SD -3301621760,3301629951,KE +3301613568,3301629951,KE 3301632000,3301634047,CM 3301634048,3301636095,LS 3301636096,3301637119,ZA 3301637120,3301638143,AO 3301638144,3301703679,TN -3301703680,3301834751,EG +3301703680,3301707263,EG +3301707264,3301707519,US +3301707520,3301834751,EG 3301834752,3301900287,MA 3301900288,3301904383,NG 3301904384,3301908479,KE 3301908480,3301912575,ZA 3301912576,3301916671,MU -3301916672,3301924863,IN -3301924864,3301933055,ZA +3301916672,3301933055,IN +3301933056,3301949439,KE 3301949440,3301965823,SN 3301965824,3302490111,ZA 3302490112,3302490367,KE @@ -83121,7 +89269,9 @@ 3302498304,3302502399,NA 3302502400,3302505471,AO 3302505472,3302506495,NA -3302506496,3302514687,MU +3302506496,3302508543,KE +3302508544,3302514687,MU +3302514688,3302522879,ZA 3302522880,3302523903,KE 3302523904,3302525951,ZA 3302525952,3302526975,EG @@ -83153,12 +89303,16 @@ 3302544640,3302544895,MU 3302544896,3302545151,GH 3302545152,3302545407,ZA +3302545408,3302545919,CD +3302545920,3302546431,TZ +3302546432,3302546943,SL +3302546944,3302547455,KE 3302548480,3302548991,GH 3302548992,3302549503,ZA 3302549504,3302550015,KE 3302550016,3302550527,TZ -3302550528,3302551295,ZA -3302551296,3302551551,MU +3302550528,3302551039,ZA +3302551040,3302551551,MU 3302551552,3302552063,EG 3302552064,3302552575,KE 3302552832,3302553087,KE @@ -83184,6 +89338,7 @@ 3302768640,3302776831,NG 3302776832,3302785023,ZW 3302785024,3302793215,NG +3302793216,3302801407,ZA 3302801408,3302805503,NG 3302805504,3302809599,MW 3302809600,3302817791,NG @@ -83226,7 +89381,9 @@ 3302959360,3302959615,MG 3302959616,3302959871,TD 3302959872,3302960127,SC +3302960128,3302960383,LR 3302985728,3302987775,DJ +3303014400,3304062975,TN 3304062976,3304456191,SC 3304456192,3304521727,NG 3304521728,3304587263,SC @@ -83276,17 +89433,13 @@ 3315138560,3315204095,MA 3315204096,3315269631,ET 3315269632,3315286015,ZA -3315286016,3315286527,MU -3315286528,3315286783,KE -3315286784,3315287039,MU -3315287040,3315287295,KE -3315287296,3315287807,MU +3315286016,3315287807,MU 3315287808,3315288319,KE 3315288320,3315288413,MU 3315288414,3315288414,KE -3315288415,3315288575,MU -3315288576,3315288831,KE -3315288832,3315291135,MU +3315288415,3315289343,MU +3315289344,3315289599,KE +3315289600,3315291135,MU 3315291136,3315293183,KE 3315293184,3315294207,MU 3315294208,3315302399,ZA @@ -83323,9 +89476,7 @@ 3315482624,3315499007,MG 3315499008,3315515391,ZM 3315515392,3315531775,SC -3315531776,3315535871,CM -3315535872,3315536127,TD -3315536128,3315539967,CM +3315531776,3315539967,CM 3315539968,3315548159,ZA 3315548160,3315552255,NG 3315552256,3315556351,GW @@ -83419,9 +89570,7 @@ 3320312832,3320313855,ZM 3320313856,3320314879,BI 3320314880,3320315903,CD -3320315904,3320378623,KE -3320378624,3320378879,US -3320378880,3320381439,KE +3320315904,3320381439,KE 3320381440,3320446975,NA 3320446976,3320451071,SC 3320451072,3320455167,ZA @@ -83510,16 +89659,18 @@ 3322202112,3322203135,GB 3322203136,3322339583,US 3322339584,3322339839,GB -3322339840,3322353663,US -3322353664,3322354175,VI +3322339840,3322354175,US 3322354176,3322354431,JP 3322354432,3322609663,US 3322609664,3322610687,SA 3322610688,3322683391,US -3322683392,3322691583,BR +3322683392,3322683647,AR +3322683648,3322691583,BR 3322691584,3322691839,US 3322691840,3322692095,SE -3322692096,3322773503,US +3322692096,3322698383,US +3322698384,3322698391,CA +3322698392,3322773503,US 3322773504,3322806271,CA 3322806272,3322875903,US 3322880000,3322888191,AU @@ -83597,8 +89748,8 @@ 3323437824,3323438079,CA 3323438080,3323461119,US 3323461120,3323461375,GB -3323461376,3323462655,US -3323462656,3323463167,BR +3323461376,3323462911,US +3323462912,3323463167,BR 3323463168,3323477983,US 3323477984,3323478015,GB 3323478016,3323659263,US @@ -83655,9 +89806,7 @@ 3324033792,3324034047,KN 3324034048,3324035327,US 3324035328,3324035583,KN -3324035584,3324040191,US -3324040192,3324040447,AU -3324040448,3324051455,US +3324035584,3324051455,US 3324051456,3324182527,CA 3324182528,3324193279,US 3324193280,3324193791,CA @@ -83686,12 +89835,12 @@ 3324525312,3324525567,CN 3324525568,3324526335,US 3324526336,3324526591,CN -3324526592,3324533247,US -3324533248,3324533503,DE -3324533504,3324579839,US +3324526592,3324579839,US 3324582912,3324583935,CA 3324583936,3324587775,CL -3324587776,3324642303,US +3324587776,3324636671,US +3324636672,3324637183,NZ +3324637184,3324642303,US 3324642304,3324642559,CA 3324642560,3324645887,US 3324645888,3324646143,CA @@ -83769,11 +89918,11 @@ 3324843800,3324843801,AP 3324843802,3324844543,US 3324844544,3324844799,EU -3324844800,3324980223,US +3324844800,3324943047,US +3324943048,3324943055,CA +3324943056,3324980223,US 3324980224,3324981247,CA -3324981248,3324998399,US -3324998400,3324998655,A1 -3324998656,3325034495,US +3324981248,3325034495,US 3325034496,3325035519,NZ 3325035520,3325067263,US 3325067264,3325100287,CA @@ -83784,6 +89933,7 @@ 3325131776,3325132031,AU 3325132032,3325132799,US 3325132800,3325133823,CO +3325133824,3325134335,BR 3325134336,3325136127,US 3325136128,3325136383,CA 3325136384,3325142015,US @@ -83807,7 +89957,9 @@ 3325207808,3325207935,US 3325207936,3325208119,CA 3325208120,3325208123,US -3325208124,3325211419,CA +3325208124,3325208403,CA +3325208404,3325208407,US +3325208408,3325211419,CA 3325211420,3325211423,US 3325211424,3325211647,CA 3325211648,3325211775,US @@ -83849,7 +90001,9 @@ 3325226593,3325226593,US 3325226594,3325226751,CA 3325226752,3325227007,US -3325227008,3325229591,CA +3325227008,3325227575,CA +3325227576,3325227583,US +3325227584,3325229591,CA 3325229592,3325229599,US 3325229600,3325230319,CA 3325230320,3325230323,US @@ -83882,16 +90036,19 @@ 3325284864,3325285119,AU 3325285376,3325296383,US 3325296384,3325296639,CA -3325296640,3325304127,US -3325304128,3325304191,AS -3325304192,3325304319,US -3325304320,3325304831,AS +3325296640,3325303807,US +3325303808,3325304575,AS +3325304576,3325304703,US +3325304704,3325304767,AS +3325304768,3325304831,US 3325304832,3325307647,CA 3325307648,3325307903,BB 3325307904,3325313023,CA 3325313024,3325337599,US 3325337600,3325338111,GB -3325338112,3325362175,US +3325338112,3325340671,US +3325340672,3325340927,CA +3325340928,3325362175,US 3325362176,3325427711,CA 3325427712,3325427967,US 3325427968,3325430527,MU @@ -83918,13 +90075,13 @@ 3325470208,3325471231,US 3325471232,3325471487,MU 3325471488,3325471999,US -3325472000,3325472255,ZA -3325472256,3325474303,MU +3325472000,3325474303,MU 3325474304,3325474559,US 3325474560,3325478655,MU 3325478656,3325478911,ZA 3325478912,3325479423,US -3325479424,3325481471,ZA +3325479424,3325479679,MU +3325479680,3325481471,ZA 3325481472,3325481727,MU 3325481728,3325481983,US 3325481984,3325483007,CA @@ -83972,9 +90129,7 @@ 3325993984,3325994239,CA 3325994240,3325996799,US 3325996800,3325997055,CA -3325997056,3326191551,US -3326191552,3326191583,A1 -3326191584,3326349823,US +3325997056,3326349823,US 3326349824,3326350335,EC 3326350336,3326406655,US 3326406656,3326408703,CO @@ -83982,17 +90137,15 @@ 3326413824,3326414335,YE 3326414336,3326420991,US 3326420992,3326423039,PR -3326423040,3326499327,US -3326499328,3326499583,IN -3326499584,3326526463,US +3326423040,3326526463,US 3326526464,3326526719,CA 3326526720,3326613503,US 3326613504,3326615551,CA 3326615552,3326619647,US -3326619648,3326623487,CA -3326623488,3326623615,US -3326623616,3326623743,CA -3326623744,3326631935,US +3326619648,3326622719,CA +3326622720,3326622975,US +3326622976,3326623487,CA +3326623488,3326631935,US 3326631936,3326640127,CA 3326640128,3326680831,US 3326680832,3326681087,CA @@ -84120,19 +90273,11 @@ 3328638976,3328704511,CA 3328704512,3328774399,US 3328774400,3328775935,CA -3328775936,3328788479,US -3328788480,3328789503,FR +3328775936,3328789503,US 3328789504,3328790015,AP -3328790016,3328794879,US -3328794880,3328795391,CA -3328795392,3328796159,US -3328796160,3328796671,CA -3328796672,3328797695,US -3328797696,3328797951,CA -3328797952,3328798207,US -3328798208,3328798719,CA +3328790016,3328798719,US 3328798720,3328799743,NL -3328799744,3328799999,CA +3328799744,3328799999,US 3328800000,3328800255,NL 3328800256,3328800767,IT 3328800768,3328801023,NZ @@ -84161,8 +90306,7 @@ 3330640896,3330641151,CH 3330641152,3330646527,US 3330646528,3330647295,CA -3330647296,3330647807,US -3330648064,3330649599,US +3330647296,3330649599,US 3330649600,3330649855,CA 3330649856,3330662911,US 3330662912,3330663167,GB @@ -84225,18 +90369,9 @@ 3331194880,3331260415,AU 3331260416,3331269375,US 3331269376,3331269631,AU -3331269632,3331269887,FR -3331269888,3331270655,US -3331270656,3331270911,FR -3331270912,3331271423,US -3331271424,3331271679,FR -3331271680,3331352575,US -3331352576,3331352831,A1 -3331352832,3331352919,US +3331269632,3331352919,US 3331352920,3331352920,A1 -3331352921,3331353087,US -3331353088,3331353599,A1 -3331353600,3331356671,US +3331352921,3331356671,US 3331356672,3331357183,BZ 3331357184,3331362815,US 3331362816,3331366911,CA @@ -84247,7 +90382,7 @@ 3331524608,3331527167,US 3331527168,3331527679,GB 3331527680,3331563519,US -3331563520,3331563775,CH +3331563520,3331563775,IN 3331563776,3331565567,US 3331565568,3331566079,CA 3331566080,3331632639,US @@ -84276,9 +90411,7 @@ 3331983104,3331983359,CA 3331983360,3331988479,US 3331988480,3331989503,CA -3331989504,3332003839,US -3332003840,3332005887,A2 -3332005888,3332028415,US +3331989504,3332028415,US 3332028416,3332030463,CA 3332030464,3332083967,US 3332083968,3332084223,AP @@ -84303,13 +90436,16 @@ 3332492032,3332500735,CA 3332500736,3332500991,US 3332500992,3332501247,CA +3332501248,3332501503,US 3332501504,3332503039,CA 3332503040,3332503551,US 3332503552,3332505343,CA 3332505344,3332505855,US 3332505856,3332508671,CA 3332508672,3332508927,US -3332508928,3332528127,CA +3332508928,3332525311,CA +3332525312,3332525823,US +3332525824,3332528127,CA 3332528128,3332529663,US 3332529664,3332554751,CA 3332554752,3332558847,US @@ -84357,11 +90493,13 @@ 3332876288,3332882431,US 3332882432,3332890623,KN 3332890624,3332897279,US -3332897280,3332898559,CA -3332898560,3332899071,US +3332897280,3332898815,CA +3332898816,3332899071,US 3332899072,3332906495,CA 3332906496,3332909567,US -3332909568,3332922879,CA +3332909568,3332909823,CA +3332909824,3332910079,US +3332910080,3332922879,CA 3332922880,3332923391,US 3332923392,3332925695,CA 3332925696,3332927487,US @@ -84389,11 +90527,10 @@ 3333018112,3333023231,CA 3333023232,3333025279,US 3333025280,3333029631,CA -3333029632,3333374975,US -3333374976,3333375231,IN -3333375232,3333385983,US +3333029632,3333385983,US 3333385984,3333386239,JP -3333386240,3333396479,US +3333386240,3333396223,US +3333396224,3333396479,JP 3333396480,3333396689,GB 3333396690,3333396691,EU 3333396692,3333396735,GB @@ -84403,17 +90540,13 @@ 3333428009,3333428223,GB 3333428224,3333480191,US 3333480192,3333481471,DE -3333481472,3333517823,US -3333517824,3333518335,CA -3333518336,3333583871,US +3333481472,3333583871,US 3333583872,3333584895,CA 3333584896,3333593855,US 3333593856,3333594111,CA 3333594112,3333603328,US 3333603329,3333603329,EU -3333603330,3333609733,US -3333609734,3333609734,AU -3333609735,3333614591,US +3333603330,3333614591,US 3333614592,3333614847,GB 3333614848,3333624319,US 3333624320,3333624575,CA @@ -84446,9 +90579,9 @@ 3333801728,3333801983,CA 3333801984,3333825791,US 3333825792,3333826047,EU -3333826048,3333829657,US -3333829658,3333829658,IN -3333829659,3333859839,US +3333826048,3333829631,US +3333829632,3333829887,IN +3333829888,3333859839,US 3333859840,3333860095,BM 3333860096,3333871103,US 3333871104,3333871359,CA @@ -84458,13 +90591,13 @@ 3333988608,3333988863,BR 3333988864,3333997823,US 3333997824,3333998079,CA -3333998080,3334006781,US -3334006782,3334006782,NL -3334006783,3334007551,US +3333998080,3334007551,US 3334007552,3334007807,EU 3334007808,3334020095,US 3334020096,3334021119,CA -3334021120,3334138623,US +3334021120,3334068479,US +3334068480,3334068735,CA +3334068736,3334138623,US 3334138624,3334138879,BM 3334138880,3334187775,US 3334187776,3334188031,BM @@ -84500,7 +90633,9 @@ 3335475200,3335475455,DE 3335475456,3335524351,US 3335524352,3335524607,AU -3335524608,3335573759,US +3335524608,3335527167,US +3335527168,3335527423,DE +3335527424,3335573759,US 3335573760,3335574015,IN 3335574016,3335581695,US 3335581696,3335581951,EU @@ -84521,9 +90656,9 @@ 3336897024,3336990719,US 3336990720,3336990975,CA 3336990976,3336991231,US -3336991232,3336991487,CA -3336991488,3336993023,US -3336993024,3336993535,CA +3336991232,3336991743,CA +3336991744,3336992767,US +3336992768,3336993535,CA 3336993536,3336993791,US 3336993792,3336994047,CA 3336994048,3337030655,US @@ -84542,14 +90677,10 @@ 3337053184,3337053695,CA 3337053696,3337055231,US 3337055232,3337060351,CA -3337060352,3337107711,US -3337107712,3337107967,GB -3337107968,3337198703,US +3337060352,3337198703,US 3337198704,3337198707,CA 3337198708,3337289983,US -3337289984,3337293567,CA -3337293568,3337293823,US -3337293824,3337297919,CA +3337289984,3337297919,CA 3337297920,3337302015,US 3337302016,3337303551,CA 3337303552,3337304063,US @@ -84567,15 +90698,13 @@ 3337355008,3337650175,US 3337650176,3337650431,GB 3337650432,3337650943,US -3337650944,3337651455,CH -3337651456,3337651711,SG -3337651712,3337654783,CH -3337654784,3337655039,AU -3337655040,3337682943,CH +3337650944,3337651199,HK +3337651200,3337682943,CH 3337682944,3337892607,US 3337892608,3337892671,HK 3337892672,3337893119,US -3337893120,3337893631,CN +3337893120,3337893375,CN +3337893376,3337893631,CA 3337893632,3337895679,US 3337895680,3337895935,CN 3337895936,3337900031,PR @@ -84583,13 +90712,13 @@ 3337948672,3337949183,CA 3337949184,3337957375,US 3337957376,3337958399,CA -3337958400,3337960447,US +3337958400,3337958783,US +3337958784,3337958784,CA +3337958785,3337960447,US 3337960448,3337961471,CA 3337961472,3337961727,US 3337961728,3337961983,CA -3337961984,3337963391,US -3337963392,3337963519,CA -3337963520,3337963639,US +3337961984,3337963639,US 3337963640,3337963647,CA 3337963648,3337964031,US 3337964032,3337964543,A2 @@ -84722,15 +90851,15 @@ 3338825728,3338827775,AW 3338827776,3338912767,US 3338912768,3338913023,EC -3338913024,3338934015,US -3338934016,3338934271,GB -3338934272,3338935039,US -3338935040,3338935295,GB -3338935296,3338964991,US +3338913024,3338964991,US 3338964992,3338965247,CA -3338965248,3339059629,US -3339059630,3339059885,NL -3339059886,3339075583,US +3338965248,3338976767,US +3338976768,3338977023,CA +3338977024,3338993407,US +3338993408,3338993663,CA +3338993664,3339043327,US +3339043328,3339043583,CA +3339043584,3339075583,US 3339075584,3339076863,GB 3339076864,3339077631,JP 3339077632,3339077887,SG @@ -84750,8 +90879,7 @@ 3339093504,3339094015,NL 3339094016,3339142655,US 3339142656,3339142911,NL -3339142912,3339146239,US -3339146752,3339147007,US +3339142912,3339147007,US 3339147008,3339147775,CA 3339147776,3339148031,MS 3339148032,3339153407,US @@ -84772,13 +90900,17 @@ 3339184128,3339186175,CA 3339186176,3339261951,US 3339261952,3339263999,HK -3339264000,3339327999,US +3339264000,3339270399,US +3339270400,3339270655,CA +3339271168,3339327999,US 3339328512,3339329535,CA -3339329536,3339337727,US -3339337984,3339338239,US +3339329536,3339338239,US 3339338240,3339338495,CA -3339338496,3339669503,US +3339338496,3339342847,US +3339342848,3339343103,CA +3339343104,3339669503,US 3339669504,3339671807,CA +3339671808,3339672063,US 3339672576,3339679487,US 3339679488,3339679743,CN 3339679744,3339707391,US @@ -84824,35 +90956,41 @@ 3340097536,3340098559,CA 3340098560,3340107775,US 3340107776,3340369919,CA -3340369920,3340386559,US +3340369920,3340386815,US 3340387328,3340388351,CA 3340388352,3340390399,US 3340390400,3340391423,CA -3340391424,3340429823,US +3340391424,3340418559,US +3340418560,3340419071,CA +3340419072,3340429823,US 3340429824,3340430079,PA 3340430080,3340452863,US 3340452864,3340453887,CA 3340453888,3340460031,US -3340460032,3340462079,PR +3340460032,3340461055,PR +3340461056,3340461311,US +3340461312,3340462079,PR 3340462080,3340466175,US 3340466176,3340467199,A2 3340467200,3340481535,US 3340481536,3340482559,CA 3340482560,3340490751,US 3340490752,3340492799,CA -3340492800,3340493567,US -3340493568,3340493823,HK -3340493824,3340584703,US +3340492800,3340584703,US 3340584704,3340584959,KW 3340584960,3340664831,US 3340664832,3340665855,CA -3340665856,3340677119,US +3340668928,3340677119,US 3340677120,3340679167,CA 3340679168,3340694783,US 3340694784,3340695039,CA -3340695040,3340857343,US +3340695040,3340851455,US +3340851456,3340851711,CA +3340851712,3340852735,US +3340852736,3340853247,CA +3340853248,3340857343,US 3340857344,3340858367,CA -3340859136,3340925567,US +3340858368,3340925567,US 3340925568,3340925575,DE 3340925576,3340925815,US 3340925816,3340925823,AU @@ -84877,9 +91015,7 @@ 3341340416,3341408511,CZ 3341408512,3341408767,US 3341408768,3341418495,CZ -3341418496,3341439200,US -3341439201,3341439201,CA -3341439202,3341444863,US +3341418496,3341444863,US 3341444864,3341445631,DE 3341445632,3341464575,US 3341464576,3341464831,GB @@ -84902,13 +91038,15 @@ 3341518848,3341520895,CA 3341520896,3341521663,US 3341521664,3341531135,CA -3341531136,3341534207,US -3341534976,3341537279,CA -3341537280,3341546239,US +3341531136,3341533951,US +3341533952,3341534207,CA +3341534720,3341534975,US +3341534976,3341536767,CA +3341536768,3341546239,US 3341546240,3341547007,CA 3341547008,3341547519,CH -3341547520,3341549567,CA -3341549568,3341631999,US +3341547520,3341549311,CA +3341549312,3341631999,US 3341632000,3341632767,CA 3341632768,3341634815,US 3341634816,3341635071,CA @@ -84953,7 +91091,9 @@ 3341891072,3341891327,AU 3341891328,3342139391,US 3342139392,3342204927,CH -3342204928,3342487551,US +3342204928,3342470399,US +3342470400,3342470655,CA +3342471168,3342487551,US 3342487552,3342488575,CA 3342488576,3342496767,US 3342496768,3342497791,CA @@ -84966,8 +91106,7 @@ 3342516224,3342517247,CA 3342517248,3342526463,US 3342526464,3342528511,CA -3342528512,3342548991,US -3342551040,3342552063,US +3342528512,3342552063,US 3342552064,3342553087,CA 3342553088,3342565375,US 3342565376,3342567423,CA @@ -84983,18 +91122,30 @@ 3342603264,3342604799,US 3342604800,3342605311,CA 3342605312,3342605567,US -3342605568,3342663679,CA -3342663680,3342795007,US +3342605568,3342623743,CA +3342624000,3342624255,US +3342624256,3342627839,CA +3342627840,3342628095,US +3342628096,3342629631,CA +3342629632,3342629887,US +3342629888,3342657535,CA +3342657536,3342657791,US +3342657792,3342663423,CA +3342663424,3342795007,US 3342795008,3342795263,AP 3342795264,3342831103,US 3342831104,3342831359,IN 3342831360,3342878967,US 3342878968,3342878975,EU -3342878976,3343013887,US +3342878976,3342879487,US +3342879488,3342879743,GB +3342879744,3343013887,US 3343013888,3343015935,CA 3343015936,3343055871,US 3343055872,3343056895,CA -3343056896,3343108863,US +3343056896,3343090588,US +3343090589,3343090589,MX +3343090590,3343108863,US 3343108864,3343109119,EU 3343109120,3343153151,US 3343153152,3343154943,CA @@ -85007,16 +91158,14 @@ 3343346176,3343346687,US 3343346688,3343355391,CA 3343355392,3343355903,US -3343355904,3343364095,CA +3343355904,3343359743,CA +3343359744,3343359999,US +3343360000,3343364095,CA 3343364096,3343365631,US -3343365632,3343372543,CA -3343372800,3343378511,US -3343378512,3343378519,GB -3343378520,3343378535,US -3343378536,3343378543,GB -3343378544,3343378575,US -3343378576,3343378583,GB -3343378584,3343378823,US +3343365632,3343366655,CA +3343366656,3343366911,US +3343366912,3343372543,CA +3343372544,3343378823,US 3343378824,3343378839,SE 3343378840,3343379079,US 3343379080,3343379087,SE @@ -85034,9 +91183,7 @@ 3344116224,3344116735,CA 3344116736,3344126975,US 3344126976,3344127999,CA -3344128000,3344138751,US -3344138752,3344139007,GB -3344139008,3344140287,US +3344128000,3344140287,US 3344140288,3344141311,CA 3344141312,3344144383,US 3344144384,3344146431,CA @@ -85048,33 +91195,35 @@ 3344168960,3344171263,US 3344171264,3344195583,CA 3344195584,3344203775,US -3344203776,3344236543,CA -3344236544,3344237055,US -3344237056,3344238591,CA +3344203776,3344236287,CA +3344236288,3344237055,US +3344237056,3344238335,CA +3344238336,3344238591,US 3344240640,3344242175,CA 3344242176,3344242687,US -3344242688,3344255999,CA -3344256000,3344261631,US -3344261888,3344263430,CA -3344263431,3344263431,US -3344263432,3344266239,CA +3344242688,3344252671,CA +3344252672,3344252927,US +3344252928,3344255999,CA +3344256000,3344261887,US +3344261888,3344266239,CA 3344266240,3344266751,US 3344266752,3344268543,CA -3344268544,3344268799,GB -3344268800,3344269311,US -3344269312,3344288767,CA +3344268544,3344269311,US +3344269312,3344287743,CA +3344287744,3344287999,US +3344288000,3344288767,CA 3344288768,3344289791,PR 3344289792,3344292863,US 3344292864,3344296447,CA 3344296448,3344296959,US 3344296960,3344297983,GD -3344297984,3344299007,US +3344297984,3344299263,US 3344299264,3344299519,CA 3344299520,3344299775,US 3344299776,3344300543,CA 3344300544,3344300799,US -3344300800,3344302079,CA -3344302080,3344379903,US +3344300800,3344301823,CA +3344301824,3344379903,US 3344379904,3344380927,CA 3344380928,3344406527,US 3344406528,3344408575,CA @@ -85082,9 +91231,9 @@ 3344429056,3344431103,CA 3344431104,3344486399,US 3344486400,3344488447,NL -3344488448,3344552959,US -3344552960,3344553215,GB -3344553216,3344633855,US +3344488448,3344534271,US +3344534272,3344534527,CA +3344534528,3344633855,US 3344633856,3344637951,CH 3344637952,3344649215,US 3344649216,3344650239,PR @@ -85096,7 +91245,9 @@ 3344660480,3344670719,US 3344670720,3344671743,GP 3344671744,3344676863,US -3344676864,3344677407,CA +3344676864,3344677247,CA +3344677248,3344677263,US +3344677264,3344677407,CA 3344677408,3344677423,US 3344677424,3344678911,CA 3344678912,3344681983,US @@ -85140,7 +91291,8 @@ 3345332640,3345332655,US 3345332656,3345332663,RO 3345332664,3345333247,US -3345333248,3345334271,MF +3345333248,3345333503,GP +3345333504,3345334271,MF 3345334272,3345334527,A1 3345334528,3345335295,US 3345335296,3345335551,A1 @@ -85186,11 +91338,7 @@ 3345443328,3345443583,CH 3345443584,3345443839,DE 3345443840,3345444607,US -3345444608,3345444627,CH -3345444628,3345444629,US -3345444630,3345444676,CH -3345444677,3345444678,US -3345444679,3345445119,CH +3345444608,3345445119,CH 3345445120,3345445375,US 3345445376,3345446399,GB 3345446400,3345446655,US @@ -85200,9 +91348,7 @@ 3345447936,3345448447,FR 3345448448,3345448703,BE 3345448704,3345448959,DE -3345448960,3345659903,US -3345659904,3345660159,CA -3345660160,3346194175,US +3345448960,3346194175,US 3346194176,3346194431,A1 3346194432,3346196479,US 3346196480,3346197503,CA @@ -85222,13 +91368,15 @@ 3346243328,3346282495,US 3346282496,3346284543,PR 3346284544,3346319359,US -3346321408,3346323455,US +3346321408,3346322431,US 3346323456,3346325503,CA 3346325504,3346327551,US 3346327552,3346328575,CA 3346328576,3346329599,US 3346329600,3346330623,CA -3346330624,3346497535,US +3346330624,3346399231,US +3346399232,3346464767,FR +3346464768,3346497535,US 3346497536,3346498559,CA 3346498560,3346520063,US 3346520064,3346521087,CA @@ -85241,7 +91389,7 @@ 3346525184,3346528255,US 3346528256,3346529279,PR 3346529280,3346530303,CA -3346530304,3346591231,US +3346530304,3346591487,US 3346591488,3346591743,CA 3346591744,3346663167,US 3346663168,3346663423,CA @@ -85252,9 +91400,7 @@ 3346793472,3346793983,US 3346794496,3346923519,US 3346923520,3346989055,CA -3346989056,3346998527,US -3346998528,3346998783,CA -3346998784,3347015647,US +3346989056,3347015647,US 3347015648,3347015663,AE 3347015664,3347016703,US 3347016704,3347017727,CA @@ -85285,8 +91431,10 @@ 3349545216,3349545727,CA 3349545728,3349545983,US 3349545984,3349551103,CA -3349551104,3349553407,US -3349553408,3349608447,CA +3349551104,3349553663,US +3349553664,3349605375,CA +3349605376,3349605631,US +3349605632,3349608447,CA 3349608448,3349609471,US 3349609472,3349610239,CA 3349610240,3349614591,US @@ -85343,7 +91491,9 @@ 3350548736,3350548991,CA 3350548992,3350561279,US 3350561280,3350561535,AP -3350561536,3350593535,US +3350561536,3350574591,US +3350574848,3350575103,CA +3350575104,3350593535,US 3350593536,3350605823,CA 3350605824,3350606847,US 3350606848,3350607871,CA @@ -85351,12 +91501,14 @@ 3350618112,3350619135,CA 3350619136,3350623231,US 3350623232,3350624255,CA -3350624256,3350626303,US +3350624256,3350625279,US 3350626304,3350628351,CA 3350628352,3350642687,US 3350642688,3350643711,TC 3350643712,3350645759,US -3350645760,3350646783,CA +3350645760,3350645887,CA +3350645888,3350646015,RU +3350646016,3350646783,CA 3350646784,3350648831,US 3350648832,3350650623,CA 3350650624,3350650631,US @@ -85364,11 +91516,15 @@ 3350650880,3350790399,US 3350790400,3350814975,CA 3350814976,3350815231,US -3350815232,3350825727,CA -3350825728,3350825983,GB -3350825984,3350836223,CA +3350815232,3350823423,CA +3350823424,3350823935,US +3350823936,3350834687,CA +3350834688,3350835199,US +3350835200,3350836735,CA 3350836736,3350836991,US -3350836992,3350843391,CA +3350836992,3350837247,CA +3350837248,3350837759,US +3350837760,3350843391,CA 3350843392,3350843647,US 3350843648,3350855679,CA 3350855680,3350862079,US @@ -85396,33 +91552,26 @@ 3351043584,3351044095,CA 3351044096,3351047167,US 3351047168,3351047679,A1 -3351047680,3351071743,US +3351047680,3351058943,US +3351058944,3351059455,CA +3351059456,3351071743,US 3351071744,3351072767,CA 3351072768,3351074815,US 3351074816,3351076863,CA 3351076864,3351080959,US -3351080960,3351081983,AG +3351080960,3351081727,AG +3351081728,3351081983,DM 3351081984,3351086079,US 3351086080,3351087103,CA -3351087104,3351094271,US -3351094272,3351094527,CA -3351094528,3351095039,US -3351095040,3351095295,CA -3351095296,3351103487,US +3351087104,3351103487,US 3351103488,3351104511,CA -3351104512,3351104639,JP -3351104640,3351104703,SI -3351104704,3351104767,CH -3351104768,3351104831,US -3351104832,3351104895,GB -3351104896,3351104959,NL -3351104960,3351105023,SG -3351105024,3351105151,CA -3351105152,3351112703,US +3351104512,3351112703,US 3351112704,3351113727,CA 3351113728,3351129087,US 3351129088,3351130111,A2 -3351130112,3351232511,US +3351130112,3351196159,US +3351196160,3351196671,VG +3351196672,3351232511,US 3351232512,3351232767,IL 3351232768,3351275519,US 3351275520,3351276543,CA @@ -85445,8 +91594,8 @@ 3351359488,3351372799,US 3351372800,3351373823,BM 3351373824,3351376127,US -3351376128,3351376383,PR -3351376384,3351380223,US +3351376128,3351376639,PR +3351376640,3351380223,US 3351380224,3351380479,CA 3351380480,3351380735,US 3351380736,3351381759,CA @@ -85543,6 +91692,7 @@ 3351441408,3351441919,US 3351441920,3351442175,CA 3351442176,3351474687,US +3351474688,3351475199,CA 3351475200,3351475711,US 3351475712,3351475967,IS 3351475968,3351483391,US @@ -85555,11 +91705,7 @@ 3351495936,3351495989,SG 3351495990,3351495990,US 3351495991,3351496191,SG -3351496192,3351496447,US -3351496448,3351496675,SG -3351496676,3351496679,US -3351496680,3351496703,SG -3351496704,3351497727,US +3351496192,3351497727,US 3351497728,3351498751,CA 3351498752,3351501823,US 3351501824,3351502847,JM @@ -85569,8 +91715,9 @@ 3351524096,3351524351,GB 3351524352,3351642111,US 3351642112,3351695871,CA +3351695872,3351696383,US 3351696384,3351696639,CA -3351696640,3351696895,US +3351696640,3351697407,US 3351697408,3351698431,CA 3351698432,3351699199,US 3351699200,3351699455,CA @@ -85593,13 +91740,17 @@ 3351933952,3351939071,US 3351939072,3351959551,CA 3351959552,3351961599,US -3351961600,3351965695,CA +3351961600,3351963647,CA +3351963648,3351964159,US +3351964160,3351965695,CA 3351965696,3351969279,US 3351969280,3351969535,CA 3351969536,3351969791,US 3351969792,3352035327,IL 3352035328,3352036351,CA -3352036352,3352046591,US +3352036352,3352037888,US +3352037889,3352037889,EU +3352037890,3352046591,US 3352046592,3352049663,CA 3352049664,3352051711,US 3352051712,3352055807,CA @@ -85616,7 +91767,9 @@ 3352563200,3352563455,US 3352563456,3352573951,CA 3352573952,3352574463,US -3352574464,3352583935,CA +3352574464,3352581631,CA +3352581632,3352582143,US +3352582144,3352583935,CA 3352583936,3352584191,US 3352584192,3352591359,CA 3352591360,3352591615,US @@ -85625,9 +91778,13 @@ 3352616960,3352887295,CA 3352887296,3352918015,US 3352918016,3352919039,CA -3352919040,3353653503,US +3352919040,3353335335,US +3353335336,3353335337,NL +3353335338,3353653503,US 3353653504,3353653759,GB -3353653760,3353722367,US +3353653760,3353714431,US +3353714432,3353714687,BE +3353714688,3353722367,US 3353722368,3353722623,GB 3353722624,3353726975,US 3353726976,3353727231,IN @@ -85638,12 +91795,16 @@ 3353731072,3353732607,US 3353732608,3353732863,DE 3353732864,3353736191,US -3353736192,3353736959,PR +3353736192,3353736447,PR +3353736448,3353736703,US +3353736704,3353736959,PR 3353736960,3353737215,US 3353737216,3353737471,GB 3353737472,3353780223,US 3353780224,3353780479,GB -3353780480,3353855999,US +3353780480,3353836799,US +3353836800,3353837311,CA +3353837312,3353855999,US 3353856000,3353858047,CA 3353858048,3353861119,US 3353861120,3353862143,CA @@ -85678,7 +91839,9 @@ 3354686976,3354687231,CN 3354687232,3354687487,US 3354687488,3354688511,CA -3354688512,3354731018,US +3354688512,3354707455,US +3354707456,3354707967,CA +3354707968,3354731018,US 3354731019,3354731019,EU 3354731020,3354731519,US 3354731520,3354731775,AP @@ -85698,17 +91861,19 @@ 3354955776,3354956031,AR 3354956032,3354972159,US 3354972160,3354972415,CA -3354972416,3355013119,US -3355013120,3355017215,CA +3354972416,3355012607,US +3355012608,3355017215,CA 3355017216,3355052287,US -3355052288,3355052543,AU -3355052544,3355053311,CA -3355053312,3355053567,US -3355054080,3355260927,US +3355052288,3355053311,CA +3355053312,3355249151,US +3355249152,3355249663,CA +3355249664,3355260927,US 3355260928,3355262719,CA 3355262720,3355272189,US 3355272190,3355272190,EU -3355272191,3355310591,US +3355272191,3355308287,US +3355308288,3355308543,GB +3355308544,3355310591,US 3355310592,3355311103,CA 3355311104,3355319295,US 3355319296,3355320319,CA @@ -85735,7 +91900,7 @@ 3355430912,3355432959,A1 3355432960,3355435007,CA 3355435008,3355443199,US -3355443200,3355443200,CN +3355443200,3355443200,DE 3355443201,3355445247,CO 3355445248,3355447295,BR 3355447296,3355447551,CU @@ -85746,7 +91911,9 @@ 3355448832,3355449343,SX 3355449344,3355450367,CU 3355450368,3355451391,EC -3355451392,3355459327,BR +3355451392,3355458559,BR +3355458560,3355459071,HN +3355459072,3355459327,BR 3355459328,3355459583,EC 3355459584,3355459839,PA 3355459840,3355460095,VE @@ -85779,7 +91946,8 @@ 3355472640,3355473407,CL 3355473408,3355473919,PE 3355473920,3355475199,CL -3355475200,3355478015,MX +3355475200,3355477503,MX +3355477504,3355478015,BR 3355478016,3355478271,PE 3355478272,3355478783,US 3355478784,3355479039,VE @@ -85811,6 +91979,7 @@ 3355516928,3355525119,AR 3355525120,3355535359,CO 3355535360,3355537407,TT +3355537408,3355537663,BR 3355537664,3355537919,AR 3355538176,3355538431,CL 3355538432,3355539199,AR @@ -85904,7 +92073,7 @@ 3355843584,3355844863,EC 3355844864,3355845119,CL 3355845120,3355845375,EC -3355845376,3355848703,BR +3355845376,3355848959,BR 3355849728,3355849983,PA 3355849984,3355850495,CL 3355850496,3355850751,NI @@ -85922,7 +92091,7 @@ 3355885568,3355901951,GT 3355901952,3355902975,BR 3355902976,3355903999,CL -3355904000,3355905023,BR +3355904000,3355905535,BR 3355905536,3355905791,PY 3355905792,3355906047,AR 3355906048,3355910143,CL @@ -85930,7 +92099,9 @@ 3355918336,3355923455,EC 3355923456,3355924479,UY 3355924480,3355926527,TT -3355926528,3355930623,PA +3355926528,3355927039,NL +3355927040,3355928063,US +3355928064,3355930623,PA 3355930624,3355934719,BR 3355934720,3355939839,AR 3355939840,3355940863,SR @@ -85940,57 +92111,58 @@ 3355949056,3355951103,CW 3355951104,3355967487,EC 3355967488,3356033023,VE -3356033280,3356033791,BR +3356033024,3356033791,BR 3356033792,3356034047,CL 3356034048,3356035071,PY 3356035072,3356037119,MX 3356037120,3356041215,CO 3356041216,3356049407,CR 3356049408,3356049663,CL -3356049664,3356050175,BR -3356050432,3356051455,BR +3356049664,3356051455,BR 3356051456,3356051711,CO 3356051712,3356051967,CL 3356051968,3356052223,GT 3356052224,3356052479,AR -3356052480,3356052735,BR +3356052480,3356053247,BR 3356053248,3356054015,CL 3356054016,3356054527,US -3356054528,3356057599,BR +3356054528,3356057087,BR +3356057088,3356057343,CO +3356057344,3356057599,BR 3356057600,3356057855,EC 3356057856,3356059135,CL 3356059136,3356060671,BR 3356060672,3356061695,CL 3356061696,3356062463,BR 3356062464,3356062719,JM -3356062720,3356062975,BR -3356062976,3356063231,CR -3356063232,3356063743,BR +3356062720,3356063743,CR 3356064000,3356064255,BR 3356064256,3356064511,CL -3356064768,3356065791,BR +3356064512,3356065791,BR 3356065792,3356066047,CL 3356066048,3356069119,BR 3356069120,3356069631,CL -3356069888,3356070143,BR +3356069632,3356070143,BR 3356070144,3356070655,CL 3356070656,3356070911,AR 3356070912,3356071423,BR 3356071424,3356072447,CL 3356073216,3356073471,AR -3356073472,3356075007,BR -3356075008,3356076287,BO +3356073472,3356075263,BR +3356075264,3356076287,BO 3356076288,3356078079,BR 3356078080,3356078335,EC 3356078336,3356079359,CL +3356079360,3356079615,AR 3356079616,3356080127,MX 3356080128,3356080383,BR 3356080384,3356080639,MX +3356080640,3356080895,BR 3356080896,3356082431,NI 3356082432,3356082687,CL 3356082688,3356082943,AR 3356082944,3356083967,CL -3356083968,3356084223,BR +3356083968,3356084479,BR 3356084480,3356084735,CL 3356084736,3356085247,BR 3356085248,3356085759,CL @@ -86024,7 +92196,18 @@ 3356102400,3356102655,PA 3356102656,3356105727,CL 3356105728,3356106751,SV -3356106752,3356113919,BR +3356106752,3356107975,HN +3356107976,3356107983,IS +3356107984,3356109119,HN +3356109120,3356109135,FR +3356109136,3356109263,HN +3356109264,3356109271,DE +3356109272,3356109495,HN +3356109496,3356109503,IT +3356109504,3356109687,HN +3356109688,3356109695,CA +3356109696,3356110847,HN +3356110848,3356113919,BR 3356113920,3356114943,UY 3356114944,3356123135,PE 3356123136,3356131839,AR @@ -86100,9 +92283,7 @@ 3356180480,3356190719,CL 3356190720,3356192767,DO 3356192768,3356194815,AR -3356196864,3356201471,KY -3356201472,3356201727,VE -3356201728,3356213247,KY +3356196864,3356213247,KY 3356213248,3356229631,VE 3356229632,3356233727,BR 3356233728,3356237823,CL @@ -86143,7 +92324,8 @@ 3356290304,3356290559,SV 3356290560,3356291071,CR 3356291072,3356293119,TT -3356293120,3356295167,AW +3356293120,3356293375,BO +3356293376,3356295167,AW 3356295168,3356297215,CL 3356297216,3356299263,BR 3356299264,3356305663,MX @@ -86156,13 +92338,11 @@ 3356332032,3356334079,CU 3356334080,3356336127,BO 3356336128,3356336895,SV -3356336896,3356337663,HN -3356337664,3356337919,SV -3356337920,3356338175,HN +3356336896,3356338175,HN 3356338176,3356339967,SV 3356339968,3356341247,HN -3356341248,3356341759,SV -3356341760,3356342271,HN +3356341248,3356341503,SV +3356341504,3356342271,HN 3356342272,3356343039,SV 3356343040,3356343551,HN 3356343552,3356344319,SV @@ -86237,6 +92417,7 @@ 3357007872,3357011967,BR 3357011968,3357016063,MX 3357016064,3357018623,CO +3357018624,3357019135,BR 3357019136,3357020159,CL 3357020160,3357032447,CO 3357032448,3357040639,BR @@ -86296,12 +92477,7 @@ 3357442392,3357442395,HN 3357442396,3357442559,GT 3357442560,3357442815,NI -3357442816,3357442847,GT -3357442848,3357442879,SV -3357442880,3357442959,GT -3357442960,3357442967,SV -3357442968,3357443007,GT -3357443008,3357443071,SV +3357442816,3357443071,SV 3357443072,3357443327,NI 3357443328,3357443583,GT 3357443584,3357444351,HN @@ -86325,8 +92501,9 @@ 3357451144,3357451151,HN 3357451152,3357451263,GT 3357451264,3357451519,HN -3357451520,3357451775,NI -3357451776,3357452287,GT +3357451520,3357451575,GT +3357451576,3357451583,NI +3357451584,3357452287,GT 3357452288,3357452799,HN 3357452800,3357453055,NI 3357453056,3357453071,GT @@ -86375,12 +92552,8 @@ 3357477432,3357477543,AR 3357477544,3357477551,EC 3357477552,3357477887,AR -3357477888,3357478911,CO -3357478912,3357479063,AR -3357479064,3357479071,CO -3357479072,3357479135,AR -3357479136,3357479151,CO -3357479152,3357479183,AR +3357477888,3357479167,CO +3357479168,3357479183,AR 3357479184,3357479191,CO 3357479192,3357479215,AR 3357479216,3357479223,CO @@ -86396,17 +92569,14 @@ 3357480336,3357480343,CO 3357480344,3357480359,AR 3357480360,3357480367,CO -3357480368,3357480463,AR +3357480368,3357480407,AR +3357480408,3357480415,CO +3357480416,3357480463,AR 3357480464,3357480479,CO 3357480480,3357480511,AR 3357480512,3357480543,CO 3357480544,3357480703,AR -3357480704,3357480711,CO -3357480712,3357480719,AR -3357480720,3357480735,CO -3357480736,3357480799,AR -3357480800,3357480807,CO -3357480808,3357480959,AR +3357480704,3357480959,CO 3357480960,3357483007,EC 3357483008,3357491199,CL 3357491200,3357499391,CO @@ -86418,16 +92588,16 @@ 3357556736,3357556991,VE 3357556992,3357557247,AR 3357557248,3357557759,MX -3357557760,3357558783,EC -3357558784,3357558895,AR -3357558896,3357558903,EC -3357558904,3357559039,AR -3357559040,3357559295,EC +3357557760,3357559295,EC 3357559296,3357559551,CA 3357559552,3357559807,US 3357559808,3357559935,AR 3357559936,3357560063,VE -3357560064,3357560199,AR +3357560064,3357560159,AR +3357560160,3357560167,VE +3357560168,3357560175,AR +3357560176,3357560183,VE +3357560184,3357560199,AR 3357560200,3357560207,VE 3357560208,3357560247,AR 3357560248,3357560255,VE @@ -86507,16 +92677,19 @@ 3358133760,3358142719,AR 3358142720,3358142975,US 3358142976,3358143231,CO -3358143232,3358143295,VE -3358143296,3358143487,AR +3358143232,3358143487,VE 3358143488,3358143999,US 3358144000,3358144127,CL 3358144128,3358144255,AR 3358144256,3358144511,CL 3358144512,3358145023,VE -3358145024,3358149631,AR -3358149632,3358150399,CO -3358150400,3358150423,AR +3358145024,3358149695,AR +3358149696,3358149703,CO +3358149704,3358149719,AR +3358149720,3358149727,CO +3358149728,3358150015,AR +3358150016,3358150143,CO +3358150144,3358150423,AR 3358150424,3358150431,CO 3358150432,3358150479,AR 3358150480,3358150655,CO @@ -86528,12 +92701,7 @@ 3358151272,3358151423,AR 3358151424,3358151551,EC 3358151552,3358151679,AR -3358151680,3358151807,PE -3358151808,3358151935,AR -3358151936,3358152191,PE -3358152192,3358152543,AR -3358152544,3358152575,PE -3358152576,3358152703,AR +3358151680,3358152703,PE 3358152704,3358152959,US 3358152960,3358153215,EC 3358153216,3358153279,AR @@ -86551,8 +92719,8 @@ 3358154752,3358158847,PE 3358158848,3358159159,AR 3358159160,3358159167,US -3358159168,3358159487,AR -3358159488,3358159615,EC +3358159168,3358159359,AR +3358159360,3358159615,EC 3358159616,3358159871,US 3358159872,3358160895,VE 3358160896,3358236671,AR @@ -86564,12 +92732,12 @@ 3358326784,3358392319,VE 3358392320,3358457855,AR 3358457856,3358523391,PA -3358523392,3358524159,VE -3358524160,3358524415,AR +3358523392,3358523903,VE +3358523904,3358524415,AR 3358524416,3358525951,VE 3358525952,3358526463,AR -3358526464,3358529535,VE -3358529536,3358530303,AR +3358526464,3358527487,VE +3358527488,3358530303,AR 3358530304,3358530943,VE 3358530944,3358531071,AR 3358531072,3358531583,VE @@ -86591,9 +92759,13 @@ 3358548224,3358548479,AR 3358548480,3358549759,VE 3358549760,3358550015,AR -3358550016,3358553599,VE +3358550016,3358552063,VE +3358552064,3358553087,AR +3358553088,3358553599,VE 3358553600,3358553855,AR -3358553856,3358556159,VE +3358553856,3358554879,VE +3358554880,3358555135,AR +3358555136,3358556159,VE 3358556160,3358558463,AR 3358558464,3358558591,PY 3358558592,3358559231,AR @@ -86603,31 +92775,7 @@ 3358562304,3358563327,PE 3358563328,3358564095,CO 3358564096,3358564351,MX -3358564352,3358564415,AR -3358564416,3358564447,VE -3358564448,3358564479,AR -3358564480,3358564511,VE -3358564512,3358564575,AR -3358564576,3358564607,VE -3358564608,3358564623,AR -3358564624,3358564719,VE -3358564720,3358564751,AR -3358564752,3358564767,VE -3358564768,3358564783,AR -3358564784,3358564807,VE -3358564808,3358564815,AR -3358564816,3358564839,VE -3358564840,3358564847,AR -3358564848,3358565183,VE -3358565184,3358565247,AR -3358565248,3358565311,VE -3358565312,3358565343,AR -3358565344,3358565375,VE -3358565376,3358566399,AR -3358566400,3358566847,VE -3358566848,3358566879,AR -3358566880,3358566911,VE -3358566912,3358566975,AR +3358564352,3358566975,AR 3358566976,3358567103,VE 3358567104,3358567167,AR 3358567168,3358567231,VE @@ -86725,8 +92873,7 @@ 3359505920,3359506431,AR 3359506432,3359508479,US 3359508480,3359514623,VE -3359514624,3359514879,CL -3359514880,3359516671,US +3359514624,3359516671,US 3359516672,3359516927,VG 3359516928,3359517183,US 3359517184,3359517439,VG @@ -86737,9 +92884,7 @@ 3359520768,3359522815,US 3359522816,3359539199,NI 3359539200,3359571967,PE -3359571968,3359579647,AR -3359579648,3359579903,US -3359579904,3359582207,AR +3359571968,3359582207,AR 3359582208,3359584255,PA 3359584256,3359586303,AR 3359586304,3359588351,CL @@ -86750,7 +92895,9 @@ 3359621120,3359637503,EC 3359637504,3359789583,MX 3359789584,3359789599,US -3359789600,3359797247,MX +3359789600,3359789823,MX +3359789824,3359789887,US +3359789888,3359797247,MX 3359797248,3359801343,BR 3359801344,3359899647,MX 3359899648,3359916031,CL @@ -86770,13 +92917,38 @@ 3360120832,3360124927,CO 3360124928,3360125951,VE 3360125952,3360127999,BR -3360128000,3360129023,HN +3360128000,3360128319,HN +3360128320,3360128327,IT +3360128328,3360128543,HN +3360128544,3360128575,US +3360128576,3360129023,HN 3360129024,3360145407,VE 3360145408,3360153599,CL 3360153600,3360157695,AR 3360157696,3360159743,VE 3360159744,3360161791,BQ -3360161792,3360251903,CL +3360161792,3360229007,CL +3360229008,3360229012,US +3360229013,3360229013,CL +3360229014,3360229023,US +3360229024,3360231775,CL +3360231776,3360231807,US +3360231808,3360244223,CL +3360244224,3360244479,CO +3360244480,3360244735,CL +3360244736,3360245759,CO +3360245760,3360246783,CL +3360246784,3360247039,AR +3360247040,3360247807,CL +3360247808,3360248063,CO +3360248064,3360248831,CL +3360248832,3360249087,CO +3360249088,3360249343,CL +3360249344,3360250367,CO +3360250368,3360250623,CL +3360250624,3360251135,CO +3360251136,3360251391,CL +3360251392,3360251903,CO 3360251904,3360253951,BO 3360253952,3360255999,SV 3360256000,3360260095,CL @@ -86792,7 +92964,9 @@ 3360342016,3360354303,VE 3360354304,3360356351,PA 3360356352,3360358399,CR -3360358400,3360366591,CL +3360358400,3360358911,CL +3360358912,3360358919,CO +3360358920,3360366591,CL 3360366592,3360382975,CO 3360382976,3360399359,VE 3360399360,3360403455,BO @@ -86808,17 +92982,76 @@ 3360538624,3360667647,MX 3360667648,3360669695,BR 3360669696,3360686079,MX -3360686080,3360705535,AR +3360686080,3360687919,CO +3360687920,3360687935,AR +3360687936,3360687983,CO +3360687984,3360688031,AR +3360688032,3360688127,CO +3360688128,3360688639,AR +3360688640,3360689407,CO +3360689408,3360689535,AR +3360689536,3360689919,CO +3360689920,3360690175,AR +3360690176,3360690399,CO +3360690400,3360690415,AR +3360690416,3360690623,CO +3360690624,3360690687,AR +3360690688,3360690703,CO +3360690704,3360690719,AR +3360690720,3360690847,CO +3360690848,3360690863,AR +3360690864,3360691199,CO +3360691200,3360691391,AR +3360691392,3360691455,CO +3360691456,3360691711,AR +3360691712,3360692479,CO +3360692480,3360692607,AR +3360692608,3360692735,CO +3360692736,3360692799,AR +3360692800,3360692863,CO +3360692864,3360693247,AR +3360693248,3360693279,CO +3360693280,3360693343,AR +3360693344,3360693407,CO +3360693408,3360693423,AR +3360693424,3360693503,CO +3360693504,3360693791,AR +3360693792,3360693807,CO +3360693808,3360693823,AR +3360693824,3360694439,CO +3360694440,3360694447,AR +3360694448,3360694463,CO +3360694464,3360694783,AR +3360694784,3360695039,CO +3360695040,3360695079,AR +3360695080,3360695087,CO +3360695088,3360695167,AR +3360695168,3360695199,CO +3360695200,3360695215,AR +3360695216,3360695295,CO +3360695296,3360696447,AR +3360696448,3360696511,CO +3360696512,3360696527,AR +3360696528,3360697343,CO +3360697344,3360697599,AR +3360697600,3360697855,CO +3360697856,3360698111,AR +3360698112,3360700543,CO +3360700544,3360701183,AR +3360701184,3360701695,CO +3360701696,3360701951,AR +3360701952,3360702207,CO +3360702208,3360705535,AR 3360705536,3360706047,US -3360706048,3360706815,AR -3360706816,3360707327,US +3360706048,3360707071,AR +3360707072,3360707327,US 3360707328,3360707583,AR 3360707584,3360708095,US 3360708096,3360708223,AR 3360708224,3360708351,US 3360708352,3360708479,AR -3360708480,3360708735,US -3360708736,3360708991,AR +3360708480,3360708863,US +3360708864,3360708991,AR 3360708992,3360709247,US 3360709248,3360709631,AR 3360709632,3360709759,US @@ -86827,9 +93060,7 @@ 3360710400,3360710527,AR 3360710528,3360710655,US 3360710656,3360718847,HT -3360718848,3360760575,AR -3360760576,3360760831,UY -3360760832,3360763903,AR +3360718848,3360763903,AR 3360763904,3360765951,GT 3360765952,3360767999,CO 3360768000,3360772351,AR @@ -86838,7 +93069,11 @@ 3360780304,3360780319,BR 3360780320,3360780399,AR 3360780400,3360780415,BR -3360780416,3360781839,AR +3360780416,3360780991,AR +3360780992,3360780995,BR +3360780996,3360781791,AR +3360781792,3360781795,MX +3360781796,3360781839,AR 3360781840,3360781847,DO 3360781848,3360781943,AR 3360781944,3360781947,MX @@ -86942,8 +93177,8 @@ 3362447360,3362448895,HN 3362448896,3362449151,SV 3362449152,3362449407,HN -3362449408,3362451199,SV -3362451200,3362451455,HN +3362449408,3362450431,SV +3362450432,3362451455,HN 3362451456,3362452479,AR 3362452480,3362452991,BO 3362452992,3362453247,HN @@ -86975,7 +93210,11 @@ 3362552144,3362552159,PR 3362552160,3362553023,AR 3362553024,3362553039,PR -3362553040,3362553855,AR +3362553040,3362553167,AR +3362553168,3362553183,DO +3362553184,3362553247,AR +3362553248,3362553263,CO +3362553264,3362553855,AR 3362553856,3362557951,PY 3362557952,3362562047,AR 3362570240,3362586623,UY @@ -86983,9 +93222,7 @@ 3362652160,3362664447,PE 3362664448,3362668543,BO 3362668544,3362684927,EC -3362684928,3362687999,AR -3362688000,3362688511,CO -3362688512,3362688767,AR +3362684928,3362688767,AR 3362688768,3362689279,CO 3362689280,3362689311,AR 3362689312,3362690367,CO @@ -87104,9 +93341,13 @@ 3367840768,3367841791,HN 3367841792,3368052991,BR 3368052992,3368053247,PE -3368053760,3368086015,BR +3368053760,3368086527,BR 3368086528,3368087551,CR -3368087552,3370188799,BR +3368087552,3368157183,BR +3368157184,3368173567,MX +3368173568,3368601799,BR +3368601800,3368601800,A1 +3368601801,3370188799,BR 3370188800,3370196991,MX 3370196992,3370214399,BR 3370214400,3370215423,AR @@ -87118,13 +93359,14 @@ 3370506240,3370507263,VE 3370507264,3370514943,BR 3370515456,3370516479,AR -3370516480,3371106303,BR +3370516480,3370926079,BR +3370926080,3370942463,MX +3370942464,3371106303,BR 3371106304,3371122687,MX 3371122688,3378511871,BR 3378511872,3380506879,MX 3380506880,3380507135,BR 3380507136,3380744191,MX -3380744192,3380745215,CW 3380745216,3380746239,BR 3380746240,3380747263,PE 3380747264,3380748287,BR @@ -87160,6 +93402,7 @@ 3380825088,3380825343,MX 3380825344,3380825599,HT 3380825600,3380825855,CO +3380825856,3380826111,AR 3380826112,3380828159,BR 3380828160,3380828671,MX 3380828672,3380829183,CO @@ -87168,13 +93411,17 @@ 3380830464,3380830719,CO 3380830720,3380831231,PA 3380831232,3380831743,MX +3380831744,3380831999,AR 3380832000,3380832255,SR 3380832256,3380832767,MX -3380833024,3380833279,DO +3380832768,3380833279,DO 3380833280,3380833791,MX +3380833792,3380834303,SV 3380834304,3380834815,MX 3380834816,3380835071,CO +3380835072,3380835327,NI 3380835328,3380835839,MX +3380835840,3380836351,AR 3380836352,3380836607,MX 3380836608,3380836863,PE 3380836864,3380837375,SV @@ -87318,7 +93565,7 @@ 3386474496,3386490879,UY 3386490880,3386499071,CO 3386499072,3386503167,AR -3386503168,3386504191,PE +3386503168,3386504191,CL 3386504192,3386505215,AR 3386505216,3386507263,CL 3386507264,3386523647,EC @@ -87386,21 +93633,7 @@ 3387424768,3387555839,CO 3387555840,3387568127,AR 3387568128,3387572223,PE -3387572224,3387572539,AR -3387572540,3387572543,CO -3387572544,3387573375,AR -3387573376,3387573887,CO -3387573888,3387574015,AR -3387574016,3387574143,CO -3387574144,3387574783,AR -3387574784,3387575039,CO -3387575040,3387575295,AR -3387575296,3387575423,CO -3387575424,3387575551,AR -3387575552,3387575567,CO -3387575568,3387575679,AR -3387575680,3387576063,CO -3387576064,3387576319,AR +3387572224,3387576319,CO 3387576320,3387578367,EC 3387578368,3387584511,AR 3387584512,3387588607,PE @@ -87498,8 +93731,8 @@ 3389123584,3389123839,ID 3389123840,3389124351,AU 3389124352,3389124607,SG -3389124608,3389128703,PG -3389128704,3389129727,AU +3389124608,3389128447,PG +3389128448,3389129727,AU 3389129728,3389132799,NZ 3389132800,3389136895,AU 3389136896,3389142015,HK @@ -87593,11 +93826,7 @@ 3389345792,3389349887,TH 3389349888,3389358079,AU 3389358080,3389366271,PK -3389366272,3389370177,AU -3389370178,3389370178,PG -3389370179,3389373183,AU -3389373184,3389373439,US -3389373440,3389374463,AU +3389366272,3389374463,AU 3389374464,3389378559,MN 3389382656,3389390847,TW 3389390848,3389391359,HK @@ -87654,6 +93883,7 @@ 3389458432,3389460479,AU 3389460480,3389464575,JP 3389464576,3389469695,NZ +3389469696,3389470719,KH 3389471232,3389471487,IN 3389471744,3389472767,NZ 3389472768,3389480959,AU @@ -87708,6 +93938,7 @@ 3389600512,3389601791,CN 3389601792,3389602047,AU 3389602048,3389602815,CN +3389602816,3389603839,HK 3389604096,3389604351,AU 3389604352,3389604863,SG 3389605120,3389605375,ID @@ -87727,7 +93958,6 @@ 3389609472,3389609727,SG 3389609728,3389609983,AU 3389609984,3389610239,NZ -3389610496,3389610751,HK 3389610752,3389611519,IN 3389611520,3389612031,AU 3389612032,3389616127,MY @@ -87738,7 +93968,7 @@ 3389661184,3389669375,ID 3389669376,3389673471,CN 3389673472,3389677567,AU -3389677568,3389685759,JP +3389677568,3389681663,JP 3389685760,3389718527,AU 3389718528,3389784063,JP 3389784064,3389784319,NZ @@ -87762,6 +93992,7 @@ 3389802496,3389802751,CN 3389802752,3389803263,TH 3389803264,3389803519,ID +3389803520,3389804543,TW 3389804544,3389805567,IN 3389805568,3389806079,CN 3389806080,3389807359,AU @@ -87792,6 +94023,7 @@ 3389847552,3389849599,NZ 3389849600,3389915135,JP 3389915136,3389916159,AU +3389916160,3389917183,HK 3389917184,3389919231,SG 3389919232,3389931519,NZ 3389931520,3389932031,CN @@ -87829,6 +94061,7 @@ 3389944832,3389945087,AU 3389945088,3389945343,TH 3389945344,3389945855,CN +3389945856,3389946879,IN 3389946880,3389947391,CN 3389947392,3389947647,AU 3389947648,3389947903,CN @@ -87851,8 +94084,7 @@ 3389957376,3389957631,KR 3389957632,3389957887,AU 3389957888,3389958399,NZ -3389958400,3389959167,CN -3389960192,3389960447,CN +3389958400,3389960447,CN 3389960448,3389962239,AU 3389962240,3389962751,CN 3389962752,3389963007,AU @@ -87899,7 +94131,7 @@ 3390335232,3390335487,TH 3390335488,3390336511,ID 3390336512,3390336767,JP -3390336768,3390337023,CH +3390336768,3390337023,HK 3390337024,3390337279,GU 3390337280,3390337535,NZ 3390337536,3390337791,CN @@ -87948,7 +94180,9 @@ 3390447360,3390447615,ID 3390447616,3390455807,KR 3390455808,3390472191,JP -3390472192,3390480383,NC +3390472192,3390472703,NC +3390472704,3390472959,FR +3390472960,3390480383,NC 3390480384,3390484479,AU 3390484480,3390488575,GU 3390488576,3390492671,BD @@ -87970,7 +94204,9 @@ 3391094784,3391192063,JP 3391192064,3391192319,AP 3391192320,3391356927,JP -3391356928,3391444479,NZ +3391356928,3391441407,NZ +3391441408,3391441663,PH +3391441664,3391444479,NZ 3391444480,3391444991,VN 3391444992,3391453183,NZ 3391453184,3391453439,ID @@ -88045,7 +94281,7 @@ 3391725568,3391733759,TH 3391733760,3391734015,CN 3391734016,3391734783,AU -3391735808,3391736831,JP +3391734784,3391736831,CN 3391736832,3391737855,IN 3391737856,3391741951,JP 3391741952,3391746047,IN @@ -88071,7 +94307,6 @@ 3391837184,3391838207,AU 3391838208,3391838719,ID 3391838720,3391838975,IN -3391838976,3391839231,AU 3391839232,3391840255,ID 3391840256,3391841279,JP 3391841280,3391842303,MY @@ -88094,6 +94329,7 @@ 3391881216,3391885311,TH 3391885312,3391889407,CN 3391889408,3391893503,TH +3391893504,3391894527,CN 3391894528,3391895551,TH 3391895552,3391896575,IN 3391896576,3391897599,NZ @@ -88194,7 +94430,9 @@ 3392114432,3392114687,KR 3392114688,3392118783,GU 3392118784,3392126975,MY -3392126976,3392135167,ID +3392126976,3392130303,ID +3392130304,3392130815,TW +3392130816,3392135167,ID 3392135168,3392143359,TH 3392143360,3392208895,JP 3392208896,3392286975,NZ @@ -88218,6 +94456,7 @@ 3392385024,3392389119,BD 3392389120,3392401407,ID 3392401408,3392403455,SG +3392403456,3392404479,IN 3392404480,3392405503,ID 3392405504,3392406015,NP 3392406016,3392406527,IN @@ -88268,7 +94507,6 @@ 3392444928,3392445183,JP 3392445184,3392445439,NZ 3392445440,3392445695,ID -3392445696,3392445951,IN 3392445952,3392446463,AU 3392446464,3392450559,PH 3392450560,3392454655,JP @@ -88282,7 +94520,9 @@ 3392499712,3392503807,JP 3392503808,3392507903,HK 3392512000,3392516095,BD -3392516096,3392524287,AU +3392516096,3392519167,AU +3392519168,3392519679,NZ +3392519680,3392524287,AU 3392524288,3392528383,JP 3392528384,3392536575,ID 3392536576,3392602111,IN @@ -88318,6 +94558,7 @@ 3392733184,3392741375,ID 3392741376,3392765951,PH 3392765952,3392782335,TH +3392788480,3392789503,CN 3392789504,3392790527,HK 3392790528,3392794623,JP 3392794624,3392798975,CN @@ -88333,6 +94574,7 @@ 3392823296,3392824319,KH 3392824320,3392824831,AU 3392824832,3392825343,IN +3392827392,3392828415,CN 3392828416,3392829439,JP 3392829440,3392830463,IN 3392830464,3392830719,ID @@ -88354,13 +94596,11 @@ 3392858880,3392859135,AU 3392859136,3392859647,PH 3392859648,3392860159,ID -3392860160,3392860415,AU -3392860416,3392860671,PH +3392860160,3392860671,AU 3392860672,3392861183,ID 3392861184,3392861439,TH 3392861440,3392861695,VN -3392861696,3392861951,PH -3392861952,3392862207,AU +3392861696,3392862207,AU 3392864256,3392864511,CN 3392864768,3392865279,IN 3392865280,3392866303,NU @@ -88468,8 +94708,7 @@ 3393159168,3393167359,SG 3393167360,3393175551,CN 3393175552,3393183743,PK -3393183744,3393183999,ID -3393184000,3393184255,US +3393183744,3393184255,SG 3393184256,3393184767,PK 3393184768,3393187839,SG 3393187840,3393189887,NP @@ -88507,10 +94746,7 @@ 3393478656,3393486847,AU 3393486848,3393495039,IN 3393495040,3393499135,AU -3393499136,3393499391,US -3393499392,3393499903,SG -3393499904,3393500159,US -3393500160,3393503231,SG +3393499136,3393503231,SG 3393503232,3393507327,HK 3393507328,3393511423,SG 3393511424,3393519615,KR @@ -88596,9 +94832,9 @@ 3393855744,3393855999,NZ 3393856000,3393856255,AU 3393856256,3393856511,HK -3393856768,3393856896,AU +3393856768,3393856896,SG 3393856897,3393856897,AP -3393856898,3393857023,AU +3393856898,3393857023,SG 3393857024,3393857535,NZ 3393857536,3393858047,HK 3393858304,3393858559,ID @@ -88653,11 +94889,9 @@ 3394011136,3394027519,AU 3394027520,3394035711,JP 3394035712,3394039807,MY -3394039808,3394040063,CN -3394040064,3394040319,SG -3394040320,3394040831,IN -3394040832,3394041087,KR -3394041088,3394041855,SG +3394039808,3394040575,SG +3394040576,3394040831,IN +3394040832,3394041855,SG 3394041856,3394042879,AU 3394042880,3394043903,CN 3394043904,3394060287,HK @@ -88703,9 +94937,7 @@ 3394226944,3394226947,AP 3394226948,3394226948,SG 3394226949,3394227199,AP -3394227200,3394230271,SG -3394230272,3394230527,AU -3394230528,3394232319,SG +3394227200,3394232319,SG 3394232320,3394234367,CN 3394234368,3394236415,VN 3394236416,3394238463,JP @@ -88720,9 +94952,7 @@ 3394273280,3394277375,HK 3394277376,3394279423,AU 3394279424,3394281471,PH -3394281472,3394282239,SG -3394282240,3394282495,US -3394282496,3394285567,SG +3394281472,3394285567,SG 3394285568,3394289663,AU 3394289664,3394293759,CN 3394293760,3394297855,ID @@ -88730,9 +94960,7 @@ 3394306048,3394307071,CN 3394307072,3394308095,AU 3394308096,3394310143,JP -3394310144,3394313727,AU -3394313728,3394313983,PH -3394313984,3394314239,AU +3394310144,3394314239,AU 3394314240,3394322431,ID 3394322432,3394326527,AU 3394326528,3394330623,JP @@ -88812,9 +95040,7 @@ 3394760704,3394764799,ID 3394764800,3394772991,HK 3394777088,3394781183,JP -3394781184,3394785023,MP -3394785024,3394785279,US -3394785280,3394789375,MP +3394781184,3394789375,MP 3394789376,3394797567,HK 3394797568,3394813951,IN 3394813952,3394815999,JP @@ -88825,7 +95051,10 @@ 3394832384,3394834431,CN 3394834432,3394834559,HK 3394834560,3394834575,JP -3394834576,3394834687,HK +3394834576,3394834591,HK +3394834592,3394834599,JP +3394834600,3394834607,SG +3394834608,3394834687,HK 3394834688,3394834943,JP 3394834944,3394834959,HK 3394834960,3394834975,JP @@ -88847,8 +95076,10 @@ 3394838528,3394846719,NZ 3394846720,3394850815,IN 3394850816,3394854911,JP +3394854912,3394855935,CN 3394855936,3394856959,AU 3394856960,3394857983,IN +3394857984,3394859007,CN 3394859008,3394860031,JP 3394860032,3394860543,ID 3394860544,3394860799,IN @@ -88893,10 +95124,7 @@ 3394949120,3394953215,JP 3394953216,3394957311,CN 3394957312,3394959359,AU -3394959360,3394959871,HK -3394959872,3394960127,SG -3394960128,3394960383,HK -3394960384,3394961407,PH +3394959360,3394960383,HK 3394961408,3394962431,CN 3394962432,3394963455,AU 3394963456,3394965503,ID @@ -89015,7 +95243,12 @@ 3397070848,3397074943,PH 3397074944,3397083135,HK 3397083136,3397087231,CN -3397091328,3397095679,GU +3397087232,3397088255,JP +3397088256,3397090303,CN +3397090304,3397091327,TW +3397091328,3397093375,GU +3397093376,3397093631,MP +3397093632,3397095679,GU 3397095680,3397095935,MP 3397095936,3397099519,GU 3397099520,3397103615,HK @@ -89098,7 +95331,8 @@ 3397338376,3397338379,JP 3397338380,3397339647,HK 3397339648,3397339687,SG -3397339688,3397341183,HK +3397339688,3397340927,HK +3397340928,3397341183,TH 3397341184,3397345279,JP 3397345280,3397349375,ID 3397349376,3397363711,CN @@ -89151,8 +95385,7 @@ 3397507840,3397508095,IN 3397508096,3397509119,PH 3397509120,3397510143,ID -3397510144,3397510911,FJ -3397510912,3397511167,AU +3397510144,3397511167,FJ 3397511168,3397512191,LK 3397512192,3397512447,KH 3397512448,3397512703,AU @@ -89209,8 +95442,8 @@ 3397779456,3397781503,ID 3397781504,3397783551,BD 3397783552,3397785599,VN -3397785600,3397787647,TO -3397787648,3397791743,AU +3397785600,3397787391,TO +3397787392,3397791743,AU 3397791744,3397791999,NZ 3397792000,3397792767,AU 3397792768,3397793023,IN @@ -89228,7 +95461,9 @@ 3397845248,3397845503,AU 3397845504,3397846015,JP 3397846016,3397846271,AU -3397846272,3397857791,JP +3397846272,3397854719,JP +3397854720,3397854975,NZ +3397854976,3397857791,JP 3397857792,3397858559,AU 3397858560,3397861887,JP 3397861888,3397862399,PH @@ -89256,6 +95491,7 @@ 3397959680,3397963775,JP 3397963776,3397971967,CN 3397971968,3397974015,LA +3397974016,3397975039,CN 3397975040,3397976063,AU 3397976064,3397984255,ID 3397984256,3397992447,JP @@ -89289,6 +95525,7 @@ 3398180864,3398189055,IN 3398189056,3398205439,HK 3398207488,3398208511,IN +3398208512,3398209535,CN 3398213632,3398221823,TW 3398221824,3398230015,JP 3398230016,3398238207,HK @@ -89355,19 +95592,15 @@ 3398636544,3398636575,HK 3398636576,3398637119,AP 3398637120,3398637183,HK -3398637184,3398637823,AP -3398637824,3398638079,PH -3398638080,3398639903,AP +3398637184,3398639903,AP 3398639904,3398639907,MY 3398639908,3398640671,AP 3398640672,3398640695,SG -3398640696,3398641919,AP -3398641920,3398642175,AU -3398642176,3398642431,AP -3398642432,3398642943,AU -3398642944,3398643199,AP -3398643200,3398643455,AU -3398643456,3398647807,AP +3398640696,3398642431,AP +3398642432,3398642687,AU +3398642688,3398646783,AP +3398646784,3398647039,AU +3398647040,3398647807,AP 3398647808,3398655999,IN 3398656000,3398668287,AU 3398668288,3398672383,CN @@ -89376,7 +95609,6 @@ 3398684672,3398688767,JP 3398688768,3398705151,ID 3398705152,3398709247,CN -3398709248,3398711295,AU 3398713344,3398729727,CN 3398729728,3398737919,AU 3398737920,3398742015,SG @@ -89515,7 +95747,9 @@ 3399662592,3399663615,IN 3399663616,3399671807,ID 3399671808,3399679999,IN -3399680000,3399688191,HK +3399680000,3399680303,HK +3399680304,3399680319,DE +3399680320,3399688191,HK 3399688192,3399696383,SG 3399696384,3399712767,PK 3399712768,3399720959,KR @@ -89573,7 +95807,9 @@ 3399950336,3399954943,AU 3399954944,3399974911,US 3399974912,3399979007,HK -3399979008,3399983744,US +3399979008,3399982963,US +3399982964,3399982965,AP +3399982966,3399983744,US 3399983745,3399983745,SG 3399983746,3399991295,US 3399991296,3399995391,IN @@ -89582,13 +95818,9 @@ 3400000256,3400000511,AU 3400000512,3400004607,SG 3400004608,3400004863,AU -3400004864,3400005119,SG -3400005120,3400005375,AU -3400005376,3400006143,SG +3400004864,3400006143,SG 3400006144,3400006399,AP -3400006400,3400006911,SG -3400006912,3400006927,AU -3400006928,3400007679,SG +3400006400,3400007679,SG 3400007680,3400024063,AU 3400024064,3400028159,MY 3400030208,3400031231,IN @@ -89665,6 +95897,10 @@ 3400343552,3400351743,TW 3400351744,3400359935,ID 3400359936,3400364031,JP +3400364032,3400365055,CN +3400365056,3400366079,US +3400366080,3400367103,CN +3400367104,3400368127,IN 3400368128,3400388607,AU 3400388608,3400392703,TH 3400392704,3400400895,CN @@ -89685,15 +95921,14 @@ 3400431616,3400431871,IN 3400431872,3400432127,HK 3400432128,3400432639,IN +3400432640,3400433663,CN 3400433664,3400435711,HK 3400435712,3400436223,BD -3400436224,3400438201,HK -3400438202,3400438202,US -3400438203,3400441599,HK +3400436224,3400441599,HK 3400441600,3400441855,AU -3400441856,3400446975,NZ -3400446976,3400447231,GB -3400447232,3400450047,NZ +3400441856,3400446079,NZ +3400446080,3400446207,AU +3400446208,3400450047,NZ 3400450048,3400458239,JP 3400458240,3400466431,AU 3400466432,3400499199,MO @@ -89714,17 +95949,15 @@ 3400608768,3400609791,IN 3400609792,3400630271,JP 3400630272,3400646655,IN -3400646656,3400647935,SG -3400647936,3400648191,AU +3400646656,3400647679,SG +3400647680,3400648191,AU 3400648192,3400648677,SG 3400648678,3400648678,HK 3400648679,3400648815,SG 3400648816,3400648831,HK -3400648832,3400649943,SG -3400649944,3400649951,HK -3400649952,3400650239,SG -3400650240,3400650495,AU -3400650496,3400650751,SG +3400648832,3400650409,SG +3400650410,3400650410,AU +3400650411,3400650751,SG 3400650752,3400654847,AU 3400654848,3400663039,IN 3400663040,3400683519,MY @@ -89807,9 +96040,15 @@ 3402917787,3402917887,US 3402917888,3403081983,JP 3403081984,3403082239,US -3403082240,3404632063,JP -3404632064,3404632575,US -3404632576,3405774847,JP +3403082240,3404630783,JP +3404630784,3404631295,US +3404631296,3404632319,JP +3404632320,3404632575,US +3404632576,3404720639,JP +3404720640,3404720678,US +3404720679,3404720679,JP +3404720680,3404720895,US +3404720896,3405774847,JP 3405774848,3405775871,AU 3405775872,3405776895,CN 3405776896,3405777407,AU @@ -90119,9 +96358,7 @@ 3406454528,3406454783,CN 3406454784,3406462207,AU 3406462208,3406462463,CN -3406462464,3406512383,AU -3406512384,3406512639,IN -3406512640,3406513663,AU +3406462464,3406513663,AU 3406513664,3406513919,CN 3406513920,3406514175,AU 3406514176,3406514431,IN @@ -90144,9 +96381,7 @@ 3406527232,3406527999,AU 3406528000,3406528255,CN 3406528256,3406528511,AU -3406528512,3406528767,HK -3406528768,3406529023,AU -3406529024,3406529535,HK +3406528512,3406529535,HK 3406529536,3406529791,IL 3406529792,3406530559,HK 3406530560,3406531583,CN @@ -90219,9 +96454,7 @@ 3406649344,3406649855,CN 3406649856,3406650367,AU 3406650368,3406651391,CN -3406651392,3406664191,AU -3406664192,3406664447,IN -3406664448,3406669823,AU +3406651392,3406669823,AU 3406669824,3406670847,IN 3406670848,3406671103,AU 3406671104,3406671359,CN @@ -90256,7 +96489,8 @@ 3406737408,3406737663,ID 3406737664,3406739199,AU 3406739200,3406739455,ID -3406739456,3406741503,HK +3406739456,3406740991,HK +3406740992,3406741503,SG 3406741504,3406741759,CN 3406741760,3406742015,AU 3406742016,3406742527,CN @@ -90317,9 +96551,9 @@ 3406864640,3406865151,CN 3406865152,3406865663,AU 3406865664,3406865919,IN -3406865920,3406869759,AU -3406869760,3406870015,JP -3406870016,3406871039,AU +3406865920,3406869503,AU +3406869504,3406870527,JP +3406870528,3406871039,AU 3406871040,3406871551,CN 3406871552,3406881791,AU 3406881792,3406882047,CN @@ -90365,10 +96599,8 @@ 3406948096,3406948351,CN 3406948352,3406948607,AU 3406948608,3406948863,CN -3406948864,3406950655,AU -3406950656,3406950911,NF -3406950912,3406951167,AU -3406951168,3406951423,NF +3406948864,3406950399,AU +3406950400,3406951423,NF 3406951424,3406952447,AU 3406952448,3406952703,CN 3406952960,3406954239,AU @@ -90511,9 +96743,7 @@ 3407122432,3407123967,AU 3407123968,3407124223,CN 3407124224,3407124479,AU -3407124480,3407126015,HK -3407126016,3407126271,AU -3407126272,3407126527,HK +3407124480,3407126527,HK 3407126528,3407144447,AU 3407144448,3407144703,CN 3407144704,3407144959,AU @@ -90575,7 +96805,8 @@ 3407241984,3407242239,CN 3407242240,3407243775,AU 3407243776,3407244031,CN -3407244032,3407247871,AU +3407244032,3407244287,AU +3407244800,3407247871,AU 3407247872,3407248383,CN 3407248384,3407250175,AU 3407250176,3407250431,CN @@ -90673,8 +96904,8 @@ 3407377664,3407378943,AU 3407378944,3407379455,CN 3407379456,3407382015,AU -3407382016,3407382527,JP -3407382528,3407384831,AU +3407382016,3407382271,JP +3407382272,3407384831,AU 3407384832,3407385087,CN 3407385088,3407386623,AU 3407386624,3407387135,CN @@ -90748,8 +96979,8 @@ 3407473408,3407473919,CN 3407473920,3407475199,AU 3407475200,3407475455,CN -3407475456,3407481087,AU -3407481088,3407481223,JP +3407475456,3407480831,AU +3407480832,3407481223,JP 3407481224,3407481231,AU 3407481232,3407481599,JP 3407481600,3407481855,AU @@ -91133,7 +97364,8 @@ 3407938560,3407938815,CN 3407938816,3407939327,AU 3407939328,3407939583,CN -3407939584,3407941631,HK +3407939584,3407940607,SG +3407940608,3407941631,HK 3407941632,3407942911,AU 3407942912,3407943167,CN 3407943168,3407944191,AU @@ -91305,8 +97537,8 @@ 3409455104,3409455359,CN 3409455360,3409456639,AU 3409456640,3409456895,CN -3409456896,3409457151,AU -3409457152,3409459199,HK +3409456896,3409457152,AU +3409457153,3409459199,HK 3409459200,3409462271,AU 3409462272,3409462783,CN 3409462784,3409465855,AU @@ -91426,7 +97658,7 @@ 3409879552,3409882111,AU 3409882112,3409883135,IN 3409883136,3409887999,AU -3409888000,3409888255,HK +3409888000,3409888255,SG 3409888256,3409888511,AU 3409888512,3409888767,CN 3409888768,3409891327,AU @@ -91473,7 +97705,6 @@ 3410903040,3410911231,HK 3410911232,3410915327,TH 3410915328,3410919423,ID -3410919424,3410923519,IN 3410927616,3410931711,NP 3410931712,3410935807,TW 3410935808,3410939903,MY @@ -91507,7 +97738,8 @@ 3411051008,3411051263,PK 3411051264,3411051519,SG 3411051520,3411052543,CN -3411052544,3411054591,HK +3411052544,3411052544,JP +3411052545,3411054591,HK 3411054592,3411058687,CN 3411058688,3411062783,AU 3411062784,3411064831,HK @@ -91531,12 +97763,11 @@ 3411149312,3411149823,MV 3411149824,3411150847,IN 3411150848,3411154943,HK -3411154944,3411156991,JP 3411156992,3411161087,PH 3411161088,3411165183,PK 3411165184,3411173375,MY 3411173376,3411177471,AU -3411177472,3411189759,JP +3411181568,3411189759,JP 3411189760,3411197951,AU 3411197952,3411202047,BD 3411202048,3411204607,AU @@ -91562,8 +97793,7 @@ 3411270656,3411271679,SG 3411271680,3411275775,CN 3411275776,3411277823,JP -3411277824,3411278079,IN -3411278080,3411278335,HK +3411277824,3411278335,HK 3411278336,3411278591,SG 3411278592,3411278847,FJ 3411278848,3411296255,HK @@ -91577,9 +97807,7 @@ 3411316736,3411318783,TW 3411318784,3411320831,ID 3411320832,3411329023,PH -3411329024,3411335167,HK -3411335168,3411335679,AU -3411335680,3411337215,HK +3411329024,3411337215,HK 3411337216,3411341311,AU 3411341312,3411345407,KR 3411345408,3411354879,HK @@ -91599,9 +97827,7 @@ 3411509248,3411542015,PH 3411542016,3411550207,IN 3411550208,3411558399,CN -3411558400,3411565257,HK -3411565258,3411565258,US -3411565259,3411566591,HK +3411558400,3411566591,HK 3411570688,3411574783,AU 3411574784,3411582975,IN 3411582976,3411587071,HK @@ -91629,7 +97855,7 @@ 3411673088,3411674111,CN 3411674112,3411674623,IN 3411674624,3411675135,HK -3411675136,3411676159,CN +3411675136,3411677183,CN 3411677184,3411679231,JP 3411679232,3411681279,AU 3411681280,3411689471,KR @@ -91642,12 +97868,7 @@ 3411763200,3411767295,CN 3411767296,3411769343,MN 3411769344,3411771391,CN -3411771392,3411775811,HK -3411775812,3411775813,US -3411775814,3411777023,HK -3411777024,3411777279,ID -3411777280,3411779327,HK -3411779328,3411779583,ID +3411771392,3411779583,HK 3411779584,3411787775,JP 3411787776,3411795967,IN 3411795968,3411804159,AU @@ -91666,7 +97887,9 @@ 3411857408,3411859249,JP 3411859250,3411859251,AU 3411859252,3411859711,JP -3411859712,3411860223,AP +3411859712,3411859815,AP +3411859816,3411859816,CN +3411859817,3411860223,AP 3411860224,3411861503,JP 3411861504,3411869695,AU 3411869696,3411943423,CN @@ -91701,8 +97924,7 @@ 3412295680,3412296191,NZ 3412296192,3412296703,ID 3412296704,3412297727,NZ -3412297728,3412298239,SC -3412298240,3412298751,MY +3412297728,3412298751,MY 3412299264,3412299519,AU 3412299520,3412299775,HK 3412299776,3412302847,AU @@ -91740,23 +97962,17 @@ 3412433824,3412434943,TH 3412434944,3412443135,PK 3412443136,3412451327,SG -3412451328,3412526079,AU -3412526080,3412526335,ID -3412526336,3412594687,AU +3412451328,3412594687,AU 3412594688,3412596735,IN 3412596736,3412598783,MV 3412598784,3412602879,CN 3412602880,3412606975,NC 3412606976,3412615167,PH -3412615168,3412631551,JP -3412631552,3412639743,KR -3412639744,3412656127,JP +3412615168,3412656127,JP 3412656128,3412672511,HK 3412672512,3412675071,JP 3412675072,3412675327,US -3412675328,3412678911,JP -3412678912,3412679167,US -3412679168,3412680191,JP +3412675328,3412680191,JP 3412680192,3412680447,US 3412680448,3412680703,JP 3412680704,3412697087,CN @@ -91776,11 +97992,10 @@ 3413008384,3413016575,JP 3413016576,3413024767,AU 3413024768,3413032959,CN -3413032960,3413035263,AU +3413032960,3413033215,US +3413033216,3413035263,AU 3413035264,3413035519,US -3413035520,3413036543,AU -3413036544,3413036799,US -3413036800,3413037055,AU +3413035520,3413037055,AU 3413037056,3413041151,CN 3413041152,3413043199,JP 3413043200,3413043967,CN @@ -91793,6 +98008,7 @@ 3413106688,3413110783,PH 3413110784,3413112831,JP 3413112832,3413113855,IN +3413113856,3413114879,HK 3413114880,3413133311,JP 3413133312,3413135359,BD 3413135360,3413135615,AP @@ -91814,6 +98030,7 @@ 3413245952,3413251071,MY 3413251072,3413262335,JP 3413262336,3413263359,PH +3413263360,3413264383,IN 3413270528,3413278719,TH 3413278720,3413295103,NZ 3413295104,3413303295,JP @@ -91830,7 +98047,9 @@ 3413344256,3413360639,PH 3413360640,3413377023,MY 3413377024,3413387519,SG -3413387520,3413387775,AP +3413387520,3413387695,AP +3413387696,3413387711,SG +3413387712,3413387775,AP 3413387776,3413437951,SG 3413437952,3413438207,AP 3413438208,3413524479,SG @@ -91875,7 +98094,7 @@ 3413593600,3413593855,SG 3413593856,3413594111,KH 3413594112,3413595135,CN -3413595136,3413595391,NZ +3413595136,3413595391,AU 3413595392,3413595647,CN 3413595648,3413595903,AU 3413595904,3413596159,HK @@ -91913,9 +98132,7 @@ 3413934080,3413946367,IN 3413946368,3413950463,AU 3413950464,3413966847,IN -3413966848,3414024191,SG -3414024192,3414024447,AU -3414024448,3414040063,SG +3413966848,3414040063,SG 3414040064,3414040319,AP 3414040320,3414048767,SG 3414048768,3414049023,AP @@ -91992,9 +98209,7 @@ 3415080960,3415082239,MY 3415082240,3415083007,SG 3415083008,3415083519,AU -3415083520,3415084031,SG -3415084032,3415084159,CN -3415084160,3415088127,SG +3415083520,3415088127,SG 3415088128,3415089151,HK 3415089152,3415097343,MY 3415097344,3415103487,ID @@ -92003,7 +98218,6 @@ 3415121920,3415130111,KR 3415130112,3415136255,JP 3415136256,3415136767,KR -3415136768,3415137023,AU 3415137280,3415137535,IN 3415137536,3415138303,AU 3415138304,3415146495,CN @@ -92016,7 +98230,9 @@ 3415195648,3415199743,NZ 3415199744,3415220223,AU 3415220224,3415224319,NZ -3415224320,3415228415,US +3415224320,3415224831,US +3415224832,3415225087,AU +3415225088,3415228415,US 3415228416,3415236607,KH 3415236608,3415244799,CN 3415244800,3415277567,TH @@ -92066,6 +98282,7 @@ 3415814656,3415815167,TH 3415815168,3415816191,IN 3415816192,3415817215,JP +3415817216,3415818239,MY 3415818240,3415822335,JP 3415822336,3415826431,MY 3415826432,3415834623,ID @@ -92092,7 +98309,6 @@ 3416262656,3416264703,AU 3416264704,3416268799,JP 3416268800,3416272895,HK -3416272896,3416274943,MN 3416274944,3416276991,ID 3416276992,3416285183,HK 3416285184,3416287231,VN @@ -92117,7 +98333,6 @@ 3416342528,3416371199,AU 3416371200,3416371711,PH 3416371712,3416371967,VN -3416371968,3416372223,IN 3416372224,3416372479,CN 3416372480,3416372735,AP 3416372736,3416372991,AU @@ -92132,9 +98347,9 @@ 3416474584,3416474599,AU 3416474600,3416474639,JP 3416474640,3416474647,NZ -3416474648,3416475439,JP -3416475440,3416475455,NZ -3416475456,3416482047,JP +3416474648,3416475391,JP +3416475392,3416475647,NZ +3416475648,3416482047,JP 3416482048,3416482055,SG 3416482056,3416489755,JP 3416489756,3416489759,AU @@ -92314,7 +98529,6 @@ 3417946112,3417946137,AU 3417946138,3417946138,HK 3417946139,3417947135,AU -3417947136,3417947391,IN 3417947648,3417947903,AU 3417947904,3417948159,IN 3417948160,3417964543,AU @@ -92351,6 +98565,7 @@ 3418184960,3418185727,AU 3418185728,3418189823,JP 3418189824,3418190847,CN +3418190848,3418191871,TH 3418191872,3418192895,ID 3418192896,3418193919,AU 3418193920,3418202111,KH @@ -92374,7 +98589,7 @@ 3418251264,3418255359,CN 3418255360,3418257407,ID 3418257408,3418257663,HK -3418257664,3418257919,AU +3418257664,3418257919,JP 3418257920,3418259455,HK 3418259456,3418267647,IN 3418267648,3418271743,VN @@ -92382,11 +98597,12 @@ 3418273792,3418275839,ID 3418275840,3418279935,AU 3418279936,3418281983,NZ -3418281984,3418282239,IN 3418282240,3418282495,AU 3418282496,3418283519,PH 3418283520,3418284031,AU -3418284032,3418288127,SG +3418284032,3418286079,SG +3418286080,3418287103,AU +3418287104,3418288127,SG 3418288128,3418290175,ID 3418290176,3418290431,IN 3418290432,3418290687,CN @@ -92397,8 +98613,7 @@ 3418292992,3418293503,HK 3418293760,3418294015,AU 3418294272,3418296319,VN -3418296320,3418297343,HK -3418297344,3418298367,CN +3418296320,3418298367,CN 3418298368,3418299391,HK 3418299392,3418300415,CN 3418300416,3418300927,BD @@ -92418,26 +98633,31 @@ 3418365952,3418374143,TH 3418374144,3418382335,AU 3418382336,3418390527,JP -3418390528,3418392831,AU +3418390528,3418391039,AP +3418391040,3418391295,AU +3418391296,3418392575,AP +3418392576,3418392831,AU 3418392832,3418393793,AP 3418393794,3418393794,JP 3418393795,3418393919,AP 3418393920,3418393927,AU -3418393928,3418397183,AP -3418397184,3418397439,MY -3418397440,3418399231,AP +3418393928,3418394367,AP +3418394368,3418394623,TW +3418394624,3418397695,AP +3418397696,3418397951,HK +3418397952,3418399231,AP 3418399232,3418399247,PH 3418399248,3418400255,AP 3418400256,3418400511,AU -3418400512,3418401455,AP +3418400512,3418400861,AP +3418400862,3418400862,SG +3418400863,3418401455,AP 3418401456,3418401459,TW -3418401460,3418403583,AP -3418403584,3418403839,AU -3418403840,3418406911,AP +3418401460,3418405887,AP +3418405888,3418406143,PH +3418406144,3418406911,AP 3418406912,3418423295,IN -3418423296,3418434559,HK -3418434560,3418434815,SG -3418434816,3418444091,HK +3418423296,3418444091,HK 3418444092,3418444095,CN 3418444096,3418456063,HK 3418456064,3418472447,IN @@ -92503,11 +98723,11 @@ 3419078656,3419209727,TW 3419209728,3419226111,VN 3419226112,3419234303,CN -3419234304,3419239935,JP -3419239936,3419240447,US -3419240448,3419240959,JP -3419240960,3419241471,US -3419241472,3419241983,JP +3419234304,3419239423,JP +3419239424,3419239935,US +3419239936,3419240449,JP +3419240450,3419240450,US +3419240451,3419241983,JP 3419241984,3419242239,US 3419242240,3419242495,JP 3419242496,3419275263,CN @@ -92518,7 +98738,7 @@ 3419353088,3419354111,JP 3419354112,3419356159,ID 3419356160,3419356671,NZ -3419356672,3419357183,IN +3419356672,3419356927,IN 3419357184,3419411455,CN 3419411456,3419411711,HK 3419411712,3419411967,NZ @@ -92527,13 +98747,11 @@ 3419412480,3419414527,PH 3419414528,3419422719,CN 3419422720,3419439103,AU -3419439104,3419456767,SG +3419439104,3419442463,SG +3419442464,3419442479,HK +3419442480,3419456767,SG 3419456768,3419457023,US -3419457024,3419459407,SG -3419459408,3419459423,GB -3419459424,3419459551,SG -3419459552,3419459583,HK -3419459584,3419470591,SG +3419457024,3419470591,SG 3419470592,3419470847,AP 3419470848,3419471871,SG 3419471872,3419504639,TH @@ -92579,9 +98797,10 @@ 3419774976,3419783167,JP 3419783168,3419791359,PH 3419791360,3419873279,AU -3419873280,3419873535,AF -3419873536,3419873791,US -3419873792,3419877375,AF +3419873280,3419873535,US +3419873536,3419873791,AF +3419873792,3419874047,US +3419874048,3419877375,AF 3419877376,3419877631,ID 3419877632,3419877887,KH 3419877888,3419878143,ID @@ -92620,9 +98839,9 @@ 3420032256,3420032511,AU 3420032512,3420033023,NZ 3420033024,3420034047,IN -3420034048,3420036095,AU +3420034048,3420035071,AU 3420036096,3420037119,JP -3420037120,3420038143,AU +3420037120,3420037631,AU 3420039168,3420040191,KH 3420040192,3420040703,ID 3420040704,3420040959,IN @@ -92671,20 +98890,23 @@ 3420436480,3420437503,AU 3420437504,3420438527,IN 3420438528,3420454911,HK -3420454912,3420463103,LK -3420463104,3422000533,KR -3422000534,3422000535,AP -3422000536,3422000536,IN -3422000537,3422000537,AP +3420454912,3422000533,KR +3422000534,3422000537,AP 3422000538,3422552063,KR 3422552064,3422850559,US -3422850560,3422850815,GB -3422850816,3422955519,US +3422850560,3422851071,GB +3422851072,3422955519,US 3422955520,3422956799,FR 3422956800,3423076351,US 3423076352,3423077375,CA -3423077376,3423092735,US -3423092736,3423093759,VI +3423077376,3423086591,US +3423086592,3423086847,A2 +3423086848,3423092735,US +3423092736,3423092767,VI +3423092768,3423092783,US +3423092784,3423092831,VI +3423092832,3423092847,US +3423092848,3423093759,VI 3423093760,3423094783,US 3423094784,3423095807,CA 3423095808,3423131647,US @@ -92703,9 +98925,7 @@ 3423258624,3423260671,CA 3423260672,3423264831,US 3423264832,3423264863,NG -3423264864,3423265025,US -3423265026,3423265026,A2 -3423265027,3423268863,US +3423264864,3423268863,US 3423268864,3423269887,CA 3423269888,3423285247,US 3423285248,3423287295,CA @@ -92724,22 +98944,15 @@ 3423379456,3423416319,US 3423416320,3423417343,CA 3423417344,3423430655,US -3423430656,3423431167,TC -3423431168,3423431416,US -3423431417,3423431417,TC -3423431418,3423468543,US +3423430656,3423431679,TC +3423431680,3423468543,US 3423468544,3423469567,CA 3423469568,3423473663,US 3423473664,3423474687,CA -3423474688,3423479807,US -3423479808,3423480831,A2 -3423480832,3423480987,NG -3423480988,3423480988,US -3423480989,3423481343,NG -3423481344,3423481855,A2 +3423474688,3423478783,US +3423479808,3423481855,A2 3423481856,3423487999,US -3423488000,3423489023,CA -3423489024,3423490047,A1 +3423488000,3423490047,CA 3423490048,3423493631,US 3423493632,3423493887,RU 3423493888,3423533055,US @@ -92806,31 +99019,29 @@ 3424507136,3424507391,CA 3424507392,3425173503,US 3425173504,3425304575,CA -3425304576,3425697791,US +3425304576,3425471487,US +3425471488,3425472511,CA +3425472512,3425484543,US +3425484544,3425484799,GU +3425484800,3425697791,US 3425697792,3425699839,CA 3425699840,3425714175,US 3425714176,3425722367,CA 3425722368,3425828863,US 3425828864,3425846783,CA 3425846784,3425847039,EU -3425847040,3425869167,CA -3425869168,3425869183,US -3425869184,3425894399,CA +3425847040,3425894399,CA 3425894400,3426007807,US 3426007808,3426008063,EU 3426008064,3426013183,US 3426013184,3426013439,IL -3426013440,3426306559,US -3426306560,3426306815,IN -3426306816,3426369023,US +3426013440,3426369023,US 3426369024,3426369535,CA 3426369536,3426387967,US 3426387968,3426388991,MX 3426388992,3426400255,US 3426400256,3426400511,CA -3426400512,3426415871,US -3426415872,3426416127,GB -3426416128,3426418687,US +3426400512,3426418687,US 3426418688,3426420479,GB 3426420480,3426420735,US 3426420736,3426435071,GB @@ -92843,9 +99054,7 @@ 3426482688,3426484223,CA 3426484224,3426617855,US 3426617856,3426618367,CA -3426618368,3426679039,US -3426679040,3426679295,ES -3426679296,3426729471,US +3426618368,3426729471,US 3426729472,3426729983,CA 3426729984,3426744319,US 3426744320,3426746367,CA @@ -92859,13 +99068,11 @@ 3427132928,3427133183,EU 3427133184,3427408393,US 3427408394,3427408394,EU -3427408395,3427426303,US -3427426304,3427426559,HK -3427426560,3427428863,US -3427428864,3427429119,GB -3427429120,3427487743,US +3427408395,3427487743,US 3427487744,3427487999,GB -3427488000,3427618303,US +3427488000,3427503871,US +3427503872,3427504127,SG +3427504128,3427618303,US 3427618304,3427618559,CA 3427618560,3427651071,US 3427651072,3427651327,CA @@ -92948,9 +99155,7 @@ 3427763712,3427763967,GB 3427763968,3427764223,US 3427764224,3427764479,FR -3427764480,3427765117,US -3427765118,3427765118,IE -3427765119,3427765503,US +3427764480,3427765503,US 3427765504,3427765759,GB 3427765760,3427766271,US 3427766272,3427766783,GB @@ -93041,7 +99246,9 @@ 3428434944,3428435199,CA 3428435200,3428437503,US 3428437504,3428437759,MX -3428437760,3428582655,US +3428437760,3428582143,US +3428582144,3428582399,CA +3428582400,3428582655,US 3428582656,3428582911,CA 3428582912,3428585215,US 3428585216,3428585471,CA @@ -93121,9 +99328,7 @@ 3428646656,3428646911,CA 3428646912,3428660735,US 3428660736,3428661503,CA -3428661504,3428662271,US -3428662272,3428662527,A1 -3428662528,3428743167,US +3428661504,3428743167,US 3428743168,3428744191,CA 3428744192,3428752383,US 3428752384,3428753407,GH @@ -93133,18 +99338,17 @@ 3429171200,3429236735,CA 3429236736,3429381887,US 3429381888,3429382143,EU -3429382144,3429382399,DE -3429382400,3429500927,US +3429382144,3429500927,US 3429500928,3429502975,A2 3429502976,3429775359,US 3429775360,3429777407,TC 3429777408,3429892095,US 3429892096,3429957631,CA 3429957632,3430073343,US -3430073344,3430073354,AP -3430073355,3430073355,AU -3430073356,3430073599,AP -3430073600,3430328831,US +3430073344,3430073599,AP +3430073600,3430074111,US +3430074112,3430074367,AU +3430074368,3430328831,US 3430328832,3430329087,GH 3430329088,3430354943,US 3430354944,3430356991,PR @@ -93156,9 +99360,7 @@ 3430705152,3430706175,MX 3430706176,3430722303,US 3430722304,3430722559,CA -3430722560,3430729244,US -3430729245,3430729245,GB -3430729246,3430729471,US +3430722560,3430729471,US 3430729472,3430729727,GB 3430729728,3430732543,US 3430732544,3430732799,GB @@ -93214,11 +99416,9 @@ 3431468032,3431469055,CA 3431469056,3431520767,US 3431520768,3431521023,AP -3431521024,3431526911,US -3431526912,3431526921,CH +3431521024,3431526921,US 3431526922,3431526922,EU -3431526923,3431527167,CH -3431527168,3431596287,US +3431526923,3431596287,US 3431596288,3431602687,CA 3431602688,3431602943,US 3431602944,3431606271,CA @@ -93238,8 +99438,8 @@ 3431639040,3431641855,CA 3431641856,3431642623,US 3431642624,3431657471,CA -3431657472,3431658495,US -3431658496,3431661311,CA +3431657472,3431658751,US +3431658752,3431661311,CA 3431661312,3431745023,US 3431745024,3431745279,BE 3431745280,3431745791,US @@ -93270,9 +99470,7 @@ 3432133888,3432134143,GB 3432134144,3432205311,US 3432205312,3432206335,CA -3432206336,3432253695,US -3432253696,3432253951,CA -3432253952,3432265983,US +3432206336,3432265983,US 3432265984,3432267263,DE 3432267264,3432280063,US 3432280064,3432280319,GB @@ -93282,17 +99480,15 @@ 3432329216,3432330239,DE 3432330240,3432361983,US 3432361984,3432366079,DE -3432366080,3432476415,US -3432476416,3432476671,DE -3432476672,3432493823,US -3432493824,3432495103,DE -3432495104,3432517119,US +3432366080,3432517119,US 3432517120,3432517631,MU 3432517632,3432570879,US 3432570880,3432572927,HK 3432572928,3432585215,US 3432585216,3432585727,MX -3432585728,3432613631,US +3432585728,3432606463,US +3432606464,3432606719,GB +3432606720,3432613631,US 3432613632,3432613887,CA 3432613888,3432634111,US 3432634112,3432634367,CA @@ -93300,11 +99496,15 @@ 3432660992,3432663039,DE 3432663040,3432689151,US 3432689152,3432689663,CA -3432689664,3432807423,US +3432689664,3432695807,US +3432695808,3432697855,CA +3432697856,3432736255,US +3432736256,3432736511,GB +3432736512,3432738303,US +3432738304,3432738559,GB +3432738560,3432807423,US 3432807424,3432808447,CA -3432808448,3433824511,US -3433824512,3433824767,DE -3433824768,3433955583,US +3432808448,3433955583,US 3433955584,3433964799,CA 3433964800,3433965055,US 3433965056,3433967359,CA @@ -93319,8 +99519,7 @@ 3434020608,3434299391,US 3434299392,3434303487,VE 3434303488,3434427391,US -3434427392,3434428159,HR -3434428160,3434428415,HN +3434427392,3434428415,HR 3434428416,3434433279,US 3434433280,3434433535,PR 3434433536,3434553343,US @@ -93332,9 +99531,7 @@ 3434575616,3434583039,US 3434583040,3434584063,NL 3434584064,3434807551,US -3434807552,3434810111,CA -3434810112,3434810367,US -3434810368,3434831359,CA +3434807552,3434831359,CA 3434831360,3434831615,US 3434831616,3434872575,CA 3434872576,3434913791,US @@ -93494,8 +99691,8 @@ 3437755904,3437756159,US 3437756160,3437756415,IE 3437756416,3437772799,US -3437772800,3437776639,CA -3437776640,3437789863,US +3437772800,3437776895,CA +3437776896,3437789863,US 3437789864,3437789871,AU 3437789872,3437961215,US 3437961216,3437964287,ZA @@ -93523,9 +99720,7 @@ 3438262016,3438280703,CA 3438280704,3438542847,US 3438542848,3438608383,CA -3438608384,3438614607,US -3438614608,3438614615,BR -3438614616,3438813183,US +3438608384,3438813183,US 3438813184,3438814207,GH 3438814208,3438895103,US 3438895104,3438896639,HN @@ -93545,12 +99740,9 @@ 3448380416,3448380671,SG 3448380672,3448380839,US 3448380840,3448380847,SG -3448380848,3448380943,US -3448380944,3448380959,SG -3448380960,3448381183,US +3448380848,3448381183,US 3448381184,3448381439,SG -3448381440,3448381695,GB -3448381696,3448398335,US +3448381440,3448398335,US 3448398336,3448399103,CA 3448399104,3448399359,US 3448399360,3448399871,CA @@ -93568,7 +99760,11 @@ 3448987648,3448989695,IN 3448989696,3448990719,HK 3448990720,3448991743,IN -3448991744,3449159679,US +3448991744,3449098751,US +3449098752,3449099263,DE +3449099264,3449100799,US +3449100800,3449101311,AU +3449101312,3449159679,US 3449159680,3449160703,CA 3449160704,3449161471,US 3449161472,3449163519,CA @@ -93653,15 +99849,21 @@ 3449254144,3449254911,US 3449254912,3449273599,CA 3449273600,3449273855,US -3449273856,3449290495,CA +3449273856,3449278975,CA +3449278976,3449279487,US +3449279488,3449290495,CA 3449290496,3449575423,US 3449575424,3449575679,AU 3449575680,3449582848,US 3449582849,3449582849,EU 3449582850,3449593855,US 3449593856,3449594111,AU -3449594112,3449638911,US -3449638912,3449639679,GB +3449594112,3449599999,US +3449600000,3449600255,CA +3449600256,3449638911,US +3449638912,3449639186,GB +3449639187,3449639187,NL +3449639188,3449639679,GB 3449639680,3449639935,US 3449639936,3449640191,GB 3449640192,3449640447,NL @@ -93678,17 +99880,15 @@ 3449843200,3449843711,YE 3449843712,3449874687,US 3449874688,3449874943,AG -3449874944,3449884159,US -3449884160,3449884415,AS -3449884416,3449923583,US +3449874944,3449884415,US +3449884416,3449884671,AS +3449884672,3449923583,US 3449923584,3449923839,ES 3449923840,3449974783,US 3449974784,3449976831,CA 3449976832,3449994239,US 3449994240,3449994495,MX -3449994496,3450085375,US -3450085376,3450085631,A1 -3450085632,3450086143,US +3449994496,3450086143,US 3450086144,3450086655,CH 3450086656,3450088191,US 3450088192,3450088447,CH @@ -93719,37 +99919,19 @@ 3450685184,3450685439,CA 3450685440,3450699007,US 3450699008,3450699263,CA -3450699776,3450731519,US +3450699264,3450731519,US 3450731520,3450732543,CA 3450732544,3450773503,US -3450773504,3450774783,CA -3450774784,3450775039,US -3450775040,3450777599,CA +3450773504,3450777599,CA 3450777600,3450849791,US 3450849792,3450850047,EU -3450850048,3450851839,US +3450850048,3450852351,US 3450852352,3450853375,CA -3450855424,3450935295,US -3450935296,3450935551,MY +3450853376,3450935551,US 3450935552,3450935807,AP -3450935808,3450936319,MY -3450936320,3450940415,US -3450940416,3450941439,SG -3450941440,3450942463,US -3450942464,3450944511,SG -3450944512,3450947583,US -3450947584,3450947839,A2 -3450947840,3450949375,US -3450949376,3450949631,A2 -3450949632,3450950655,US -3450950656,3450951679,JP -3450951680,3450953727,US -3450953728,3450957823,DE -3450957824,3450975231,US -3450975232,3450975743,LB -3450975744,3450982399,US -3450982400,3450984447,TW -3450984448,3450986495,PH +3450935808,3450974335,US +3450974336,3450974463,GB +3450974464,3450986495,US 3450986496,3450986751,HK 3450986752,3451170303,US 3451170304,3451170559,VE @@ -93765,9 +99947,10 @@ 3451507200,3451507711,BR 3451507712,3451715839,US 3451715840,3451724543,CA -3451724544,3451724799,US -3451725312,3451725567,US -3451725568,3451737343,CA +3451724544,3451725567,US +3451725568,3451726847,CA +3451726848,3451727359,US +3451727360,3451737343,CA 3451737344,3451737599,US 3451737600,3451740927,CA 3451740928,3451741183,US @@ -93816,9 +99999,7 @@ 3451840256,3451840767,CA 3451840768,3451879423,US 3451879424,3451879935,DE -3451879936,3451884287,US -3451884288,3451884543,DE -3451884544,3451890431,US +3451879936,3451890431,US 3451890432,3451890687,AU 3451890688,3451896319,US 3451896320,3451896575,DE @@ -93828,11 +100009,15 @@ 3452436480,3452502015,CA 3452502016,3452658431,US 3452658432,3452658687,HK -3452658688,3452678143,US +3452658688,3452663039,US +3452663040,3452663295,GB +3452663296,3452678143,US 3452678144,3452678399,EU 3452678400,3452715007,US 3452715008,3452723199,CA -3452723200,3452764671,US +3452723200,3452730623,US +3452730624,3452730879,HK +3452730880,3452764671,US 3452764672,3452765183,CA 3452765184,3452765439,US 3452765440,3452765951,CA @@ -93963,7 +100148,9 @@ 3452895232,3452895487,US 3452895488,3452902399,CA 3452902400,3452902655,US -3452902656,3452914175,CA +3452902656,3452912127,CA +3452912128,3452912383,US +3452912384,3452914175,CA 3452914176,3452914431,US 3452914432,3452919551,CA 3452919552,3452919807,US @@ -93971,13 +100158,15 @@ 3452920832,3452923391,US 3452923392,3452931327,CA 3452931328,3452931583,US -3452931584,3452934911,CA +3452931584,3452933119,CA +3452933120,3452933631,US +3452933632,3452934911,CA 3452934912,3452936191,US -3452936192,3452938839,CA -3452938840,3452938847,US -3452938848,3452939066,CA -3452939067,3452939067,US -3452939068,3452942847,CA +3452936192,3452938751,CA +3452938752,3452939023,US +3452939024,3452939039,CA +3452939040,3452939263,US +3452939264,3452942847,CA 3452942848,3452943103,US 3452943104,3452953087,CA 3452953088,3452953343,US @@ -94090,9 +100279,7 @@ 3454603008,3454603519,CA 3454603520,3454604031,US 3454604032,3454604799,CA -3454604800,3454606335,US -3454606336,3454606591,CA -3454606592,3454607359,US +3454604800,3454607359,US 3454607360,3454608127,CA 3454608128,3454608383,US 3454608384,3454609151,CA @@ -94116,18 +100303,18 @@ 3454662656,3454664447,CA 3454664448,3454672895,US 3454672896,3454681087,CA -3454681088,3454708353,US -3454708354,3454708355,GB -3454708356,3454727935,US -3454727936,3454727951,JP -3454727952,3454730239,US +3454681088,3454727935,US +3454727936,3454728191,JP +3454728192,3454730239,US 3454730240,3454732287,EC 3454732288,3454796031,US 3454796032,3454808831,CA 3454808832,3454809087,US 3454809088,3454810111,CA 3454810112,3454810367,US -3454810368,3454814975,CA +3454810368,3454813951,CA +3454813952,3454814207,US +3454814208,3454814975,CA 3454814976,3454815231,US 3454815232,3454815743,CA 3454815744,3454816255,US @@ -94144,11 +100331,11 @@ 3454881792,3454883839,CA 3454883840,3454915071,US 3454915072,3454926591,CA -3454926592,3455035391,US +3454926592,3455017471,US +3455017472,3455017727,GB +3455017728,3455035391,US 3455035392,3455035903,AU -3455035904,3455042565,US -3455042566,3455042566,CA -3455042567,3455096831,US +3455035904,3455096831,US 3455096832,3455097855,EC 3455097856,3455109119,US 3455109120,3455111167,HN @@ -94266,20 +100453,15 @@ 3455647488,3455647743,IT 3455647744,3455713279,US 3455713280,3455778815,CA -3455778816,3455864831,US -3455864832,3455866879,TW -3455866880,3455871999,US +3455778816,3455871999,US 3455872000,3455872255,ZM -3455872256,3455873023,GB -3455873024,3455887359,US -3455887360,3455889407,MY -3455889408,3456303103,US +3455872256,3455903967,US +3455903968,3455903983,HK +3455903984,3456303103,US 3456303104,3456311295,JP 3456311296,3456360447,US 3456360448,3456364543,BG -3456364544,3456856063,US -3456856064,3456856319,CA -3456856320,3456892927,US +3456364544,3456892927,US 3456892928,3456958463,CA 3456958464,3457551871,US 3457551872,3457552127,CA @@ -94333,8 +100515,7 @@ 3459055616,3459121151,CA 3459121152,3459186687,US 3459186688,3459252223,CA -3459252224,3459253247,BS -3459253248,3459256831,US +3459252224,3459256831,US 3459256832,3459257087,CO 3459257088,3459257343,US 3459257344,3459258367,AW @@ -94453,13 +100634,17 @@ 3459455488,3459455743,US 3459455744,3459456511,CA 3459456512,3459456767,US -3459456768,3459458047,CA -3459458048,3459512319,US +3459456768,3459457279,CA +3459457280,3459457535,US +3459457536,3459457791,CA +3459457792,3459512319,US 3459512320,3459513855,CA 3459513856,3459592191,US 3459592192,3459596287,CA 3459596288,3459615743,US 3459615744,3459615999,CA +3459616000,3459616255,DM +3459616256,3459616767,US 3459616768,3459617791,CA 3459617792,3459617999,AP 3459618000,3459618000,ID @@ -94467,21 +100652,21 @@ 3459618048,3459618815,CA 3459618816,3459619071,AP 3459619072,3459620863,CA -3459620864,3459622911,US +3459620864,3459624959,US 3459624960,3459629055,BM 3459629056,3459686399,US -3459686400,3459687167,NL -3459687168,3459731455,US +3459686400,3459688479,NL +3459688480,3459689215,US +3459689216,3459689471,NL +3459689472,3459731455,US 3459731456,3459735551,CA 3459735552,3459745535,US 3459745536,3459745791,IT -3459745792,3459842815,US -3459842816,3459843071,BR -3459843072,3459848959,US +3459745792,3459848959,US 3459848960,3459849215,FR -3459849216,3459850239,US -3459850240,3459850495,CA -3459850496,3460104703,US +3459849216,3459874303,US +3459874304,3459874559,GB +3459874560,3460104703,US 3460104704,3460105215,MX 3460105216,3460114431,US 3460114432,3460116479,SR @@ -94590,9 +100775,7 @@ 3460942336,3460943359,US 3460943360,3460943615,ID 3460943616,3460943871,HK -3460943872,3460944127,US -3460944128,3460944383,AU -3460944384,3460944895,US +3460943872,3460944895,US 3460944896,3460945151,DE 3460945152,3460945663,US 3460945664,3460945919,GB @@ -94610,9 +100793,7 @@ 3460952576,3460952831,ES 3460952832,3460953855,US 3460953856,3460954111,GB -3460954112,3460954527,US -3460954528,3460954559,KR -3460954560,3460954623,US +3460954112,3460954623,US 3460954624,3460954879,DE 3460954880,3460955135,LU 3460955136,3461021695,US @@ -94644,10 +100825,7 @@ 3461515776,3461516031,CA 3461516032,3461516287,US 3461516288,3461516543,IL -3461516544,3461554943,US -3461554944,3461555199,CA -3461555200,3461556223,US -3461558272,3461808127,US +3461516544,3461808127,US 3461808128,3461873663,CA 3461873664,3461897727,US 3461897728,3461897983,CA @@ -94735,7 +100913,9 @@ 3462634752,3462635007,SG 3462635008,3462635263,US 3462635264,3462635519,SG -3462635520,3462661375,US +3462635520,3462660295,US +3462660296,3462660303,GB +3462660304,3462661375,US 3462661376,3462661631,SG 3462661632,3463004159,US 3463004160,3463006207,CO @@ -94761,9 +100941,7 @@ 3463245056,3463249663,CA 3463249664,3463518207,US 3463518208,3463520255,NL -3463520256,3463536895,US -3463536896,3463537151,NG -3463537152,3463708671,US +3463520256,3463708671,US 3463708672,3463774207,CA 3463774208,3464108031,US 3464108032,3464108287,DE @@ -94778,18 +100956,53 @@ 3464171776,3464172031,US 3464172032,3464173567,CA 3464173568,3464173823,US -3464173824,3464174591,CA +3464173824,3464175103,CA 3464175104,3464175359,US 3464175360,3464180735,CA -3464180736,3464196490,US -3464196491,3464196491,ZA -3464196492,3464208383,US +3464180736,3464200703,US +3464200704,3464200959,AU +3464200960,3464201215,NZ +3464201216,3464201471,JP +3464201472,3464201727,GR +3464201728,3464201983,EG +3464201984,3464202239,ES +3464202240,3464202495,CA +3464202496,3464202751,FR +3464202752,3464203007,IT +3464203008,3464203263,SE +3464203264,3464203519,DE +3464203520,3464204799,US +3464204800,3464205311,NL +3464205312,3464205567,SE +3464205568,3464205823,VE +3464205824,3464205951,AF +3464205952,3464206079,UZ +3464206080,3464206207,TJ +3464206208,3464206335,KG +3464206336,3464206463,KZ +3464206464,3464206591,TM +3464206592,3464206719,LA +3464206720,3464206847,MN +3464206848,3464206975,LK +3464206976,3464207103,BD +3464207104,3464207231,MM +3464207232,3464207359,PG +3464207360,3464207487,TZ +3464207488,3464207615,MG +3464207616,3464207743,AO +3464207744,3464207871,NE +3464207872,3464207999,MR +3464208000,3464208127,SN +3464208128,3464208255,TN +3464208256,3464208383,DZ 3464208384,3464216575,CA 3464216576,3464340479,US 3464340480,3464341503,CA 3464341504,3464342287,US 3464342288,3464342295,VN -3464342296,3464382463,US +3464342296,3464349695,US +3464349696,3464351743,CA +3464351744,3464384511,US 3464384512,3464388607,CA 3464388608,3464391935,US 3464391936,3464392191,CA @@ -94797,10 +101010,12 @@ 3464394752,3464396799,LC 3464396800,3464421631,US 3464421632,3464421887,CA -3464422400,3464425983,US +3464421888,3464426495,US 3464426496,3464426751,GD -3464426752,3464427007,US -3464427520,3464548607,US +3464426752,3464428543,US +3464428800,3464429311,US +3464429312,3464429567,CA +3464429568,3464548607,US 3464548608,3464548863,LC 3464548864,3464549119,KN 3464549120,3464549375,VG @@ -94811,21 +101026,31 @@ 3464550144,3464550399,LC 3464550400,3464626175,US 3464626176,3464626687,CA -3464626688,3464627199,US +3464626688,3464627967,US 3464627968,3464628735,CA 3464628736,3464628991,US 3464628992,3464630271,CA 3464630272,3464631295,US -3464631296,3464650751,CA -3464650752,3464664063,US -3464664064,3464691711,CA +3464631296,3464642047,CA +3464642048,3464642559,US +3464642560,3464642815,CA +3464642816,3464643071,US +3464643072,3464647935,CA +3464647936,3464648191,US +3464648192,3464648703,CA +3464648704,3464649215,US +3464649216,3464650239,CA +3464650240,3464664319,US +3464664320,3464684543,CA +3464684544,3464684799,BL +3464684800,3464688383,CA +3464688384,3464688639,US +3464688640,3464691711,CA 3464691712,3464740863,US 3464740864,3464744959,PH 3464744960,3464769535,US 3464769536,3464773631,CA -3464773632,3464774079,US -3464774080,3464774111,ES -3464774112,3464782079,US +3464773632,3464782079,US 3464782080,3464782335,GB 3464782336,3464785151,US 3464785152,3464785407,AR @@ -94841,9 +101066,7 @@ 3465462784,3465463039,GB 3465463040,3465468159,US 3465468160,3465468415,GB -3465468416,3465468671,US -3465468672,3465468927,GB -3465468928,3465510911,US +3465468416,3465510911,US 3465510912,3465543679,JP 3465543680,3465962495,US 3465962496,3465962751,CA @@ -94855,12 +101078,14 @@ 3466069344,3466069375,CA 3466069376,3466069447,US 3466069448,3466069455,CA -3466069456,3466072431,US +3466069456,3466071807,US +3466071808,3466072063,CA +3466072064,3466072431,US 3466072432,3466072439,CA 3466072440,3466072775,US 3466072776,3466072783,CA -3466072784,3466073055,US -3466073056,3466073087,CA +3466072784,3466072831,US +3466072832,3466073087,CA 3466073088,3466158079,US 3466158080,3466166271,PA 3466166272,3466290687,US @@ -94875,13 +101100,9 @@ 3466558208,3466558463,EC 3466558464,3466560255,US 3466560256,3466560511,GH -3466560512,3466661887,US -3466661888,3466663935,TW -3466663936,3466683135,US -3466683136,3466683391,NG -3466683392,3466688511,US -3466688512,3466688767,A2 -3466688768,3466734847,US +3466560512,3466714111,US +3466714112,3466714367,JP +3466714368,3466734847,US 3466734848,3466735103,RU 3466735104,3466756095,US 3466756096,3466772479,CA @@ -94897,25 +101118,21 @@ 3466914304,3466914559,FR 3466914560,3466929407,US 3466929408,3466929663,IT -3466929664,3466937599,US -3466937600,3466937663,ES +3466929664,3466937663,US 3466937664,3466937669,DE 3466937670,3466937670,EU 3466937671,3466937727,DE -3466937728,3466937855,ES -3466937856,3466938444,US -3466938445,3466938448,HK -3466938449,3466938807,US +3466937728,3466938807,US 3466938808,3466938811,GB 3466938812,3466958079,US 3466958080,3466958335,CA 3466958336,3467051007,US -3467051008,3467116543,CA +3467051008,3467068927,CA +3467068928,3467069439,US +3467069440,3467116543,CA 3467116544,3467378687,US 3467378688,3467444223,CA -3467444224,3467500799,US -3467500800,3467501055,A1 -3467501056,3467554815,US +3467444224,3467554815,US 3467554816,3467567103,CA 3467567104,3467706367,US 3467706368,3467902975,CA @@ -95034,9 +101251,7 @@ 3468623872,3468656639,CA 3468656640,3468977919,US 3468977920,3468978175,A1 -3468978176,3469010687,US -3469010688,3469010943,AU -3469010944,3469032191,US +3468978176,3469032191,US 3469032192,3469032447,AP 3469032448,3469055743,US 3469055744,3469055999,CA @@ -95046,17 +101261,17 @@ 3469176320,3469176575,MX 3469176576,3469186303,US 3469186304,3469186559,MX -3469186560,3469893631,US +3469186560,3469859583,US +3469859584,3469859839,CA +3469859840,3469893631,US 3469893632,3469901823,CA -3469901824,3470131199,US +3469901824,3469989887,US +3469989888,3469990399,CA +3469990400,3470131199,US 3470131200,3470135295,AG 3470135296,3470137343,LC 3470137344,3470139391,VG -3470139392,3470148095,US -3470148096,3470148351,CA -3470148352,3470148607,US -3470148608,3470148863,CA -3470148864,3470151807,US +3470139392,3470151807,US 3470151808,3470151871,CA 3470151872,3470151935,US 3470151936,3470152191,EG @@ -95101,7 +101316,6 @@ 3470767872,3470768127,IE 3470768128,3470770175,CA 3470770176,3470778367,US -3470778368,3470786559,CA 3470786560,3470794751,US 3470794752,3470802943,PA 3470802944,3470884863,US @@ -95128,9 +101342,9 @@ 3471572992,3472375807,US 3472375808,3472392191,PR 3472392192,3472408575,CA -3472408576,3472571647,US -3472571648,3472571903,GH -3472571904,3473039359,US +3472408576,3472721919,US +3472721920,3472723967,CA +3472723968,3473039359,US 3473039360,3473040639,BM 3473040640,3473040895,US 3473040896,3473041407,BM @@ -95169,42 +101383,45 @@ 3475115008,3475120127,CA 3475120128,3475124223,US 3475124224,3475243007,CA -3475243008,3475296461,US -3475296462,3475296462,AE -3475296463,3475310847,US +3475243008,3475310847,US 3475310848,3475311103,DE -3475311104,3475589887,US +3475311104,3475358719,US +3475358720,3475358975,GB +3475358976,3475589887,US 3475589888,3475590143,EC 3475590144,3475670015,US 3475670016,3475670271,AG 3475670272,3475670527,AI 3475670528,3475670783,LC 3475670784,3475670847,DM -3475670848,3475670857,AG -3475670858,3475670858,DM -3475670859,3475671039,AG +3475670848,3475671039,AG 3475671040,3475681279,US 3475681280,3475685375,HN -3475685376,3475882767,US +3475685376,3475879279,US +3475879280,3475879287,TT +3475879288,3475882767,US 3475882768,3475882783,FR 3475882784,3475882799,US 3475882800,3475882815,FR 3475882816,3475885951,US 3475885952,3475885983,CA -3475885984,3475896319,US -3475896320,3475896575,FR -3475896576,3475896831,EU +3475885984,3475896575,US +3475896576,3475896831,FR 3475896832,3475897471,US 3475897472,3475897503,FR -3475897504,3475911167,US -3475911168,3475911237,AP -3475911238,3475911239,IN -3475911240,3475911423,AP -3475911424,3475912447,US -3475912448,3475912703,IN -3475912704,3475921151,US -3475921152,3475921407,JP -3475921408,3475996671,US +3475897504,3475910847,US +3475910848,3475910879,SG +3475910880,3475911167,US +3475911168,3475911423,AP +3475911424,3475912703,US +3475912704,3475912959,SG +3475912960,3475915327,US +3475915328,3475915359,JP +3475915360,3475916543,US +3475916544,3475916799,HK +3475916800,3475918287,US +3475918288,3475918303,HK +3475918304,3475996671,US 3475996672,3476029439,CA 3476029440,3476111359,US 3476111360,3476111871,CA @@ -95213,16 +101430,12 @@ 3476349184,3476447231,US 3476447232,3476455423,CA 3476455424,3476545535,US -3476545536,3476545791,A2 -3476545792,3476546815,US -3476546816,3476547583,A2 +3476545536,3476546047,A2 +3476546048,3476547071,US +3476547072,3476547583,A2 3476547584,3476881407,US 3476881408,3476946943,CA -3476946944,3477312511,US -3477312512,3477312767,A1 -3477312768,3477542143,US -3477542144,3477542399,IN -3477542400,3478114303,US +3476946944,3478114303,US 3478114304,3478118399,PE 3478118400,3478192127,US 3478192128,3478257663,CA @@ -95234,9 +101447,9 @@ 3478286592,3478286847,GB 3478286848,3478288607,US 3478288608,3478288615,GB -3478288616,3478288671,US -3478288672,3478288703,GB -3478288704,3478372351,US +3478288616,3478288639,US +3478288640,3478288895,GB +3478288896,3478372351,US 3478372352,3478380543,MX 3478380544,3479207935,US 3479207936,3479240703,CA @@ -95376,13 +101589,13 @@ 3481665536,3481731071,CA 3481731072,3481812991,US 3481812992,3481829375,CA -3481829376,3481843455,US -3481843456,3481843711,GB -3481843712,3481951395,US -3481951396,3481951399,GB -3481951400,3481958271,US +3481829376,3481934591,US +3481934592,3481934847,CH +3481934848,3481958271,US 3481958272,3481958399,NL -3481958400,3481964575,US +3481958400,3481959020,US +3481959021,3481959021,GB +3481959022,3481964575,US 3481964576,3481964579,IE 3481964580,3481993791,US 3481993792,3481993799,CA @@ -95427,9 +101640,7 @@ 3482017536,3482017791,CA 3482017792,3482018047,US 3482018048,3482018303,CA -3482018304,3482018559,US -3482018560,3482018815,CA -3482018816,3482019327,US +3482018304,3482019327,US 3482019328,3482019583,CA 3482019584,3482020607,US 3482020608,3482020863,CA @@ -95461,12 +101672,12 @@ 3482037760,3482038015,CA 3482038016,3482038271,US 3482038272,3482038783,CA -3482038784,3482039039,US -3482039040,3482039295,CA -3482039296,3482039551,US +3482038784,3482039551,US 3482039552,3482040319,CA 3482040320,3482041087,US -3482041088,3482041855,CA +3482041088,3482041343,CA +3482041344,3482041599,US +3482041600,3482041855,CA 3482041856,3482042111,US 3482042112,3482042367,CA 3482042368,3482043903,US @@ -95519,19 +101730,14 @@ 3484006912,3484007167,AU 3484007168,3484013055,US 3484013056,3484013567,DE -3484013568,3484319743,US -3484320256,3484320511,US +3484013568,3484320767,US 3484321792,3484322047,PR -3484322048,3484323839,US +3484322048,3484325887,US 3484326912,3484327423,US -3484327936,3484336127,US -3484338176,3484340223,US -3484340736,3484341247,US +3484327424,3484327935,CA +3484327936,3484341247,US 3484341248,3484342271,VG -3484344320,3484419583,US -3484419584,3484419839,A2 -3484419840,3484437503,US -3484437504,3484438527,GB +3484342272,3484438527,US 3484438528,3484438783,ZM 3484438784,3484439039,US 3484439040,3484439295,GB @@ -95620,17 +101826,18 @@ 3485318144,3485327359,US 3485327360,3485335551,CA 3485335552,3485462527,US -3485462528,3485464575,VC -3485464576,3485466623,LC +3485462528,3485465343,VC +3485465344,3485465599,LC +3485465600,3485466623,VC 3485466624,3485597695,US -3485597696,3485694975,CA -3485694976,3485695231,US -3485695232,3485695999,CA -3485696000,3485721056,US -3485721057,3485721057,AE -3485721058,3485959423,US +3485597696,3485695999,CA +3485696000,3485959423,US 3485959424,3485960191,CA -3485960192,3486023679,US +3485960192,3485960703,US +3485960704,3485960959,CA +3485960960,3485970431,US +3485970432,3485970687,CA +3485970688,3486023679,US 3486023680,3486031871,CA 3486031872,3486269439,US 3486269440,3486285823,JM @@ -95834,13 +102041,10 @@ 3486702592,3486702847,CA 3486702848,3487039487,US 3487039488,3487105023,CA -3487105024,3487174143,US -3487174144,3487174271,CH -3487174272,3487175935,US -3487175936,3487176191,GB -3487176192,3487181359,US -3487181360,3487181375,GB -3487181376,3487189247,US +3487105024,3487172095,US +3487172096,3487172351,MX +3487172352,3487188991,US +3487188992,3487189247,GB 3487189248,3487189503,DK 3487189504,3487197183,US 3487197184,3487197439,DK @@ -95848,22 +102052,11 @@ 3487216384,3487216639,SE 3487216640,3487236095,US 3487236096,3487301631,CA -3487301632,3487561471,US -3487561472,3487561727,AU -3487561728,3487703039,US -3487703040,3487703073,DE -3487703074,3487703074,A2 -3487703075,3487704849,DE -3487704850,3487704850,NG -3487704851,3487704851,DE -3487704852,3487704853,NG -3487704854,3487705855,DE -3487705856,3487706367,A2 +3487301632,3487706367,US 3487706368,3487706623,RU -3487706624,3487707135,A2 -3487707136,3487725567,US -3487725568,3487727615,TW -3487727616,3487766527,US +3487706624,3487731199,US +3487731200,3487731455,CN +3487731456,3487766527,US 3487766528,3487768575,CA 3487768576,3487842303,US 3487842304,3487858687,CA @@ -95887,21 +102080,21 @@ 3488112640,3488120831,CA 3488120832,3488300287,US 3488300288,3488300543,A2 -3488300544,3488307711,US -3488307712,3488308223,IN -3488308224,3488350207,US +3488300544,3488350207,US 3488350208,3488415743,CA 3488415744,3488615935,US 3488615936,3488616191,AU 3488616192,3488901887,US 3488901888,3488902143,CA -3488902144,3488940031,US +3488902144,3488910335,US +3488910336,3488911359,CA +3488911360,3488940031,US 3488940032,3488956415,CA 3488956416,3488989183,US 3488989184,3489005567,CA 3489005568,3489058047,US -3489058048,3489058063,GB -3489058064,3489136639,US +3489058048,3489058303,GB +3489058304,3489136639,US 3489136640,3489153535,MX 3489153536,3489154047,HN 3489154048,3489155583,MX @@ -95928,7 +102121,6 @@ 3489399040,3489464319,US 3489464320,3489529855,CA 3489529856,3489562623,US -3489565440,3489565695,JM 3489566720,3489575935,US 3489575936,3489576959,CN 3489576960,3489577215,US @@ -95946,7 +102138,9 @@ 3489720064,3489720319,LC 3489720320,3489738751,US 3489738752,3489740799,PH -3489740800,3489775103,US +3489740800,3489753151,US +3489753152,3489753167,PR +3489753168,3489775103,US 3489775104,3489775359,BO 3489775360,3489969151,US 3489969152,3489969663,PR @@ -95990,37 +102184,25 @@ 3492812760,3492812763,JP 3492812764,3492845823,US 3492845824,3492846079,CH -3492846080,3492858111,US -3492858112,3492858367,SA -3492858368,3492864767,US +3492846080,3492864767,US 3492864768,3492865023,CA -3492865024,3492865279,US -3492865280,3492865359,GB -3492865360,3492865375,US -3492865376,3492865504,GB -3492865505,3492865505,US -3492865506,3492865535,GB -3492865536,3492867071,US -3492867072,3492867327,FR -3492867328,3492869631,US -3492869632,3492869887,BR -3492869888,3492877954,US +3492865024,3492867327,US +3492867328,3492867583,GB +3492867584,3492877954,US 3492877955,3492877955,CA -3492877956,3492894975,US -3492894976,3492895231,BE -3492895232,3492906495,US +3492877956,3492893951,US +3492893952,3492893969,GB +3492893970,3492893971,US +3492893972,3492893983,GB +3492893984,3492894015,US +3492894016,3492894207,GB +3492894208,3492897023,US +3492897024,3492897279,GB +3492897280,3492906495,US 3492906496,3492906751,EU -3492906752,3492910079,US -3492910080,3492910207,GB -3492910208,3492912127,US -3492912128,3492912151,GB -3492912152,3492912159,US -3492912160,3492912383,GB -3492912384,3492913663,US -3492913664,3492913919,CA -3492913920,3492917247,US -3492917248,3492917503,VI -3492917504,3492921855,US +3492906752,3492912127,US +3492912128,3492912383,GB +3492912384,3492921855,US 3492921856,3492922111,VI 3492922112,3492926079,US 3492926080,3492926095,EU @@ -96028,41 +102210,25 @@ 3492933376,3492933376,CA 3492933377,3492933377,CH 3492933378,3492933631,CA -3492933632,3492934111,US -3492934112,3492934143,GB -3492934144,3492939022,US +3492933632,3492939022,US 3492939023,3492939023,DE -3492939024,3492950863,US -3492950864,3492950879,DE -3492950880,3492954623,US -3492954624,3492955135,GB -3492955136,3492957695,US +3492939024,3492957695,US 3492957696,3492958207,VI -3492958208,3492962559,US -3492962560,3492962815,GB -3492962816,3492968191,US +3492958208,3492960255,US +3492960256,3492960511,ES +3492960512,3492968191,US 3492968192,3492968447,GB 3492968448,3492969471,US 3492969472,3492969727,VI -3492969728,3492994815,US -3492994816,3492995071,GB -3492995072,3492996127,US -3492996128,3492996136,GB -3492996137,3493011327,US -3493011328,3493011455,GB -3493011456,3493013759,US -3493013760,3493014015,GB -3493014016,3493014627,US -3493014628,3493014628,GB -3493014629,3493029119,US -3493029120,3493029311,GB -3493029312,3493029327,US -3493029328,3493029375,GB -3493029376,3493039359,US +3492969728,3492998911,US +3492998912,3492999167,GB +3492999168,3493009151,US +3493009152,3493009205,MX +3493009206,3493009206,US +3493009207,3493009407,MX +3493009408,3493039359,US 3493039360,3493039615,AR -3493039616,3493061119,US -3493061120,3493061375,BR -3493061376,3493069055,US +3493039616,3493069055,US 3493069056,3493069311,A2 3493069312,3493073151,US 3493073152,3493073407,BO @@ -96099,9 +102265,7 @@ 3493987328,3493990399,US 3493990400,3493991423,CA 3493991424,3493998591,US -3493998592,3493999103,AI -3493999104,3493999359,KN -3493999360,3494000639,AI +3493998592,3494000639,AI 3494000640,3494002687,US 3494003712,3494004735,CA 3494004736,3494009855,US @@ -96134,11 +102298,7 @@ 3494181632,3494181887,SN 3494181888,3494184959,US 3494184960,3494187007,CA -3494187008,3494191359,US -3494191360,3494191615,DE -3494191616,3494191871,GB -3494191872,3494192127,NL -3494192128,3494192383,US +3494187008,3494192383,US 3494192384,3494192639,JP 3494192640,3494197247,US 3494197248,3494198271,CA @@ -96166,7 +102326,9 @@ 3494359040,3494360063,CA 3494360064,3494361087,US 3494361088,3494362111,CA -3494362112,3494380543,US +3494362112,3494368255,US +3494368256,3494369279,CN +3494369280,3494380543,US 3494380544,3494381567,CA 3494381568,3494402559,US 3494402560,3494402815,GB @@ -96230,11 +102392,7 @@ 3494758400,3494776831,US 3494776832,3494777855,CA 3494777856,3494785023,US -3494785024,3494785535,MF -3494785536,3494785791,GP -3494785792,3494786047,MF -3494786048,3494786559,GP -3494786560,3494787071,MF +3494785024,3494787071,MF 3494787072,3494787327,A2 3494787328,3494787583,NG 3494787584,3494788095,A2 @@ -96287,11 +102445,7 @@ 3495098368,3495100415,CA 3495100416,3495120895,US 3495120896,3495122943,AG -3495122944,3495123423,US -3495123424,3495123439,IN -3495123440,3495123455,US -3495123456,3495123967,GB -3495123968,3495153663,US +3495122944,3495153663,US 3495153664,3495155711,CA 3495155712,3495187199,US 3495187200,3495187455,IM @@ -96301,6 +102455,7 @@ 3495215104,3495217151,VI 3495217152,3495219199,VC 3495219200,3495225343,US +3495225600,3495225855,US 3495225856,3495226111,GB 3495226624,3495226879,US 3495227392,3495251967,US @@ -96326,7 +102481,9 @@ 3495375872,3495376895,CA 3495376896,3495399423,US 3495399424,3495400447,KN -3495400448,3495412735,US +3495400448,3495406335,US +3495406336,3495406591,LB +3495406592,3495412735,US 3495412736,3495413759,CA 3495413760,3495429119,US 3495429120,3495430143,CA @@ -96364,7 +102521,8 @@ 3495618560,3495619583,CA 3495619584,3495620607,US 3495620608,3495622655,CA -3495622656,3495654143,US +3495622656,3495651327,US +3495653376,3495654143,US 3495654144,3495654399,CA 3495654400,3495673855,US 3495673856,3495674879,MF @@ -96376,8 +102534,7 @@ 3495689216,3495694335,US 3495694336,3495696383,CA 3495696384,3495703551,US -3495703552,3495704063,GB -3495704064,3495704575,CA +3495703552,3495704575,CA 3495704576,3495718911,US 3495718912,3495723007,CA 3495723008,3495724031,US @@ -96401,16 +102558,16 @@ 3495864320,3495864831,DM 3495864832,3495865343,MF 3495865344,3495866367,US -3495866368,3495868415,LC +3495866368,3495867647,LC +3495867648,3495867903,VC +3495867904,3495868415,LC 3495868416,3495871487,US 3495871488,3495872511,CA 3495872512,3495881471,US 3495881472,3495881727,PA 3495881728,3495896063,US 3495896064,3495897087,PR -3495897088,3495916287,US -3495916288,3495916543,SL -3495916544,3495930879,US +3495897088,3495930879,US 3495930880,3495931903,CA 3495931904,3495968767,US 3495968768,3495985151,CA @@ -96425,10 +102582,8 @@ 3496189952,3496190519,US 3496190520,3496190527,CA 3496190528,3496190719,US -3496190720,3496190735,CA -3496190736,3496190751,US -3496190752,3496190767,CA -3496190768,3496296447,US +3496190720,3496190975,CA +3496190976,3496296447,US 3496296448,3496312831,CA 3496312832,3496468479,US 3496468480,3496476671,CA @@ -96440,9 +102595,7 @@ 3496894464,3496902655,CA 3496902656,3496946175,US 3496946176,3496946431,HK -3496946432,3496946943,US -3496946944,3496947199,IN -3496947200,3496947711,US +3496946432,3496947711,US 3496947712,3496949759,JP 3496949760,3496951807,US 3496951808,3496959999,CA @@ -96452,16 +102605,23 @@ 3497066496,3497082879,CA 3497082880,3497157375,US 3497157376,3497158143,A2 -3497158144,3497162495,US +3497158144,3497161735,US +3497161736,3497161743,MT +3497161744,3497161759,US +3497161760,3497161767,PT +3497161768,3497161775,MT +3497161776,3497161895,US +3497161896,3497161903,MT +3497161904,3497161935,US +3497161936,3497161943,MT +3497161944,3497162495,US 3497162496,3497162751,GB 3497162752,3497163007,NL 3497163008,3497163167,US 3497163168,3497163175,GB 3497163176,3497164799,US 3497164800,3497181183,CA -3497181184,3497233407,US -3497233408,3497233663,CN -3497233664,3497410559,US +3497181184,3497410559,US 3497410560,3497431039,CA 3497431040,3497447423,US 3497447424,3497451519,CA @@ -96477,11 +102637,7 @@ 3498254592,3498254847,JM 3498254848,3498287103,US 3498287104,3498295295,JM -3498295296,3498428415,US -3498428416,3498429439,CR -3498429440,3498429951,US -3498429952,3498430207,CR -3498430208,3498513151,US +3498295296,3498513151,US 3498513152,3498513407,CL 3498513408,3498513919,US 3498513920,3498514431,CL @@ -96515,9 +102671,7 @@ 3500016384,3500016639,KN 3500016640,3500016895,AG 3500016896,3500017151,DM -3500017152,3500017407,AG -3500017408,3500017663,VG -3500017664,3500018943,AG +3500017152,3500018943,AG 3500018944,3500019199,LC 3500019200,3500019455,AG 3500019456,3500019711,LC @@ -96526,22 +102680,13 @@ 3500126464,3500126719,GB 3500126720,3500351487,US 3500351488,3500359679,JM -3500359680,3500486655,US -3500486656,3500490751,CR -3500490752,3500613631,US +3500359680,3500613631,US 3500613632,3500614655,MZ -3500614656,3500664870,US -3500664871,3500664871,CA -3500664872,3500689407,US +3500614656,3500689407,US 3500689408,3500689919,CL 3500689920,3500707327,US 3500707328,3500707839,CA -3500707840,3500725247,US -3500725248,3500725503,EC -3500725504,3500725759,HT -3500725760,3500726015,EC -3500726016,3500726271,HT -3500726272,3500728319,US +3500707840,3500728319,US 3500728320,3500736511,KY 3500736512,3500752895,US 3500752896,3500761087,KY @@ -96575,7 +102720,9 @@ 3502545664,3502545919,BS 3502545920,3502683135,US 3502683136,3502683391,MC -3502683392,3502993407,US +3502683392,3502718719,US +3502718720,3502718975,CA +3502718976,3502993407,US 3502993408,3502993919,NL 3502993920,3503206399,US 3503206400,3503206911,CR @@ -96608,7 +102755,9 @@ 3504207872,3504208127,CA 3504208128,3504223743,US 3504223744,3504223999,RO -3504224000,3504521215,US +3504224000,3504518399,US +3504518400,3504518655,CA +3504518656,3504521215,US 3504521216,3504521727,GU 3504521728,3504889343,US 3504889344,3504889855,PK @@ -96655,27 +102804,15 @@ 3506231808,3506232063,IN 3506232064,3506765823,US 3506765824,3506831359,CA -3506831360,3506964479,US -3506964480,3506966527,TW -3506966528,3506972927,US -3506972928,3506973183,A2 -3506973184,3506977791,US -3506977792,3506978815,NL -3506978816,3506986751,US -3506986752,3506987007,DE -3506987008,3507013631,US -3507013632,3507015679,DE -3507015680,3507019775,US -3507019776,3507021823,GB -3507021824,3507022079,US -3507022080,3507022335,A2 -3507022336,3507023871,US -3507023872,3507024383,GB -3507024384,3507024639,AU -3507024640,3507025919,GB -3507025920,3507038207,US -3507038208,3507040255,TW -3507040256,3507290111,US +3506831360,3507012607,US +3507012608,3507012639,GR +3507012640,3507025407,US +3507025408,3507025663,IQ +3507025664,3507055103,US +3507055104,3507055359,CN +3507055360,3507060735,US +3507060736,3507060991,CN +3507060992,3507290111,US 3507290112,3507355647,AR 3507355648,3507427583,US 3507427584,3507427839,CA @@ -96897,9 +103034,9 @@ 3509532672,3509532927,US 3509532928,3509533439,CA 3509533440,3509534719,US -3509534720,3509535487,CA -3509535488,3509535743,US -3509535744,3509535999,CA +3509534720,3509535231,CA +3509535232,3509535487,US +3509535488,3509535999,CA 3509536000,3509536255,US 3509536256,3509536767,CA 3509536768,3509537279,US @@ -96908,15 +103045,13 @@ 3509538560,3509538815,CA 3509538816,3509539071,US 3509539072,3509539327,CA -3509539328,3509539643,US -3509539644,3509539644,CA -3509539645,3509539967,US +3509539328,3509539967,US 3509539968,3509540031,CA 3509540032,3509540607,US 3509540608,3509541503,CA -3509541504,3509541631,US -3509541632,3509541887,CA -3509541888,3509542911,US +3509541504,3509541887,US +3509541888,3509542143,CA +3509542144,3509542911,US 3509542912,3509543167,CA 3509543168,3509543423,US 3509543424,3509543935,CA @@ -96932,8 +103067,8 @@ 3509551616,3509551871,CA 3509551872,3509552127,US 3509552128,3509552639,CA -3509552640,3509553919,US -3509553920,3509554959,CA +3509552640,3509554431,US +3509554432,3509554959,CA 3509554960,3509555199,US 3509555200,3509555455,CA 3509555456,3509555711,US @@ -96948,20 +103083,18 @@ 3509560320,3509560831,US 3509560832,3509561087,CA 3509561088,3509561343,US -3509561344,3509562623,CA +3509561344,3509561599,CA +3509561600,3509561855,US +3509561856,3509562623,CA 3509562624,3509563391,US -3509563392,3509564159,CA -3509564160,3509564415,US -3509564416,3509564927,CA -3509564928,3509565183,US +3509563392,3509563903,CA +3509563904,3509564415,US +3509564416,3509564671,CA +3509564672,3509565183,US 3509565184,3509566463,CA 3509566464,3509567231,US 3509567232,3509569023,CA -3509569024,3509569535,US -3509569536,3509569791,CA -3509569792,3509571071,US -3509571072,3509571327,CA -3509571328,3509572351,US +3509569024,3509572351,US 3509572352,3509573375,CA 3509573376,3509573439,US 3509573440,3509573455,CA @@ -96971,23 +103104,17 @@ 3509574144,3509575679,CA 3509575680,3509575935,US 3509575936,3509576191,CA -3509576192,3509576447,US -3509576448,3509576703,CA -3509576704,3509576959,US +3509576192,3509576959,US 3509576960,3509577215,CA 3509577216,3509577983,US 3509577984,3509578239,CA -3509578240,3509578495,US -3509578496,3509578751,CA -3509578752,3509579007,US +3509578240,3509579007,US 3509579008,3509579263,CA 3509579264,3509579519,US 3509579520,3509579775,CA 3509579776,3509580031,US 3509580032,3509580287,CA -3509580288,3509580799,US -3509580800,3509581055,CA -3509581056,3509582335,US +3509580288,3509582335,US 3509582336,3509582847,CA 3509582848,3509583615,US 3509583616,3509583871,CA @@ -97031,7 +103158,10 @@ 3510268928,3510269951,US 3510269952,3510270719,LY 3510270720,3510270975,SY -3510270976,3510321151,US +3510270976,3510284287,US +3510284288,3510286335,SG +3510286336,3510288383,HK +3510288384,3510321151,US 3510321152,3510321663,VG 3510321664,3510321919,AG 3510321920,3510322175,KN @@ -97071,13 +103201,7 @@ 3510935552,3510943743,CA 3510943744,3511140351,US 3511140352,3511156735,CA -3511156736,3511256063,US -3511256064,3511256319,A1 -3511256320,3511258367,US -3511258368,3511258623,A1 -3511258624,3511260927,US -3511260928,3511261183,A1 -3511261184,3511812095,US +3511156736,3511812095,US 3511812096,3511844863,CA 3511844864,3512012095,US 3512012096,3512012159,GB @@ -97091,17 +103215,9 @@ 3512024320,3512024575,AU 3512024576,3512043519,US 3512043520,3512043775,FI -3512043776,3512045055,US -3512045056,3512045311,IE -3512045312,3512052735,US +3512043776,3512052735,US 3512052736,3512052991,FI -3512052992,3512053247,US -3512053248,3512053503,MY -3512053504,3512066559,US -3512066560,3512066815,BE -3512066816,3512067071,US -3512067072,3512067327,BE -3512067328,3512139775,US +3512052992,3512139775,US 3512139776,3512156159,CA 3512156160,3512172543,US 3512172544,3512176639,CA @@ -97186,8 +103302,8 @@ 3512459520,3512459775,US 3512459776,3512460031,PR 3512460032,3512460287,US -3512460288,3512460543,PR -3512460544,3512461055,US +3512460288,3512460799,PR +3512460800,3512461055,US 3512461056,3512463103,PR 3512463104,3512463359,US 3512463360,3512464639,PR @@ -97245,7 +103361,11 @@ 3512594176,3512594431,MY 3512594432,3512647679,US 3512647680,3512655871,TT -3512655872,3512844287,US +3512655872,3512679511,US +3512679512,3512679515,HK +3512679516,3512680339,US +3512680340,3512680340,SG +3512680341,3512844287,US 3512844288,3512852479,CA 3512852480,3512931583,US 3512931584,3512931839,CA @@ -97271,23 +103391,7 @@ 3514007552,3514040319,CA 3514040320,3514367999,US 3514368000,3514433535,CA -3514433536,3514580991,US -3514580992,3514581503,GB -3514581504,3514581759,US -3514581760,3514582015,GB -3514582016,3514582527,US -3514582528,3514582783,GB -3514582784,3514583295,US -3514583296,3514583511,GB -3514583512,3514583535,US -3514583536,3514583807,GB -3514583808,3514584063,US -3514584064,3514584831,GB -3514584832,3514585343,US -3514585344,3514587135,GB -3514587136,3514587391,US -3514587392,3514589183,GB -3514589184,3514589439,US +3514433536,3514589439,US 3514589440,3514589695,GT 3514589696,3514590207,SV 3514590208,3514590719,NI @@ -97307,34 +103411,24 @@ 3514723697,3514723697,BZ 3514723698,3514724635,US 3514724636,3514724636,UA -3514724637,3514732071,US -3514732072,3514732075,UA -3514732076,3514826751,US +3514724637,3514826751,US 3514826752,3514843135,CA -3514843136,3514993919,US -3514993920,3514993983,GB +3514843136,3514993983,US 3514993984,3514993987,FR 3514993988,3514993991,DE 3514993992,3514994007,GB 3514994008,3514994023,DK -3514994024,3514994049,GB +3514994024,3514994049,US 3514994050,3514994050,EU -3514994051,3514994175,GB -3514994176,3515001869,US -3515001870,3515001873,GB -3515001874,3515007869,US -3515007870,3515007870,GB -3515007871,3515222271,US +3514994051,3515211775,US +3515211776,3515219967,CA +3515219968,3515222271,US 3515222272,3515224831,TR 3515224832,3515301887,US 3515301888,3515318271,CA -3515318272,3515339519,US -3515339520,3515339775,A1 -3515339776,3515358975,US +3515318272,3515358975,US 3515358976,3515359231,MX -3515359232,3515450623,US -3515450624,3515450879,CA -3515450880,3515596799,US +3515359232,3515596799,US 3515596800,3515613183,CA 3515613184,3515711487,US 3515711488,3515731967,CA @@ -97394,9 +103488,7 @@ 3517120512,3517173759,US 3517173760,3517174783,IN 3517174784,3517233151,US -3517233152,3517234687,GU -3517234688,3517234943,US -3517234944,3517235199,GU +3517233152,3517235199,GU 3517235200,3517382655,US 3517382656,3517383167,CA 3517383168,3517383423,US @@ -97409,20 +103501,20 @@ 3517385984,3517387263,CA 3517387264,3517387519,US 3517387520,3517387775,CA -3517387776,3517388287,US -3517388288,3517388799,CA +3517387776,3517388031,US +3517388032,3517388799,CA 3517388800,3517389311,US 3517389312,3517389567,CA 3517389568,3517389823,US 3517389824,3517390335,CA 3517390336,3517390591,US -3517390592,3517391359,CA -3517391360,3517391871,US +3517390592,3517391103,CA +3517391104,3517391359,US +3517391360,3517391615,CA +3517391616,3517391871,US 3517391872,3517392127,CA 3517392128,3517392383,US -3517392384,3517392639,CA -3517392640,3517392895,US -3517392896,3517393407,CA +3517392384,3517393407,CA 3517393408,3517394431,US 3517394432,3517394943,CA 3517394944,3517395199,US @@ -97469,8 +103561,8 @@ 3517412608,3517412863,CA 3517412864,3517413119,US 3517413120,3517414399,CA -3517414400,3517414911,US -3517414912,3517415423,CA +3517414400,3517415167,US +3517415168,3517415423,CA 3517415424,3517416919,US 3517416920,3517416927,CA 3517416928,3517416959,US @@ -97516,7 +103608,9 @@ 3517435392,3517435647,US 3517435648,3517436415,CA 3517436416,3517436671,US -3517436672,3517437439,CA +3517436672,3517436927,CA +3517436928,3517437183,US +3517437184,3517437439,CA 3517437440,3517437695,US 3517437696,3517437951,CA 3517437952,3517438207,US @@ -97547,54 +103641,23 @@ 3517447936,3517448191,CA 3517448192,3517546495,US 3517546496,3517562879,CA -3517562880,3517595647,US -3517595648,3517596671,SE -3517596672,3517596927,US +3517562880,3517596927,US 3517596928,3517597183,IE 3517597184,3517597695,US 3517597696,3517597951,IE -3517597952,3517598207,DE +3517597952,3517598207,US 3517598208,3517598463,IE -3517598464,3517598591,SE -3517598592,3517598719,US -3517598720,3517599263,SE -3517599264,3517599295,US -3517599296,3517599359,SE -3517599360,3517599615,US -3517599616,3517600767,SE -3517600768,3517601279,US -3517601280,3517602047,SE +3517598464,3517602047,US 3517602048,3517602303,DE -3517602304,3517602559,US -3517602560,3517602687,SE -3517602688,3517602815,US -3517602816,3517603071,SE -3517603072,3517603231,US -3517603232,3517603327,SE -3517603328,3517603583,US -3517603584,3517603647,SE -3517603648,3517603711,US -3517603712,3517604095,SE -3517604096,3517604351,US -3517604352,3517605119,SE -3517605120,3517605375,US -3517605376,3517605887,SE -3517605888,3517606143,US -3517606144,3517606207,SE -3517606208,3517606399,US -3517606400,3517607935,SE +3517602304,3517607935,US 3517607936,3517608191,DE 3517608192,3517608447,US 3517608448,3517608703,GB 3517608704,3517609727,US -3517609728,3517609743,SE -3517609744,3517609751,US -3517609752,3517610495,SE +3517609728,3517609743,AT +3517609744,3517610495,US 3517610496,3517611263,IE -3517611264,3517611311,SE -3517611312,3517611343,US -3517611344,3517612031,SE -3517612032,3517644799,US +3517611264,3517644799,US 3517644800,3517710335,CA 3517710336,3517718527,US 3517718528,3517726719,CA @@ -97616,11 +103679,7 @@ 3518762496,3518762751,GB 3518762752,3518765311,US 3518765312,3518765567,CA -3518765568,3518905599,US -3518905600,3518905855,GB -3518905856,3518911743,US -3518911744,3518911999,GB -3518912000,3518912511,US +3518765568,3518912511,US 3518912512,3518912767,IN 3518912768,3518918143,US 3518918144,3518918399,IN @@ -97630,13 +103689,7 @@ 3519234048,3519250431,CA 3519250432,3519340543,US 3519340544,3519344639,CA -3519344640,3519351327,US -3519351328,3519351359,GB -3519351360,3519351423,US -3519351424,3519351455,GB -3519351456,3519351551,US -3519351552,3519351807,GB -3519351808,3519354909,US +3519344640,3519354909,US 3519354910,3519354910,BR 3519354911,3519381503,US 3519381504,3519397887,CA @@ -97667,9 +103720,9 @@ 3519877888,3519878143,CA 3519878144,3519878271,US 3519878272,3519878303,CA -3519878304,3519878911,US -3519878912,3519879167,CA -3519879168,3519879727,US +3519878304,3519878655,US +3519878656,3519878911,CA +3519878912,3519879727,US 3519879728,3519879735,CA 3519879736,3519879935,US 3519879936,3519880447,CA @@ -97678,9 +103731,7 @@ 3519882496,3519882751,US 3519882752,3519884031,CA 3519884032,3519884287,US -3519884288,3519898367,CA -3519898368,3519898623,US -3519898624,3519901695,CA +3519884288,3519901695,CA 3519901696,3519930367,US 3519934464,3519938559,CA 3519938560,3520020479,US @@ -97719,13 +103770,9 @@ 3521196544,3521216511,US 3521216512,3521220351,CA 3521220352,3521220607,US -3521220608,3521222143,CA -3521222144,3521222399,US -3521222400,3521224959,CA +3521220608,3521224959,CA 3521224960,3521225215,US -3521225216,3521232127,CA -3521232128,3521232383,US -3521232384,3521232895,CA +3521225216,3521232895,CA 3521232896,3521249279,US 3521249280,3521314815,CA 3521314816,3521347583,US @@ -97734,21 +103781,11 @@ 3521366784,3521367039,CY 3521367040,3521837055,US 3521837056,3521837311,SG -3521837312,3521888483,US -3521888484,3521888484,KW -3521888485,3521896927,US -3521896928,3521896935,NG -3521896936,3521899263,US -3521899264,3521899271,KW -3521899272,3521904148,US -3521904149,3521904149,NG -3521904150,3521904639,US +3521837312,3521904639,US 3521904640,3521921023,JM 3521921024,3521965055,US 3521965056,3521966079,DE -3521966080,3521989631,US -3521989632,3521989887,A2 -3521989888,3522101247,US +3521966080,3522101247,US 3522101248,3522109439,CA 3522109440,3522118143,US 3522118144,3522118655,GB @@ -97786,13 +103823,17 @@ 3522174976,3522179071,BM 3522179072,3522195455,US 3522195456,3522199551,CA -3522199552,3522854911,US +3522199552,3522816767,US +3522816768,3522817023,CA +3522817024,3522854911,US 3522854912,3522871295,CA -3522871296,3522902015,US +3522871296,3522893823,US +3522893824,3522894847,CA +3522894848,3522902015,US 3522902016,3522903039,CA 3522903040,3522937855,US -3522937856,3522938367,GB -3522938368,3522940415,US +3522937856,3522938111,GB +3522938112,3522940415,US 3522940416,3522940671,HK 3522940672,3523215359,US 3523215360,3523223551,AU @@ -97851,15 +103892,13 @@ 3523603968,3523674111,HK 3523674112,3523682303,FJ 3523682304,3523686399,NZ -3523686400,3523690495,AU +3523686400,3523688447,AU 3523690496,3523698687,IN 3523698688,3523700735,JP 3523700736,3523701759,HK 3523701760,3523707903,JP 3523707904,3523708159,AU -3523708160,3523709183,JP -3523709184,3523709951,CN -3523709952,3523723263,JP +3523708160,3523723263,JP 3523723264,3523725311,US 3523725312,3523739647,JP 3523739648,3524001791,AU @@ -97885,9 +103924,7 @@ 3524722688,3524730879,SG 3524730880,3524739071,CN 3524739072,3524743167,ID -3524743168,3524745215,MP -3524745216,3524745471,GU -3524745472,3524745727,MP +3524743168,3524745727,MP 3524745728,3524745983,GU 3524745984,3524747263,MP 3524747264,3524755455,PH @@ -97908,9 +103945,7 @@ 3526557696,3526651135,CN 3526651136,3526651391,KP 3526651392,3526754303,CN -3526754304,3526845183,NZ -3526845184,3526845311,AU -3526845312,3526885375,NZ +3526754304,3526885375,NZ 3526885376,3526893567,PK 3526893568,3526897663,NZ 3526897664,3526901759,HK @@ -97933,7 +103968,7 @@ 3528404992,3528407039,NZ 3528407040,3528409087,AU 3528409088,3528425471,CN -3528425472,3528445951,JP +3528441856,3528445951,JP 3528445952,3528450047,ID 3528450048,3528458239,CN 3528458240,3528474623,AP @@ -97962,7 +103997,9 @@ 3529089024,3529097215,KR 3529097216,3529113599,JP 3529113600,3531603967,KR -3531603968,3532929279,JP +3531603968,3532290815,JP +3532290816,3532291071,GB +3532291072,3532929279,JP 3532929280,3532929535,AP 3532929536,3534749695,JP 3534749696,3534757887,HK @@ -97974,12 +104011,16 @@ 3534758976,3534759039,PH 3534759040,3534759167,AU 3534759168,3534759183,JP -3534759184,3534760703,AU -3534760704,3534760711,NZ -3534760712,3534761983,AU +3534759184,3534760447,AU +3534760448,3534760959,NZ +3534760960,3534761983,AU 3534761984,3534763775,HK 3534763776,3534764031,AP -3534764032,3534863443,HK +3534764032,3534787327,HK +3534787328,3534787583,TH +3534787584,3534852095,HK +3534852096,3534852351,AU +3534852352,3534863443,HK 3534863444,3534863444,CN 3534863445,3534867711,HK 3534867712,3534867967,AP @@ -98056,7 +104097,9 @@ 3546808320,3547856895,KR 3547856896,3547916287,JP 3547916288,3547916543,US -3547916544,3548905471,JP +3547916544,3548208127,JP +3548208128,3548208639,US +3548208640,3548905471,JP 3548905472,3551002623,CN 3551002624,3556769791,KR 3556769792,3556773887,DE @@ -98093,8 +104136,8 @@ 3557007360,3557015551,IT 3557015552,3557023743,DE 3557023744,3557027327,GB -3557027328,3557027583,NL -3557027584,3557028415,GB +3557027328,3557027455,NL +3557027456,3557028415,GB 3557028416,3557028479,BE 3557028480,3557031935,GB 3557031936,3557040127,IT @@ -98142,17 +104185,9 @@ 3557360128,3557360135,GB 3557360136,3557360263,JE 3557360264,3557360271,GB -3557360272,3557360743,JE -3557360744,3557360751,GB -3557360752,3557360863,JE -3557360864,3557360871,GB -3557360872,3557363583,JE -3557363584,3557363595,GB -3557363596,3557363631,JE -3557363632,3557363639,GB -3557363640,3557363703,JE -3557363704,3557363711,GB -3557363712,3557365791,JE +3557360272,3557364555,JE +3557364556,3557364556,GG +3557364557,3557365791,JE 3557365792,3557365799,GB 3557365800,3557367807,JE 3557367808,3557375999,DE @@ -98204,9 +104239,7 @@ 3557834752,3557842943,IR 3557842944,3557851135,FI 3557851136,3557859327,HU -3557859328,3557860831,SE -3557860832,3557860847,FI -3557860848,3557861983,SE +3557859328,3557861983,SE 3557861984,3557862015,FI 3557862016,3557863295,SE 3557863296,3557863327,FI @@ -98218,15 +104251,11 @@ 3557883904,3557892095,RU 3557892096,3557900287,IE 3557900288,3557916671,AT -3557916672,3557920055,NO -3557920056,3557920056,DK -3557920057,3557924863,NO -3557924864,3557926143,AX -3557926144,3557926399,FI -3557926400,3557926655,AX -3557926656,3557929471,FI -3557929472,3557929727,AX -3557929728,3557929983,FI +3557916672,3557924863,NO +3557924864,3557925887,AX +3557925888,3557927679,FI +3557927680,3557927935,AX +3557927936,3557929983,FI 3557929984,3557933055,AX 3557933056,3557941247,IT 3557941248,3557957631,DE @@ -98240,11 +104269,11 @@ 3557998592,3558006783,DE 3558006784,3558010879,GB 3558010880,3558012927,FR -3558012928,3558013951,GB -3558013952,3558014207,IL +3558012928,3558014207,GB 3558014208,3558014463,NL 3558014464,3558014464,US -3558014465,3558014975,IL +3558014465,3558014719,IL +3558014720,3558014975,NL 3558014976,3558023167,RU 3558023168,3558031359,DE 3558031360,3558039551,GB @@ -98258,17 +104287,15 @@ 3558129664,3558137855,NO 3558137856,3558146047,GB 3558146048,3558154239,RU -3558154240,3558155007,A2 -3558155008,3558155263,US -3558155264,3558156303,A2 +3558154240,3558155059,A2 +3558155060,3558155063,DE +3558155064,3558156303,A2 3558156304,3558156311,GB 3558156312,3558157391,A2 3558157392,3558157407,AF 3558157408,3558159359,A2 3558159360,3558159615,US -3558159616,3558159747,A2 -3558159748,3558159748,US -3558159749,3558160127,A2 +3558159616,3558160127,A2 3558160128,3558160383,GB 3558160384,3558162431,A2 3558162432,3558170623,DE @@ -98276,8 +104303,7 @@ 3558178816,3558187007,BG 3558187008,3558195199,DE 3558195200,3558197247,GB -3558197248,3558199039,US -3558199040,3558199295,ES +3558197248,3558199295,US 3558199296,3558203391,GB 3558203392,3558211583,ES 3558211584,3558219775,GB @@ -98286,9 +104312,7 @@ 3558228480,3558228735,FR 3558228736,3558232063,RU 3558232064,3558232575,LB -3558232576,3558234623,RU -3558234624,3558234879,UA -3558234880,3558235647,RU +3558232576,3558235647,RU 3558235648,3558235903,LB 3558235904,3558236159,RU 3558236160,3558244351,GB @@ -98310,9 +104334,9 @@ 3558289976,3558289983,CZ 3558289984,3558291071,GB 3558291072,3558291135,DE -3558291136,3558291295,GB -3558291296,3558291311,CH -3558291312,3558292479,GB +3558291136,3558292255,GB +3558292256,3558292271,SE +3558292272,3558292479,GB 3558292480,3558292735,EU 3558292736,3558293055,GB 3558293056,3558293087,NL @@ -98341,9 +104365,7 @@ 3558514688,3558522879,SK 3558522880,3558531071,NL 3558531072,3558539263,RU -3558539264,3558542591,DK -3558542592,3558542847,SE -3558542848,3558547455,DK +3558539264,3558547455,DK 3558547456,3558555647,FR 3558555648,3558572031,AT 3558572032,3558580223,DE @@ -98367,13 +104389,7 @@ 3558718208,3558718463,EU 3558718464,3558719487,NL 3558719488,3558735871,IL -3558735872,3558741503,GB -3558741504,3558742015,GG -3558742016,3558742271,GB -3558742272,3558742527,GG -3558742528,3558743551,GB -3558743552,3558743807,GG -3558743808,3558744063,GB +3558735872,3558744063,GG 3558744064,3558752255,LB 3558752256,3558760447,SI 3558760448,3558768639,FR @@ -98414,22 +104430,25 @@ 3559055360,3559063551,AM 3559063552,3559079935,CH 3559079936,3559088127,JO -3559088128,3559089527,GB +3559088128,3559088383,GB +3559088384,3559088639,BE +3559088640,3559089527,GB 3559089528,3559089535,BE 3559089536,3559089935,GB 3559089936,3559089951,BE 3559089952,3559090239,GB 3559090240,3559090303,BE -3559090304,3559093311,GB +3559090304,3559092243,GB +3559092244,3559092244,BE +3559092245,3559093311,GB 3559093312,3559093319,BE -3559093320,3559093503,GB -3559093504,3559093759,BE -3559093760,3559094303,GB +3559093320,3559093695,GB +3559093696,3559093703,BE +3559093704,3559094303,GB 3559094304,3559094319,BE 3559094320,3559095455,GB 3559095456,3559095456,BE -3559095457,3559096063,GB -3559096064,3559096319,NL +3559095457,3559096319,GB 3559096320,3559104511,RO 3559104512,3559112703,RU 3559112704,3559120895,IT @@ -98440,7 +104459,11 @@ 3559153664,3559178239,GB 3559178240,3559186431,LB 3559186432,3559194623,RU -3559194624,3559202815,SE +3559194624,3559197439,SE +3559197440,3559197567,FI +3559197568,3559200255,SE +3559200256,3559200511,FI +3559200512,3559202815,SE 3559202816,3559211007,DE 3559211008,3559219199,SK 3559219200,3559227391,SE @@ -98453,11 +104476,7 @@ 3559276544,3559284735,GB 3559284736,3559292927,RU 3559292928,3559301119,JO -3559301120,3559303103,GB -3559303104,3559303167,A1 -3559303168,3559303679,GB -3559303680,3559303871,A1 -3559303872,3559306576,GB +3559301120,3559306576,GB 3559306577,3559306577,AT 3559306578,3559309311,GB 3559309312,3559317503,PL @@ -98483,7 +104502,9 @@ 3559448576,3559456767,ES 3559456768,3559473151,RU 3559473152,3559489535,CH -3559489536,3559491759,GB +3559489536,3559491247,GB +3559491248,3559491263,NL +3559491264,3559491759,GB 3559491760,3559491767,NL 3559491768,3559505919,GB 3559505920,3559514111,CH @@ -98546,20 +104567,21 @@ 3559940096,3559948287,DE 3559948288,3559956479,RU 3559956480,3559964671,IT -3559964672,3559981055,RU +3559964672,3559976959,RU +3559976960,3559981055,HU 3559981056,3559989247,EE 3559989248,3559997439,PL 3559997440,3560005631,KE 3560005632,3560013823,RU -3560013824,3560015871,GB -3560015872,3560016127,ES -3560016128,3560022751,GB +3560013824,3560022751,GB 3560022752,3560022767,ES 3560022768,3560023631,GB 3560023632,3560023639,ES 3560023640,3560023791,GB 3560023792,3560023799,ES -3560023800,3560030095,GB +3560023800,3560025904,GB +3560025905,3560025905,ES +3560025906,3560030095,GB 3560030096,3560030103,ES 3560030104,3560046591,GB 3560046592,3560054783,BG @@ -98639,7 +104661,6 @@ 3560669184,3560685567,CH 3560685568,3560693759,ES 3560693760,3560701951,PL -3560706048,3560710143,DE 3560710144,3560718335,CH 3560718336,3560726527,GM 3560726528,3560734719,DK @@ -98785,7 +104806,9 @@ 3561299968,3561308159,GB 3561308160,3561316351,PL 3561316352,3561324543,RU -3561324544,3561332735,IT +3561324544,3561325567,IT +3561325568,3561326591,CH +3561326592,3561332735,IT 3561332736,3561340927,AT 3561340928,3561357311,GB 3561357312,3561365503,DK @@ -98804,9 +104827,7 @@ 3561472000,3561480191,DE 3561480192,3561488383,GB 3561488384,3561496575,OM -3561496576,3561496831,GB -3561496832,3561497087,NL -3561497088,3561502719,GB +3561496576,3561502719,GB 3561502720,3561503743,NL 3561503744,3561504767,GB 3561504768,3561512959,DE @@ -98825,17 +104846,19 @@ 3561604352,3561604607,FR 3561604608,3561607391,GB 3561607392,3561607423,FR -3561607424,3561607935,GB -3561607936,3561608191,FR -3561608192,3561609215,GB -3561609216,3561609727,FR -3561609728,3561616383,GB -3561616384,3561616895,FR -3561616896,3561618943,GB -3561618944,3561619455,ES -3561619456,3561641450,GB -3561641451,3561641451,FR -3561641452,3561652223,GB +3561607424,3561607723,GB +3561607724,3561607724,FR +3561607725,3561609215,GB +3561609216,3561609471,FR +3561609472,3561610495,GB +3561610496,3561610751,FR +3561610752,3561612543,GB +3561612544,3561612799,FR +3561612800,3561615871,GB +3561615872,3561616127,FR +3561616128,3561616639,GB +3561616640,3561616895,FR +3561616896,3561652223,GB 3561652224,3561668607,CH 3561668608,3561684991,RU 3561684992,3561693183,BG @@ -98851,9 +104874,7 @@ 3561775104,3561783295,IL 3561783296,3561799679,RU 3561799680,3561807871,DE -3561807872,3561815039,BE -3561815040,3561815295,LU -3561815296,3561816063,BE +3561807872,3561816063,BE 3561816064,3561824255,VA 3561824256,3561832447,LI 3561832448,3561840639,IT @@ -98867,9 +104888,9 @@ 3561897984,3561906175,GB 3561906176,3561914367,DE 3561914368,3561922559,ES -3561922560,3561925023,GB -3561925024,3561925039,NL -3561925040,3561925343,GB +3561922560,3561924863,GB +3561924864,3561925119,NL +3561925120,3561925343,GB 3561925344,3561925375,NL 3561925376,3561929967,GB 3561929968,3561929983,NL @@ -98959,9 +104980,7 @@ 3562479616,3562487807,DE 3562487808,3562495999,GB 3562496000,3562504191,BE -3562504192,3562507071,DE -3562507072,3562507199,AT -3562507200,3562512383,DE +3562504192,3562512383,DE 3562512384,3562520575,UA 3562528768,3562536959,PL 3562536960,3562545151,AT @@ -99078,7 +105097,8 @@ 3563454464,3563462655,SA 3563462656,3563479039,IT 3563479040,3563487231,GB -3563487232,3563495423,RS +3563487232,3563491327,RS +3563491328,3563495423,BG 3563495424,3563503615,DE 3563503616,3563511807,GB 3563511808,3563519999,DE @@ -99155,7 +105175,9 @@ 3564129744,3564134399,IT 3564134400,3564142591,KG 3564142592,3564150783,DK -3564150784,3564158831,SE +3564150784,3564154943,SE +3564154944,3564154975,FI +3564154976,3564158831,SE 3564158832,3564158839,FI 3564158840,3564158975,SE 3564158976,3564175359,DE @@ -99181,16 +105203,15 @@ 3564396544,3564404735,RU 3564404736,3564412927,BG 3564412928,3564421119,IL -3564421120,3564428185,SA -3564428186,3564428186,A2 -3564428187,3564429311,SA +3564421120,3564429311,SA 3564429312,3564437503,KZ 3564437504,3564445695,LT 3564445696,3564453887,BG 3564453888,3564462079,DE 3564462080,3564470271,CH 3564470272,3564478463,IL -3564478464,3564486655,LU +3564478464,3564478719,AE +3564478720,3564486655,LU 3564486656,3564494847,CH 3564494848,3564503039,EU 3564503040,3564511231,JO @@ -99228,8 +105249,8 @@ 3564716032,3564724223,IT 3564724224,3564732415,NL 3564732416,3564733183,GB -3564733184,3564733215,DE -3564733216,3564734207,GB +3564733184,3564733439,DE +3564733440,3564734207,GB 3564734208,3564734457,EU 3564734458,3564734458,DE 3564734459,3564734463,EU @@ -99239,27 +105260,23 @@ 3564734744,3564734751,DE 3564734752,3564736535,GB 3564736536,3564736543,DE -3564736544,3564739345,GB +3564736544,3564738815,GB +3564738816,3564739071,DE +3564739072,3564739345,GB 3564739346,3564739346,DE 3564739347,3564739367,GB 3564739368,3564739375,DE -3564739376,3564740607,GB +3564739376,3564740095,GB +3564740096,3564740351,DE +3564740352,3564740607,GB 3564740608,3564748799,FR 3564748800,3564756991,GB 3564756992,3564765183,ES 3564765184,3564773375,RU 3564773376,3564781567,DE -3564781568,3564782079,LT -3564782080,3564782335,US -3564782336,3564786175,LT -3564786176,3564786431,US -3564786432,3564786687,LT -3564786688,3564786943,US -3564786944,3564787199,LT -3564787200,3564787455,US +3564781568,3564787455,LT 3564787456,3564787583,NL -3564787584,3564787711,US -3564787712,3564789759,LT +3564787584,3564789759,LT 3564789760,3564797951,ES 3564797952,3564806143,DE 3564806144,3564814335,BG @@ -99296,14 +105313,15 @@ 3564889634,3564889634,NL 3564889635,3564891119,GB 3564891120,3564891135,NL -3564891136,3564892735,GB -3564892736,3564892751,NL -3564892752,3564895231,GB +3564891136,3564892671,GB +3564892672,3564892927,NL +3564892928,3564895231,GB 3564895232,3564895743,NL 3564895744,3564896255,GB 3564896256,3564904447,RU 3564904448,3564912639,DE -3564912640,3564920831,NL +3564912640,3564918783,NL +3564918784,3564920831,IT 3564920832,3564922111,DE 3564922112,3564929023,US 3564929024,3564937215,AT @@ -99362,7 +105380,13 @@ 3565682688,3565684995,NL 3565684996,3565684996,EU 3565684997,3565748223,NL -3565748224,3565752839,GB +3565748224,3565752319,GB +3565752320,3565752447,EU +3565752448,3565752479,GB +3565752480,3565752527,EU +3565752528,3565752543,GB +3565752544,3565752575,EU +3565752576,3565752839,GB 3565752840,3565752855,EU 3565752856,3565752879,GB 3565752880,3565752887,EU @@ -99406,37 +105430,11 @@ 3565755848,3565755855,EU 3565755856,3565755871,GB 3565755872,3565755879,EU -3565755880,3565755919,GB -3565755920,3565755927,EU -3565755928,3565755935,GB -3565755936,3565755943,EU -3565755944,3565755959,GB -3565755960,3565755967,EU -3565755968,3565755999,GB -3565756000,3565756007,EU -3565756008,3565756063,GB -3565756064,3565756071,EU -3565756072,3565756087,GB -3565756088,3565756095,EU -3565756096,3565756119,GB -3565756120,3565756135,EU -3565756136,3565756159,GB -3565756160,3565756287,EU -3565756288,3565760783,GB -3565760784,3565760791,EU -3565760792,3565760799,GB -3565760800,3565760807,EU -3565760808,3565760823,GB -3565760824,3565760831,EU -3565760832,3565760855,GB -3565760856,3565760863,EU -3565760864,3565760935,GB -3565760936,3565760943,EU -3565760944,3565760967,GB -3565760968,3565760975,EU -3565760976,3565761007,GB -3565761008,3565761015,EU -3565761016,3565761279,GB +3565755880,3565755903,GB +3565755904,3565756151,EU +3565756152,3565756159,GB +3565756160,3565756415,EU +3565756416,3565761279,GB 3565761280,3565761343,EU 3565761344,3565761535,GB 3565761536,3565761543,EU @@ -99493,7 +105491,15 @@ 3565767352,3565767359,EU 3565767360,3565767399,GB 3565767400,3565767407,EU -3565767408,3565767999,GB +3565767408,3565767439,GB +3565767440,3565767455,EU +3565767456,3565767487,GB +3565767488,3565767503,EU +3565767504,3565767599,GB +3565767600,3565767615,EU +3565767616,3565767631,GB +3565767632,3565767679,EU +3565767680,3565767999,GB 3565768000,3565768207,EU 3565768208,3565768223,GB 3565768224,3565768239,EU @@ -99667,7 +105673,9 @@ 3567173632,3567239167,GB 3567239168,3567241215,NL 3567241216,3567241471,EU -3567241472,3567255551,NL +3567241472,3567246591,NL +3567246592,3567246847,GB +3567246848,3567255551,NL 3567255552,3567321087,PL 3567321088,3567353855,GB 3567353856,3567386623,CH @@ -99675,13 +105683,15 @@ 3567388352,3567388383,DE 3567388384,3567388543,GB 3567388544,3567388607,DE -3567388608,3567389695,GB -3567389696,3567390975,DE +3567388608,3567388927,GB +3567388928,3567389183,DE +3567389184,3567389439,GB +3567389440,3567390975,DE 3567390976,3567391231,GB 3567391232,3567391487,DE -3567391488,3567399167,GB -3567399168,3567399423,DE -3567399424,3567403007,GB +3567391488,3567394815,GB +3567394816,3567395071,IE +3567395072,3567403007,GB 3567403008,3567419391,IT 3567419392,3567427583,SA 3567427584,3567435775,SE @@ -99697,9 +105707,7 @@ 3567459936,3567459943,ES 3567459944,3567465983,GB 3567465984,3567466239,ES -3567466240,3567490559,GB -3567490560,3567490815,ES -3567490816,3567495679,GB +3567466240,3567495679,GB 3567495680,3567495935,ES 3567495936,3567499007,GB 3567499008,3567499135,ES @@ -99731,10 +105739,10 @@ 3567586816,3567587327,EU 3567587328,3567591423,GB 3567591424,3567599615,IT -3567599616,3567615999,NL -3567616000,3567616525,A2 -3567616526,3567616526,KE -3567616527,3567616767,A2 +3567599616,3567603199,NL +3567603200,3567603455,DK +3567603456,3567615999,NL +3567616000,3567616767,A2 3567616768,3567617023,US 3567617024,3567618047,A2 3567618048,3567619071,IN @@ -99742,9 +105750,7 @@ 3567619584,3567619839,NG 3567619840,3567620095,A2 3567620096,3567620351,IN -3567620352,3567626239,A2 -3567626240,3567626751,TZ -3567626752,3567627263,A2 +3567620352,3567627263,A2 3567627264,3567629311,LU 3567629312,3567630335,A2 3567630336,3567634431,LU @@ -99812,9 +105818,7 @@ 3569075712,3569090559,GB 3569090560,3569123327,RU 3569123328,3569156095,GB -3569156096,3569156351,NL -3569156352,3569156607,EU -3569156608,3569157379,NL +3569156096,3569157379,NL 3569157380,3569157380,EU 3569157381,3569165311,NL 3569165312,3569165567,EU @@ -99857,8 +105861,8 @@ 3570663424,3570728959,GB 3570728960,3570729983,FI 3570729984,3570731007,SE -3570731008,3570794751,FI -3570794752,3570860031,SE +3570731008,3570794495,FI +3570794496,3570860031,SE 3570860032,3570892799,CH 3570892800,3570925567,SA 3570925568,3570991103,IT @@ -99881,9 +105885,7 @@ 3571515392,3571548159,GB 3571548160,3571580927,ES 3571580928,3571646463,FI -3571646464,3571655560,DE -3571655561,3571655561,RO -3571655562,3571688383,DE +3571646464,3571688383,DE 3571688384,3571689215,ES 3571689216,3571699711,DE 3571699712,3571700735,GB @@ -99917,9 +105919,7 @@ 3572760576,3572826111,PL 3572826112,3572891647,IT 3572891648,3572957183,FI -3572957184,3573003837,SE -3573003838,3573003838,NO -3573003839,3573022719,SE +3572957184,3573022719,SE 3573022720,3573055487,RU 3573055488,3573088255,GB 3573088256,3573101055,CH @@ -99966,7 +105966,9 @@ 3574136832,3574169599,DE 3574169600,3574174839,GB 3574174840,3574174847,ES -3574174848,3574186799,GB +3574174848,3574182904,GB +3574182905,3574182905,ES +3574182906,3574186799,GB 3574186800,3574186815,ES 3574186816,3574187007,GB 3574187008,3574188031,ES @@ -99994,15 +105996,13 @@ 3574594560,3574595583,GB 3574595584,3574596607,FR 3574596608,3574596863,GP -3574596864,3574597119,MQ -3574597120,3574597631,FR -3574597632,3574597887,GP -3574597888,3574598911,FR -3574598912,3574599167,MQ -3574599168,3574599423,FR +3574596864,3574598143,FR +3574598144,3574598399,MQ +3574598400,3574598655,FR +3574598656,3574598911,MQ +3574598912,3574599423,FR 3574599424,3574599679,MQ -3574599680,3574599935,GP -3574599936,3574601215,FR +3574599680,3574601215,FR 3574601216,3574601471,GP 3574601472,3574603775,FR 3574603776,3574611967,BG @@ -100040,18 +106040,11 @@ 3575562240,3575578623,DE 3575578624,3575581439,BE 3575581440,3575581695,EU -3575581696,3575588863,BE -3575588864,3575589119,A2 -3575589120,3575589375,BE -3575589376,3575589631,A2 +3575581696,3575589631,BE 3575589632,3575589887,CY -3575589888,3575590655,BE -3575590656,3575590911,GB -3575590912,3575624703,BE +3575589888,3575624703,BE 3575624704,3575624959,EU -3575624960,3575626751,BE -3575626752,3575627007,A2 -3575627008,3575631103,BE +3575624960,3575631103,BE 3575631104,3575631359,EU 3575631360,3575638181,BE 3575638182,3575638182,EU @@ -100303,9 +106296,7 @@ 3576084864,3576084927,GB 3576084928,3576085183,EU 3576085184,3576085215,GB -3576085216,3576085503,EU -3576085504,3576085759,GB -3576085760,3576086015,EU +3576085216,3576086015,EU 3576086016,3576086143,GB 3576086144,3576086367,EU 3576086368,3576086399,GB @@ -100341,12 +106332,8 @@ 3576091408,3576091423,GB 3576091424,3576091455,EU 3576091456,3576091479,GB -3576091480,3576091967,EU -3576091968,3576091983,GB -3576091984,3576091999,EU -3576092000,3576092031,GB -3576092032,3576092127,EU -3576092128,3576092159,GB +3576091480,3576091903,EU +3576091904,3576092159,GB 3576092160,3576092863,EU 3576092864,3576092895,GB 3576092896,3576093063,EU @@ -100360,7 +106347,9 @@ 3576100864,3576101375,EU 3576101376,3576110939,GB 3576110940,3576110943,NL -3576110944,3576134653,GB +3576110944,3576116127,GB +3576116128,3576116135,DE +3576116136,3576134653,GB 3576134654,3576134654,CH 3576134655,3576135679,GB 3576135680,3576168447,DE @@ -100370,7 +106359,9 @@ 3576241992,3576241999,FR 3576242000,3576242383,GB 3576242384,3576242391,FR -3576242392,3576251711,GB +3576242392,3576250111,GB +3576250112,3576250367,FR +3576250368,3576251711,GB 3576251712,3576251775,FR 3576251776,3576252415,GB 3576252416,3576252671,FR @@ -100382,13 +106373,11 @@ 3576254696,3576254703,FR 3576254704,3576254775,GB 3576254776,3576254783,FR -3576254784,3576258047,GB -3576258048,3576258303,FR -3576258304,3576260607,GB +3576254784,3576260607,GB 3576260608,3576260623,FR 3576260624,3576260863,GB -3576260864,3576260871,FR -3576260872,3576263919,GB +3576260864,3576261119,FR +3576261120,3576263919,GB 3576263920,3576263935,FR 3576263936,3576264255,GB 3576264256,3576264263,FR @@ -100398,7 +106387,9 @@ 3576264376,3576264383,FR 3576264384,3576264679,GB 3576264680,3576264687,FR -3576264688,3576266751,GB +3576264688,3576264959,GB +3576264960,3576265215,FR +3576265216,3576266751,GB 3576266752,3576299519,FR 3576299520,3576365055,AE 3576365056,3576430591,TR @@ -100413,37 +106404,39 @@ 3576823808,3576889343,SE 3576889344,3576954879,NL 3576954880,3576987647,NO -3576987648,3577020415,GB +3576987648,3576999935,GB +3576999936,3577000191,NL +3577000192,3577020415,GB 3577020416,3577085951,NL 3577085952,3577151487,DE -3577151488,3577151999,RE -3577152000,3577152255,FR -3577152256,3577152511,RE -3577152512,3577153023,FR +3577151488,3577151743,RE +3577151744,3577153023,FR 3577153024,3577153279,RE -3577153280,3577153791,FR -3577153792,3577154303,RE -3577154304,3577154815,FR -3577154816,3577155327,RE -3577155328,3577155839,FR -3577155840,3577156095,RE -3577156096,3577156607,FR -3577156608,3577156863,RE -3577156864,3577157375,FR -3577157376,3577157887,RE -3577157888,3577158655,FR -3577158656,3577159167,RE -3577159168,3577160959,FR -3577160960,3577161215,YT -3577161216,3577163775,FR -3577163776,3577164031,RE -3577164032,3577164073,FR +3577153280,3577154303,FR +3577154304,3577154815,RE +3577154816,3577155327,FR +3577155328,3577155839,RE +3577155840,3577156095,FR +3577156096,3577156607,RE +3577156608,3577157375,FR +3577157376,3577157631,RE +3577157632,3577157887,FR +3577157888,3577158143,RE +3577158144,3577158399,FR +3577158400,3577158655,RE +3577158656,3577159423,FR +3577159424,3577159679,RE +3577159680,3577159935,FR +3577159936,3577160447,RE +3577160448,3577161983,FR +3577161984,3577162751,RE +3577162752,3577163007,FR +3577163008,3577163263,RE +3577163264,3577164073,FR 3577164074,3577164074,RE -3577164075,3577165567,FR -3577165568,3577166079,RE -3577166080,3577166591,FR -3577166592,3577167103,RE -3577167104,3577167871,FR +3577164075,3577166079,FR +3577166080,3577166335,RE +3577166336,3577167871,FR 3577167872,3577184255,ET 3577184256,3577217023,CH 3577217024,3577282559,FR @@ -100465,7 +106458,9 @@ 3577641200,3577641215,FR 3577641216,3577641471,EU 3577641472,3577641983,FR -3577641984,3577650047,EU +3577641984,3577642495,EU +3577642496,3577642751,FR +3577642752,3577650047,EU 3577650048,3577650063,NL 3577650064,3577663487,EU 3577663488,3577664511,SE @@ -100509,11 +106504,15 @@ 3579019264,3579052031,DK 3579052032,3579117567,NL 3579117568,3579183103,RU -3579183104,3579193759,GB +3579183104,3579193607,GB +3579193608,3579193615,NL +3579193616,3579193759,GB 3579193760,3579193775,NL 3579193776,3579197311,GB 3579197312,3579197439,US -3579197440,3579248639,GB +3579197440,3579244831,GB +3579244832,3579244879,AT +3579244880,3579248639,GB 3579248640,3579346943,RU 3579346944,3579362055,SE 3579362056,3579362063,NO @@ -100541,9 +106540,7 @@ 3580116992,3580131327,SE 3580131328,3580133375,LV 3580133376,3580135423,SE -3580135424,3580135531,EE -3580135532,3580135532,SE -3580135533,3580135935,EE +3580135424,3580135935,EE 3580135936,3580136447,SE 3580136448,3580138495,HR 3580138496,3580150783,SE @@ -100599,9 +106596,7 @@ 3580340224,3580344319,LT 3580344320,3580354559,SE 3580354560,3580362751,LT -3580362752,3580473871,GB -3580473872,3580473887,IE -3580473888,3580624895,GB +3580362752,3580624895,GB 3580624896,3580626943,RU 3580626944,3580628991,PL 3580628992,3580631039,RU @@ -100612,10 +106607,12 @@ 3580641280,3580643327,FR 3580643328,3580645375,UA 3580645376,3580647423,PL -3580647424,3580647935,GB -3580647936,3580648703,DE -3580648704,3580648959,GB -3580648960,3580649471,DE +3580647424,3580647679,GB +3580647680,3580647935,DE +3580647936,3580648027,GB +3580648028,3580648028,DE +3580648029,3580648447,GB +3580648448,3580649471,DE 3580649472,3580651519,SE 3580651520,3580653567,NL 3580653568,3580655615,PL @@ -100636,7 +106633,6 @@ 3580719104,3580723199,NL 3580723200,3580727295,UA 3580727296,3580731391,RU -3580735488,3580739583,RO 3580739584,3580743679,RU 3580743680,3580747775,RO 3580747776,3580751871,UA @@ -100661,14 +106657,14 @@ 3581214720,3581231103,NL 3581231104,3581239295,EU 3581239296,3581241343,NL -3581241344,3581242623,EU -3581242624,3581245439,FR -3581245440,3581255679,EU +3581241344,3581255679,EU 3581255680,3581258751,FR 3581258752,3581280255,EU 3581280256,3581411327,BE 3581411328,3581673471,GB -3581673472,3581935615,NL +3581673472,3581922047,NL +3581922048,3581922303,GB +3581922304,3581935615,NL 3581935616,3581943807,RU 3581943808,3581951999,FR 3581952000,3581960191,TR @@ -100689,9 +106685,7 @@ 3582066688,3582074879,UA 3582074880,3582077439,GB 3582077440,3582077471,DE -3582077472,3582078090,GB -3582078091,3582078091,CH -3582078092,3582083071,GB +3582077472,3582083071,GB 3582083072,3582091263,BG 3582091264,3582099455,QA 3582099456,3582107647,GB @@ -100719,9 +106713,7 @@ 3582197760,3582205951,DK 3582205952,3582214143,AE 3582214144,3582222335,RU -3582222336,3582224375,SE -3582224376,3582224379,FI -3582224380,3582225719,SE +3582222336,3582225719,SE 3582225720,3582225727,FI 3582225728,3582227391,SE 3582227392,3582227455,FI @@ -100730,7 +106722,9 @@ 3582238720,3582251319,NL 3582251320,3582251327,FI 3582251328,3582255103,NL -3582255104,3582263039,KW +3582255104,3582258687,KW +3582258688,3582258943,US +3582258944,3582263039,KW 3582263040,3582263295,A2 3582263296,3582271487,ME 3582271488,3582279679,NL @@ -100738,9 +106732,7 @@ 3582287872,3582296063,DE 3582296064,3582304255,GB 3582304256,3582312447,UA -3582312448,3582313855,JE -3582313856,3582313871,GB -3582313872,3582320639,JE +3582312448,3582320639,JE 3582320640,3582328831,CH 3582328832,3582337023,HU 3582337024,3582345215,PT @@ -100828,9 +106820,9 @@ 3583000576,3583008767,IT 3583008768,3583016959,TR 3583016960,3583025151,CH -3583025152,3583031807,A2 +3583025152,3583031807,IT 3583031808,3583032063,GR -3583032064,3583033343,A2 +3583032064,3583033343,IT 3583033344,3583041535,FR 3583041536,3583049727,NL 3583049728,3583066111,RU @@ -100848,11 +106840,7 @@ 3583157504,3583157759,IE 3583157760,3583160319,GB 3583160320,3583161343,DE -3583161344,3583162623,GB -3583162624,3583162751,ZA -3583162752,3583162815,GB -3583162816,3583162879,ZA -3583162880,3583164415,GB +3583161344,3583164415,GB 3583164416,3583172607,PT 3583172608,3583188991,DE 3583188992,3583197183,RU @@ -100874,28 +106862,29 @@ 3583328256,3583336447,DE 3583336448,3583337727,ME 3583337728,3583337983,AL -3583337984,3583344639,ME +3583337984,3583338143,ME +3583338144,3583338175,RS +3583338176,3583344639,ME 3583344640,3583352831,BG 3583352832,3583361023,CY 3583361024,3583369215,IT 3583369216,3583377407,ES 3583377408,3583385599,AT -3583385600,3583393791,DK +3583385600,3583390207,DK +3583390208,3583390463,LV +3583390464,3583393791,DK 3583393792,3583401983,RU 3583401984,3583410175,KE 3583410176,3583418367,SE 3583418368,3583426559,TN -3583426560,3583434751,CI +3583426560,3583428607,CV +3583428608,3583430655,CI +3583430656,3583432703,ZA +3583432704,3583434751,CI 3583434752,3583442943,AT -3583442944,3583445247,RU -3583445248,3583445503,UA -3583445504,3583446783,RU -3583446784,3583447039,UA -3583447040,3583451135,RU +3583442944,3583451135,RU 3583451136,3583459327,IL -3583459328,3583467111,CZ -3583467112,3583467119,PL -3583467120,3583467519,CZ +3583459328,3583467519,CZ 3583467520,3583475711,ES 3583475712,3583483903,NO 3583483904,3583492095,FR @@ -100922,15 +106911,14 @@ 3583696896,3583705087,NL 3583705088,3583713279,UA 3583713280,3583721471,CZ -3583721472,3583727871,DE -3583727872,3583728127,GB -3583728128,3583729663,DE +3583721472,3583729663,DE 3583729664,3583737855,TR 3583737856,3583740927,EU 3583740928,3583741183,GB 3583741184,3583742975,EU 3583742976,3583743487,PL -3583743488,3583743743,GB +3583743488,3583743615,EU +3583743616,3583743743,GB 3583743744,3583743999,IE 3583744000,3583744127,EU 3583744128,3583744255,PL @@ -100975,8 +106963,7 @@ 3583950848,3583959039,PL 3583959040,3583967231,NO 3583967232,3583975423,NL -3583975424,3583983103,LT -3583983104,3583983231,US +3583975424,3583983231,LT 3583983232,3583983359,BR 3583983360,3583983615,LT 3583983616,3583999999,RU @@ -101045,11 +107032,9 @@ 3584499712,3584507903,RU 3584507904,3584509231,GB 3584509232,3584509239,AW -3584509240,3584509695,GB -3584509696,3584509951,JE -3584509952,3584513535,GB -3584513536,3584513791,JE -3584513792,3584516095,GB +3584509240,3584509855,GB +3584509856,3584509871,AW +3584509872,3584516095,GB 3584516096,3584524287,NO 3584524288,3584532479,IS 3584532480,3584540671,DE @@ -101070,9 +107055,7 @@ 3584622592,3584630783,FI 3584630784,3584638975,BG 3584638976,3584647167,UA -3584647168,3584648191,LU -3584648192,3584648447,IT -3584648448,3584655359,LU +3584647168,3584655359,LU 3584655360,3584663551,CY 3584663552,3584671743,FR 3584671744,3584688127,NL @@ -101099,6 +107082,7 @@ 3584827392,3584835583,ES 3584835584,3584843775,AZ 3584843776,3584851967,DE +3584851968,3584860159,ZA 3584860160,3584868351,PL 3584868352,3584876543,NO 3584876544,3584884735,SI @@ -101109,7 +107093,9 @@ 3584925696,3584933887,CH 3584933888,3584937983,NO 3584937984,3584942079,NL -3584942080,3584950271,DK +3584942080,3584943103,DK +3584943104,3584943359,SE +3584943360,3584950271,DK 3584950272,3584958463,UA 3584958464,3584966655,DE 3584966656,3584971263,DK @@ -101123,9 +107109,7 @@ 3585015808,3585023999,IT 3585024000,3585032191,CZ 3585032192,3585048575,LV -3585048576,3585050879,GB -3585050880,3585051391,A2 -3585051392,3585056767,GB +3585048576,3585056767,GB 3585056768,3585064959,LB 3585064960,3585081343,GB 3585081344,3585114111,IR @@ -101197,19 +107181,35 @@ 3585597440,3585605631,RU 3585605632,3585613823,PL 3585613824,3585622015,EE -3585630208,3585638399,IL +3585630208,3585632255,IL +3585632256,3585632511,GB +3585632512,3585632639,NL +3585632640,3585632767,IL +3585632768,3585633535,GB +3585633536,3585634047,IT +3585634048,3585634303,IL +3585634304,3585634559,IT +3585634560,3585634687,IL +3585634688,3585634815,NL +3585634816,3585635071,IT +3585635072,3585635199,NL +3585635200,3585635455,IL +3585635456,3585635711,NL +3585635712,3585635967,IL +3585635968,3585636095,NL +3585636096,3585637375,IL +3585637376,3585637503,NL +3585637504,3585638399,IL 3585638400,3585646591,RU 3585646592,3585654783,SA 3585654784,3585662975,NO 3585662976,3585671167,BY -3585671168,3585672191,SE -3585672192,3585672447,DK -3585672448,3585679359,SE +3585671168,3585675306,SE +3585675307,3585675307,DK +3585675308,3585679359,SE 3585679360,3585687551,FI 3585687552,3585695743,DE -3585695744,3585702527,A2 -3585702528,3585702655,TZ -3585702656,3585703935,A2 +3585695744,3585703935,A2 3585703936,3585712127,DE 3585712128,3585720319,AT 3585720320,3585728511,GB @@ -101243,7 +107243,9 @@ 3585900544,3585906687,NO 3585906688,3585907711,CZ 3585907712,3585908735,NO -3585908736,3585916671,GP +3585908736,3585910015,GP +3585910016,3585910271,MQ +3585910272,3585916671,GP 3585916672,3585916927,MQ 3585916928,3585925119,IT 3585925120,3585933311,CH @@ -101252,13 +107254,19 @@ 3585949696,3585957887,KW 3585957888,3585966079,SE 3585966080,3585974271,CH -3585974272,3585976831,BE -3585976832,3585977087,GB -3585977088,3585982463,BE +3585974272,3585982463,BE 3585982464,3585998847,RU 3585998848,3586007039,ES 3586007040,3586015231,LT -3586015232,3586023423,FR +3586015232,3586022687,FR +3586022688,3586022688,GB +3586022689,3586022689,TN +3586022690,3586022690,SE +3586022691,3586022691,BE +3586022692,3586022692,DK +3586022693,3586022693,DE +3586022694,3586022694,IT +3586022695,3586023423,FR 3586023424,3586031615,IS 3586031616,3586039807,IE 3586039808,3586047999,GB @@ -101274,8 +107282,8 @@ 3586162688,3586179071,FI 3586179072,3586195455,ES 3586195456,3586203647,RU -3586203648,3586204415,KE -3586204416,3586204671,ZM +3586203648,3586204159,KE +3586204160,3586204671,ZM 3586204672,3586205695,KE 3586205696,3586207743,BW 3586207744,3586207999,ZA @@ -101302,16 +107310,14 @@ 3586424832,3586441215,CH 3586441216,3586457599,DE 3586457600,3586473983,NL -3586473984,3586476287,HU -3586476288,3586476303,SK -3586476304,3586490367,HU +3586473984,3586490367,HU 3586490368,3586506751,LT 3586506752,3586523135,NL 3586523136,3586544267,DE 3586544268,3586544271,DK 3586544272,3586544383,DE -3586544384,3586544511,DK -3586544512,3586547711,DE +3586544384,3586544639,DK +3586544640,3586547711,DE 3586547712,3586547967,NL 3586547968,3586555903,DE 3586555904,3586572287,IT @@ -101322,7 +107328,11 @@ 3586621440,3586621695,EU 3586621696,3586625535,IE 3586625536,3586629631,GB -3586629632,3586637823,IE +3586629632,3586634047,IE +3586634048,3586634079,NL +3586634080,3586634239,IE +3586634240,3586634495,NL +3586634496,3586637823,IE 3586637824,3586654207,PL 3586654208,3586662399,GE 3586662400,3586670591,UA @@ -101338,15 +107348,19 @@ 3586677648,3586677655,US 3586677656,3586679599,FR 3586679600,3586679615,IT -3586679616,3586680319,FR -3586680320,3586680511,ES +3586679616,3586680511,FR 3586680512,3586680519,GB -3586680520,3586680575,ES -3586680576,3586681615,FR +3586680520,3586681471,FR +3586681472,3586681487,GB +3586681488,3586681527,FR +3586681528,3586681535,GB +3586681536,3586681615,FR 3586681616,3586681631,CZ 3586681632,3586682239,FR 3586682240,3586682367,US -3586682368,3586682879,FR +3586682368,3586682415,FR +3586682416,3586682423,DE +3586682424,3586682879,FR 3586682880,3586686975,US 3586686976,3586703359,SE 3586703360,3586719743,CH @@ -101364,15 +107378,11 @@ 3586911008,3586911039,BE 3586911040,3586911103,DE 3586911104,3586911167,NL -3586911168,3586912721,DE -3586912722,3586912722,FR -3586912723,3586916351,DE +3586911168,3586916351,DE 3586916352,3586924543,IT -3586924544,3586925823,AX -3586925824,3586926079,FI -3586926080,3586929663,AX -3586929664,3586930687,FI -3586930688,3586932735,AX +3586924544,3586929663,AX +3586929664,3586931711,FI +3586931712,3586932735,AX 3586932736,3586949119,LB 3586949120,3586965503,SE 3586965504,3586981887,NL @@ -101402,34 +107412,32 @@ 3587194880,3587211263,GB 3587211264,3587219455,AT 3587219456,3587227647,RU -3587227648,3587231231,GB +3587227648,3587230719,GB +3587230720,3587230975,NL +3587230976,3587231231,GB 3587231232,3587231263,NL 3587231264,3587233087,GB 3587233088,3587233095,NL 3587233096,3587234191,GB 3587234192,3587234207,NL -3587234208,3587237631,GB -3587237632,3587237887,NL +3587234208,3587236095,GB +3587236096,3587236351,NL +3587236352,3587237375,GB +3587237376,3587237887,NL 3587237888,3587238487,GB 3587238488,3587238495,NL 3587238496,3587239487,GB 3587239488,3587239495,NL 3587239496,3587239583,GB 3587239584,3587239599,NL -3587239600,3587239711,GB -3587239712,3587239727,NL -3587239728,3587239791,GB -3587239792,3587239799,NL -3587239800,3587242671,GB -3587242672,3587242679,DE -3587242680,3587244031,GB +3587239600,3587239679,GB +3587239680,3587240191,NL +3587240192,3587242495,GB +3587242496,3587242751,NL +3587242752,3587244031,GB 3587244032,3587260415,IT 3587260416,3587284991,DE -3587284992,3587285216,EU -3587285217,3587285217,US -3587285218,3587285523,EU -3587285524,3587285524,A2 -3587285525,3587291135,EU +3587284992,3587291135,EU 3587291136,3587292159,FR 3587292160,3587293183,EU 3587293184,3587309567,IT @@ -101448,9 +107456,7 @@ 3587422720,3587423743,NL 3587423744,3587424255,BE 3587424256,3587440639,DE -3587440640,3587444900,SE -3587444901,3587444916,FI -3587444917,3587445759,SE +3587440640,3587445759,SE 3587445760,3587446015,FI 3587446016,3587446071,SE 3587446072,3587446079,FI @@ -101509,8 +107515,8 @@ 3588128768,3588145151,HU 3588145152,3588153343,PL 3588153344,3588161535,RU -3588161536,3588173311,FR -3588173312,3588173567,RE +3588161536,3588173055,FR +3588173056,3588173567,RE 3588173568,3588227071,FR 3588227072,3588292607,BE 3588292608,3588308991,AT @@ -101536,7 +107542,9 @@ 3588538368,3588554751,GB 3588554752,3588571135,AT 3588571136,3588587519,GB -3588587520,3588590591,ES +3588587520,3588588567,ES +3588588568,3588588575,IT +3588588576,3588590591,ES 3588590592,3588590847,FR 3588590848,3588595199,ES 3588595200,3588595455,FR @@ -101575,9 +107583,8 @@ 3588997120,3589013503,AT 3589013504,3589021695,ES 3589021696,3589029887,SA -3589029888,3589030119,GB -3589030120,3589030127,NL -3589030128,3589031055,GB +3589029888,3589030143,NL +3589030144,3589031055,GB 3589031056,3589031056,NL 3589031057,3589034239,GB 3589034240,3589034495,EU @@ -101603,13 +107610,15 @@ 3589341184,3589373951,PL 3589373952,3589390335,DE 3589390336,3589423103,RU -3589423104,3589430591,GB +3589423104,3589426175,GB +3589426176,3589426431,IT +3589426432,3589430591,GB 3589430592,3589430655,ES -3589430656,3589431039,GB -3589431040,3589431295,ES -3589431296,3589432831,GB +3589430656,3589432831,GB 3589432832,3589433087,CH -3589433088,3589435759,GB +3589433088,3589433855,GB +3589433856,3589434111,IE +3589434112,3589435759,GB 3589435760,3589435763,ES 3589435764,3589439487,GB 3589439488,3589455871,SE @@ -101627,11 +107636,11 @@ 3589580544,3589581055,NL 3589581056,3589582975,GB 3589582976,3589583103,NL -3589583104,3589583871,GB -3589583872,3589584127,NL -3589584128,3589586943,GB +3589583104,3589586943,GB 3589586944,3589587199,DE -3589587200,3589599231,RS +3589587200,3589587455,NL +3589587456,3589587967,CH +3589587968,3589599231,RS 3589599232,3589601279,SE 3589601280,3589603327,RS 3589603328,3589668863,FR @@ -101641,7 +107650,8 @@ 3589718016,3589722023,BE 3589722024,3589722031,FR 3589722032,3589734399,BE -3589734400,3589739519,EG +3589734400,3589738495,ZA +3589738496,3589739519,EG 3589739520,3589742591,ZA 3589742592,3589746175,NL 3589746176,3589746687,US @@ -101693,9 +107703,15 @@ 3590234112,3590242303,GB 3590242304,3590244351,US 3590244352,3590244607,DE -3590244608,3590245311,FR +3590244608,3590245263,FR +3590245264,3590245271,GB +3590245272,3590245311,FR 3590245312,3590245439,US -3590245440,3590247167,FR +3590245440,3590247048,FR +3590247049,3590247049,IT +3590247050,3590247103,FR +3590247104,3590247119,GB +3590247120,3590247167,FR 3590247168,3590247231,US 3590247232,3590247295,FR 3590247296,3590247423,US @@ -101703,15 +107719,11 @@ 3590247488,3590247551,US 3590247552,3590247711,FR 3590247712,3590247743,A1 -3590247744,3590250495,FR -3590250496,3590250751,IE -3590250752,3590251647,FR +3590247744,3590247759,FR +3590247760,3590247763,IE +3590247764,3590251647,FR 3590251648,3590251775,NL -3590251776,3590252543,FR -3590252544,3590253055,LB -3590253056,3590254847,FR -3590254848,3590255103,GB -3590255104,3590255871,FR +3590251776,3590255871,FR 3590255872,3590255935,US 3590255936,3590256127,FR 3590256128,3590256383,ES @@ -101723,15 +107735,11 @@ 3590258688,3590291455,IT 3590291456,3590299647,EG 3590299648,3590307839,FI -3590307840,3590308607,A2 -3590308608,3590308863,US -3590308864,3590308951,A2 +3590307840,3590308951,A2 3590308952,3590308959,GH 3590308960,3590312935,A2 3590312936,3590312943,UG -3590312944,3590316282,A2 -3590316283,3590316283,US -3590316284,3590317951,A2 +3590312944,3590317951,A2 3590317952,3590318015,UA 3590318016,3590324223,A2 3590324224,3623890943,US @@ -101758,14 +107766,12 @@ 3624281088,3624281343,HT 3624281344,3624284671,US 3624284672,3624284927,CA -3624284928,3624286193,US -3624286194,3624286194,ZA -3624286195,3624287743,US +3624284928,3624287743,US 3624287744,3624287999,CA 3624288000,3624288255,US 3624288256,3624290303,IN 3624290304,3624292351,CA -3624292352,3624292607,MF +3624292352,3624292607,GP 3624292608,3624295423,US 3624295424,3624295679,CA 3624295680,3624295935,US @@ -101779,9 +107785,7 @@ 3624300032,3624300287,LY 3624300288,3624302335,US 3624302336,3624302591,CA -3624302592,3624302847,US -3624302848,3624303103,MY -3624303104,3624303871,US +3624302592,3624303871,US 3624303872,3624304127,CA 3624304128,3624321023,US 3624321024,3624325119,CA @@ -101789,9 +107793,7 @@ 3624357888,3624358143,KN 3624358144,3624359679,US 3624359680,3624360703,CW -3624360704,3624374447,US -3624374448,3624374455,ES -3624374456,3624376247,US +3624360704,3624376247,US 3624376248,3624376263,ES 3624376264,3624376287,US 3624376288,3624376295,GB @@ -101799,9 +107801,7 @@ 3624376336,3624376343,AU 3624376344,3624376351,US 3624376352,3624376359,PT -3624376360,3624376655,US -3624376656,3624376679,GB -3624376680,3624377863,US +3624376360,3624377863,US 3624377864,3624377871,GB 3624377872,3624377879,US 3624377880,3624377887,GB @@ -101812,26 +107812,25 @@ 3624394752,3624402943,US 3624402944,3624411135,JP 3624411136,3624435711,US -3624435712,3624452095,CA +3624435712,3624443903,CA +3624443904,3624443919,US +3624443920,3624452095,CA 3624452096,3624480767,US 3624480768,3624484863,CA 3624484864,3624529919,US -3624529920,3624532479,CA -3624532480,3624532735,US -3624532736,3624534015,CA +3624529920,3624534015,CA 3624534016,3624534271,PA -3624534272,3624536063,CA -3624536064,3624546559,US +3624534272,3624546559,US 3624546560,3624546815,A2 3624546816,3624547327,US -3624547328,3624547583,A2 -3624547584,3624547839,US -3624547840,3624548095,A2 +3624547328,3624548095,A2 3624548096,3624548351,US 3624548352,3624550143,A2 3624550144,3624587263,US 3624587264,3624591359,JM -3624591360,3624714239,US +3624591360,3624592383,US +3624592384,3624593919,CA +3624593920,3624714239,US 3624714240,3624722431,SG 3624722432,3624730623,US 3624730624,3624796159,CA @@ -101851,15 +107850,12 @@ 3625168896,3625172991,CA 3625172992,3625256959,US 3625256960,3625257983,CA -3625258496,3625258751,US -3625259008,3625261055,US +3625257984,3625261055,US 3625263104,3625287679,US 3625287680,3625295871,CA 3625295872,3625346047,US 3625346048,3625346303,AR -3625346304,3625377279,US -3625377280,3625377535,TH -3625377536,3625418751,US +3625346304,3625418751,US 3625418752,3625420031,CA 3625420032,3625420543,US 3625420544,3625422591,CA @@ -101871,15 +107867,11 @@ 3625574400,3625577983,A2 3625577984,3625631743,US 3625631744,3625639935,CA -3625639936,3625959423,US -3625959424,3625961471,GB -3625961472,3625961983,US +3625639936,3625961983,US 3625961984,3625962239,GB 3625962240,3626091519,US 3626091520,3626092031,AR -3626092032,3626222653,US -3626222654,3626222654,CA -3626222655,3626270719,US +3626092032,3626270719,US 3626270720,3626287103,CA 3626287104,3626332159,US 3626332160,3626336255,CA @@ -101909,7 +107901,11 @@ 3627532288,3627544575,CA 3627544576,3627659263,US 3627659264,3627663359,CA -3627663360,3627679743,US +3627663360,3627667561,US +3627667562,3627667562,CA +3627667563,3627667564,US +3627667565,3627667565,CA +3627667566,3627679743,US 3627679744,3627712511,CA 3627712512,3627753471,US 3627753472,3627753727,AR @@ -101931,7 +107927,9 @@ 3628161024,3628161279,CA 3628161280,3628179455,US 3628179456,3628187647,CA -3628187648,3628225387,US +3628187648,3628225097,US +3628225098,3628225098,AT +3628225099,3628225387,US 3628225388,3628225395,GB 3628225396,3628225779,US 3628225780,3628225783,GB @@ -101996,7 +107994,9 @@ 3628834816,3628843007,CA 3628843008,3628848639,US 3628848640,3628848895,EU -3628848896,3629187071,US +3628848896,3628850687,US +3628850688,3628850943,AU +3628850944,3629187071,US 3629187072,3629195263,CA 3629195264,3629199359,US 3629199360,3629201439,CA @@ -102007,9 +108007,11 @@ 3629201496,3629201499,US 3629201500,3629201503,CA 3629201504,3629201507,US -3629201508,3629201919,CA -3629201920,3629202431,US -3629202432,3629203199,CA +3629201508,3629201935,CA +3629201936,3629201939,US +3629201940,3629202103,CA +3629202104,3629202107,US +3629202108,3629203199,CA 3629203200,3629318143,US 3629318144,3629326335,CA 3629326336,3629539327,US @@ -102026,9 +108028,7 @@ 3629789952,3629790207,CA 3629790208,3629839103,US 3629839104,3629839359,CA -3629839360,3630039295,US -3630039296,3630039551,CA -3630039552,3630040063,US +3629839360,3630040063,US 3630040064,3630040319,CA 3630040320,3630040431,US 3630040432,3630040447,CA @@ -102036,10 +108036,8 @@ 3630040576,3630040831,CA 3630040832,3630041343,US 3630041344,3630041599,CA -3630041600,3630043135,US -3630043136,3630043391,CA -3630043392,3630044671,US -3630044672,3630046207,CA +3630041600,3630045439,US +3630045440,3630046207,CA 3630046208,3630046719,US 3630046720,3630047487,CA 3630047488,3630047999,US @@ -102075,83 +108073,54 @@ 3630063872,3630063935,US 3630063936,3630063951,CA 3630063952,3630066431,US -3630066432,3630067711,CA +3630066432,3630066687,CA +3630066688,3630066943,US +3630066944,3630067711,CA 3630067712,3630068991,US 3630068992,3630069247,CA 3630069248,3630069503,US 3630069504,3630069759,CA 3630069760,3630071295,US 3630071296,3630071551,CA -3630071552,3630072575,US -3630072576,3630073599,CA -3630073600,3630073855,US -3630073856,3630074111,CA -3630074112,3630074879,US +3630071552,3630072831,US +3630072832,3630073343,CA +3630073344,3630074879,US 3630074880,3630075135,CA -3630075136,3630076927,US -3630076928,3630077183,CA -3630077184,3630078463,US -3630078464,3630078719,CA -3630078720,3630081151,US -3630081152,3630081279,CA -3630081280,3630081535,US -3630081536,3630081791,CA -3630081792,3630082303,US +3630075136,3630082303,US 3630082304,3630082559,CA 3630082560,3630082815,US 3630082816,3630083071,CA -3630083072,3630083583,US -3630083584,3630083839,CA -3630083840,3630084607,US -3630084608,3630084863,CA -3630084864,3630085119,US -3630085120,3630085375,CA -3630085376,3630085631,US -3630085632,3630086143,CA -3630086144,3630086375,US -3630086376,3630086383,CA -3630086384,3630087039,US -3630087040,3630087935,CA +3630083072,3630085631,US +3630085632,3630085887,CA +3630085888,3630087679,US +3630087680,3630087935,CA 3630087936,3630088447,US 3630088448,3630088959,CA -3630088960,3630089471,US -3630089472,3630090239,CA -3630090240,3630091007,US -3630091008,3630092287,CA -3630092288,3630093567,US +3630088960,3630091519,US +3630091520,3630091775,CA +3630091776,3630093567,US 3630093568,3630093823,CA -3630093824,3630094591,US -3630094592,3630094847,CA -3630094848,3630096127,US -3630096128,3630096639,CA -3630096640,3630097151,US +3630093824,3630096127,US +3630096128,3630096383,CA +3630096384,3630097151,US 3630097152,3630097663,CA -3630097664,3630098175,KW -3630098176,3630098431,CA -3630098432,3630098687,US -3630098688,3630100223,CA -3630100224,3630100479,KW -3630100480,3630101247,US -3630101248,3630101503,CA -3630101504,3630102783,US +3630097664,3630102783,US 3630102784,3630103807,CA 3630103808,3630104063,US 3630104064,3630104575,CA -3630104576,3630108159,US -3630108160,3630108415,CA -3630108416,3630141951,US +3630104576,3630134015,US +3630134016,3630134271,CA +3630134272,3630141951,US 3630141952,3630142207,CA -3630142208,3630143999,US -3630144000,3630144255,CA -3630144256,3630148095,US +3630142208,3630148095,US 3630148096,3630148607,CA 3630148608,3630148863,US 3630148864,3630149119,CA 3630149120,3630151679,US 3630151680,3630152191,CA 3630152192,3630152703,US -3630152704,3630153215,CA -3630153216,3630156287,US +3630152704,3630152959,CA +3630152960,3630156287,US 3630156288,3630156543,CA 3630156544,3630157311,US 3630157312,3630157567,CA @@ -102167,9 +108136,7 @@ 3630162432,3630162687,CA 3630162688,3630163199,US 3630163200,3630163455,CA -3630163456,3630163711,US -3630163712,3630163967,CA -3630163968,3630164991,US +3630163456,3630164991,US 3630164992,3630165247,CA 3630165248,3630165503,US 3630165504,3630166015,CA @@ -102212,20 +108179,18 @@ 3631284224,3631316991,CA 3631316992,3631333375,US 3631333376,3631341567,CA -3631341568,3631435007,US -3631435008,3631435263,GB -3631435264,3631644671,US +3631341568,3631644671,US 3631644672,3631652863,CA 3631652864,3631665151,US 3631665152,3631667199,CA 3631667200,3631667455,US -3631667456,3631668223,CA -3631668224,3631668479,US -3631668480,3631668735,CA +3631667456,3631668735,CA 3631668736,3631669247,US 3631669248,3631669807,A2 3631669808,3631669823,EC -3631669824,3631670527,A2 +3631669824,3631670015,A2 +3631670016,3631670271,US +3631670272,3631670527,A2 3631670528,3631670783,NG 3631670784,3631671039,EC 3631671040,3631671295,US @@ -102235,22 +108200,15 @@ 3631672064,3631672575,PY 3631672576,3631672831,NG 3631672832,3631677439,A2 -3631677440,3631822815,US -3631822816,3631822831,AU -3631822832,3631825647,US -3631825648,3631825663,NZ -3631825664,3631829023,US -3631829024,3631829039,IN -3631829040,3631841279,US +3631677440,3631841279,US 3631841280,3631874047,CA 3631874048,3631939583,US 3631939584,3632005119,CA 3632005120,3632152575,US 3632152576,3632168959,CA -3632168960,3632185343,US +3632168960,3632187391,US 3632187392,3632188415,CA -3632188416,3632191487,US -3632193536,3632197631,US +3632188416,3632197631,US 3632197632,3632201727,CA 3632201728,3632218271,US 3632218272,3632218287,AU @@ -102260,19 +108218,19 @@ 3632232448,3632232703,A2 3632232704,3632244223,US 3632244224,3632244479,CA -3632244480,3632279039,US -3632279040,3632279295,SA -3632279296,3632332799,US +3632244480,3632332799,US 3632332800,3632357375,CA -3632357376,3632381951,US +3632357376,3632376319,US +3632376320,3632377343,CA +3632377344,3632381951,US 3632381952,3632390143,CA 3632390144,3632414719,US 3632414720,3632422911,CA -3632422912,3632448255,US -3632448256,3632448511,CA -3632448512,3632451583,US +3632422912,3632451583,US 3632451584,3632455679,CA -3632455680,3632857087,US +3632455680,3632495199,US +3632495200,3632495207,ZA +3632495208,3632857087,US 3632857088,3632859229,BS 3632859230,3632859230,US 3632859231,3632861183,BS @@ -102299,10 +108257,7 @@ 3633344512,3633348607,CA 3633348608,3633405951,US 3633405952,3633410047,CA -3633410048,3633446911,US -3633455104,3633456383,US -3633456384,3633456639,AU -3633456640,3633479679,US +3633410048,3633479679,US 3633479680,3633483775,CA 3633483776,3633545215,US 3633545216,3633545727,GA @@ -102384,15 +108339,19 @@ 3635159040,3635163135,CA 3635163136,3635171071,US 3635171072,3635171327,CA -3635171328,3635185407,US -3635185408,3635185663,A1 -3635185664,3635187199,US -3635187200,3635187455,A1 -3635187456,3635314687,US +3635171328,3635314687,US 3635314688,3635322879,CA 3635322880,3635466239,US 3635466240,3635470335,CA -3635470336,3635533535,US +3635470336,3635527679,US +3635527680,3635527935,PR +3635527936,3635528959,US +3635528960,3635529215,PR +3635529216,3635529983,US +3635529984,3635530751,PR +3635530752,3635531007,US +3635531008,3635531263,PR +3635531264,3635533535,US 3635533536,3635533551,IN 3635533552,3635643391,US 3635643392,3635644415,JP @@ -102427,87 +108386,45 @@ 3635741696,3635741951,US 3635741952,3635745535,CA 3635745536,3635746047,US -3635746048,3635749375,CA -3635749376,3635749631,US -3635749632,3635750143,CA +3635746048,3635750143,CA 3635750144,3635750399,US -3635750400,3635751679,CA -3635751680,3635752191,US +3635750400,3635751935,CA +3635751936,3635752191,US 3635752192,3635752447,CA 3635752448,3635752703,US -3635752704,3635753215,CA -3635753216,3635753471,US -3635753472,3635754239,CA -3635754240,3635755007,US +3635752704,3635754239,CA +3635754240,3635754362,US +3635754363,3635754363,CA +3635754364,3635755007,US 3635755008,3635755519,CA 3635755520,3635755775,US -3635755776,3635756287,CA -3635756288,3635756543,US -3635756544,3635757311,CA -3635757312,3635758079,US -3635758080,3635758335,CA -3635758336,3635758591,US -3635758592,3635758847,CA -3635758848,3635759103,US -3635759104,3635760895,CA +3635755776,3635760895,CA 3635760896,3635761151,US 3635761152,3635762687,CA 3635762688,3635762943,US 3635762944,3635763199,CA 3635763200,3635763455,US -3635763456,3635764735,CA -3635764736,3635765247,US -3635765248,3635765759,CA +3635763456,3635765759,CA 3635765760,3635768575,US -3635768576,3635768831,CA -3635768832,3635769087,US -3635769088,3635771135,CA -3635771136,3635771647,US +3635768576,3635771391,CA +3635771392,3635771647,US 3635771648,3635771903,CA 3635771904,3635772415,US 3635772416,3635772671,CA 3635772672,3635772927,US -3635772928,3635773439,CA -3635773440,3635773695,US -3635773696,3635773951,CA +3635772928,3635773951,CA 3635773952,3635774207,US -3635774208,3635774463,CA -3635774464,3635774719,US -3635774720,3635775231,CA -3635775232,3635775487,US -3635775488,3635775743,CA -3635775744,3635775999,US -3635776000,3635776511,CA -3635776512,3635776767,US -3635776768,3635777023,CA -3635777024,3635777279,US -3635777280,3635777791,CA -3635777792,3635778047,US -3635778048,3635778559,CA -3635778560,3635778815,US -3635778816,3635780607,CA -3635780608,3635780863,US -3635780864,3635781119,CA +3635774208,3635781119,CA 3635781120,3635783167,US -3635783168,3635789055,CA -3635789056,3635789311,US -3635789312,3635791359,CA -3635791360,3635791615,US -3635791616,3635793407,CA -3635793408,3635794175,US -3635794176,3635799551,CA +3635783168,3635799551,CA 3635799552,3635800063,US 3635800064,3635804159,CA 3635804160,3635804671,US -3635804672,3635805439,CA -3635805440,3635805455,US -3635805456,3635806207,CA +3635804672,3635806207,CA 3635806208,3635871743,US 3635871744,3635879935,CA 3635879936,3635892223,US -3635892224,3635895785,CA -3635895786,3635895786,US -3635895787,3635896319,CA +3635892224,3635896319,CA 3635896320,3635904511,US 3635904512,3635912703,CA 3635912704,3635961855,US @@ -102554,11 +108471,13 @@ 3636158464,3636158719,CA 3636158720,3636158871,US 3636158872,3636158879,CA -3636158880,3636158975,US -3636158976,3636159743,CA +3636158880,3636158959,US +3636158960,3636159743,CA 3636159744,3636160511,US 3636160512,3636160767,CA -3636160768,3636162047,US +3636160768,3636161983,US +3636161984,3636162015,CA +3636162016,3636162047,US 3636162048,3636162559,CA 3636162560,3636163583,US 3636163584,3636164095,CA @@ -102581,11 +108500,7 @@ 3636627200,3636627455,BR 3636627456,3636628479,MX 3636628480,3636628991,PE -3636628992,3636740095,US -3636740096,3636740351,CA -3636740352,3636741503,US -3636741504,3636741631,CA -3636741632,3636822015,US +3636628992,3636822015,US 3636822016,3636854783,CA 3636854784,3636887551,US 3636887552,3636895743,CA @@ -102612,9 +108527,7 @@ 3637641216,3637665791,US 3637665792,3637669887,CA 3637669888,3637706751,US -3637706752,3637726591,CA -3637726592,3637726719,US -3637726720,3637739519,CA +3637706752,3637739519,CA 3637739520,3638165503,US 3638165504,3638181887,CA 3638181888,3638214399,US @@ -102631,9 +108544,7 @@ 3638250560,3638250623,GB 3638250624,3638304767,US 3638304768,3638312959,CA -3638312960,3638349823,US -3638349824,3638350079,AU -3638350080,3638370303,US +3638312960,3638370303,US 3638370304,3638386687,CA 3638386688,3638399743,US 3638399744,3638399999,CH @@ -102642,19 +108553,14 @@ 3638401120,3638500125,US 3638500126,3638500126,CA 3638500127,3638509567,US -3638509568,3638526719,CA -3638526720,3638526975,US -3638526976,3638534143,CA +3638509568,3638534143,CA 3638534144,3638697983,US 3638697984,3638706175,CA -3638706176,3638706687,US -3638706688,3638706943,NG -3638706944,3638707455,A2 -3638707456,3638707711,US -3638707712,3638710015,A2 -3638710016,3638874111,US +3638706176,3638874111,US 3638874112,3638878207,CA -3638878208,3638984703,US +3638878208,3638880511,US +3638880512,3638880767,CA +3638880768,3638984703,US 3638984704,3638985983,GT 3638985984,3638986239,HN 3638986240,3638992895,GT @@ -102690,9 +108596,7 @@ 3639399680,3639399935,HN 3639399936,3639400447,A2 3639400448,3639401471,RS -3639401472,3639401541,A2 -3639401542,3639401542,KE -3639401543,3639402239,A2 +3639401472,3639402239,A2 3639402240,3639402495,GH 3639402496,3639513239,US 3639513240,3639513243,AE @@ -102727,23 +108631,111 @@ 3639593984,3639595007,GB 3639595008,3639607295,US 3639607296,3639611391,CA -3639611392,3639639807,US -3639639808,3639640063,CA -3639640064,3639656447,US +3639611392,3639656447,US 3639656448,3639660543,CA 3639660544,3639664639,US 3639664640,3639668735,CA 3639668736,3639672831,US -3639672832,3639681023,CL -3639681024,3639685055,US -3639685056,3639685063,SA -3639685064,3639692031,US +3639672832,3639675007,CL +3639675008,3639675135,CO +3639675136,3639675263,CL +3639675264,3639676159,CO +3639676160,3639676415,CL +3639676416,3639676479,CO +3639676480,3639676607,CL +3639676608,3639676639,CO +3639676640,3639676799,CL +3639676800,3639676959,CO +3639676960,3639676967,CL +3639676968,3639676983,CO +3639676984,3639676999,CL +3639677000,3639677063,CO +3639677064,3639677071,CL +3639677072,3639677223,CO +3639677224,3639677231,CL +3639677232,3639677335,CO +3639677336,3639677343,CL +3639677344,3639677431,CO +3639677432,3639677439,CL +3639677440,3639677503,CO +3639677504,3639677519,CL +3639677520,3639677559,CO +3639677560,3639677567,CL +3639677568,3639677575,CO +3639677576,3639677583,CL +3639677584,3639677631,CO +3639677632,3639677695,CL +3639677696,3639677719,CO +3639677720,3639677727,CL +3639677728,3639677751,CO +3639677752,3639677767,CL +3639677768,3639677823,CO +3639677824,3639677831,CL +3639677832,3639677839,CO +3639677840,3639677847,CL +3639677848,3639677927,CO +3639677928,3639677951,CL +3639677952,3639677975,CO +3639677976,3639677983,CL +3639677984,3639677991,CO +3639677992,3639678007,CL +3639678008,3639678031,CO +3639678032,3639678039,CL +3639678040,3639678175,CO +3639678176,3639678191,CL +3639678192,3639678199,CO +3639678200,3639678207,CL +3639678208,3639678463,CO +3639678464,3639678471,CL +3639678472,3639678487,CO +3639678488,3639678495,CL +3639678496,3639678647,CO +3639678648,3639678655,CL +3639678656,3639678687,CO +3639678688,3639678703,CL +3639678704,3639678735,CO +3639678736,3639678751,CL +3639678752,3639678831,CO +3639678832,3639678839,CL +3639678840,3639678895,CO +3639678896,3639678911,CL +3639678912,3639678927,CO +3639678928,3639678935,CL +3639678936,3639679231,CO +3639679232,3639679247,CL +3639679248,3639679359,CO +3639679360,3639679383,CL +3639679384,3639679455,CO +3639679456,3639679463,CL +3639679464,3639680415,CO +3639680416,3639680431,CL +3639680432,3639680511,CO +3639680512,3639680767,CL +3639680768,3639680799,CO +3639680800,3639680831,CL +3639680832,3639680895,CO +3639680896,3639680959,CL +3639680960,3639680991,CO +3639680992,3639681023,CL +3639681024,3639684863,US +3639684864,3639684865,SA +3639684866,3639684866,US +3639684867,3639684897,SA +3639684898,3639684898,US +3639684899,3639684961,SA +3639684962,3639684962,US +3639684963,3639685071,SA +3639685072,3639685087,US +3639685088,3639685119,SA +3639685120,3639692031,US 3639692032,3639692287,GB 3639692288,3639704573,US 3639704574,3639704574,GB 3639704575,3639730175,US 3639730176,3639734271,CA -3639734272,3639737343,US +3639734272,3639736575,US +3639736576,3639736831,HK +3639736832,3639737343,US 3639737344,3639737373,GB 3639737374,3639737374,FR 3639737375,3639737599,GB @@ -102763,9 +108755,7 @@ 3640312320,3640312575,NI 3640312576,3640312831,US 3640312832,3640313087,TO -3640313088,3640314879,US -3640314880,3640315135,A2 -3640315136,3640315391,US +3640313088,3640315391,US 3640315392,3640315647,TR 3640315648,3640316927,US 3640316928,3640317183,MX @@ -102783,11 +108773,10 @@ 3640430592,3640432639,DE 3640432640,3640433407,US 3640433408,3640433663,A2 -3640433664,3640434943,US -3640435712,3640436479,US -3640436480,3640436735,GH +3640433664,3640438783,US 3640438784,3640442879,DE 3640442880,3640446975,US +3640446976,3640449023,CA 3640449024,3640450047,A2 3640450048,3640451071,US 3640451072,3640459263,DE @@ -102796,13 +108785,7 @@ 3640582144,3640647679,US 3640647680,3640651775,JP 3640651776,3640655871,US -3640655872,3641020121,DE -3641020122,3641020122,GB -3641020123,3641061225,DE -3641061226,3641061226,US -3641061227,3641151231,DE -3641151232,3641151232,CN -3641151233,3641180159,DE +3640655872,3641180159,DE 3641180160,3641188351,GB 3641188352,3641192447,TJ 3641192448,3641196543,DE @@ -102829,7 +108812,9 @@ 3641311232,3641315327,DE 3641315328,3641319423,DK 3641319424,3641323519,RU -3641323520,3641331711,DE +3641323520,3641324543,DE +3641324544,3641324799,AT +3641324800,3641331711,DE 3641331712,3641335807,ES 3641335808,3641343999,SE 3641344000,3641352191,GB @@ -102837,9 +108822,9 @@ 3641356536,3641356543,CM 3641356544,3641357983,A2 3641357984,3641358015,SL -3641358016,3641359359,A2 -3641359360,3641359615,US -3641359616,3641360383,A2 +3641358016,3641359615,A2 +3641359616,3641359871,US +3641359872,3641360383,A2 3641360384,3641368575,RO 3641368576,3641372671,GB 3641372672,3641376767,BG @@ -102917,11 +108902,7 @@ 3641670912,3641671167,LS 3641671168,3641671679,GB 3641671680,3641679871,RU -3641679872,3641680127,DK -3641680128,3641681151,A1 -3641681152,3641681407,SE -3641681408,3641681663,FR -3641681664,3641683967,A1 +3641679872,3641683967,A1 3641683968,3641688063,KZ 3641688064,3641692159,RU 3641692160,3641696255,IT @@ -102951,9 +108932,7 @@ 3641794560,3641798655,RS 3641798656,3641802751,RU 3641802752,3641806847,NL -3641806848,3641807871,TR -3641807872,3641808895,NL -3641808896,3641810943,TR +3641806848,3641810943,TR 3641810944,3641819135,RU 3641819136,3641823231,DE 3641823232,3641827327,NO @@ -102982,7 +108961,11 @@ 3641941760,3641942015,EU 3641942016,3641950207,DE 3641950208,3641954303,FR -3641954304,3641958399,MD +3641954304,3641957119,MD +3641957120,3641957631,GB +3641957632,3641957887,MD +3641957888,3641958143,GB +3641958144,3641958399,MD 3641958400,3641960447,BE 3641960448,3641960703,NL 3641960704,3641961727,BE @@ -103013,7 +108996,9 @@ 3642064896,3642068991,IT 3642068992,3642073087,AL 3642073088,3642077183,LV -3642077184,3642085375,NL +3642077184,3642078207,NL +3642078208,3642078463,BE +3642078464,3642085375,NL 3642085376,3642089471,RU 3642089472,3642093567,SE 3642093568,3642097663,NL @@ -103048,7 +109033,9 @@ 3642224640,3642228735,SK 3642228736,3642232831,DE 3642232832,3642236927,RS -3642236928,3642241023,CH +3642236928,3642237263,CH +3642237264,3642237264,DE +3642237265,3642241023,CH 3642241024,3642245119,DE 3642245120,3642249215,LV 3642249216,3642253311,FR @@ -103088,11 +109075,7 @@ 3642415104,3642417151,GB 3642417152,3642419199,DE 3642419200,3642421247,GB -3642421248,3642422783,A2 -3642422784,3642423039,US -3642423040,3642425087,A2 -3642425088,3642425343,US -3642425344,3642429439,DE +3642421248,3642429439,DE 3642429440,3642433535,GB 3642433536,3642435583,CY 3642435584,3642436607,RU @@ -103134,16 +109117,14 @@ 3642554721,3642554721,LV 3642554722,3642556415,UA 3642556416,3642560511,CZ -3642560512,3642561535,KG -3642561536,3642561791,US -3642561792,3642564607,KG +3642560512,3642564607,KG 3642564608,3642568703,DE 3642568704,3642572799,RU 3642572800,3642576895,IT 3642576896,3642580991,RU 3642580992,3642585087,ES 3642585088,3642589183,UZ -3642589184,3642593279,EG +3642589184,3642593279,TZ 3642593280,3642597375,AT 3642597376,3642601471,IT 3642601472,3642605567,RU @@ -103152,8 +109133,7 @@ 3642613760,3642617855,FI 3642617856,3642621951,JO 3642621952,3642626047,IT -3642626048,3642626303,A2 -3642626304,3642628607,BE +3642626048,3642628607,BE 3642628608,3642628863,A2 3642628864,3642630143,BE 3642630144,3642634239,DK @@ -103173,9 +109153,7 @@ 3642691584,3642695679,DE 3642695680,3642699775,SK 3642699776,3642703871,CZ -3642703872,3642705151,LU -3642705152,3642705407,DE -3642705408,3642707967,LU +3642703872,3642707967,LU 3642707968,3642712063,DE 3642712064,3642716159,NO 3642716160,3642720255,IT @@ -103215,7 +109193,9 @@ 3644919808,3644923903,DE 3644923904,3644924927,IL 3644924928,3644925183,US -3644925184,3644926463,IL +3644925184,3644925439,IL +3644925440,3644925695,US +3644925696,3644926463,IL 3644926464,3644926719,US 3644926720,3644927999,IL 3644928000,3644932095,GI @@ -103279,7 +109259,7 @@ 3645202432,3645206527,CZ 3645206528,3645210623,LV 3645210624,3645214719,RU -3645214720,3645218815,NL +3645214720,3645218815,SE 3645218816,3645222911,DE 3645222912,3645227007,KW 3645227008,3645235199,RU @@ -103484,7 +109464,9 @@ 3647209472,3647602687,NL 3647602688,3647733759,RU 3647733760,3647864831,FR -3647864832,3647890687,DE +3647864832,3647880703,DE +3647880704,3647880959,PL +3647880960,3647890687,DE 3647890688,3647890943,EU 3647890944,3647916799,DE 3647916800,3647917055,SE @@ -103492,7 +109474,9 @@ 3647947264,3647947519,US 3647947520,3647949567,DE 3647949568,3647949823,EU -3647949824,3647964159,DE +3647949824,3647963135,DE +3647963136,3647963391,BE +3647963392,3647964159,DE 3647964160,3647964287,ES 3647964288,3647964439,DE 3647964440,3647964447,ES @@ -103511,15 +109495,14 @@ 3647964616,3647964623,DE 3647964624,3647964639,ES 3647964640,3647965695,DE -3647965696,3647966207,CH +3647965696,3647965951,CH +3647965952,3647966207,DE 3647966208,3647967231,GB 3647967232,3647968255,BE 3647968256,3647969279,FR 3647969280,3647969327,DE 3647969328,3647969335,IT -3647969336,3647970047,DE -3647970048,3647970303,BE -3647970304,3647971327,DE +3647969336,3647971327,DE 3647971328,3647972351,GB 3647972352,3647973375,IT 3647973376,3647973399,DE @@ -103536,29 +109519,32 @@ 3647975424,3647976447,ES 3647976448,3647977471,DE 3647977472,3647978495,GB -3647978496,3647980223,DE -3647980224,3647980239,FR -3647980240,3647980383,DE +3647978496,3647979007,DE +3647979008,3647979071,IT +3647979072,3647980031,DE +3647980032,3647980287,FR +3647980288,3647980383,DE 3647980384,3647980415,FR 3647980416,3647980543,DE 3647980544,3647981567,GB 3647981568,3647982591,BE 3647982592,3647983615,IT -3647983616,3647983871,US -3647983872,3647984031,DE +3647983616,3647984031,DE 3647984032,3647984047,NL -3647984048,3647986431,DE +3647984048,3647984127,DE +3647984128,3647984383,NL +3647984384,3647986431,DE 3647986432,3647986687,ES 3647986688,3647987647,DE 3647987648,3647987655,ES 3647987656,3647987695,DE 3647987696,3647987711,ES 3647987712,3647988735,IT -3647988736,3647989063,DE +3647988736,3647988999,DE +3647989000,3647989007,BE +3647989008,3647989063,DE 3647989064,3647989071,BE -3647989072,3647989247,DE -3647989248,3647989503,BE -3647989504,3647995903,DE +3647989072,3647995903,DE 3647995904,3648004095,RU 3648004096,3648007167,GB 3648007168,3648007679,US @@ -103569,12 +109555,7 @@ 3648020480,3648024575,IT 3648024576,3648028671,NL 3648028672,3648032767,HU -3648032768,3648033023,IE -3648033024,3648034887,EU -3648034888,3648034895,IE -3648034896,3648036095,EU -3648036096,3648036351,IE -3648036352,3648036863,EU +3648032768,3648036863,IE 3648036864,3648040959,CZ 3648040960,3648045055,BE 3648045056,3648049151,FI @@ -103635,9 +109616,7 @@ 3648192512,3648196607,DE 3648196608,3648200703,IT 3648200704,3648208895,SE -3648208896,3648209166,DE -3648209167,3648209169,GB -3648209170,3648209663,DE +3648208896,3648209663,DE 3648209664,3648209919,EU 3648209920,3648212991,DE 3648212992,3648217087,RU @@ -103733,12 +109712,11 @@ 3649841152,3649843199,GB 3649843200,3649847817,NL 3649847818,3649855487,DE -3649855488,3649856511,GB -3649856512,3649857535,US -3649857536,3649857791,JP +3649855488,3649857791,GB 3649857792,3649858047,IN 3649858048,3649859071,GB -3649859072,3649859583,US +3649859072,3649859327,US +3649859328,3649859583,GB 3649859584,3649863679,SE 3649863680,3649896447,FI 3649896448,3649961983,IT @@ -103795,7 +109773,7 @@ 3650231808,3650232063,DE 3650232064,3650232319,SE 3650232320,3650236415,RU -3650236416,3650240511,CH +3650236416,3650240511,GB 3650240512,3650244607,EE 3650244608,3650256895,GB 3650256896,3650265087,DE @@ -103821,25 +109799,7 @@ 3650338816,3650342911,FR 3650342912,3650347007,CH 3650347008,3650351103,GE -3650351104,3650351871,GB -3650351872,3650351879,NL -3650351880,3650351887,IT -3650351888,3650351903,GB -3650351904,3650351911,FR -3650351912,3650351919,SE -3650351920,3650351927,DK -3650351928,3650351935,DE -3650351936,3650351943,PL -3650351944,3650351951,ES -3650351952,3650351959,BE -3650351960,3650351967,ZA -3650351968,3650351975,PT -3650351976,3650351983,FI -3650351984,3650351991,NO -3650351992,3650351999,HU -3650352000,3650352007,GB -3650352008,3650352015,IE -3650352016,3650352264,GB +3650351104,3650352264,GB 3650352265,3650352265,DE 3650352266,3650355199,GB 3650355200,3650359295,CH @@ -103891,18 +109851,20 @@ 3650560000,3650564095,GB 3650564096,3650568191,SE 3650568192,3650572287,RU -3650572288,3650576383,DE +3650572288,3650575103,DE +3650575104,3650575167,AT +3650575168,3650576383,DE 3650576384,3650580479,GB 3650580480,3650584575,CH 3650584576,3650588671,RU 3650588672,3650592767,DE 3650592768,3650600959,IS 3650600960,3650605055,SE -3650605056,3650609180,DE -3650609181,3650609181,LB -3650609182,3650610175,DE +3650605056,3650610175,DE 3650610176,3650611711,RU -3650611712,3650611835,LB +3650611712,3650611782,LB +3650611783,3650611783,RU +3650611784,3650611835,LB 3650611836,3650611836,RU 3650611837,3650611866,LB 3650611867,3650611867,RU @@ -103917,21 +109879,18 @@ 3650682880,3650748415,PL 3650748416,3650879487,GB 3650879488,3650912255,RO -3650912256,3650915327,GB -3650915328,3650915583,FR -3650915584,3650920447,GB -3650920448,3650920457,FR -3650920458,3650920458,GB -3650920459,3650920703,FR +3650912256,3650916393,GB +3650916394,3650916394,FR +3650916395,3650920703,GB 3650920704,3650920895,LB -3650920896,3650920896,US -3650920897,3650920897,GR -3650920898,3650920898,GB -3650920899,3650920927,GR +3650920896,3650920927,GR 3650920928,3650920959,LB -3650920960,3650922799,GB +3650920960,3650920991,GB +3650920992,3650921007,IL +3650921008,3650922799,GB 3650922800,3650922815,FR -3650922816,3650926591,GB +3650922816,3650926335,GB +3650926336,3650926591,DE 3650926592,3650929663,ES 3650929664,3650929847,GB 3650929848,3650929855,FR @@ -103940,14 +109899,9 @@ 3650930432,3650930687,DE 3650930688,3650932943,GB 3650932944,3650932975,IT -3650932976,3650939599,GB -3650939600,3650939607,FR +3650932976,3650939607,GB 3650939608,3650939615,TR -3650939616,3650940927,GB -3650940928,3650941177,NL -3650941178,3650941178,GB -3650941179,3650941183,NL -3650941184,3650945023,GB +3650939616,3650945023,GB 3650945024,3651010559,DK 3651010560,3651076095,GB 3651076096,3651108863,DE @@ -104013,7 +109967,9 @@ 3651272704,3651338239,CH 3651338240,3651350783,GB 3651350784,3651351039,EU -3651351040,3651403775,GB +3651351040,3651353087,GB +3651353088,3651353343,FR +3651353344,3651403775,GB 3651403776,3651534847,AE 3651534848,3651600383,NL 3651600384,3651665919,FR @@ -104069,9 +110025,7 @@ 3651895296,3651899391,GB 3651899392,3651903487,RU 3651903488,3651907583,IT -3651907584,3651909046,DE -3651909047,3651909047,IQ -3651909048,3651911679,DE +3651907584,3651911679,DE 3651911680,3651915775,NO 3651915776,3651919871,IS 3651919872,3651921919,NL @@ -104118,13 +110072,7 @@ 3652071424,3652075519,BG 3652075520,3652083711,SE 3652083712,3652087807,RU -3652087808,3652093951,IT -3652093952,3652094207,US -3652094208,3652094975,IT -3652094976,3652095231,US -3652095232,3652095487,IT -3652095488,3652095743,US -3652095744,3652095999,IT +3652087808,3652095999,IT 3652096000,3652100095,BG 3652100096,3652108287,RU 3652108288,3652116479,FR @@ -104138,18 +110086,11 @@ 3652149248,3652153343,DE 3652153344,3652157439,SE 3652157440,3652165631,RU -3652165632,3652165887,GF -3652165888,3652169471,FR -3652169472,3652169727,GF -3652169728,3652170239,MQ -3652170240,3652170751,FR +3652165632,3652170751,FR 3652170752,3652171007,MQ -3652171008,3652171519,FR -3652171520,3652171775,MQ -3652171776,3652172287,RE -3652172288,3652172543,FR -3652172544,3652172799,RE -3652172800,3652173823,FR +3652171008,3652172031,FR +3652172032,3652172287,RE +3652172288,3652173823,FR 3652173824,3652177919,AT 3652177920,3652182015,CY 3652182016,3652190207,DE @@ -104158,26 +110099,30 @@ 3653238784,3653369855,CH 3653369856,3653373951,IT 3653373952,3653378047,NL -3653378048,3653378674,DE +3653378048,3653378559,DE +3653378560,3653378569,DK +3653378570,3653378570,DE +3653378571,3653378655,DK +3653378656,3653378656,DE +3653378657,3653378674,DK 3653378675,3653378675,EU -3653378676,3653382143,DE +3653378676,3653378815,DK +3653378816,3653382143,DE 3653382144,3653386239,CH 3653386240,3653390335,DE 3653390336,3653394431,FR 3653394432,3653402623,NL 3653402624,3653407103,A2 3653407104,3653407111,UG -3653407112,3653407999,A2 -3653408000,3653408255,US -3653408256,3653410060,A2 -3653410061,3653410061,YT -3653410062,3653410815,A2 +3653407112,3653408071,A2 +3653408072,3653408079,NG +3653408080,3653408231,A2 +3653408232,3653408239,KE +3653408240,3653410815,A2 3653410816,3653414911,CZ 3653414912,3653419007,IT 3653419008,3653423103,IL -3653423104,3653426687,GB -3653426688,3653426815,A1 -3653426816,3653427199,GB +3653423104,3653427199,GB 3653427200,3653431295,DE 3653431296,3653435391,RU 3653435392,3653439487,DE @@ -104276,17 +110221,11 @@ 3659628544,3659661311,JP 3659661312,3659792383,TW 3659792384,3660054527,KR -3660054528,3660096767,JP -3660096768,3660097535,US -3660097536,3660099071,JP -3660099072,3660099583,US -3660099584,3660100095,JP -3660100096,3660100607,US -3660100608,3660102143,JP +3660054528,3660097535,JP +3660097536,3660097791,US +3660097792,3660102143,JP 3660102144,3660102399,US -3660102400,3660102655,JP -3660102656,3660102911,US -3660102912,3660578815,JP +3660102400,3660578815,JP 3660578816,3661103103,KR 3661103104,3663986687,CN 3663986688,3663987711,AU @@ -104338,9 +110277,8 @@ 3664007168,3664008191,AU 3664008192,3664008447,MN 3664008448,3664008703,PK -3664008704,3664008959,MY -3664008960,3664009215,AU -3664009216,3664052223,CN +3664008960,3664010239,AU +3664010240,3664052223,CN 3664052224,3664084991,NZ 3664084992,3664117759,KR 3664117760,3664248831,HK @@ -104360,9 +110298,7 @@ 3669618688,3669620735,CN 3669622784,3669688319,SG 3669688320,3669753855,TW -3669753856,3669777663,HK -3669777664,3669777919,SG -3669777920,3670015999,HK +3669753856,3670015999,HK 3670016000,3671064575,CN 3671064576,3671130111,MY 3671130112,3671195647,KR @@ -104447,7 +110383,30 @@ 3701293056,3701301247,AU 3701301248,3701305343,ID 3701305344,3701309439,TW -3701309440,3701473279,JP +3701309440,3701374975,JP +3701374976,3701375999,IN +3701376000,3701377023,HK +3701377024,3701380095,IN +3701380096,3701381119,KH +3701381120,3701390335,IN +3701390336,3701391359,AU +3701391360,3701392383,IN +3701392384,3701393407,HK +3701393408,3701394431,MY +3701394432,3701395455,BD +3701395456,3701396479,HK +3701396480,3701397503,NZ +3701397504,3701398527,JP +3701398528,3701399551,MV +3701399552,3701400575,HK +3701400576,3701401599,TW +3701401600,3701402623,BD +3701402624,3701403647,BT +3701403648,3701404671,CN +3701404672,3701405695,HK +3701405696,3701406719,JP +3701406720,3701407743,HK +3701407744,3701473279,JP 3701473280,3704619007,CN 3704619008,3705667583,JP 3705667584,3705929727,IN @@ -104458,7 +110417,9 @@ 3706159104,3706191871,CN 3706191872,3706206959,SG 3706206960,3706206975,AP -3706206976,3706208255,SG +3706206976,3706207107,SG +3706207108,3706207108,US +3706207109,3706208255,SG 3706208256,3706224639,CN 3706224640,3706257407,HK 3706257408,3706322943,AU @@ -104470,7 +110431,7 @@ 3707109376,3707174911,HK 3707174912,3707207679,JP 3707209728,3707211775,CN -3707211776,3707215871,JP +3707211776,3707215871,ID 3707215872,3707217919,BD 3707217920,3707219967,ID 3707219968,3707222015,AU @@ -104495,7 +110456,9 @@ 3715694592,3715710975,VN 3715710976,3715719167,AU 3715719168,3715727359,PH -3715727360,3715735551,AU +3715727360,3715729151,AU +3715729152,3715729407,NZ +3715729408,3715735551,AU 3715735552,3715741695,JP 3715741696,3715743743,PH 3715743744,3715760127,JP @@ -104549,9 +110512,7 @@ 3735404544,3735420927,ID 3735420928,3735551999,HK 3735552000,3739222015,CN -3739222016,3739555071,JP -3739555072,3739555327,US -3739555328,3739570175,JP +3739222016,3739570175,JP 3739570176,3739572223,ID 3739572224,3739574271,AU 3739574272,3739680767,JP diff --git a/installer/resources/geoipv6.dat.gz b/installer/resources/geoipv6.dat.gz index 285970bc2..ccce489fd 100644 Binary files a/installer/resources/geoipv6.dat.gz and b/installer/resources/geoipv6.dat.gz differ diff --git a/installer/resources/hosts.txt b/installer/resources/hosts.txt index 46017c9c4..34987b08f 100644 --- a/installer/resources/hosts.txt +++ b/installer/resources/hosts.txt @@ -360,3 +360,7 @@ i2pdocs.str4d.i2p=CRayYfxrPBELUQ4tYi723g8atsyHwkR0--N8fXggNqJgHsnrKxle0ovH5qj6aq mtn.i2p-projekt.i2p=I6Ha4I7rgR0JyExQnN~4sZz5CfRqdN7o-2t1i2YOExd2CxC4MHHz3nJ5KgBIqeNa0dZbugwMEYMWneXAf8nuy9RKUrjcDvGLqScuU8QCpG-e7UDR8lNregfaOwTuypBQiPh9nrc86Zc2JXyTv0eG3T5Yl1tydqs3qEz5w1vn64uRCrGLEMsnGMIZ4aXexseL6McW9ObIQ0qOIfRG9kc~3~bpD9UM4G04BXPZ1Ao5MUjGoQyxlaNCt1DrvAYcrRArzvv0QGyPjb6HpHLlK2UIoR6SumRuNYpEXCaqbXEnEicx1kB5Pyhcwm0cyaMCx-ZaUU-F1~23VurE41xNMbq4GwXtev4bVP4ycHGHjH-XYJmKrqnesIEp7InSAWfm0gdDHuy9377nSIyAhGLLFlWKtzrZPiKm57SN4~BZSQIF6CI4JutGa0x9EaO8hvzFgaYKgwS~a7-YuZNfx4VHEF2J34DrsJo4qetdPTWTKX1o-ztMP6f7DpWjp4JTKb36YstvAAAA tracker.thebland.i2p=gzBtMSRcMD6b36PmPCQWZhh30fYm2Ww2r4tRSref4N2T4~cnXK3DjJOuJwao2jRK4bZwX2Rkyjw849xrFMqaR3SdPe3-K61B~Kr9Uo1KLdm3~oahOWFmCaIlipPs-i3jdTT~721YUcYB09n4PGrDq5KZSOOBlLZKulJficO58QRUlDpva4OCCRrX9EUCoAavOciKpvKtnGwl6AiPFu8WnmEeGQ861vjdirjfkHWNp3gj9IjGuxJNcgyHi51BWYZM6il~LJTcbA4zuZn~qudHIx9uzUtO-t08yzSRrmfVwVVVru6-~BBX0ipADi9UGZjyB-PJEKKjizUPxSp2OCmiOlQ2iXpKs2j8yfjHJbn-eWKpIh4jfpNigy6AbDfzFivkvm8lt8CleYf-p3~SHdqIL0iEaacxi5BAU4Baj5yS818kPQP4hEEMMtq4WnKjl4IW64swXSg1wlVBTiKDJzzQGK20jySBuPxhEbd6sfAeirzn585g5EqeV8DLqsMfe5pZBQAEAAEAAA== opentracker.dg2.i2p=WSUjGXhqHr7TsBizCO0qV~Kk7G1-suPPSSyMs4AnLQ8wRlWWZ~9rl7AzS0tFG4Dbbl8Te0wtZmQeMhcartbJ3TY-TBnviFqA8zP-sEQf5UK0BA5zzrtpB7NnUo-65B61cVbqG51-p9cJZ~Crre0LEZm5bJs8P3J~oH3b3BJ0YXtuv0ccBgj~OAf1g8ZrHr431XLq8WPRkzAVEIDhFdiSCYAz8XTArNN7OnPUUCjZcw92Oqf9wajg0eXqnThDFbrCx54h0UKM7sVDqRnoXbuGVLTPVvmIOnwuwZrn4X60GMLW38Dg-38qSfJL61FIbn5HfK-VTjCOuC16PtvJAPS1qUBWa-Y3j3aGK3BpHQnlOl-XNB~tJU0GBzRvEnOPFbtqXw38LyTCsvXcY31C~sNC~jedATUfPSZK-UBeN6RkR5BQiXBV-YkzUvTM4s~oXXgw9WFe9DdEWP-XR9~2G1Qe-GkcRAKUXmTAzVnRjlHEDR0lLMfxDwe3OfZuBzM9Gda9AAAA +i2pnews.i2p=XHS99uhrvijk3KxU438LjNf-SMXXiNXsbV8uwHFXdqsDsHPZRdc6LH-hEMGWDR5g2b65KLlSm8plFrTusR-yxBfGHtZLa9vhXCwWXXbUlBe7Ty6NlwY7GmJItBKPO09BbUa0oJ5jITjLM1mVxeHShAZs8IMlLJjYaeYycDdaUInuPrng51~ySeiiKKxHa3qJkFOuPgQQiCXqy-9Qhi7t9j16iXzWWZ5yN7XcE9i1J7UQix66ntwILTnTAYBelNbONPiSJzKq-BiXj13bI3~liBgckJGf1a1dU8lOuAemtB-XM36cUcg~LQ6iHMuxK-AE8UDQHTNma6E0TxlK5DizV34UgiJ2CxRB5n8BBrZQEvIjYOExXyt6gbopL-aer1qrL1zoIKoMbGon5P4GV~f8NyClJKHXSS2NW7FV-kZbmA0WSLAxecyBfSLStIlw01gtnb2OAQt6OkMQ693N2-L~IJMg4f1lWK4Pv0bIqJUrHZS8YyeWbb4Y~pto6hkd0kgRBQAEAAEAAA== +exchanged.i2p=rLFzsOqsfSmJZvg6xvl~ctUulYWwGaM8K~rGs-e4WXkKePTCMOpU8l6LIU-wwDOiUZ7Ve8Y-zWPBVYQjH8~~lgT-BJ81zjP5I6H051KOVaXDChdx5F99mZu0sEjnYoFX484QHsUkFc5GUypqhpv1iwWwdPL7bVNzr1fS6sIZvq7tYWEOymbnifxk2jC0BnjultNPCq1wiI2Y-G66iOHDvuLu5f7RvNGJYlpw0UYNv6g8jUu3gXYjDRMBD5OIxFUJaksfmml2CiaGjrPfXKEXBR4q1CogVruq3r~447VHb32f52aeYszcslNzQjYyFCdipnAi5JiNTFpzTZPMEglt2J3KZYB3SMCmxSLktFI7376c7mT7EbMIFFv1GrmcUy9oIyYasbb82Sec9y0nJ9ahZt0x3iGokAYekXKXq-rGPzgFeBwfuCHzQnLzm1akVyJHoGDdaG0QHJfqfW1sY3F2n1xaWrnKcqIz2ypemxVnTMFKQqm2pdG-dMsXNYiGmZtaBQAEAAcAAA== +i2pwiki.i2p=Zr1YUKIKooxymZRqLvtfSYuZggqv5txkLE8Ks~FTh3A8JDmhOV8C82dUBKJhzst~Pcbqz7rXc~TPyrqasaQ~LioAji~WLSs8PpmCLVF83edhYpx75Fp23ELboEszHduhKWuibVchPLNa-6nP4F0Ttcr4krTlphe3KveNfZDAbm511zFFlNzPcY4PqOdCRBrp7INiWkVwQxwGWO7jiNYTYa5x4QXJmxIN1YOiNRYQST7THz1aV6219ThsfT9FE5JtiX-epli6PF5ZX9TcVSjHUKZnr8uJLXfh5T4RMVNe1n~KXutMUZwxpFE0scOIez9vhDFd7t0HPIsQUsv7MUBzrz4FM9qol7UUPueSGDRgTOOfXMfj4BDsouiWQC4GcSmH3SflR0Ith9QWKC4u3XYvB7Tw-70QWBEV53hUo6I8YKidV13WgeN9JI3KWTYkMyX-TYjmY9y2q6Xd-Maszv4Tb~NzxQs9CNdu0W-JRSUFOqzgt3l4cx0K1pmx4p0tM5dLBQAEAAEAAA== +lenta.i2p=DnW8NqbKilYLcIx5g5CG4mWVHkzrCkl0MbV4a5rGJku4BSs7HjvzjZpCoXWFky9JCUlHzjFotMETxQBhaKl0Q46vu-plKQ4BLnYyo45p7j2lTiejWvV4SDuXU4IAdmug27i~Jl4N44zwe9KYy~gMfY1Vsgv4bH9ov7X7l2iS-bycfcd9nE7JfycwFc4e0XU-dx7xf~tHw7I5--25dp-SsRX3-UYz4ygb58aD8UsKfQaFZtMy4x~Z1ufNEftuekb1HH9g2Rhhq8Bl62ad8PWSDa9Ne-SkCQsqTYjrCsvMY2DMvWgmZxI1hJYqzjRdFV6JEprrr~CJgHGJXr~KdnZhX12Vm4bKisZK847wBm42CoBQBT5HRzDkeflkbsliirRuKSUxVYMoZ1vic~avPZZl~pvIKZsz-YtiKha4vjCNE1zD-tHIS~2qq4uEO546Ol9pNokPaNttV6r7D2-zurEDx~9grJ8LhBozTxtdTdfZv2OqN4bVhrE7xUrxe0flIFKEAAAA diff --git a/installer/resources/i2prouter b/installer/resources/i2prouter index afee6b721..5d2017924 100644 --- a/installer/resources/i2prouter +++ b/installer/resources/i2prouter @@ -1287,7 +1287,7 @@ installsystemd() { cat << EOF >> "$SYSTEMD_SERVICE" [Unit] Description=$APP_LONG_NAME -After= local-fs.target network.target +After= local-fs.target network.target time-sync.target [Service] Type=forking diff --git a/installer/resources/icons/flags/ap.png b/installer/resources/icons/flags/ap.png new file mode 100644 index 000000000..adde45fd8 Binary files /dev/null and b/installer/resources/icons/flags/ap.png differ diff --git a/installer/resources/icons/flags/bl.png b/installer/resources/icons/flags/bl.png new file mode 100644 index 000000000..8332c4ec2 Binary files /dev/null and b/installer/resources/icons/flags/bl.png differ diff --git a/installer/resources/icons/flags/bq.png b/installer/resources/icons/flags/bq.png new file mode 100644 index 000000000..0620838aa Binary files /dev/null and b/installer/resources/icons/flags/bq.png differ diff --git a/installer/resources/icons/flags/ss.png b/installer/resources/icons/flags/ss.png new file mode 100644 index 000000000..f8716eed4 Binary files /dev/null and b/installer/resources/icons/flags/ss.png differ diff --git a/installer/resources/icons/flags/sx.png b/installer/resources/icons/flags/sx.png new file mode 100644 index 000000000..a2edf588e Binary files /dev/null and b/installer/resources/icons/flags/sx.png differ diff --git a/installer/resources/locale/bundle-messages.sh b/installer/resources/locale/bundle-messages.sh index bd4d5ab01..ce5704d7e 100755 --- a/installer/resources/locale/bundle-messages.sh +++ b/installer/resources/locale/bundle-messages.sh @@ -19,12 +19,12 @@ then fi # on windows, one must specify the path of commnad find -# since windows has its own retarded version of find. +# since windows has its own version of find. if which find|grep -q -i windows ; then export PATH=.:/bin:/usr/local/bin:$PATH fi # Fast mode - update ondemond -# set LG2 to the language you need in envrionment varibales to enable this +# set LG2 to the language you need in environment variables to enable this JPATHS=".." for i in po/messages_*.po diff --git a/installer/resources/locale/po/messages_de.po b/installer/resources/locale/po/messages_de.po index 465ada251..c8c499a4c 100644 --- a/installer/resources/locale/po/messages_de.po +++ b/installer/resources/locale/po/messages_de.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-01-09 18:07+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-12-04 18:54+0000\n" "Last-Translator: kytv \n" "Language-Team: German (http://www.transifex.com/projects/p/I2P/language/" @@ -24,185 +24,185 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Wrapper konnte nicht geladen werden." -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME läuft bereits." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Führe $APP_LONG_NAME aus" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Warte auf $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "WARNUNG: Das Starten von $APP_LONG_NAME könnte fehlgeschlagen sein" -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Nur root kann diese Aktion durchführen." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Starte $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Stoppe $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME wurde nicht ausgeführt." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Konnte $APP_LONG_NAME nicht beenden." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Warte auf die Beendigung von $APP_LONG_NAME." -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Beenden von $APP_LONG_NAME fehlgeschlagen." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME wurde beendet." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Beende $APP_LONG_NAME ordnungsgemäß." -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME wird nicht ausgeführt." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME wird ausgeführt: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" "$APP_LONG_NAME wird ausgeführt: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "Der $APP_LONG_NAME Dämon ist bereits installiert." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Installiere den $APP_LONG_NAME Dämon" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Die Installation für $DIST_OS wird momentan nicht unterstützt" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Entferne $APP_LONG_NAME Dämon" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "Der $APP_LONG_NAME Dämon ist momentan nicht installiert." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Entfernen wird momentan unter $DIST_OS nicht unterstützt." -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Befehle:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Start in dieser Konsole." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Im Hintergrund als Dämon starten." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "" "Beende den Router, falls er als Dämon oder in einer anderen Konsole " "ausgeführt wird." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Ordnungsgemäßes Beenden kann bis zu 11 Minuten dauern." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "" "Beende den Router, falls er ausgeführt wird und dann starte ihn erneut." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Starte den Router neu, falls er momentan ausgeführt wird." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Aktuellen Status abfragen." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Installiere für automatischen Start wenn das System hochfährt." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Deinstallieren." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Falls gestartet, fordere einen Java Thread dump an" -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Bitte bearbeite i2prouter und setze die Variable RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "I2P als root Benutzer auszuführen ist *nicht* empfehlenswert." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "Um I2P trotzdem als root auszuführen bearbeite i2prouter und setze " diff --git a/installer/resources/locale/po/messages_en.po b/installer/resources/locale/po/messages_en.po index 81921f7f7..813b061ea 100644 --- a/installer/resources/locale/po/messages_en.po +++ b/installer/resources/locale/po/messages_en.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P startup script\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-02-18 20:15+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2012-12-21 23:34+0000\n" "Last-Translator: kytv \n" "Language-Team: English \n" @@ -22,176 +22,176 @@ msgstr "" msgid "Failed to load the wrapper" msgstr "" -#: ../i2prouter:943 ../i2prouter:967 ../i2prouter:1041 ../i2prouter:1069 -#: ../i2prouter:1090 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "" -#: ../i2prouter:954 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "" -#: ../i2prouter:974 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1021 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "" -#: ../i2prouter:1035 ../i2prouter:1063 ../i2prouter:1269 ../i2prouter:1558 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "" -#: ../i2prouter:1079 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1101 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1105 ../i2prouter:1173 ../i2prouter:1726 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "" -#: ../i2prouter:1118 ../i2prouter:1126 ../i2prouter:1188 ../i2prouter:1196 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1144 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "" -#: ../i2prouter:1158 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1161 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1169 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "" -#: ../i2prouter:1215 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "" -#: ../i2prouter:1220 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "" -#: ../i2prouter:1223 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" -#: ../i2prouter:1276 ../i2prouter:1288 ../i2prouter:1307 ../i2prouter:1324 -#: ../i2prouter:1391 ../i2prouter:1411 ../i2prouter:1425 ../i2prouter:1439 -#: ../i2prouter:1467 ../i2prouter:1505 ../i2prouter:1540 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "" -#: ../i2prouter:1279 ../i2prouter:1294 ../i2prouter:1396 ../i2prouter:1428 -#: ../i2prouter:1442 ../i2prouter:1456 ../i2prouter:1470 ../i2prouter:1508 -#: ../i2prouter:1543 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "" -#: ../i2prouter:1550 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "" -#: ../i2prouter:1566 ../i2prouter:1579 ../i2prouter:1593 ../i2prouter:1602 -#: ../i2prouter:1612 ../i2prouter:1636 ../i2prouter:1649 ../i2prouter:1661 -#: ../i2prouter:1679 ../i2prouter:1692 ../i2prouter:1706 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "" -#: ../i2prouter:1572 ../i2prouter:1587 ../i2prouter:1596 ../i2prouter:1606 -#: ../i2prouter:1617 ../i2prouter:1630 ../i2prouter:1642 ../i2prouter:1655 -#: ../i2prouter:1673 ../i2prouter:1686 ../i2prouter:1700 ../i2prouter:1711 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "" -#: ../i2prouter:1715 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "" -#: ../i2prouter:1802 +#: ../i2prouter:1841 msgid "Commands:" msgstr "" -#: ../i2prouter:1803 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "" -#: ../i2prouter:1804 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "" -#: ../i2prouter:1805 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "" -#: ../i2prouter:1806 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "" -#: ../i2prouter:1807 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "" -#: ../i2prouter:1808 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "" -#: ../i2prouter:1809 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "" -#: ../i2prouter:1810 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "" -#: ../i2prouter:1811 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "" -#: ../i2prouter:1812 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "" -#: ../i2prouter:1825 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "" -#: ../i2prouter:1830 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "" -#: ../i2prouter:1833 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" diff --git a/installer/resources/locale/po/messages_es.po b/installer/resources/locale/po/messages_es.po index 7b8d3fa30..fd12737dc 100644 --- a/installer/resources/locale/po/messages_es.po +++ b/installer/resources/locale/po/messages_es.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 19:59+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-08-11 14:15+0000\n" "Last-Translator: kytv \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/I2P/language/" @@ -24,183 +24,183 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Falló al cargar el " -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME está aún ejecutándose" -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Ejecutando $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Esperando a $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "CUIDADO: puede que $APP_LONG_NAME haya fallado al iniciarse." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Debe ser root para realizar esta acción" -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Iniciando $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Deteniendo $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME no estaba en ejecución." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "No se pudo detener $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Esperando a que salga de $APP_LONG_NAME" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "No se pudo detener $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Se detuvo $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Deteniendo $APP_LONG_NAME elegantemente" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME no está en ejecución." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME está en ejecución: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" "$APP_LONG_NAME ejecutándose: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "$APP_LONG_NAME está aún instalado" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Instalando el demonio $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "La instalación no está aún soportada por $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Eliminando el demonio $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "El demonio $APP_LONG_NAME no está instalado actualmente." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Eliminar no está actualmente soportado por $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Órdenes:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Ejecutar en la consola actual." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Iniciar en segundo plano como un proceso de demonio." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "" "Parar en caso de que esté ejecutándose como un demonio o en otra consola." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Parada segura, puede tardar hasta 11 minutos." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Parar si está ejecutándose y entonces iniciar." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Reiniciar sólo si ya se está ejecutando." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Consultar el estado actual." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Instalar para que se inicie automáticamente con el sistema." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Desinstalar." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Solicitar un volcado del hilo JAVA si se está ejecutando." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Por favor edite i2prouter e introduzca la variable RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "\"No\" se recomienda ejecutar I2P como root." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "Para ejecutar como root de todos modos, edite i2prouter y ponga la variable " diff --git a/installer/resources/locale/po/messages_fr.po b/installer/resources/locale/po/messages_fr.po index 8b2cb92a3..240be5675 100644 --- a/installer/resources/locale/po/messages_fr.po +++ b/installer/resources/locale/po/messages_fr.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 20:01+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-08-11 15:53+0000\n" "Last-Translator: kytv \n" "Language-Team: French (http://www.transifex.com/projects/p/I2P/language/" @@ -21,184 +21,184 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Echec de chargement du wrapper" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME fonctionne déjà." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Lancement de $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Attente de $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "AVERTISSEMENT : $APP_LONG_NAME peut avoir échoué à démarrer." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Vous devez être root pour accomplir cette action." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Démarrage de $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Arrêt de $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME ne fonctionnait pas." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Incapable de stopper $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "En attente que $APP_LONG_NAME existe" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Echec à stopper $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Stoppé $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Arrête $APP_LONG_NAME gracieusement" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME ne tourne pas." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME fait tourner: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" "$APP_LONG_NAME fait tourner: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "Le démon de $APP_LONG_NAME est déjà installé." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Installing le démon de $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Installation actuellement pas prise en charge pour $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Supprime le démon $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "Le démon $APP_LONG_NAME n'est actuellement pas installé." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Suppression actuellement pas prise en charge pour $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Commandes :" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Lancer dans la console actuelle." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Démarre en tâche de fond comme un processus démon." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Stopper s'il fonctionne comme un démon ou dans une autre console." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Stopper gracieusement, peut prendre jusqu'à 11 minutes." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Stopper si il marche et ensuite démarrer." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Redémarrer seulement si il est déjà en cours d'exécution." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Interroger l'état actuel." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "" "Installer pour lancer automatiquement quand le système système démarre." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Désinstalle." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Request a Java thread dump if running." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Veuillez éditer i2prouter et paramétrer la variable RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "" "Faire fonctionner I2P en tant qu'utilisateur root n'est *pas* recommandé." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "Pour exécuter en tant que root de toute façon, éditer i2prouter et mettre " diff --git a/installer/resources/locale/po/messages_id.po b/installer/resources/locale/po/messages_id.po index 877ee8d66..e755c2369 100644 --- a/installer/resources/locale/po/messages_id.po +++ b/installer/resources/locale/po/messages_id.po @@ -2,197 +2,200 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # Khairul Agasta , 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-02-06 18:28+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2014-08-29 06:04+0000\n" "Last-Translator: Khairul Agasta \n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/I2P/language/id/)\n" +"Language-Team: Indonesian (http://www.transifex.com/projects/p/I2P/language/" +"id/)\n" +"Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: id\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Gagal memuat wrapper" -#: ../i2prouter:943 ../i2prouter:967 ../i2prouter:1041 ../i2prouter:1069 -#: ../i2prouter:1090 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME sudah berjalan." -#: ../i2prouter:954 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Menjalankan $APP_LONG_NAME" -#: ../i2prouter:974 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Menunggu $APP_LONG_NAME" -#: ../i2prouter:1021 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "PERINGATAN: $APP_LONG_NAME mungkin gagal memulai." -#: ../i2prouter:1035 ../i2prouter:1063 ../i2prouter:1269 ../i2prouter:1558 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Harus sudah root untuk melaksanakan tindakan ini." -#: ../i2prouter:1079 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Memulai $APP_LONG_NAME" -#: ../i2prouter:1101 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Menghentikan $APP_LONG_NAME" -#: ../i2prouter:1105 ../i2prouter:1173 ../i2prouter:1726 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME tidak berjalan." -#: ../i2prouter:1118 ../i2prouter:1126 ../i2prouter:1188 ../i2prouter:1196 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Tidak dapat menghentikan $APP_LONG_NAME." -#: ../i2prouter:1144 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Menunggu $APP_LONG_NAME untuk mengakhiri" -#: ../i2prouter:1158 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Gagal menghentikan $APP_LONG_NAME." -#: ../i2prouter:1161 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME dihentikan." -#: ../i2prouter:1169 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Menghentikan $APP_LONG_NAME dengan halus" -#: ../i2prouter:1215 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME tidak berjalan." -#: ../i2prouter:1220 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME sedang berjalan: PID:$pid" -#: ../i2prouter:1223 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -msgstr "$APP_LONG_NAME sudah berjalan: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" +msgstr "" +"$APP_LONG_NAME sudah berjalan: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1276 ../i2prouter:1288 ../i2prouter:1307 ../i2prouter:1324 -#: ../i2prouter:1391 ../i2prouter:1411 ../i2prouter:1425 ../i2prouter:1439 -#: ../i2prouter:1467 ../i2prouter:1505 ../i2prouter:1540 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "Daemon $APP_LONG_NAME sudah terpasang." -#: ../i2prouter:1279 ../i2prouter:1294 ../i2prouter:1396 ../i2prouter:1428 -#: ../i2prouter:1442 ../i2prouter:1456 ../i2prouter:1470 ../i2prouter:1508 -#: ../i2prouter:1543 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Memasang daemon $APP_LONG_NAME" -#: ../i2prouter:1550 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Memasang saat ini tidak didukung untuk $DIST_OS" -#: ../i2prouter:1566 ../i2prouter:1579 ../i2prouter:1593 ../i2prouter:1602 -#: ../i2prouter:1612 ../i2prouter:1636 ../i2prouter:1649 ../i2prouter:1661 -#: ../i2prouter:1679 ../i2prouter:1692 ../i2prouter:1706 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Menghapus daemon $APP_LONG_NAME" -#: ../i2prouter:1572 ../i2prouter:1587 ../i2prouter:1596 ../i2prouter:1606 -#: ../i2prouter:1617 ../i2prouter:1630 ../i2prouter:1642 ../i2prouter:1655 -#: ../i2prouter:1673 ../i2prouter:1686 ../i2prouter:1700 ../i2prouter:1711 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "Daemon $APP_LONG_NAME saat ini belum dipasang" -#: ../i2prouter:1715 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Menghapus saat ini tidak didukung untuk $DIST_OS" -#: ../i2prouter:1802 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Perintah:" -#: ../i2prouter:1803 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Luncurkan dalam konsol saat ini." -#: ../i2prouter:1804 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Mulai di latar sebagai proses daemon." -#: ../i2prouter:1805 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Hentikan jika berjalan sebagai daemon atau pada konsol lain." -#: ../i2prouter:1806 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Menghentikan dengan halus, bisa memakan waktu hingga 11 menit." -#: ../i2prouter:1807 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Hentikan jika berjalan dan kemudian memulainya." -#: ../i2prouter:1808 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Memulai ulang hanya jika sudah berjalan." -#: ../i2prouter:1809 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Menanyakan status saat ini." -#: ../i2prouter:1810 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Pasang untuk memulai secara otomatis ketika sistem boot." -#: ../i2prouter:1811 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Copot." -#: ../i2prouter:1812 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Meminta thread buangan Java jika berjalan." -#: ../i2prouter:1825 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Silahkan mengedit i2prouter dan setel variabel RUN_AS_USER" +#: ../i2prouter:1864 +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "Silahkan mengedit /etc/default/i2p dan setel variabel RUN_AS_USER" -#: ../i2prouter:1830 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Menjalankan I2P sebagai pengguna root adalah *tidak* direkomendasikan." -#: ../i2prouter:1833 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Untuk menjalankan sebagai root, edit i2prouter dan setel ALLOW_ROOT=true." +#: ../i2prouter:1872 +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." +msgstr "" +"Untuk menjalankan sebagai root, edit /etc/default/i2p dan setel ALLOW_ROOT=true." diff --git a/installer/resources/locale/po/messages_it.po b/installer/resources/locale/po/messages_it.po index 1375c3407..8fb4ed3c2 100644 --- a/installer/resources/locale/po/messages_it.po +++ b/installer/resources/locale/po/messages_it.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 20:02+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-01-10 21:29+0000\n" "Last-Translator: BadCluster \n" "Language-Team: Italian (http://www.transifex.com/projects/p/I2P/language/" @@ -20,180 +20,180 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "" -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "" -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "" -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "" -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "" -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "" -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Istallazione non ancora supportata per $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "" -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Comandi:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "" -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "" -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "" -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "" -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "" -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "" -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "" -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "" -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "" -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "" -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "" -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" diff --git a/installer/resources/locale/po/messages_ja.po b/installer/resources/locale/po/messages_ja.po index 47260ffc2..294c82c74 100644 --- a/installer/resources/locale/po/messages_ja.po +++ b/installer/resources/locale/po/messages_ja.po @@ -2,197 +2,202 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # plazmism , 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:51+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2014-02-13 11:19+0000\n" "Last-Translator: plazmism \n" -"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/ja/)\n" +"Language-Team: Japanese (http://www.transifex.com/projects/p/I2P/language/" +"ja/)\n" +"Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "ラッパーの読み込みに失敗" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME がすでに起動中です。" -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "$APP_LONG_NAME を起動中" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "$APP_LONG_NAME を待機中" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "警告: $APP_LONG_NAME は開始に失敗したかもしれません。" -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "このアクションを実行するには、rootである必要があります。" -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "$APP_LONG_NAME を起動中" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "$APP_LONG_NAME を停止中" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME は起動していませんでした。" -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "$APP_LONG_NAME を停止できません。" -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "$APP_LONG_NAME が終了するのを待っています" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "$APP_LONG_NAME の停止に失敗しました。" -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME が停止しました。" -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "$APP_LONG_NAME を適切に停止中" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME は起動していません。" -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME は起動しています: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -msgstr "$APP_LONG_NAME は起動しています: PID:$pid、 ラッパー:$STATUS、 Java:$JAVASTATUS" +msgstr "" +"$APP_LONG_NAME は起動しています: PID:$pid、 ラッパー:$STATUS、 Java:" +"$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "$APP_LONG_NAME デーモンはすでにインストールされています。" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "$APP_LONG_NAME のデーモンをインストール中" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "$DIST_OS に現在サポートされていないインストール" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "$APP_LONG_NAME デーモンを削除中" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "$APP_LONG_NAME daemon は現在インストールされていません。" -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "$DIST_OS に現在サポートされていない削除" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "コマンド:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "現在のコンソールで起動。" -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "デーモンプロセスとしてバックグラウンドで開始" -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "デーモンとして、あるいは他のコンソールで起動中の場合停止" -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "適切に停、最大11分掛かる恐れがあります。" -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "起動中の場合、停止してから起動" -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "すでに起動中の場合のみ再起動。" -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "現在の状態を問い合わせ" -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "インストールして、システムのブート時に自動的に起動する。" -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "アンインストール。" -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "起動中の場合、 Java スレッドダンプを要求" -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "i2prouter を編集して、変数 RUN_AS_USER を設定してください" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "root ユーザーとしての I2P の起動は推奨され*ません*。" -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "とにかく root として起動し、 i2prouter を編集して、ALLOW_ROOT=true と設定する。" +msgstr "" +"とにかく root として起動し、 i2prouter を編集して、ALLOW_ROOT=true と設定す" +"る。" diff --git a/installer/resources/locale/po/messages_nl.po b/installer/resources/locale/po/messages_nl.po index 1b56d3ff6..210467672 100644 --- a/installer/resources/locale/po/messages_nl.po +++ b/installer/resources/locale/po/messages_nl.po @@ -2,197 +2,199 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # Nathan Follens, 2015 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-02-06 18:28+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2015-01-18 10:33+0000\n" "Last-Translator: Nathan Follens\n" "Language-Team: Dutch (http://www.transifex.com/projects/p/I2P/language/nl/)\n" +"Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Laden van wrapper mislukt" -#: ../i2prouter:943 ../i2prouter:967 ../i2prouter:1041 ../i2prouter:1069 -#: ../i2prouter:1090 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME draait al." -#: ../i2prouter:954 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "$APP_LONG_NAME draaien" -#: ../i2prouter:974 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Wachten op $APP_LONG_NAME" -#: ../i2prouter:1021 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "WAARSCHUWING: $APP_LONG_NAME is misschien niet gestart." -#: ../i2prouter:1035 ../i2prouter:1063 ../i2prouter:1269 ../i2prouter:1558 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Root vereist om deze handeling uit te voeren." -#: ../i2prouter:1079 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "$APP_LONG_NAME starten" -#: ../i2prouter:1101 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "$APP_LONG_NAME stoppen" -#: ../i2prouter:1105 ../i2prouter:1173 ../i2prouter:1726 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME draaide niet." -#: ../i2prouter:1118 ../i2prouter:1126 ../i2prouter:1188 ../i2prouter:1196 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Kon $APP_LONG_NAME niet stoppen." -#: ../i2prouter:1144 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Wachten op $APP_LONG_NAME om af te sluiten" -#: ../i2prouter:1158 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Stoppen van $APP_LONG_NAME mislukt." -#: ../i2prouter:1161 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME gestopt." -#: ../i2prouter:1169 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "$APP_LONG_NAME sierlijk stoppen" -#: ../i2prouter:1215 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME draait niet." -#: ../i2prouter:1220 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME draait: PID:$pid" -#: ../i2prouter:1223 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME draait: PID:$pid, Wrapper: $STATUS, Jave: $JAVASTATUS" -#: ../i2prouter:1276 ../i2prouter:1288 ../i2prouter:1307 ../i2prouter:1324 -#: ../i2prouter:1391 ../i2prouter:1411 ../i2prouter:1425 ../i2prouter:1439 -#: ../i2prouter:1467 ../i2prouter:1505 ../i2prouter:1540 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "De $APP_LONG_NAME daemon is al geïnstalleerd." -#: ../i2prouter:1279 ../i2prouter:1294 ../i2prouter:1396 ../i2prouter:1428 -#: ../i2prouter:1442 ../i2prouter:1456 ../i2prouter:1470 ../i2prouter:1508 -#: ../i2prouter:1543 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Bezig met installeren van de $APP_LONG_NAME daemon" -#: ../i2prouter:1550 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Installeren wordt momenteel niet ondersteund voor $DIST_OS" -#: ../i2prouter:1566 ../i2prouter:1579 ../i2prouter:1593 ../i2prouter:1602 -#: ../i2prouter:1612 ../i2prouter:1636 ../i2prouter:1649 ../i2prouter:1661 -#: ../i2prouter:1679 ../i2prouter:1692 ../i2prouter:1706 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Bezig met verwijderen van $APP_LONG_NAME daemon" -#: ../i2prouter:1572 ../i2prouter:1587 ../i2prouter:1596 ../i2prouter:1606 -#: ../i2prouter:1617 ../i2prouter:1630 ../i2prouter:1642 ../i2prouter:1655 -#: ../i2prouter:1673 ../i2prouter:1686 ../i2prouter:1700 ../i2prouter:1711 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "De $APP_LONG_NAME daemon is momenteel niet geïnstalleerd." -#: ../i2prouter:1715 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Verwijderen wordt momenteel niet ondersteund voor $DIST_OS" -#: ../i2prouter:1802 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Commando's:" -#: ../i2prouter:1803 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Starten in de huidige console." -#: ../i2prouter:1804 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Starten in de achtergrond als een daemon-proces." -#: ../i2prouter:1805 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Stop indien draaiende als een daemon of in een andere console." -#: ../i2prouter:1806 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Sierlijk stoppen, kan tot 11 minuten duren." -#: ../i2prouter:1807 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Indien draaiende, stop en start opnieuw." -#: ../i2prouter:1808 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Herstart enkel indien al draaiend." -#: ../i2prouter:1809 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "De huidige status opvragen." -#: ../i2prouter:1810 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Installeren om automatisch te starten wanneer het systeem opstart." -#: ../i2prouter:1811 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Verwijderen." -#: ../i2prouter:1812 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Vraag een Java thread dump indien draaiende." -#: ../i2prouter:1825 -msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Gelieve i2prouter te wijzigen en de variabele RUN_AS_USER in te stellen" +#: ../i2prouter:1864 +msgid "Please edit /etc/default/i2p and set the variable RUN_AS_USER" +msgstr "" +"Gelieve /etc/default/i2p te wijzigen en de variabele RUN_AS_USER in te stellen" -#: ../i2prouter:1830 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "I2P uitvoeren als root is *niet* aanbevolen." -#: ../i2prouter:1833 -msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Om toch als root uit te voeren, wijzig i2prouter en stel ALLOW_ROOT=true in." +#: ../i2prouter:1872 +msgid "To run as root anyway, edit /etc/default/i2p and set ALLOW_ROOT=true." +msgstr "" +"Om toch als root uit te voeren, wijzig /etc/default/i2p en stel ALLOW_ROOT=true in." diff --git a/installer/resources/locale/po/messages_pl.po b/installer/resources/locale/po/messages_pl.po index f345ede4f..9f691a9d4 100644 --- a/installer/resources/locale/po/messages_pl.po +++ b/installer/resources/locale/po/messages_pl.po @@ -2,197 +2,202 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # sebx, 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:51+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2014-02-05 22:18+0000\n" "Last-Translator: sebx\n" -"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/pl/)\n" +"Language-Team: Polish (http://www.transifex.com/projects/p/I2P/language/" +"pl/)\n" +"Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pl\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Nie udało uruchomić się osłony" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME jest już uruchomione." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Uruchomione $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Czeka na $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "UWAGA: $APP_LONG_NAME mogło się nie uruchomić." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Musisz mieć prawa roota, aby wykonać daną czynność." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Trwa uruchamianie $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Zatrzymywanie $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME nie było uruchomione." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Nie można zatrzymać $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Trwa czekanie na wyłączenie $APP_LONG_NAME" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Nie udało się wyłączyć $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Zatrzymano $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Zatrzymywanie $APP_LONG_NAME" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr " $APP_LONG_NAME nie jest włączone." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME jest uruchomione: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -msgstr "$APP_LONG_NAME jest uruchomione: PID:$pid, Osłona:$STATUS, Java:$JAVASTATUS" +msgstr "" +"$APP_LONG_NAME jest uruchomione: PID:$pid, Osłona:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "The $APP_LONG_NAME daemon jest już zainstalowany." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Instalacja deamona $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Instalacja nie jest obecnie obsługiwana dla $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Usuwanie deamona $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "Deamon $APP_LONG_NAME nie jest obecnie zainstalowany." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Usunięcie obecnie jest jest obsługiwane dla $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Polecenia:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Odpal w obecnej konsoli." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Uruchom w tle jako proces deamon." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." -msgstr "Zatrzymaj jeśli jest uruchomione jako deamon lub jest uruchomione w innej konsoli." +msgstr "" +"Zatrzymaj jeśli jest uruchomione jako deamon lub jest uruchomione w innej " +"konsoli." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Wdzięczne zatrzymanie może potrwać nawet 11 minut." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Zatrzymaj jeśli działa i uruchom ponownie." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Zrestartuj tylko wtedy jeśli jest już uruchomione." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Zbadaj aktualny stan." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Zainstaluj aby uruchomić automatycznie przy starcie systemu." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Odinstaluj." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Zażądaj zrzutu wątków Java jeśli jest uruchomiona." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Proszę edytuj i2prouter i ustaw zmienną RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Nie jest polecane uruchamianie I2P jako root." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "Aby uruchomić jako root, edytuj i2prouter i ustaw ALLOW_ROOT=true." diff --git a/installer/resources/locale/po/messages_pt.po b/installer/resources/locale/po/messages_pt.po index ba0907e40..5a6f715fb 100644 --- a/installer/resources/locale/po/messages_pt.po +++ b/installer/resources/locale/po/messages_pt.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-08-11 15:44+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-06-17 20:59+0000\n" "Last-Translator: rafaelbf\n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/I2P/language/" @@ -21,182 +21,182 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Falha ao iniciar wrapper" -#: ../i2prouter:908 ../i2prouter:935 ../i2prouter:1009 ../i2prouter:1037 -#: ../i2prouter:1061 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME já se encontra em funcionamento." -#: ../i2prouter:919 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "$APP_LONG_NAME Iniciado" -#: ../i2prouter:942 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "À espera de $APP_LONG_NAME" -#: ../i2prouter:989 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "Aviso: $APP_LONG_NAME pode ter falhado a ser iniciado." -#: ../i2prouter:1003 ../i2prouter:1031 ../i2prouter:1240 ../i2prouter:1529 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Tem de ser root para realizar esta ação." -#: ../i2prouter:1047 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "A Iniciar $APP_LONG_NAME" -#: ../i2prouter:1072 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "A encerrar $APP_LONG_NAME" -#: ../i2prouter:1076 ../i2prouter:1144 ../i2prouter:1697 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME não foi iniciado." -#: ../i2prouter:1089 ../i2prouter:1097 ../i2prouter:1159 ../i2prouter:1167 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Incapaz de encerrar $APP_LONG_NAME." -#: ../i2prouter:1115 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "À espera de $APP_LONG_NAME para encerrar." -#: ../i2prouter:1129 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Falhou o encerramento de $APP_LONG_NAME." -#: ../i2prouter:1132 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME Encerrado." -#: ../i2prouter:1140 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "A parar $APP_LONG_NAME graciosamente" -#: ../i2prouter:1186 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME não foi iniciado." -#: ../i2prouter:1191 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME foi iniciado: PID:$pid" -#: ../i2prouter:1194 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "" "$APP_LONG_NAME foi iniciado: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1247 ../i2prouter:1259 ../i2prouter:1278 ../i2prouter:1295 -#: ../i2prouter:1362 ../i2prouter:1382 ../i2prouter:1396 ../i2prouter:1410 -#: ../i2prouter:1438 ../i2prouter:1476 ../i2prouter:1511 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "O daemon $APP_LONG_NAME já foi instalado." -#: ../i2prouter:1250 ../i2prouter:1265 ../i2prouter:1367 ../i2prouter:1399 -#: ../i2prouter:1413 ../i2prouter:1427 ../i2prouter:1441 ../i2prouter:1479 -#: ../i2prouter:1514 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "A instalar daemon $APP_LONG_NAME" -#: ../i2prouter:1521 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "A instalação neste momento não é suportada para $DIST_OS" -#: ../i2prouter:1537 ../i2prouter:1550 ../i2prouter:1564 ../i2prouter:1573 -#: ../i2prouter:1583 ../i2prouter:1607 ../i2prouter:1620 ../i2prouter:1632 -#: ../i2prouter:1650 ../i2prouter:1663 ../i2prouter:1677 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "A remover daemon $APP_LONG_NAME" -#: ../i2prouter:1543 ../i2prouter:1558 ../i2prouter:1567 ../i2prouter:1577 -#: ../i2prouter:1588 ../i2prouter:1601 ../i2prouter:1613 ../i2prouter:1626 -#: ../i2prouter:1644 ../i2prouter:1657 ../i2prouter:1671 ../i2prouter:1682 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "O daemon $APP_LONG_NAME não se encontra instalado neste momento." -#: ../i2prouter:1686 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "A remoção neste momento não é suportada para $DIST_OS" -#: ../i2prouter:1773 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Comandos: " -#: ../i2prouter:1774 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Inicie na consola atual." -#: ../i2prouter:1775 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "A iniciar no background como processo daemon." -#: ../i2prouter:1776 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Pare se iniciado como daemon ou noutra consola." -#: ../i2prouter:1777 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Pare graciosamente, pode demorar ate 11 minutos." -#: ../i2prouter:1778 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Pare se iniciado e depois inicie." -#: ../i2prouter:1779 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Reinicie apenas se já estiver iniciado." -#: ../i2prouter:1780 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Consultar o status atual." -#: ../i2prouter:1781 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Instale para iniciar automaticamente quando o sistema iniciar." -#: ../i2prouter:1782 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Desinstalar." -#: ../i2prouter:1783 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Requisitar o histórico Java se iniciado." -#: ../i2prouter:1796 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Favor editar o arquivo i2prouter e configurar a variável RUN_AS_USER" -#: ../i2prouter:1801 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Iniciar I2P como permissões root *não* é recomendado." -#: ../i2prouter:1804 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "Para executar como root mesmo assim, editar o i2prouter e configurar a " diff --git a/installer/resources/locale/po/messages_pt_BR.po b/installer/resources/locale/po/messages_pt_BR.po index 150a70c83..21cdba79e 100644 --- a/installer/resources/locale/po/messages_pt_BR.po +++ b/installer/resources/locale/po/messages_pt_BR.po @@ -2,198 +2,203 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: +# testsubject67 , 2014 # blueboy, 2013 +# blueboy, 2015 # blueboy, 2014 msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:51+0000\n" -"PO-Revision-Date: 2014-01-31 16:45+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" +"PO-Revision-Date: 2015-05-07 03:44+0000\n" "Last-Translator: blueboy\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/language/pt_BR/)\n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/I2P/" +"language/pt_BR/)\n" +"Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" -msgstr "Falha ao carregar o empacotador." +msgstr "Falha ao carregar o encapsulador." -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME já está sendo executado." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Executando $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Esperando por $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "AVISO: $APP_LONG_NAME talvez tenha falhado ao inicializar." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Esta ação exige previlégios de root para ser realizada." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Inicializando $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Interrompendo $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME não estava sendo executado." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Impossibilitado de interromper $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Aguardando $APP_LONG_NAME terminar" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Falha ao interromper $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." -msgstr "" +msgstr "$APP_LONG_NAME parado." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" -msgstr "" +msgstr "Graciosamente parando $APP_LONG_NAME" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." -msgstr "" +msgstr "$APP_LONG_NAME não está sendo executado" -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" -msgstr "" +msgstr "$APP_LONG_NAME está sendo executado: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -msgstr "" +msgstr "$APP_LONG_NAME está sendo executado: PID:$pid, Envoltório:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." -msgstr "" +msgstr "O daemon $APP_LONG_NAME já está instalado" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" -msgstr "" +msgstr "Instalando o daemon $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "A instalação não possui atualmente suporte para $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" -msgstr "" +msgstr "Removendo daemon $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." -msgstr "" +msgstr "O daemon $APP_LONG_NAME não está instalado." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" -msgstr "" +msgstr "Remoção não suportada por $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Comandos:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." -msgstr "" +msgstr "Lançar em atual console." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Inicializar executando ao fundo, como um processo daemon." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Pare se estiver sendo executado como um daemon ou em um outro console." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." -msgstr "" +msgstr "Graciosamente pare, poderá demorar até 11 minutos." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Pare, se estiver sendo executado, e então inicialize." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Reinicialize apenas se já estiver sendo executado." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." -msgstr "" +msgstr "Duvide do status atual." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." -msgstr "" +msgstr "Instalar para automaticamente começar com o sistema." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Desinstalar." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." -msgstr "" +msgstr "Solicitar um despejo de thread se está sendo executado." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Por favor, edite i2prouter e especifique a variável RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Executar o roteador I2P como usuário root *não* é recomendado." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "De qualquer forma, se quiser mesmo executar o roteador como root, edite i2prouter e ponha ALLOW_ROOT=true." +msgstr "" +"De qualquer forma, se quiser mesmo executar o roteador como root, edite " +"i2prouter e ponha ALLOW_ROOT=true." diff --git a/installer/resources/locale/po/messages_ro.po b/installer/resources/locale/po/messages_ro.po index 453785f61..56a3a73c9 100644 --- a/installer/resources/locale/po/messages_ro.po +++ b/installer/resources/locale/po/messages_ro.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:03+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-11-11 13:00+0000\n" "Last-Translator: polearnik \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/I2P/language/" @@ -20,181 +20,181 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" "2:1));\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Încărcarea învelișului a eșuat" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME este deja pornit." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Pornirea $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Asteptarea $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "AVERTIZARE: $APP_LONG_NAME posibil nu au reușit să porneasca." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Trebuie să fie root pentru a efectua această acțiune." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Pornirea $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Oprirea $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME nu este pornit." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Imposibil de a opri $APP_LONG_NAME" -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Asteptarea opririi $APP_LONG_NAME" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Oprirea $APP_LONG_NAME a esuat" -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME este oprit" -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Oprirea corecta a $APP_LONG_NAME" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME nu este pornit." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME este pornit: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME este pornit: PID:$pid,invelis:$STATUS Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "Demonul $APP_LONG_NAME este deja instalat" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Instalarea demonului $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Instalarea nu este suportata în prezent pentru $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Stergerea demonului $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "Demonul $APP_LONG_NAME nu este instalat" -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Ștergerea nu este suportata în prezent pentru $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Comenzi:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Pornirea in consola curenta" -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Începe în fundal ca un proces daemon." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Oprirea dacă rulează ca un demon sau într-o altă consolă." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Oprirea corecta poate ocupa peste 11 minute" -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Oprirea dacă rulează și apoi pornește." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Repornirea numai dacă deja rulează." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Interogarea stării curentă." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Instalare pentru pornirea automata la startul sistemului." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Dezinstalează" -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Solicitarea dump-ului firului Java daca este pornit" -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Vă rugăm să editați i2prouter și setați variabila RUN_AS_USER " -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Rularea I2P ca root *nu* este recomandată." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "Pentru a rula ca root, oricum, editati i2prouter și setați ALLOW_ROOT = " diff --git a/installer/resources/locale/po/messages_ru.po b/installer/resources/locale/po/messages_ru.po index 90e4e8cb1..a46424585 100644 --- a/installer/resources/locale/po/messages_ru.po +++ b/installer/resources/locale/po/messages_ru.po @@ -2,7 +2,7 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # varnav, 2013 # nefelim4ag , 2012 @@ -14,190 +14,195 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:51+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2014-01-11 08:32+0000\n" "Last-Translator: sr4d \n" -"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/language/ru_RU/)\n" +"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/I2P/" +"language/ru_RU/)\n" +"Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: ru_RU\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" +"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" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Не удалось загрузить оболочку" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "Приложение \"$APP_LONG_NAME\" уже запущено." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Приложение \"$APP_LONG_NAME\" запущено" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Ожидание приложения \"$APP_LONG_NAME\"" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "Внимание: возможно, не удалось запустить $APP_LONG_NAME." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Для выполнения этого действия необходимо быть root-пользователем." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Запуск приложения \"$APP_LONG_NAME\"" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Остановка приложения \"$APP_LONG_NAME\"" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "Приложение \"$APP_LONG_NAME\" не было запущено." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Невозможно остановить приложение \"$APP_LONG_NAME\"." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Ожидание завершения работы приложения \"$APP_LONG_NAME\"" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Ошибка остановки $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Остановленно $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "$APP_LONG_NAME мягко останавливается" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME не запущен." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME запущено: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME запущено: PID:$pid, Оболочка:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "Демон $APP_LONG_NAME уже установлен." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Установка демона $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "В данный момент установка на $DIST_OS не поддерживается" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Удаляется демон: $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "$APP_LONG_NAME демон сейчас не установлен." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Установка не поддерживается для $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Команды:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Запустить в текущей консоли." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Запустить в фоне как демона." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Остановить если демон запущен в другой консоли." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Остановить медленно, может отнять до 11 минут." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Остановить если запущен и запустить." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Перезапустить только если уже запущен." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Текущий статус очереди." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Установка запустится автоматически, во время запуска системы." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Удаление." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Запросить дамп нитей Java, если запущено." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" -msgstr "Пожалуйста, отредактируйте i2prouter и установите переменную RUN_AS_USER" +msgstr "" +"Пожалуйста, отредактируйте i2prouter и установите переменную RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Запускать I2P от имени root'а *НЕ* рекомендуется." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Чтобы всё равно запустить под root'ом, отредактируйте i2prouter и установите ALLOW_ROOT=true." +msgstr "" +"Чтобы всё равно запустить под root'ом, отредактируйте i2prouter и установите " +"ALLOW_ROOT=true." diff --git a/installer/resources/locale/po/messages_sk.po b/installer/resources/locale/po/messages_sk.po index 53d6303f1..4a40f3f54 100644 --- a/installer/resources/locale/po/messages_sk.po +++ b/installer/resources/locale/po/messages_sk.po @@ -2,7 +2,7 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # Krantišek , 2014 # Svistwarrior273 , 2014 @@ -10,190 +10,194 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-11-19 23:51+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2014-04-15 15:38+0000\n" "Last-Translator: Svistwarrior273 \n" -"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/sk/)\n" +"Language-Team: Slovak (http://www.transifex.com/projects/p/I2P/language/" +"sk/)\n" +"Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: sk\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Nepodarilo sa načítať wrapper" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME je už spustená." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Spúšťa sa $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Čaká sa na $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "UPOZORNENIE: $APP_LONG_NAME môže pri štarte zlyhať." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Pre vykonanie tejto akcie musíš byť root." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Spúšťa sa $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Zastavuje sa $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME nebola sputená." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Nemožno zastaviť $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Čakám na $APP_LONG_NAME pre ukončenie" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Nepodarilo sa zastaviť $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Zastavené $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Zastavuje sa $APP_LONG_NAME elegantne" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME nie je spustená." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME je spustená: PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -msgstr "$APP_LONG_NAME je spustená: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" +msgstr "" +"$APP_LONG_NAME je spustená: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "$APP_LONG_NAME daemon je už nainštalovaný." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Inštaluje sa $APP_LONG_NAME daemon" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Inštalácia momentálne nie je podporovaná pre $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Odstraňuje sa $APP_LONG_NAME daemon" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "$APP_LONG_NAME daemon momentálne nie je nainštalovaný." -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Odstránenie momentálne nie je podporované pre $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Príkazy:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Spustiť v aktuálnej konzole." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Spustiť na pozadí ako daemon proces." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Zastaviť, ak je spustený ako daemon alebo v inej konzoli." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Zastaviť jemným spôsobom, môže to zabrať až 11 minút." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Zastaviť, ak je spustený a potom znova spustiť." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Reštartovať, iba ak je už spustený." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Poslať požiadavku na zistenie súčasného stavu." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Nainštalovať tak, aby sa spustil automaticky pri boote systému." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Odinštalovať." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Vyžiadať zrušenie vlákna Javy, ak je spustený." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Prosím upravte i2prouter a nastavte premennú RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Spúšťať I2P ako root *nie* je odporúčané." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Ak ho chcete spustiť ako root aj tak, upravte i2prouter a nastavte ALLOW_ROOT=true." +msgstr "" +"Ak ho chcete spustiť ako root aj tak, upravte i2prouter a nastavte " +"ALLOW_ROOT=true." diff --git a/installer/resources/locale/po/messages_sv.po b/installer/resources/locale/po/messages_sv.po index e1bd95f65..bfbfad9e8 100644 --- a/installer/resources/locale/po/messages_sv.po +++ b/installer/resources/locale/po/messages_sv.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 20:05+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-09-11 22:20+0000\n" "Last-Translator: hottuna \n" "Language-Team: Swedish (Sweden) (http://www.transifex.com/projects/p/I2P/" @@ -20,181 +20,181 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Misslyckades vid laddning av wrapper" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME körs redan." -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "Kör $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "Väntar på $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "VARNING: $APP_LONG_NAME kan ha misslyckats att starta." -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Handlingen måste göras av root." -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "Startar $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "Stannar $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME kördes inte." -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "Kan inte stoppa $APP_LONG_NAME." -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "Väntar på att $APP_LONG_NAME ska avslutas" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "Misslyckades med att stanna $APP_LONG_NAME." -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "Stannad $APP_LONG_NAME." -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "Stannar $APP_LONG_NAME graciöst" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME körs inte." -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME kör: PID$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME kör: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "$APP_LONG_NAME demonen är redan installerad." -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "Installerar $APP_LONG_NAME demon" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "Installation stöds inte för $DIST_OS" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "Tar bort $APP_LONG_NAME demon" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "$APP_LONG_NAME demonen är inte installerad" -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "Borttagning stöds inte för $DIST_OS" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Kommandon:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Kör in nuvarande konsoll." -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Starta i bakgrunden som en demon-process." -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "Stanna om demon körs i annan konsoll." -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Stanna graciöst, kan ta upp till 11 minuter." -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Stanna vid drift och starta sedan." -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Starta om vid drift." -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Fråga efter nuvarande status." -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Installera så att programmet startar vid systemstart." -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Avinstallera." -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Fråga efter en Java thread dump vid drift." -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "Var god ändra i2prouter och set variabeln RUN_AS_USER" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "Att köra I2P som användare root är *inte* rekommenderat." -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "" "För att köra som root oavsett, ändra i2prouter och sätt ALLOW_ROOT=true" diff --git a/installer/resources/locale/po/messages_tr.po b/installer/resources/locale/po/messages_tr.po index 38515ae82..1e1ec48a7 100644 --- a/installer/resources/locale/po/messages_tr.po +++ b/installer/resources/locale/po/messages_tr.po @@ -2,197 +2,201 @@ # Copyright (C) 2012 The I2P Project # This file is distributed under the same license as the routerconsole package. # To contribute translations, see http://www.i2p2.de/newdevelopers -# +# # Translators: # Kaya Zeren , 2013 msgid "" msgstr "" "Project-Id-Version: I2P\n" -"Report-Msgid-Bugs-To: https://trac.i2p2.de/\n" -"POT-Creation-Date: 2013-07-04 16:43+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-07-11 20:20+0000\n" "Last-Translator: Kaya Zeren \n" -"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/language/tr_TR/)\n" +"Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/I2P/" +"language/tr_TR/)\n" +"Language: tr_TR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: tr_TR\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "Sarıcı yüklenemedi" -#: ../i2prouter:908 ../i2prouter:935 ../i2prouter:1009 ../i2prouter:1037 -#: ../i2prouter:1061 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME zaten çalışıyor." -#: ../i2prouter:919 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "$APP_LONG_NAME çalışıyor" -#: ../i2prouter:942 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "$APP_LONG_NAME bekleniyor" -#: ../i2prouter:989 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "DİKKAT: $APP_LONG_NAME başlatılamamış olabilir." -#: ../i2prouter:1003 ../i2prouter:1031 ../i2prouter:1240 ../i2prouter:1529 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "Bu işlemi ancak root yapabilir." -#: ../i2prouter:1047 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "$APP_LONG_NAME başlatılıyor" -#: ../i2prouter:1072 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "$APP_LONG_NAME durduruluyor" -#: ../i2prouter:1076 ../i2prouter:1144 ../i2prouter:1697 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME çalışmıyordu." -#: ../i2prouter:1089 ../i2prouter:1097 ../i2prouter:1159 ../i2prouter:1167 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "$APP_LONG_NAME durdurulamıyor." -#: ../i2prouter:1115 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "$APP_LONG_NAME kapanması bekleniyor" -#: ../i2prouter:1129 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "$APP_LONG_NAME durdurulamadı." -#: ../i2prouter:1132 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME durduruldu." -#: ../i2prouter:1140 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "$APP_LONG_NAME düzgün şekilde kapatıldı" -#: ../i2prouter:1186 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME çalışmıyor." -#: ../i2prouter:1191 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME çalışıyor: PID:$pid" -#: ../i2prouter:1194 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME çalışıyor: PID:$pid, Sarıcı:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1247 ../i2prouter:1259 ../i2prouter:1278 ../i2prouter:1295 -#: ../i2prouter:1362 ../i2prouter:1382 ../i2prouter:1396 ../i2prouter:1410 -#: ../i2prouter:1438 ../i2prouter:1476 ../i2prouter:1511 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "$APP_LONG_NAME arka plan hizmeti zaten yüklenmiş." -#: ../i2prouter:1250 ../i2prouter:1265 ../i2prouter:1367 ../i2prouter:1399 -#: ../i2prouter:1413 ../i2prouter:1427 ../i2prouter:1441 ../i2prouter:1479 -#: ../i2prouter:1514 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "$APP_LONG_NAME arka plan hizmeti yükleniyor" -#: ../i2prouter:1521 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "$DIST_OS üzerine yükleme desteklenmiyor" -#: ../i2prouter:1537 ../i2prouter:1550 ../i2prouter:1564 ../i2prouter:1573 -#: ../i2prouter:1583 ../i2prouter:1607 ../i2prouter:1620 ../i2prouter:1632 -#: ../i2prouter:1650 ../i2prouter:1663 ../i2prouter:1677 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "$APP_LONG_NAME arka plan hizmeti kaldırılıyor" -#: ../i2prouter:1543 ../i2prouter:1558 ../i2prouter:1567 ../i2prouter:1577 -#: ../i2prouter:1588 ../i2prouter:1601 ../i2prouter:1613 ../i2prouter:1626 -#: ../i2prouter:1644 ../i2prouter:1657 ../i2prouter:1671 ../i2prouter:1682 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "$APP_LONG_NAME arka plan hizmeti yüklü değil." -#: ../i2prouter:1686 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "$DIST_OS üzerinden kaldırma desteklenmiyor" -#: ../i2prouter:1773 +#: ../i2prouter:1841 msgid "Commands:" msgstr "Komutlar:" -#: ../i2prouter:1774 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "Geçerli konsolda başlatın." -#: ../i2prouter:1775 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "Arka plan hizmeti olarak başlatın." -#: ../i2prouter:1776 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." -msgstr "Arka plan hizmeti olarak ya da başka bir konsolda çalışıyorsa durdurun." +msgstr "" +"Arka plan hizmeti olarak ya da başka bir konsolda çalışıyorsa durdurun." -#: ../i2prouter:1777 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "Uygun şekilde kapatın. 11 dakika sürebilir." -#: ../i2prouter:1778 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "Çalışıyorsa durdurun ve başlatın." -#: ../i2prouter:1779 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "Yalnız zaten çalışıyorsa yeniden başlatın." -#: ../i2prouter:1780 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "Geçerli durumu öğrenin." -#: ../i2prouter:1781 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "Sistem açılırken kendiliğinden yüklensin." -#: ../i2prouter:1782 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "Kaldırın." -#: ../i2prouter:1783 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "Çalışıyorsa Java iş parçacığı dökümü isteyin." -#: ../i2prouter:1796 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "i2prouter dosyasını düzenleyin ve RUN_AS_USER değişkenini ayarlayın" -#: ../i2prouter:1801 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "I2P yazılımının root olarak çalıştırmanız *önerilmez*." -#: ../i2prouter:1804 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." -msgstr "Root olarak çalıştırmak için i2prouter dosyasını düzenleyin ve ALLOW_ROOT=true ayarını yapın." +msgstr "" +"Root olarak çalıştırmak için i2prouter dosyasını düzenleyin ve " +"ALLOW_ROOT=true ayarını yapın." diff --git a/installer/resources/locale/po/messages_zh.po b/installer/resources/locale/po/messages_zh.po index aeb3ce859..902cec7a7 100644 --- a/installer/resources/locale/po/messages_zh.po +++ b/installer/resources/locale/po/messages_zh.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: I2P\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-12-01 19:57+0000\n" +"POT-Creation-Date: 2015-07-17 01:16+0000\n" "PO-Revision-Date: 2013-07-11 07:19+0000\n" "Last-Translator: xtoaster \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/I2P/" @@ -20,180 +20,180 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../i2prouter:203 +#: ../i2prouter:221 msgid "Failed to load the wrapper" msgstr "封装程序载入失败" -#: ../i2prouter:925 ../i2prouter:949 ../i2prouter:1023 ../i2prouter:1051 -#: ../i2prouter:1072 +#: ../i2prouter:978 ../i2prouter:1006 ../i2prouter:1080 ../i2prouter:1108 +#: ../i2prouter:1129 #, sh-format msgid "$APP_LONG_NAME is already running." msgstr "$APP_LONG_NAME 已运行。" -#: ../i2prouter:936 +#: ../i2prouter:989 #, sh-format msgid "Running $APP_LONG_NAME" msgstr "正在运行 $APP_LONG_NAME" -#: ../i2prouter:956 +#: ../i2prouter:1013 #, sh-format msgid "Waiting for $APP_LONG_NAME" msgstr "正在等待 $APP_LONG_NAME" -#: ../i2prouter:1003 +#: ../i2prouter:1060 #, sh-format msgid "WARNING: $APP_LONG_NAME may have failed to start." msgstr "警告:$APP_LONG_NAME 可能启动失败。" -#: ../i2prouter:1017 ../i2prouter:1045 ../i2prouter:1251 ../i2prouter:1540 +#: ../i2prouter:1074 ../i2prouter:1102 ../i2prouter:1308 ../i2prouter:1597 msgid "Must be root to perform this action." msgstr "root 才能执行此操作。" -#: ../i2prouter:1061 +#: ../i2prouter:1118 #, sh-format msgid "Starting $APP_LONG_NAME" msgstr "正在启动 $APP_LONG_NAME" -#: ../i2prouter:1083 +#: ../i2prouter:1140 #, sh-format msgid "Stopping $APP_LONG_NAME" msgstr "正在停止 $APP_LONG_NAME" -#: ../i2prouter:1087 ../i2prouter:1155 ../i2prouter:1708 +#: ../i2prouter:1144 ../i2prouter:1212 ../i2prouter:1765 #, sh-format msgid "$APP_LONG_NAME was not running." msgstr "$APP_LONG_NAME 未运行" -#: ../i2prouter:1100 ../i2prouter:1108 ../i2prouter:1170 ../i2prouter:1178 +#: ../i2prouter:1157 ../i2prouter:1165 ../i2prouter:1227 ../i2prouter:1235 #, sh-format msgid "Unable to stop $APP_LONG_NAME." msgstr "无法停止 $APP_LONG_NAME" -#: ../i2prouter:1126 +#: ../i2prouter:1183 #, sh-format msgid "Waiting for $APP_LONG_NAME to exit" msgstr "正在等待 $APP_LONG_NAME 退出" -#: ../i2prouter:1140 +#: ../i2prouter:1197 #, sh-format msgid "Failed to stop $APP_LONG_NAME." msgstr "无法停止 $APP_LONG_NAME。" -#: ../i2prouter:1143 +#: ../i2prouter:1200 #, sh-format msgid "Stopped $APP_LONG_NAME." msgstr "$APP_LONG_NAME 已停止。" -#: ../i2prouter:1151 +#: ../i2prouter:1208 #, sh-format msgid "Stopping $APP_LONG_NAME gracefully" msgstr "正在等待 $APP_LONG_NAME 自然关闭" -#: ../i2prouter:1197 +#: ../i2prouter:1254 #, sh-format msgid "$APP_LONG_NAME is not running." msgstr "$APP_LONG_NAME 未运行" -#: ../i2prouter:1202 +#: ../i2prouter:1259 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid" msgstr "$APP_LONG_NAME 已运行:PID:$pid" -#: ../i2prouter:1205 +#: ../i2prouter:1262 #, sh-format msgid "$APP_LONG_NAME is running: PID:$pid, Wrapper:$STATUS, Java:$JAVASTATUS" msgstr "$APP_LONG_NAME 已运行:PID:$pid, 封装:$STATUS, Java:$JAVASTATUS" -#: ../i2prouter:1258 ../i2prouter:1270 ../i2prouter:1289 ../i2prouter:1306 -#: ../i2prouter:1373 ../i2prouter:1393 ../i2prouter:1407 ../i2prouter:1421 -#: ../i2prouter:1449 ../i2prouter:1487 ../i2prouter:1522 +#: ../i2prouter:1315 ../i2prouter:1327 ../i2prouter:1346 ../i2prouter:1363 +#: ../i2prouter:1430 ../i2prouter:1450 ../i2prouter:1464 ../i2prouter:1478 +#: ../i2prouter:1506 ../i2prouter:1544 ../i2prouter:1579 #, sh-format msgid "The $APP_LONG_NAME daemon is already installed." msgstr "后台服务 $APP_LONG_NAME 已运行。" -#: ../i2prouter:1261 ../i2prouter:1276 ../i2prouter:1378 ../i2prouter:1410 -#: ../i2prouter:1424 ../i2prouter:1438 ../i2prouter:1452 ../i2prouter:1490 -#: ../i2prouter:1525 +#: ../i2prouter:1318 ../i2prouter:1333 ../i2prouter:1435 ../i2prouter:1467 +#: ../i2prouter:1481 ../i2prouter:1495 ../i2prouter:1509 ../i2prouter:1547 +#: ../i2prouter:1582 #, sh-format msgid "Installing the $APP_LONG_NAME daemon" msgstr "正在安装后台服务 $APP_LONG_NAME" -#: ../i2prouter:1532 +#: ../i2prouter:1589 #, sh-format msgid "Install not currently supported for $DIST_OS" msgstr "暂不支持 $DIST_OS 平台上的安装" -#: ../i2prouter:1548 ../i2prouter:1561 ../i2prouter:1575 ../i2prouter:1584 -#: ../i2prouter:1594 ../i2prouter:1618 ../i2prouter:1631 ../i2prouter:1643 -#: ../i2prouter:1661 ../i2prouter:1674 ../i2prouter:1688 +#: ../i2prouter:1605 ../i2prouter:1618 ../i2prouter:1632 ../i2prouter:1641 +#: ../i2prouter:1651 ../i2prouter:1675 ../i2prouter:1688 ../i2prouter:1700 +#: ../i2prouter:1718 ../i2prouter:1731 ../i2prouter:1745 #, sh-format msgid "Removing $APP_LONG_NAME daemon" msgstr "正在删除后台服务 $APP_LONG_NAME" -#: ../i2prouter:1554 ../i2prouter:1569 ../i2prouter:1578 ../i2prouter:1588 -#: ../i2prouter:1599 ../i2prouter:1612 ../i2prouter:1624 ../i2prouter:1637 -#: ../i2prouter:1655 ../i2prouter:1668 ../i2prouter:1682 ../i2prouter:1693 +#: ../i2prouter:1611 ../i2prouter:1626 ../i2prouter:1635 ../i2prouter:1645 +#: ../i2prouter:1656 ../i2prouter:1669 ../i2prouter:1681 ../i2prouter:1694 +#: ../i2prouter:1712 ../i2prouter:1725 ../i2prouter:1739 ../i2prouter:1750 #, sh-format msgid "The $APP_LONG_NAME daemon is not currently installed." msgstr "后台服务 $APP_LONG_NAME 未安装。" -#: ../i2prouter:1697 +#: ../i2prouter:1754 #, sh-format msgid "Remove not currently supported for $DIST_OS" msgstr "暂不支持 $DIST_OS 平台上的删除" -#: ../i2prouter:1784 +#: ../i2prouter:1841 msgid "Commands:" msgstr "命令:" -#: ../i2prouter:1785 +#: ../i2prouter:1842 msgid "Launch in the current console." msgstr "从当前控制台中启动。" -#: ../i2prouter:1786 +#: ../i2prouter:1843 msgid "Start in the background as a daemon process." msgstr "作为服务进程从后台启动。" -#: ../i2prouter:1787 +#: ../i2prouter:1844 msgid "Stop if running as a daemon or in another console." msgstr "关闭作为服务进程或从其他控制台启动的I2P。" -#: ../i2prouter:1788 +#: ../i2prouter:1845 msgid "Stop gracefully, may take up to 11 minutes." msgstr "自然关闭,可以需要最多11分钟。" -#: ../i2prouter:1789 +#: ../i2prouter:1846 msgid "Stop if running and then start." msgstr "先终止(如果运行)再启动。" -#: ../i2prouter:1790 +#: ../i2prouter:1847 msgid "Restart only if already running." msgstr "重启(仅在已运行时)。" -#: ../i2prouter:1791 +#: ../i2prouter:1848 msgid "Query the current status." msgstr "查询当前状态。" -#: ../i2prouter:1792 +#: ../i2prouter:1849 msgid "Install to start automatically when system boots." msgstr "安装为随系统启动。" -#: ../i2prouter:1793 +#: ../i2prouter:1850 msgid "Uninstall." msgstr "卸载。" -#: ../i2prouter:1794 +#: ../i2prouter:1851 msgid "Request a Java thread dump if running." msgstr "请求Java转储(如果在运行)。" -#: ../i2prouter:1807 +#: ../i2prouter:1864 msgid "Please edit i2prouter and set the variable RUN_AS_USER" msgstr "请编辑 i2prouter 设置 RUN_AS_USER 变量" -#: ../i2prouter:1812 +#: ../i2prouter:1869 msgid "Running I2P as the root user is *not* recommended." msgstr "推荐 *不要* 以 root 身份运行 I2P 。" -#: ../i2prouter:1815 +#: ../i2prouter:1872 msgid "To run as root anyway, edit i2prouter and set ALLOW_ROOT=true." msgstr "要以root运行,请编辑 i2prouter 并设置 ALLOW_ROOT=true。" diff --git a/installer/resources/man/eepget.1 b/installer/resources/man/eepget.1 index 8e4a4e3c4..c24e0fe0c 100644 --- a/installer/resources/man/eepget.1 +++ b/installer/resources/man/eepget.1 @@ -1,4 +1,4 @@ -.TH EEEPGET 1 "February 5, 2014" "" "Eepget - I2P Downloader" +.TH EEEPGET 1 "September 18, 2015" "" "Eepget - I2P Downloader" .SH NAME Eepget \- I2P downloader @@ -15,7 +15,7 @@ regular Internet are supported. .P Eepget is able to cope with slow or unstable network connections; if a download is not successful because of a network problem, it will keep retrying until the -whole file has been retrieved (by default up to three times). If supported by +whole file has been retrieved (if the -n option is set). If supported by the remote server, eepget will instruct the server to continue the download from the point of interruption. @@ -53,7 +53,7 @@ Controls the progress display. \fB\ markSize \fP is the number of bytes one '#' .B \fB\-n\fR retries .TP -Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will retry downloading the file 5 times. +Specify the number of times to retry downloading if the download isn't successful. If this option is not specified, eepget will not retry. .TP .B diff --git a/installer/resources/themes/console/images/exchanged.png b/installer/resources/themes/console/images/exchanged.png new file mode 100644 index 000000000..0e72a2c8e Binary files /dev/null and b/installer/resources/themes/console/images/exchanged.png differ diff --git a/installer/resources/themes/console/images/i2pwiki_logo.png b/installer/resources/themes/console/images/i2pwiki_logo.png new file mode 100644 index 000000000..c08805ead Binary files /dev/null and b/installer/resources/themes/console/images/i2pwiki_logo.png differ diff --git a/installer/resources/themes/console/images/lenta_main_logo.png b/installer/resources/themes/console/images/lenta_main_logo.png new file mode 100644 index 000000000..c43be5f4a Binary files /dev/null and b/installer/resources/themes/console/images/lenta_main_logo.png differ diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index 62b7969f3..24e34751e 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -250,7 +250,12 @@ div.newsheadings { div.newsheadings li { list-style: none outside url('images/newsbullet_mini.png'); - margin: 0 -4px 2px 8px; + margin: 4px -4px 2px 10px; + line-height: 120%; +} + +div.newsheadings li:first-child { + margin-top: 0; } div.tunnels { diff --git a/installer/resources/themes/console/light/images/move_bottom.png b/installer/resources/themes/console/light/images/move_bottom.png index 577ae3352..bc0ecd8d7 100644 Binary files a/installer/resources/themes/console/light/images/move_bottom.png and b/installer/resources/themes/console/light/images/move_bottom.png differ diff --git a/installer/resources/themes/console/light/images/move_down.png b/installer/resources/themes/console/light/images/move_down.png index d82b5d45d..4c9d311de 100644 Binary files a/installer/resources/themes/console/light/images/move_down.png and b/installer/resources/themes/console/light/images/move_down.png differ diff --git a/installer/resources/themes/console/light/images/move_top.png b/installer/resources/themes/console/light/images/move_top.png index 55192cf79..6a05a35ea 100644 Binary files a/installer/resources/themes/console/light/images/move_top.png and b/installer/resources/themes/console/light/images/move_top.png differ diff --git a/installer/resources/themes/console/light/images/move_up.png b/installer/resources/themes/console/light/images/move_up.png index e512dbdc2..47f79c108 100644 Binary files a/installer/resources/themes/console/light/images/move_up.png and b/installer/resources/themes/console/light/images/move_up.png differ diff --git a/installer/resources/themes/snark/ubergine/snark.css b/installer/resources/themes/snark/ubergine/snark.css index f2e09b4f9..facb2fae5 100644 --- a/installer/resources/themes/snark/ubergine/snark.css +++ b/installer/resources/themes/snark/ubergine/snark.css @@ -656,12 +656,6 @@ input.add { min-height: 22px; } -input.create { - background: #989 url('images/create.png') no-repeat 2px center; - padding: 2px 3px 2px 20px !important; - min-height: 22px; -} - input.cancel { background: #989 url('../../console/images/cancel.png') no-repeat 2px center; padding: 2px 3px 2px 20px !important; @@ -686,6 +680,18 @@ input.reload { min-height: 22px; } +input.starttorrent { + background: #989 url('images/start.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + +input.stoptorrent { + background: #989 url('images/stop.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + select { background: #333; background: url('/themes/snark/ubergine/images/graytile.png') !important; diff --git a/installer/resources/themes/snark/vanilla/snark.css b/installer/resources/themes/snark/vanilla/snark.css index ddbcd8e8c..b5ab1155b 100644 --- a/installer/resources/themes/snark/vanilla/snark.css +++ b/installer/resources/themes/snark/vanilla/snark.css @@ -694,6 +694,18 @@ input.reload { min-height: 22px; } +input.starttorrent { + background: #f3efc7 url('images/start.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + +input.stoptorrent { + background: #f3efc7 url('images/stop.png') no-repeat 2px center; + padding: 2px 3px 2px 20px !important; + min-height: 22px; +} + select { background: #fff; /* background: url('/themes/snark/ubergine/images/graytile.png') !important;*/ diff --git a/installer/resources/wrapper.config b/installer/resources/wrapper.config index 8ed9410d8..3601991da 100644 --- a/installer/resources/wrapper.config +++ b/installer/resources/wrapper.config @@ -285,3 +285,10 @@ wrapper.ntservice.starttype=AUTO_START # Allow the service to interact with the desktop. wrapper.ntservice.interactive=false +# http://wrapper.tanukisoftware.com/doc/english/prop-check-deadlock.html +# requires wrapper 3.5.0 or higher +# interval is seconds +wrapper.check.deadlock=TRUE +wrapper.check.deadlock.interval=3699 +wrapper.check.deadlock.action=DUMP,RESTART +wrapper.check.deadlock.output=FULL diff --git a/installer/tools/java/src/net/i2p/router/networkdb/kademlia/BundleRouterInfos.java b/installer/tools/java/src/net/i2p/router/networkdb/kademlia/BundleRouterInfos.java index f916e976f..cab5991d3 100644 --- a/installer/tools/java/src/net/i2p/router/networkdb/kademlia/BundleRouterInfos.java +++ b/installer/tools/java/src/net/i2p/router/networkdb/kademlia/BundleRouterInfos.java @@ -24,6 +24,7 @@ import java.util.Properties; import gnu.getopt.Getopt; import net.i2p.I2PAppContext; +import net.i2p.data.DataFormatException; import net.i2p.data.Hash; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; @@ -109,7 +110,9 @@ public class BundleRouterInfos { RouterInfo ri = new RouterInfo(); ri.readBytes(fis, true); // true = verify sig on read me = ri.getIdentity().getHash(); - } catch (Exception e) { + } catch (IOException e) { + //System.out.println("Can't determine our identity"); + } catch (DataFormatException e) { //System.out.println("Can't determine our identity"); } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} @@ -209,7 +212,9 @@ public class BundleRouterInfos { copied++; else System.out.println("Failed copy of " + file + " to " + toDir); - } catch (Exception e) { + } catch (IOException e) { + System.out.println("Skipping bad " + file); + } catch (DataFormatException e) { System.out.println("Skipping bad " + file); } finally { if (fis != null) try { fis.close(); } catch (IOException ioe) {} diff --git a/router/java/src/net/i2p/data/i2np/DataMessage.java b/router/java/src/net/i2p/data/i2np/DataMessage.java index c77ec5df0..f1505397e 100644 --- a/router/java/src/net/i2p/data/i2np/DataMessage.java +++ b/router/java/src/net/i2p/data/i2np/DataMessage.java @@ -49,7 +49,7 @@ public class DataMessage extends FastI2NPMessageImpl { long size = DataHelper.fromLong(data, curIndex, 4); curIndex += 4; if (size > MAX_SIZE) - throw new I2NPMessageException("wtf, size=" + size); + throw new I2NPMessageException("too large msg, size=" + size); _data = new byte[(int)size]; System.arraycopy(data, curIndex, _data, 0, (int)size); } diff --git a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java index 4a5c94638..1df280349 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java @@ -68,7 +68,7 @@ public class DatabaseSearchReplyMessage extends FastI2NPMessageImpl { curIndex += Hash.HASH_LENGTH; //_key = new Hash(keyData); - int num = (int)DataHelper.fromLong(data, curIndex, 1); + int num = data[curIndex] & 0xff; curIndex++; _peerHashes.clear(); diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java index cff476b61..e9efdd641 100644 --- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java +++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java @@ -103,6 +103,13 @@ public class DatabaseStoreMessage extends FastI2NPMessageImpl { int curIndex = offset; _key = Hash.create(data, curIndex); + // i2pd bug? Generally followed by corrupt gzipped content. + // Fast-fail here to save resources. + if (_key.equals(Hash.FAKE_HASH)) { + // createRateStat in KNDF + _context.statManager().addRateData("netDb.DSMAllZeros", 1); + throw new I2NPMessageException("DSM all zeros"); + } curIndex += Hash.HASH_LENGTH; // as of 0.9.18, ignore other 7 bits of the type byte, in preparation for future options diff --git a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java index e4e32377c..2c34b4001 100644 --- a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java +++ b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java @@ -209,7 +209,7 @@ public class DeliveryInstructions extends DataStructureImpl { public int readBytes(byte data[], int offset) throws DataFormatException { int cur = offset; - long flags = DataHelper.fromLong(data, cur, 1); + int flags = data[cur] & 0xff; cur++; //if (_log.shouldLog(Log.DEBUG)) // _log.debug("Read flags: " + flags + " mode: " + flagMode(flags)); @@ -357,8 +357,8 @@ public class DeliveryInstructions extends DataStructureImpl { int offset = 0; offset += getAdditionalInfo(rv, offset); if (offset != additionalSize) - //_log.log(Log.CRIT, "wtf, additionalSize = " + additionalSize + ", offset = " + offset); - throw new IllegalStateException("wtf, additionalSize = " + additionalSize + ", offset = " + offset); + //_log.log(Log.CRIT, "size mismatch, additionalSize = " + additionalSize + ", offset = " + offset); + throw new IllegalStateException("size mismatch, additionalSize = " + additionalSize + ", offset = " + offset); return rv; } @@ -430,7 +430,7 @@ public class DeliveryInstructions extends DataStructureImpl { // _log.debug("Write flags: " + flags + " mode: " + getDeliveryMode() // + " =?= " + flagMode(flags)); byte additionalInfo[] = getAdditionalInfo(); - DataHelper.writeLong(out, 1, flags); + out.write((byte) flags); if (additionalInfo != null) { out.write(additionalInfo); out.flush(); diff --git a/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java index 564d0f726..912a9e2b9 100644 --- a/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java @@ -85,7 +85,7 @@ public abstract class FastI2NPMessageImpl extends I2NPMessageImpl { throw new I2NPMessageException("Payload is too short " + maxLen); int cur = offset; if (type < 0) { - type = (int)DataHelper.fromLong(data, cur, 1); + type = data[cur] & 0xff; cur++; } _uniqueId = DataHelper.fromLong(data, cur, 4); diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java index 628874d81..d19435321 100644 --- a/router/java/src/net/i2p/data/i2np/GarlicClove.java +++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java @@ -158,7 +158,7 @@ public class GarlicClove extends DataStructureImpl { if (m.length <= 0) throw new RuntimeException("foo, returned 0 length"); out.write(m); - } catch (Exception e) { + } catch (RuntimeException e) { throw new DataFormatException("Unable to write the clove: " + _msg + " to " + out, e); } DataHelper.writeLong(out, 4, _cloveId); @@ -187,7 +187,7 @@ public class GarlicClove extends DataStructureImpl { byte m[] = _msg.toByteArray(); System.arraycopy(m, 0, rv, offset, m.length); offset += m.length; - } catch (Exception e) { throw new RuntimeException("Unable to write: " + _msg + ": " + e.getMessage()); } + } catch (RuntimeException e) { throw new RuntimeException("Unable to write: " + _msg + ": " + e.getMessage()); } DataHelper.toLong(rv, offset, 4, _cloveId); offset += 4; DataHelper.toDate(rv, offset, _expiration.getTime()); diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java b/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java index fe1225f74..224918ef4 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java @@ -59,7 +59,7 @@ public class I2NPMessageHandler { _lastSize = msg.readBytes(in, type, _messageBuffer); } catch (I2NPMessageException ime) { throw ime; - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Error reading the stream", e); throw new I2NPMessageException("Unknown error reading the " + msg.getClass().getSimpleName(), e); @@ -109,7 +109,7 @@ public class I2NPMessageHandler { public int readMessage(byte data[], int offset, int maxLen) throws I2NPMessageException { int cur = offset; // we will assume that maxLen is >= 1 here. It's checked to be >= 16 in readBytes() - int type = (int)DataHelper.fromLong(data, cur, 1); + int type = data[cur] & 0xff; cur++; _lastReadBegin = System.currentTimeMillis(); I2NPMessage msg = I2NPMessageImpl.createMessage(_context, type); @@ -131,7 +131,7 @@ public class I2NPMessageHandler { cur += _lastSize; } catch (I2NPMessageException ime) { throw ime; - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Error reading the stream", e); throw new I2NPMessageException("Unknown error reading the " + msg.getClass().getSimpleName(), e); diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java index ea080d374..062e310b1 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java @@ -197,7 +197,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM throw new I2NPMessageException("Payload is too short " + maxLen); int cur = offset; if (type < 0) { - type = (int)DataHelper.fromLong(data, cur, 1); + type = data[cur] & 0xff; cur++; } _uniqueId = DataHelper.fromLong(data, cur, 4); @@ -411,10 +411,11 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM * THe header consists of a one-byte type and a 4-byte expiration in seconds only. * Used by SSU only! */ - public static I2NPMessage fromRawByteArray(I2PAppContext ctx, byte buffer[], int offset, int len, I2NPMessageHandler handler) throws I2NPMessageException { - int type = (int)DataHelper.fromLong(buffer, offset, 1); + public static I2NPMessage fromRawByteArray(I2PAppContext ctx, byte buffer[], int offset, + int len, I2NPMessageHandler handler) throws I2NPMessageException { + int type = buffer[offset] & 0xff; offset++; - I2NPMessageImpl msg = (I2NPMessageImpl)createMessage(ctx, type); + I2NPMessage msg = createMessage(ctx, type); if (msg == null) throw new I2NPMessageException("Unknown message type: " + type); //if (RAW_FULL_SIZE) { diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java b/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java index 1acd53e59..d23a489d6 100644 --- a/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java +++ b/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java @@ -163,8 +163,8 @@ public class I2NPMessageReader { _log.warn("IO Error handling message", ioe); _listener.disconnected(I2NPMessageReader.this); cancelRunner(); - } catch (Exception e) { - _log.log(Log.CRIT, "wtf, error reading", e); + } catch (RuntimeException e) { + _log.log(Log.CRIT, "error reading msg!", e); _listener.readError(I2NPMessageReader.this, e); _listener.disconnected(I2NPMessageReader.this); cancelRunner(); diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java index bac9b5b3f..ce47e6aac 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java @@ -31,7 +31,7 @@ public class TunnelDataMessage extends FastI2NPMessageImpl { public final static int MESSAGE_TYPE = 18; public static final int DATA_SIZE = 1024; - /** if we can't deliver a tunnel message in 10s, fuck it */ + /** if we can't deliver a tunnel message in 10s, forget it */ private static final int EXPIRATION_PERIOD = 10*1000; private static final ByteCache _cache; diff --git a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java index 7952c6df0..d908ca4d1 100644 --- a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java +++ b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java @@ -25,7 +25,7 @@ public class TunnelGatewayMessage extends FastI2NPMessageImpl { //private Exception _creator; public final static int MESSAGE_TYPE = 19; - /** if we can't deliver a tunnel message in 10s, fuck it */ + /** if we can't deliver a tunnel message in 10s, forget it */ private static final int EXPIRATION_PERIOD = 10*1000; public TunnelGatewayMessage(I2PAppContext context) { @@ -62,7 +62,7 @@ public class TunnelGatewayMessage extends FastI2NPMessageImpl { if (_msg != null) throw new IllegalStateException(); if (msg == null) - throw new IllegalArgumentException("wtf, dont set me to null"); + throw new IllegalArgumentException("dont set me to null!"); _msg = msg; } @@ -137,7 +137,7 @@ public class TunnelGatewayMessage extends FastI2NPMessageImpl { //handler.readMessage(data, curIndex); //_msg = handler.lastRead(); //if (_msg == null) - // throw new I2NPMessageException("wtf, message read has no payload?"); + // throw new I2NPMessageException("impossible? message read has no payload?!"); // NEW WAY save lots of effort at the IBGW by reading as an UnknownI2NPMessage instead // This will save a lot of object churn and processing, diff --git a/router/java/src/net/i2p/data/i2np/UnknownI2NPMessage.java b/router/java/src/net/i2p/data/i2np/UnknownI2NPMessage.java index 791f8126a..72bcc081e 100644 --- a/router/java/src/net/i2p/data/i2np/UnknownI2NPMessage.java +++ b/router/java/src/net/i2p/data/i2np/UnknownI2NPMessage.java @@ -48,7 +48,7 @@ public class UnknownI2NPMessage extends FastI2NPMessageImpl { throw new IllegalStateException(); if (type != _type) throw new I2NPMessageException("Message type is incorrect for this message"); if (dataSize > MAX_SIZE) - throw new I2NPMessageException("wtf, size=" + dataSize); + throw new I2NPMessageException("size mismatch, too big, size=" + dataSize); _data = new byte[dataSize]; System.arraycopy(data, offset, _data, 0, dataSize); } diff --git a/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java b/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java index b33cba761..52aa565de 100644 --- a/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java +++ b/router/java/src/net/i2p/data/i2np/VariableTunnelBuildMessage.java @@ -29,7 +29,7 @@ public class VariableTunnelBuildMessage extends TunnelBuildMessage { @Override public void readMessage(byte[] data, int offset, int dataSize, int type) throws I2NPMessageException { // message type will be checked in super() - int r = (int)DataHelper.fromLong(data, offset, 1); + int r = data[offset] & 0xff; if (r <= 0 || r > MAX_RECORD_COUNT) throw new I2NPMessageException("Bad record count " + r); RECORD_COUNT = r; diff --git a/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java b/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java index 368104a2a..575f55630 100644 --- a/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java +++ b/router/java/src/net/i2p/data/i2np/VariableTunnelBuildReplyMessage.java @@ -31,7 +31,7 @@ public class VariableTunnelBuildReplyMessage extends TunnelBuildReplyMessage { @Override public void readMessage(byte[] data, int offset, int dataSize, int type) throws I2NPMessageException { // message type will be checked in super() - int r = (int)DataHelper.fromLong(data, offset, 1); + int r = data[offset] & 0xff; if (r <= 0 || r > MAX_RECORD_COUNT) throw new I2NPMessageException("Bad record count " + r); RECORD_COUNT = r; diff --git a/router/java/src/net/i2p/data/router/RouterAddress.java b/router/java/src/net/i2p/data/router/RouterAddress.java index ca0f94d08..a350ef593 100644 --- a/router/java/src/net/i2p/data/router/RouterAddress.java +++ b/router/java/src/net/i2p/data/router/RouterAddress.java @@ -17,6 +17,8 @@ import java.util.Date; import java.util.Map; import java.util.Properties; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.DataStructureImpl; @@ -219,8 +221,8 @@ public class RouterAddress extends DataStructureImpl { if (host != null) { rv = Addresses.getIP(host); if (rv != null && - (host.replaceAll("[0-9\\.]", "").length() == 0 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0)) { + (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host))) { _ip = rv; } } @@ -286,7 +288,7 @@ public class RouterAddress extends DataStructureImpl { public void writeBytes(OutputStream out) throws DataFormatException, IOException { if (_transportStyle == null) throw new DataFormatException("uninitialized"); - DataHelper.writeLong(out, 1, _cost); + out.write((byte) _cost); DataHelper.writeLong(out, 8, _expiration); DataHelper.writeString(out, _transportStyle); DataHelper.writeProperties(out, _options); diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java index cb977a864..fdfd29136 100644 --- a/router/java/src/net/i2p/data/router/RouterInfo.java +++ b/router/java/src/net/i2p/data/router/RouterInfo.java @@ -78,8 +78,11 @@ public class RouterInfo extends DatabaseEntry { private volatile boolean _hashCodeInitialized; /** should we cache the byte and string versions _byteified ? **/ private boolean _shouldCache; - /** maybe we should check if we are floodfill? */ - private static final boolean CACHE_ALL = SystemVersion.getMaxMemory() > 128*1024*1024l; + /** + * Maybe we should check if we are floodfill? + * If we do bring this back, don't do on ARM or Android + */ + private static final boolean CACHE_ALL = false; // SystemVersion.getMaxMemory() > 128*1024*1024l; public static final String PROP_NETWORK_ID = "netId"; public static final String PROP_CAPABILITIES = "caps"; @@ -308,11 +311,30 @@ public class RouterInfo extends DatabaseEntry { */ protected byte[] getBytes() throws DataFormatException { if (_byteified != null) return _byteified; - if (_identity == null) throw new DataFormatException("Router identity isn't set? wtf!"); - - //long before = Clock.getInstance().now(); ByteArrayOutputStream out = new ByteArrayOutputStream(2*1024); try { + writeDataBytes(out); + } catch (IOException ioe) { + throw new DataFormatException("IO Error getting bytes", ioe); + } + byte data[] = out.toByteArray(); + if (CACHE_ALL || _shouldCache) + _byteified = data; + return data; + } + + /** + * Write out the raw payload of the routerInfo, excluding the signature. This + * caches the data in memory if possible. + * + * @throws DataFormatException if the data is somehow b0rked (missing props, etc) + * @throws IOException + * @since 0.9.24 + */ + private void writeDataBytes(OutputStream out) throws DataFormatException, IOException { + if (_identity == null) throw new DataFormatException("Missing identity"); + if (_published < 0) throw new DataFormatException("Invalid published date: " + _published); + _identity.writeBytes(out); // avoid thrashing objects //DataHelper.writeDate(out, new Date(_published)); @@ -320,9 +342,9 @@ public class RouterInfo extends DatabaseEntry { int sz = _addresses.size(); if (sz <= 0 || isHidden()) { // Do not send IP address to peers in hidden mode - DataHelper.writeLong(out, 1, 0); + out.write((byte) 0); } else { - DataHelper.writeLong(out, 1, sz); + out.write((byte) sz); for (RouterAddress addr : _addresses) { addr.writeBytes(out); } @@ -332,30 +354,19 @@ public class RouterInfo extends DatabaseEntry { // method of trusted links, which isn't implemented in the router // at the moment, and may not be later. int psz = _peers == null ? 0 : _peers.size(); - DataHelper.writeLong(out, 1, psz); + out.write((byte) psz); if (psz > 0) { Collection peers = _peers; if (psz > 1) // WARNING this sort algorithm cannot be changed, as it must be consistent // network-wide. The signature is not checked at readin time, but only // later, and the hashes are stored in a Set, not a List. - peers = (Collection) SortHelper.sortStructures(peers); + peers = SortHelper.sortStructures(peers); for (Hash peerHash : peers) { peerHash.writeBytes(out); } } DataHelper.writeProperties(out, _options); - } catch (IOException ioe) { - throw new DataFormatException("IO Error getting bytes", ioe); - } - byte data[] = out.toByteArray(); - //if (_log.shouldLog(Log.DEBUG)) { - // long after = Clock.getInstance().now(); - // _log.debug("getBytes() took " + (after - before) + "ms"); - //} - if (CACHE_ALL || _shouldCache) - _byteified = data; - return data; } /** @@ -434,44 +445,6 @@ public class RouterInfo extends DatabaseEntry { return (bwTier); } - /** - * Warning, must be called AFTER setOptions(). - * - * @throws IllegalStateException if RouterInfo is already signed - */ - public void addCapability(char cap) { - if (_signature != null) - throw new IllegalStateException(); - - String caps = _options.getProperty(PROP_CAPABILITIES); - if (caps == null) - _options.setProperty(PROP_CAPABILITIES, String.valueOf(cap)); - else if (caps.indexOf(cap) == -1) - _options.setProperty(PROP_CAPABILITIES, caps + cap); - } - - /** - * @throws IllegalStateException if RouterInfo is already signed - * @deprecated unused - */ - public void delCapability(char cap) { - if (_signature != null) - throw new IllegalStateException(); - - String caps = _options.getProperty(PROP_CAPABILITIES); - int idx; - if (caps == null) { - return; - } else if ((idx = caps.indexOf(cap)) == -1) { - return; - } else { - StringBuilder buf = new StringBuilder(caps); - while ( (idx = buf.indexOf(""+cap)) != -1) - buf.deleteCharAt(idx); - _options.setProperty(PROP_CAPABILITIES, buf.toString()); - } - } - /** * Determine whether the router was published recently (within the given age milliseconds). * The age should be large enough to take into consideration any clock fudge factor, so @@ -525,16 +498,11 @@ public class RouterInfo extends DatabaseEntry { if (!_isValid) { Log log = I2PAppContext.getGlobalContext().logManager().getLog(RouterInfo.class); - byte data[] = null; - try { - data = getBytes(); - } catch (DataFormatException dfe) { - log.error("Error validating", dfe); - return; + if (log.shouldWarn()) { + log.warn("Sig verify fail: " + toString(), new Exception("from")); + } else { + log.error("RI Sig verify fail: " + _identity.getHash()); } - log.error("Invalid [" + SHA256Generator.getInstance().calculateHash(data).toBase64() - + (log.shouldLog(Log.WARN) ? ("]\n" + toString()) : ""), - new Exception("Signature failed")); } } @@ -631,18 +599,9 @@ public class RouterInfo extends DatabaseEntry { * This does NOT validate the signature */ public void writeBytes(OutputStream out) throws DataFormatException, IOException { - if (_identity == null) throw new DataFormatException("Missing identity"); - if (_published < 0) throw new DataFormatException("Invalid published date: " + _published); if (_signature == null) throw new DataFormatException("Signature is null"); - //if (!isValid()) - // throw new DataFormatException("Data is not valid"); - ByteArrayOutputStream baos = new ByteArrayOutputStream(2048); - baos.write(getBytes()); - _signature.writeBytes(baos); - - byte data[] = baos.toByteArray(); - //_log.debug("Writing routerInfo [len=" + data.length + "]: " + toString()); - out.write(data); + writeDataBytes(out); + _signature.writeBytes(out); } @Override @@ -724,7 +683,10 @@ public class RouterInfo extends DatabaseEntry { System.err.println("Router info " + args[i] + " is invalid"); fail = true; } - } catch (Exception e) { + } catch (IOException e) { + System.err.println("Error reading " + args[i] + ": " + e); + fail = true; + } catch (DataFormatException e) { System.err.println("Error reading " + args[i] + ": " + e); fail = true; } finally { diff --git a/router/java/src/net/i2p/data/router/RouterKeyGenerator.java b/router/java/src/net/i2p/data/router/RouterKeyGenerator.java index 69e6aacec..02e49ede5 100644 --- a/router/java/src/net/i2p/data/router/RouterKeyGenerator.java +++ b/router/java/src/net/i2p/data/router/RouterKeyGenerator.java @@ -52,6 +52,8 @@ public class RouterKeyGenerator extends RoutingKeyGenerator { public RouterKeyGenerator(I2PAppContext context) { _log = context.logManager().getLog(RoutingKeyGenerator.class); _context = context; + // make sure GMT is set, azi2phelper Vuze plugin is disabling static JVM TZ setting in Router.java + _fmt.setCalendar(_cal); // ensure non-null mod data generateDateBasedModData(); } @@ -61,14 +63,10 @@ public class RouterKeyGenerator extends RoutingKeyGenerator { private volatile long _nextMidnight; private volatile long _lastChanged; - private final static Calendar _cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); + private final Calendar _cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); private static final String FORMAT = "yyyyMMdd"; private static final int LENGTH = FORMAT.length(); - private final static SimpleDateFormat _fmt = new SimpleDateFormat(FORMAT, Locale.US); - static { - // make sure GMT is set, azi2phelper Vuze plugin is disabling static JVM TZ setting in Router.java - _fmt.setCalendar(_cal); - } + private final SimpleDateFormat _fmt = new SimpleDateFormat(FORMAT, Locale.US); /** * The current (today's) mod data. diff --git a/router/java/src/net/i2p/data/router/SortHelper.java b/router/java/src/net/i2p/data/router/SortHelper.java index 0c40fa3ed..c7cea3c6f 100644 --- a/router/java/src/net/i2p/data/router/SortHelper.java +++ b/router/java/src/net/i2p/data/router/SortHelper.java @@ -31,12 +31,11 @@ class SortHelper { * WARNING - this sort order must be consistent network-wide, so while the order is arbitrary, * it cannot be changed. * Why? Just because it has to be consistent so signing will work. - * How to spec as returning the same type as the param? * DEPRECATED - Only used by RouterInfo. * * @return a new list */ - public static List sortStructures(Collection dataStructures) { + public static List sortStructures(Collection dataStructures) { if (dataStructures == null) return Collections.emptyList(); // This used to use Hash.toString(), which is insane, since a change to toString() @@ -52,7 +51,7 @@ class SortHelper { //for (DataStructure struct : tm.values()) { // rv.add(struct); //} - ArrayList rv = new ArrayList(dataStructures); + ArrayList rv = new ArrayList(dataStructures); sortStructureList(rv); return rv; } diff --git a/router/java/src/net/i2p/router/Banlist.java b/router/java/src/net/i2p/router/Banlist.java index 180e9366f..984be5ec6 100644 --- a/router/java/src/net/i2p/router/Banlist.java +++ b/router/java/src/net/i2p/router/Banlist.java @@ -60,6 +60,8 @@ public class Banlist { _log = context.logManager().getLog(Banlist.class); _entries = new ConcurrentHashMap(16); _context.jobQueue().addJob(new Cleanup(_context)); + // i2pd bug? + banlistRouterForever(Hash.FAKE_HASH, "Invalid Hash"); } private class Cleanup extends JobImpl { @@ -160,11 +162,11 @@ public class Banlist { */ public boolean banlistRouter(Hash peer, String reason, String reasonCode, String transport, long expireOn) { if (peer == null) { - _log.error("wtf, why did we try to banlist null?", new Exception("banfaced")); + _log.error("why did we try to banlist null?", new Exception("banfaced")); return false; } if (peer.equals(_context.routerHash())) { - _log.error("wtf, why did we try to banlist ourselves?", new Exception("banfaced")); + _log.error("why did we try to banlist ourselves?", new Exception("banfaced")); return false; } boolean wasAlready = false; diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java index 4e931f665..3ad8e7387 100644 --- a/router/java/src/net/i2p/router/Blocklist.java +++ b/router/java/src/net/i2p/router/Blocklist.java @@ -917,7 +917,7 @@ public class Blocklist { singles.addAll(_singleIPBlocklist); if (!(singles.isEmpty() && _singleIPv6Blocklist.isEmpty())) { out.write(""); // first 0 - 127 for (Integer ii : singles) { @@ -954,11 +954,11 @@ public class Blocklist { } if (_blocklistSize > 0) { out.write("
              "); - out.write(_("IPs Banned Until Restart")); + out.write(_t("IPs Banned Until Restart")); out.write("
              "); int max = Math.min(_blocklistSize, MAX_DISPLAY); int displayed = 0; @@ -994,7 +994,7 @@ public class Blocklist { out.write("
              "); - out.write(_("IPs Permanently Banned")); + out.write(_t("IPs Permanently Banned")); out.write("
              "); - out.write(_("From")); + out.write(_t("From")); out.write(""); - out.write(_("To")); + out.write(_t("To")); out.write("
              "); } else { out.write("
              "); - out.write(_("none")); + out.write(_t("none")); out.write(""); } out.flush(); @@ -1030,7 +1030,7 @@ public class Blocklist { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate */ - private String _(String key) { + private String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java index e9c050762..5c704ef87 100644 --- a/router/java/src/net/i2p/router/CommSystemFacade.java +++ b/router/java/src/net/i2p/router/CommSystemFacade.java @@ -48,7 +48,7 @@ public abstract class CommSystemFacade implements Service { public boolean haveInboundCapacity(int pct) { return true; } public boolean haveOutboundCapacity(int pct) { return true; } public boolean haveHighOutboundCapacity() { return true; } - public List getMostRecentErrorMessages() { return Collections.emptyList(); } + public List getMostRecentErrorMessages() { return Collections.emptyList(); } /** * Median clock skew of connected peers in seconds, or null if we cannot answer. @@ -70,6 +70,7 @@ public abstract class CommSystemFacade implements Service { * * @deprecated use getStatus() */ + @Deprecated public short getReachabilityStatus() { return (short) getStatus().getCode(); } /** @@ -81,13 +82,22 @@ public abstract class CommSystemFacade implements Service { /** * @deprecated unused */ + @Deprecated public void recheckReachability() {} - public boolean isBacklogged(Hash dest) { return false; } - public boolean wasUnreachable(Hash dest) { return false; } - public boolean isEstablished(Hash dest) { return false; } + public boolean isBacklogged(Hash peer) { return false; } + public boolean wasUnreachable(Hash peer) { return false; } + public boolean isEstablished(Hash peer) { return false; } public byte[] getIP(Hash dest) { return null; } public void queueLookup(byte[] ip) {} + + /** + * Tell the comm system that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + public void mayDisconnect(Hash peer) {} /** @since 0.8.11 */ public String getOurCountry() { return null; } diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java index fb4c2a632..2337dbce6 100644 --- a/router/java/src/net/i2p/router/InNetMessagePool.java +++ b/router/java/src/net/i2p/router/InNetMessagePool.java @@ -94,7 +94,7 @@ public class InNetMessagePool implements Service { * @return previous builder for this message type, or null * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE */ - public HandlerJobBuilder registerHandlerJobBuilder(int i2npMessageType, HandlerJobBuilder builder) { + public synchronized HandlerJobBuilder registerHandlerJobBuilder(int i2npMessageType, HandlerJobBuilder builder) { HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType]; _handlerJobBuilders[i2npMessageType] = builder; return old; @@ -103,8 +103,10 @@ public class InNetMessagePool implements Service { /** * @return previous builder for this message type, or null * @throws AIOOBE if i2npMessageType is greater than MAX_I2NP_MESSAGE_TYPE + * @deprecated unused */ - public HandlerJobBuilder unregisterHandlerJobBuilder(int i2npMessageType) { + @Deprecated + public synchronized HandlerJobBuilder unregisterHandlerJobBuilder(int i2npMessageType) { HandlerJobBuilder old = _handlerJobBuilders[i2npMessageType]; _handlerJobBuilders[i2npMessageType] = null; return old; @@ -434,7 +436,7 @@ public class InNetMessagePool implements Service { } catch (OutOfMemoryError oome) { throw oome; - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, "Error in the tunnel gateway dispatcher", e); } @@ -467,7 +469,7 @@ public class InNetMessagePool implements Service { } catch (OutOfMemoryError oome) { throw oome; - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, "Error in the tunnel data dispatcher", e); } diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index bebd9c6e1..141f348bf 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.i2p.data.DataHelper; import net.i2p.router.message.HandleGarlicMessageJob; import net.i2p.router.networkdb.kademlia.HandleFloodfillDatabaseLookupMessageJob; +import net.i2p.router.RouterClock; import net.i2p.util.Clock; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -340,7 +341,7 @@ public class JobQueue { public void startup() { _alive = true; I2PThread pumperThread = new I2PThread(_pumper, "Job Queue Pumper", true); - //pumperThread.setPriority(I2PThread.NORM_PRIORITY+1); + pumperThread.setPriority(Thread.NORM_PRIORITY + 1); pumperThread.start(); } @@ -516,10 +517,12 @@ public class JobQueue { * max number of runners. * */ - private final class QueuePumper implements Runnable, Clock.ClockUpdateListener { + private final class QueuePumper implements Runnable, Clock.ClockUpdateListener, RouterClock.ClockShiftListener { public QueuePumper() { _context.clock().addUpdateListener(this); + ((RouterClock) _context.clock()).addShiftListener(this); } + public void run() { try { while (_alive) { @@ -589,9 +592,11 @@ public class JobQueue { } catch (InterruptedException ie) {} } // while (_alive) } catch (Throwable t) { - _context.clock().removeUpdateListener(this); if (_log.shouldLog(Log.ERROR)) - _log.error("wtf, pumper killed", t); + _log.error("pumper killed?!", t); + } finally { + _context.clock().removeUpdateListener(this); + ((RouterClock) _context.clock()).removeShiftListener(this); } } @@ -602,6 +607,22 @@ public class JobQueue { } } + /** + * Clock shift listener. + * Only adjust timings for negative shifts. + * For positive shifts, just wake up the pumper. + * @since 0.9.23 + */ + public void clockShift(long delta) { + if (delta < 0) { + offsetChanged(delta); + } else { + synchronized (_jobLock) { + _jobLock.notifyAll(); + } + } + } + } /** diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java index a3ed2da14..ecc4cd954 100644 --- a/router/java/src/net/i2p/router/JobQueueRunner.java +++ b/router/java/src/net/i2p/router/JobQueueRunner.java @@ -21,6 +21,7 @@ class JobQueueRunner extends I2PThread { _id = id; _keepRunning = true; _log = _context.logManager().getLog(JobQueueRunner.class); + setPriority(NORM_PRIORITY + 1); // all createRateStat in JobQueue //_state = 1; } @@ -117,7 +118,7 @@ class JobQueueRunner extends I2PThread { //if ( (jobNum % 10) == 0) // System.gc(); } catch (Throwable t) { - _log.log(Log.CRIT, "WTF, error running?", t); + _log.log(Log.CRIT, "error running?", t); } } //_state = 16; diff --git a/router/java/src/net/i2p/router/JobTiming.java b/router/java/src/net/i2p/router/JobTiming.java index 98d8e67c7..c9c0efb03 100644 --- a/router/java/src/net/i2p/router/JobTiming.java +++ b/router/java/src/net/i2p/router/JobTiming.java @@ -8,6 +8,7 @@ package net.i2p.router; * */ +import net.i2p.router.RouterClock; import net.i2p.util.Clock; /** diff --git a/router/java/src/net/i2p/router/KeyManager.java b/router/java/src/net/i2p/router/KeyManager.java index 2807e8fe7..3317b9290 100644 --- a/router/java/src/net/i2p/router/KeyManager.java +++ b/router/java/src/net/i2p/router/KeyManager.java @@ -60,6 +60,11 @@ public class KeyManager { _leaseSetKeys = new ConcurrentHashMap(); } + /** + * Read keys in from disk, blocking + * + * @deprecated we never read keys in anymore + */ public void startup() { // run inline so keys are loaded immediately (new SynchronizeKeysJob()).runJob(); @@ -79,17 +84,29 @@ public class KeyManager { queueWrite(); } - /** router */ - public PrivateKey getPrivateKey() { return _privateKey; } + /** + * Router key + * @return will be null on error or before startup() or setKeys() is called + */ + public synchronized PrivateKey getPrivateKey() { return _privateKey; } - /** router */ - public PublicKey getPublicKey() { return _publicKey; } + /** + * Router key + * @return will be null on error or before startup() or setKeys() is called + */ + public synchronized PublicKey getPublicKey() { return _publicKey; } - /** router */ - public SigningPrivateKey getSigningPrivateKey() { return _signingPrivateKey; } + /** + * Router key + * @return will be null on error or before startup() or setKeys() is called + */ + public synchronized SigningPrivateKey getSigningPrivateKey() { return _signingPrivateKey; } - /** router */ - public SigningPublicKey getSigningPublicKey() { return _signingPublicKey; } + /** + * Router key + * @return will be null on error or before startup() or setKeys() is called + */ + public synchronized SigningPublicKey getSigningPublicKey() { return _signingPublicKey; } /** client */ public void registerKeys(Destination dest, SigningPrivateKey leaseRevocationPrivateKey, PrivateKey endpointDecryptionKey) { @@ -216,6 +233,11 @@ public class KeyManager { _signingPublicKey = (SigningPublicKey) readin; } + /** + * @param param non-null, filled-in if exists is true, or without data if exists is false + * @param exists write to file if true, read from file if false + * @return structure or null on read error + */ private DataStructure syncKey(File keyFile, DataStructure structure, boolean exists) { OutputStream out = null; InputStream in = null; diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java index 16403996f..82d1af9df 100644 --- a/router/java/src/net/i2p/router/MessageHistory.java +++ b/router/java/src/net/i2p/router/MessageHistory.java @@ -10,6 +10,7 @@ import java.util.Queue; import java.util.TimeZone; import java.util.concurrent.LinkedBlockingQueue; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.TunnelId; import net.i2p.data.i2np.I2NPMessage; @@ -40,7 +41,7 @@ public class MessageHistory { //private SubmitMessageHistoryJob _submitMessageHistoryJob; private volatile boolean _firstPass; - private final static byte[] NL = System.getProperty("line.separator").getBytes(); + private final static byte[] NL = DataHelper.getUTF8(System.getProperty("line.separator")); private final static int FLUSH_SIZE = 1000; // write out at least once every 1000 entries /** config property determining whether we want to debug with the message history - default false */ @@ -636,7 +637,7 @@ public class MessageHistory { fos = new SecureFileOutputStream(f, true); String entry; while ((entry = _unwrittenEntries.poll()) != null) { - fos.write(entry.getBytes()); + fos.write(DataHelper.getUTF8(entry)); fos.write(NL); } } catch (IOException ioe) { diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index e7e8db67e..410890547 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -9,6 +9,8 @@ package net.i2p.router; */ import java.io.File; +import java.io.IOException; +import java.security.GeneralSecurityException; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -20,7 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; import gnu.getopt.Getopt; -import net.i2p.client.I2PSessionImpl; +import net.i2p.client.impl.I2PSessionImpl; import net.i2p.crypto.SigUtil; import net.i2p.data.Base64; import net.i2p.data.Certificate; @@ -34,6 +36,7 @@ import net.i2p.data.SigningPublicKey; import net.i2p.data.i2np.GarlicMessage; import net.i2p.data.router.RouterInfo; import net.i2p.router.CommSystemFacade.Status; +import net.i2p.router.crypto.FamilyKeyCrypto; import net.i2p.router.message.GarlicMessageHandler; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.router.startup.CreateRouterInfoJob; @@ -52,6 +55,8 @@ import net.i2p.util.I2PThread; import net.i2p.util.Log; import net.i2p.util.NativeBigInteger; import net.i2p.util.OrderedProperties; +import net.i2p.util.ReusableGZIPInputStream; +import net.i2p.util.ReusableGZIPOutputStream; import net.i2p.util.SecureFileOutputStream; import net.i2p.util.SimpleByteCache; import net.i2p.util.SystemVersion; @@ -60,7 +65,7 @@ import net.i2p.util.Translate; /** * Main driver for the router. * - * For embedded use, instantiate and then call runRouter(). + * For embedded use, instantiate, call setKillVMOnEnd(false), and then call runRouter(). * */ public class Router implements RouterClock.ClockShiftListener { @@ -70,11 +75,11 @@ public class Router implements RouterClock.ClockShiftListener { /** full path */ private String _configFilename; private RouterInfo _routerInfo; + private final Object _routerInfoLock = new Object(); /** not for external use */ public final Object routerInfoFileLock = new Object(); private final Object _configFileLock = new Object(); private long _started; - private boolean _higherVersionSeen; private boolean _killVMOnEnd; private int _gracefulExitCode; private I2PThread.OOMEventListener _oomListener; @@ -85,6 +90,9 @@ public class Router implements RouterClock.ClockShiftListener { private final EventLog _eventLog; private final Object _stateLock = new Object(); private State _state = State.UNINITIALIZED; + private FamilyKeyCrypto _familyKeyCrypto; + private boolean _familyKeyCryptoFail; + public final Object _familyKeyLock = new Object(); public final static String PROP_CONFIG_FILE = "router.configLocation"; @@ -389,13 +397,12 @@ public class Router implements RouterClock.ClockShiftListener { CryptoChecker.warnUnavailableCrypto(_context); _routerInfo = null; - _higherVersionSeen = false; if (_log.shouldLog(Log.INFO)) _log.info("New router created with config file " + _configFilename); _oomListener = new OOMListener(_context); _shutdownHook = new ShutdownHook(_context); - _gracefulShutdownDetector = new I2PAppThread(new GracefulShutdown(_context), "Graceful shutdown hook", true); + _gracefulShutdownDetector = new I2PAppThread(new GracefulShutdown(_context), "Graceful ShutdownHook", true); _gracefulShutdownDetector.setPriority(Thread.NORM_PRIORITY + 1); _gracefulShutdownDetector.start(); @@ -420,6 +427,8 @@ public class Router implements RouterClock.ClockShiftListener { SigningPublicKey.clearCache(); SigUtil.clearCaches(); I2PSessionImpl.clearCache(); + ReusableGZIPInputStream.clearCache(); + ReusableGZIPOutputStream.clearCache(); } /** @@ -448,6 +457,7 @@ public class Router implements RouterClock.ClockShiftListener { * saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) is recommended. * * @since 0.8.13 + * @deprecated use saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) */ public void setConfigSetting(String name, String value) { _config.put(name, value); @@ -458,6 +468,7 @@ public class Router implements RouterClock.ClockShiftListener { * saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) is recommended. * * @since 0.8.13 + * @deprecated use saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) */ public void removeConfigSetting(String name) { _config.remove(name); @@ -482,44 +493,48 @@ public class Router implements RouterClock.ClockShiftListener { /** * Our current router info. * Warning, may be null if called very early. + * + * Warning - risk of deadlock - do not call while holding locks + * */ - public RouterInfo getRouterInfo() { return _routerInfo; } + public RouterInfo getRouterInfo() { + synchronized (_routerInfoLock) { + return _routerInfo; + } + } /** * Caller must ensure info is valid - no validation done here. * Not for external use. + * + * Warning - risk of deadlock - do not call while holding locks + * */ public void setRouterInfo(RouterInfo info) { - _routerInfo = info; + synchronized (_routerInfoLock) { + _routerInfo = info; + } if (_log.shouldLog(Log.INFO)) _log.info("setRouterInfo() : " + info, new Exception("I did it")); if (info != null) _context.jobQueue().addJob(new PersistRouterInfoJob(_context)); } - /** - * True if the router has tried to communicate with another router who is running a higher - * incompatible protocol version. - * @deprecated unused - */ - public boolean getHigherVersionSeen() { return _higherVersionSeen; } - - /** - * True if the router has tried to communicate with another router who is running a higher - * incompatible protocol version. - * @deprecated unused - */ - public void setHigherVersionSeen(boolean seen) { _higherVersionSeen = seen; } - /** * Used only by routerconsole.. to be deprecated? + * @return System time, NOT context time */ public long getWhenStarted() { return _started; } - /** wall clock uptime */ + /** + * Wall clock uptime. + * This uses System time, NOT context time, so context clock shifts will + * not affect it. This is important if NTP fails and the + * clock then shifts from a SSU peer source just after startup. + */ public long getUptime() { - if ( (_context == null) || (_context.clock() == null) ) return 1; // racing on startup - return Math.max(1, _context.clock().now() - _context.clock().getOffset() - _started); + if (_started <= 0) return 1000; // racing on startup + return Math.max(1000, System.currentTimeMillis() - _started); } /** @@ -557,16 +572,16 @@ public class Router implements RouterClock.ClockShiftListener { _eventLog.addEvent(EventLog.STARTED, RouterVersion.FULL_VERSION); startupStuff(); changeState(State.STARTING_2); - _started = _context.clock().now(); + _started = System.currentTimeMillis(); try { Runtime.getRuntime().addShutdownHook(_shutdownHook); } catch (IllegalStateException ise) {} if (!SystemVersion.isAndroid()) I2PThread.addOOMEventListener(_oomListener); - _context.keyManager().startup(); - - setupHandlers(); + // message handlers + _context.inNetMessagePool().registerHandlerJobBuilder(GarlicMessage.MESSAGE_TYPE, new GarlicMessageHandler(_context)); + //if (ALLOW_DYNAMIC_KEYS) { // if ("true".equalsIgnoreCase(_context.getProperty(Router.PROP_HIDDEN, "false"))) // killKeys(); @@ -575,7 +590,7 @@ public class Router implements RouterClock.ClockShiftListener { _context.messageValidator().startup(); _context.tunnelDispatcher().startup(); _context.inNetMessagePool().startup(); - startupQueue(); + _context.jobQueue().runQueue(1); //_context.jobQueue().addJob(new CoalesceStatsJob(_context)); _context.simpleTimer2().addPeriodicEvent(new CoalesceStatsEvent(_context), COALESCE_TIME); _context.jobQueue().addJob(new UpdateRoutingKeyModifierJob(_context)); @@ -614,6 +629,7 @@ public class Router implements RouterClock.ClockShiftListener { * This is synchronized with saveConfig(). * Not for external use. */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public void readConfig() { synchronized(_configFileLock) { String f = getConfigFilename(); @@ -642,7 +658,6 @@ public class Router implements RouterClock.ClockShiftListener { File f = new File(filename); if (f.canRead()) { DataHelper.loadProps(props, f); - // dont be a wanker props.remove(PROP_SHUTDOWN_IN_PROGRESS); } else { if (log != null) @@ -651,7 +666,7 @@ public class Router implements RouterClock.ClockShiftListener { //else // System.err.println("WARNING: Configuration file " + filename + " does not exist"); } - } catch (Exception ioe) { + } catch (IOException ioe) { if (log != null) log.error("Error loading the router configuration from " + filename, ioe); else @@ -808,12 +823,25 @@ public class Router implements RouterClock.ClockShiftListener { * Rebuild and republish our routerInfo since something significant * has changed. * Not for external use. + * + * Warning - risk of deadlock - do not call while holding locks + * */ public void rebuildRouterInfo(boolean blockingRebuild) { if (_log.shouldLog(Log.INFO)) _log.info("Rebuilding new routerInfo"); + synchronized (_routerInfoLock) { + locked_rebuildRouterInfo(blockingRebuild); + } + } - RouterInfo ri = null; + + /** + * Rebuild and republish our routerInfo since something significant + * has changed. + */ + private void locked_rebuildRouterInfo(boolean blockingRebuild) { + RouterInfo ri; if (_routerInfo != null) ri = new RouterInfo(_routerInfo); else @@ -822,15 +850,14 @@ public class Router implements RouterClock.ClockShiftListener { try { ri.setPublished(_context.clock().now()); Properties stats = _context.statPublisher().publishStatistics(); - stats.setProperty(RouterInfo.PROP_NETWORK_ID, NETWORK_ID+""); ri.setOptions(stats); + // deadlock thru createAddresses() thru SSU REA... move outside lock? ri.setAddresses(_context.commSystem().createAddresses()); - addCapabilities(ri); SigningPrivateKey key = _context.keyManager().getSigningPrivateKey(); if (key == null) { - _log.log(Log.CRIT, "Internal error - signing private key not known? wtf"); + _log.log(Log.CRIT, "Internal error - signing private key not known? Impossible?"); return; } ri.sign(key); @@ -847,6 +874,32 @@ public class Router implements RouterClock.ClockShiftListener { } } + /** + * Family Key Crypto Signer / Verifier. + * Not for external use. + * If family key is set, first call Will take a while to generate keys. + * Warning - risk of deadlock - do not call while holding locks + * (other than routerInfoLock) + * + * @return null on initialization failure + * @since 0.9.24 + */ + public FamilyKeyCrypto getFamilyKeyCrypto() { + synchronized (_familyKeyLock) { + if (_familyKeyCrypto == null) { + if (!_familyKeyCryptoFail) { + try { + _familyKeyCrypto = new FamilyKeyCrypto(_context); + } catch (GeneralSecurityException gse) { + _log.error("Failed to initialize family key crypto", gse); + _familyKeyCryptoFail = true; + } + } + } + } + return _familyKeyCrypto; + } + // publicize our ballpark capacity public static final char CAPABILITY_BW12 = 'K'; public static final char CAPABILITY_BW32 = 'L'; @@ -870,14 +923,11 @@ public class Router implements RouterClock.ClockShiftListener { /** * For building our RI. Not for external use. - * This does not publish the ri. - * This does not use anything in the ri (i.e. it can be freshly constructed) * - * TODO just return a string instead of passing in the RI? See PublishLocalRouterInfoJob. - * - * @param ri an unpublished ri we are generating. + * @return a capabilities string to be added to the RI */ - public void addCapabilities(RouterInfo ri) { + public String getCapabilities() { + StringBuilder rv = new StringBuilder(4); int bwLim = Math.min(_context.bandwidthLimiter().getInboundKBytesPerSecond(), _context.bandwidthLimiter().getOutboundKBytesPerSecond()); bwLim = (int)(bwLim * getSharePercentage()); @@ -886,40 +936,40 @@ public class Router implements RouterClock.ClockShiftListener { String force = _context.getProperty(PROP_FORCE_BWCLASS); if (force != null && force.length() > 0) { - ri.addCapability(force.charAt(0)); + rv.append(force.charAt(0)); } else if (bwLim < 12) { - ri.addCapability(CAPABILITY_BW12); - } else if (bwLim <= 32) { - ri.addCapability(CAPABILITY_BW32); + rv.append(CAPABILITY_BW12); + } else if (bwLim <= 48) { + rv.append(CAPABILITY_BW32); } else if (bwLim <= 64) { - ri.addCapability(CAPABILITY_BW64); + rv.append(CAPABILITY_BW64); } else if (bwLim <= 128) { - ri.addCapability(CAPABILITY_BW128); + rv.append(CAPABILITY_BW128); } else if (bwLim <= 256) { - ri.addCapability(CAPABILITY_BW256); + rv.append(CAPABILITY_BW256); } else if (bwLim <= 2000) { // TODO adjust threshold // 512 supported as of 0.9.18; // Add 256 as well for compatibility - ri.addCapability(CAPABILITY_BW512); - ri.addCapability(CAPABILITY_BW256); + rv.append(CAPABILITY_BW512); + rv.append(CAPABILITY_BW256); } else { // Unlimited supported as of 0.9.18; // Add 256 as well for compatibility - ri.addCapability(CAPABILITY_BW_UNLIMITED); - ri.addCapability(CAPABILITY_BW256); + rv.append(CAPABILITY_BW_UNLIMITED); + rv.append(CAPABILITY_BW256); } // if prop set to true, don't tell people we are ff even if we are if (_context.netDb().floodfillEnabled() && !_context.getBooleanProperty("router.hideFloodfillParticipant")) - ri.addCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL); + rv.append(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL); if(_context.getBooleanProperty(PROP_HIDDEN)) - ri.addCapability(RouterInfo.CAPABILITY_HIDDEN); + rv.append(RouterInfo.CAPABILITY_HIDDEN); if (_context.getBooleanProperty(PROP_FORCE_UNREACHABLE)) { - ri.addCapability(CAPABILITY_UNREACHABLE); - return; + rv.append(CAPABILITY_UNREACHABLE); + return rv.toString(); } switch (_context.commSystem().getStatus()) { case OK: @@ -929,13 +979,13 @@ public class Router implements RouterClock.ClockShiftListener { case IPV4_DISABLED_IPV6_OK: case IPV4_UNKNOWN_IPV6_OK: case IPV4_SNAT_IPV6_OK: - ri.addCapability(CAPABILITY_REACHABLE); + rv.append(CAPABILITY_REACHABLE); break; case DIFFERENT: case REJECT_UNSOLICITED: case IPV4_DISABLED_IPV6_FIREWALLED: - ri.addCapability(CAPABILITY_UNREACHABLE); + rv.append(CAPABILITY_UNREACHABLE); break; case DISCONNECTED: @@ -949,11 +999,22 @@ public class Router implements RouterClock.ClockShiftListener { // no explicit capability break; } + return rv.toString(); } + /* + * This checks the config only. We don't check the current RI + * due to deadlocks. + * + */ public boolean isHidden() { - RouterInfo ri = _routerInfo; - if ( (ri != null) && (ri.isHidden()) ) + //RouterInfo ri; + //synchronized (_routerInfoLock) { + // ri = _routerInfo; + //} + //if ( (ri != null) && (ri.isHidden()) ) + // return true; + if (_context.getBooleanProperty(PROP_HIDDEN)) return true; String h = _context.getProperty(PROP_HIDDEN_HIDDEN); if (h != null) @@ -1057,15 +1118,6 @@ public class Router implements RouterClock.ClockShiftListener { saveConfig(PROP_JBIGI, loaded); } - private void startupQueue() { - _context.jobQueue().runQueue(1); - } - - private void setupHandlers() { - _context.inNetMessagePool().registerHandlerJobBuilder(GarlicMessage.MESSAGE_TYPE, new GarlicMessageHandler(_context)); - //_context.inNetMessagePool().registerHandlerJobBuilder(TunnelMessage.MESSAGE_TYPE, new TunnelMessageHandler(_context)); - } - /** shut down after all tunnels are gone */ public static final int EXIT_GRACEFUL = 2; /** shut down immediately */ @@ -1140,7 +1192,7 @@ public class Router implements RouterClock.ClockShiftListener { _log.warn("Running shutdown task " + task.getClass()); try { //task.run(); - Thread t = new Thread(task, "Shutdown task " + task.getClass().getName()); + Thread t = new I2PAppThread(task, "Shutdown task " + task.getClass().getName()); t.setDaemon(true); t.start(); try { @@ -1162,7 +1214,6 @@ public class Router implements RouterClock.ClockShiftListener { try { _context.clientManager().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the client manager", t); } try { _context.namingService().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the naming service", t); } try { _context.jobQueue().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the job queue", t); } - try { _context.statPublisher().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the stats publisher", t); } try { _context.tunnelManager().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the tunnel manager", t); } try { _context.tunnelDispatcher().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the tunnel dispatcher", t); } try { _context.netDb().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the networkDb", t); } @@ -1350,7 +1401,7 @@ public class Router implements RouterClock.ClockShiftListener { ordered.putAll(_config); DataHelper.storeProps(ordered, new File(_configFilename)); } - } catch (Exception ioe) { + } catch (IOException ioe) { // warning, _log will be null when called from constructor if (_log != null) _log.error("Error saving the config to " + _configFilename, ioe); @@ -1391,6 +1442,7 @@ public class Router implements RouterClock.ClockShiftListener { * @return success * @since 0.8.13 */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public boolean saveConfig(Map toAdd, Collection toRemove) { synchronized(_configFileLock) { if (toAdd != null) @@ -1420,8 +1472,10 @@ public class Router implements RouterClock.ClockShiftListener { _eventLog.addEvent(EventLog.CLOCK_SHIFT, Long.toString(delta)); // update the routing key modifier _context.routerKeyGenerator().generateDateBasedModData(); - if (_context.commSystem().countActivePeers() <= 0) - return; + // Commented because this check makes no sense (#1014) + // .. and 'active' is relative to our broken time. + //if (_context.commSystem().countActivePeers() <= 0) + // return; if (delta > 0) _log.error("Restarting after large clock shift forward by " + DataHelper.formatDuration(delta)); else @@ -1450,7 +1504,7 @@ public class Router implements RouterClock.ClockShiftListener { ((RouterClock) _context.clock()).removeShiftListener(this); // Let's not stop accepting tunnels, etc //_started = _context.clock().now(); - Thread t = new Thread(new Restarter(_context), "Router Restart"); + Thread t = new I2PThread(new Restarter(_context), "Router Restart"); t.setPriority(Thread.NORM_PRIORITY + 1); t.start(); } @@ -1557,7 +1611,7 @@ public class Router implements RouterClock.ClockShiftListener { if (f.exists()) { long lastWritten = f.lastModified(); if (System.currentTimeMillis()-lastWritten > LIVELINESS_DELAY) { - System.err.println("WARN: Old router was not shut down gracefully, deleting router.ping"); + System.err.println("WARN: Old router was not shut down gracefully, deleting " + f); f.delete(); } else { return false; diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java index 31dbb49b3..2698faa0c 100644 --- a/router/java/src/net/i2p/router/RouterContext.java +++ b/router/java/src/net/i2p/router/RouterContext.java @@ -28,7 +28,6 @@ import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.router.transport.OutboundMessageRegistry; import net.i2p.router.tunnel.TunnelDispatcher; import net.i2p.router.tunnel.pool.TunnelPoolManager; -import net.i2p.update.UpdateManager; import net.i2p.util.KeyRing; import net.i2p.util.I2PProperties.I2PPropertyCallback; import net.i2p.util.SystemVersion; @@ -64,7 +63,6 @@ public class RouterContext extends I2PAppContext { private Banlist _banlist; private Blocklist _blocklist; private MessageValidator _messageValidator; - private UpdateManager _updateManager; //private MessageStateMonitor _messageStateMonitor; private RouterThrottle _throttle; private RouterAppManager _appManager; @@ -263,6 +261,9 @@ public class RouterContext extends I2PAppContext { /** * Convenience method for getting the router hash. * Equivalent to context.router().getRouterInfo().getIdentity().getHash() + * + * Warning - risk of deadlock - do not call while holding locks + * * @return may be null if called very early */ public Hash routerHash() { diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java index 66a31acce..9d0d0ddce 100644 --- a/router/java/src/net/i2p/router/RouterThrottleImpl.java +++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java @@ -29,7 +29,7 @@ class RouterThrottleImpl implements RouterThrottle { // TODO reduce private static final long JOB_LAG_LIMIT_TUNNEL = 500; private static final String PROP_MAX_TUNNELS = "router.maxParticipatingTunnels"; - private static final int DEFAULT_MAX_TUNNELS = 5000; + private static final int DEFAULT_MAX_TUNNELS = 10*1000; private static final String PROP_MAX_PROCESSINGTIME = "router.defaultProcessingTimeThrottle"; private static final long DEFAULT_REJECT_STARTUP_TIME = 10*60*1000; private static final String PROP_REJECT_STARTUP_TIME = "router.rejectStartupTime"; @@ -276,7 +276,7 @@ class RouterThrottleImpl implements RouterThrottle { // ok, we're not hosed, but can we handle the bandwidth requirements // of another tunnel? - rs = _context.statManager().getRate("tunnel.participatingMessageCount"); + rs = _context.statManager().getRate("tunnel.participatingMessageCountAvgPerTunnel"); r = null; double messagesPerTunnel = DEFAULT_MESSAGES_PER_TUNNEL_ESTIMATE; if (rs != null) { diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 78754ef28..80cfb9c84 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,10 +18,10 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 20; + public final static long BUILD = 18; /** for example "-test" */ - public final static String EXTRA = "-rc"; + public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; public static void main(String args[]) { System.out.println("I2P Router version: " + FULL_VERSION); diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index 30e063b7b..21e0813cc 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -9,6 +9,7 @@ package net.i2p.router; */ import java.io.Writer; +import java.security.GeneralSecurityException; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; @@ -16,6 +17,9 @@ import java.util.Properties; import net.i2p.CoreVersion; import net.i2p.data.DataHelper; +import net.i2p.data.Hash; +import net.i2p.data.router.RouterInfo; +import net.i2p.router.crypto.FamilyKeyCrypto; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; @@ -25,11 +29,12 @@ import net.i2p.util.Log; * Publishes some statistics about the router in the netDB. * */ -public class StatisticsManager implements Service { +public class StatisticsManager { private final Log _log; private final RouterContext _context; public final static String PROP_PUBLISH_RANKINGS = "router.publishPeerRankings"; + private static final String PROP_CONTACT_NAME = "netdb.contact"; /** enhance anonymity by only including build stats one out of this many times */ private static final int RANDOM_INCLUDE_STATS = 16; @@ -43,20 +48,32 @@ public class StatisticsManager implements Service { _log = context.logManager().getLog(StatisticsManager.class); } - /** noop */ - public void shutdown() {} - - /** noop */ - public void restart() {} - - /** noop */ - public void startup() {} - - /** Retrieve a snapshot of the statistics that should be published */ + /** + * Retrieve a snapshot of the statistics that should be published. + * + * This includes all standard options (as of 0.9.24, network ID and caps) + */ public Properties publishStatistics() { + // if hash is null, will be caught in fkc.sign() + return publishStatistics(_context.routerHash()); + } + + /** + * Retrieve a snapshot of the statistics that should be published. + * + * This includes all standard options (as of 0.9.24, network ID and caps) + * + * @param h current router hash, non-null + * @since 0.9.24 + */ + public Properties publishStatistics(Hash h) { Properties stats = new Properties(); stats.setProperty("router.version", RouterVersion.VERSION); - stats.setProperty("coreVersion", CoreVersion.VERSION); + // scheduled for removal, never used + if (CoreVersion.VERSION.equals("0.9.23")) + stats.setProperty("coreVersion", CoreVersion.VERSION); + stats.setProperty(RouterInfo.PROP_NETWORK_ID, Integer.toString(Router.NETWORK_ID)); + stats.setProperty(RouterInfo.PROP_CAPABILITIES, _context.router().getCapabilities()); // No longer expose, to make build tracking more expensive // stats.setProperty("router.id", RouterVersion.ID); @@ -148,8 +165,10 @@ public class StatisticsManager implements Service { //includeRate("tunnel.acceptLoad", stats, new long[] { 10*60*1000 }); } - // So that we will still get build requests - stats.setProperty("stat_uptime", "90m"); + // So that we will still get build requests - not required since 0.7.9 2010-01-12 + // scheduled for removal + if (CoreVersion.VERSION.equals("0.9.23")) + stats.setProperty("stat_uptime", "90m"); if (FloodfillNetworkDatabaseFacade.isFloodfill(_context.router().getRouterInfo())) { int ri = _context.router().getUptime() > 30*60*1000 ? _context.netDb().getKnownRouters() : @@ -161,6 +180,48 @@ public class StatisticsManager implements Service { stats.setProperty("netdb.knownLeaseSets", String.valueOf(ls)); } + String contact = _context.getProperty(PROP_CONTACT_NAME); + if (contact != null) + stats.setProperty("contact", contact); + + String family = _context.getProperty(FamilyKeyCrypto.PROP_FAMILY_NAME); + if (family != null) { + stats.setProperty(FamilyKeyCrypto.OPT_NAME, family); + String sig = null; + String key = null; + RouterInfo oldRI = _context.router().getRouterInfo(); + if (oldRI != null) { + // don't do it if family changed + if (family.equals(oldRI.getOption(FamilyKeyCrypto.OPT_NAME))) { + // copy over the pubkey and signature + key = oldRI.getOption(FamilyKeyCrypto.OPT_KEY); + if (key != null) { + if (key.contains(";")) { + // we changed the separator from ';' to ':' + key = null; + } else { + stats.setProperty(FamilyKeyCrypto.OPT_KEY, key); + sig = oldRI.getOption(FamilyKeyCrypto.OPT_SIG); + if (sig != null) + stats.setProperty(FamilyKeyCrypto.OPT_SIG, sig); + } + } + } + } + if (sig == null || key == null) { + FamilyKeyCrypto fkc = _context.router().getFamilyKeyCrypto(); + if (fkc != null) { + try { + stats.putAll(fkc.sign(family, h)); + } catch (GeneralSecurityException gse) { + _log.error("Failed to sign router family", gse); + stats.remove(FamilyKeyCrypto.OPT_KEY); + stats.remove(FamilyKeyCrypto.OPT_SIG); + } + } + } + } + return stats; } diff --git a/router/java/src/net/i2p/router/TunnelManagerFacade.java b/router/java/src/net/i2p/router/TunnelManagerFacade.java index 2a35d0c97..5b3e000ac 100644 --- a/router/java/src/net/i2p/router/TunnelManagerFacade.java +++ b/router/java/src/net/i2p/router/TunnelManagerFacade.java @@ -146,6 +146,21 @@ public interface TunnelManagerFacade extends Service { * */ public void buildTunnels(Destination client, ClientTunnelSettings settings); + + /** + * Add another destination to the same tunnels. + * Must have same encryption key and a different signing key. + * @throws IllegalArgumentException if not + * @return success + * @since 0.9.21 + */ + public boolean addAlias(Destination dest, ClientTunnelSettings settings, Destination existingClient); + + /** + * Remove another destination to the same tunnels. + * @since 0.9.21 + */ + public void removeAlias(Destination dest); public TunnelPoolSettings getInboundSettings(); public TunnelPoolSettings getOutboundSettings(); diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java index 329cf5eae..24184cc14 100644 --- a/router/java/src/net/i2p/router/TunnelPoolSettings.java +++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java @@ -1,11 +1,13 @@ package net.i2p.router; +import java.util.Set; import java.util.Locale; import java.util.Map; import java.util.Properties; import net.i2p.data.Base64; import net.i2p.data.Hash; +import net.i2p.util.ConcurrentHashSet; import net.i2p.util.NativeBigInteger; import net.i2p.util.RandomSource; import net.i2p.util.SystemVersion; @@ -31,6 +33,8 @@ public class TunnelPoolSettings { private final Properties _unknownOptions; private Hash _randomKey; private int _priority; + private final Set _aliases; + private Hash _aliasOf; /** prefix used to override the router's defaults for clients */ // unimplemented @@ -72,11 +76,11 @@ public class TunnelPoolSettings { private static final int DEFAULT_LENGTH_VARIANCE = 0; /** expl only */ private static final int DEFAULT_IB_EXPL_LENGTH = 2; - //private static final int DEFAULT_OB_EXPL_LENGTH = isSlow ? 2 : 3; - private static final int DEFAULT_OB_EXPL_LENGTH = 2; + private static final int DEFAULT_OB_EXPL_LENGTH = isSlow ? 2 : 3; + //private static final int DEFAULT_OB_EXPL_LENGTH = 2; private static final int DEFAULT_IB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; - //private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = 0; - private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; + private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = 0; + //private static final int DEFAULT_OB_EXPL_LENGTH_VARIANCE = isSlow ? 0 : 1; public static final boolean DEFAULT_ALLOW_ZERO_HOP = true; public static final int DEFAULT_IP_RESTRICTION = 2; // class B (/16) @@ -119,6 +123,10 @@ public class TunnelPoolSettings { _randomKey = generateRandomKey(); if (_isExploratory && !_isInbound) _priority = EXPLORATORY_PRIORITY; + if (!_isExploratory) + _aliases = new ConcurrentHashSet(4); + else + _aliases = null; } /** how many tunnels should be available at all times */ @@ -206,6 +214,34 @@ public class TunnelPoolSettings { /** what destination is this a client tunnel for (or null if exploratory) */ public Hash getDestination() { return _destination; } + + /** + * Other destinations that use the same tunnel (or null if exploratory) + * Modifiable, concurrent, not a copy + * @since 0.9.21 + */ + public Set getAliases() { + return _aliases; + } + + /** + * Other destination that this is an alias of (or null). + * If non-null, don't build tunnels. + * @since 0.9.21 + */ + public Hash getAliasOf() { + return _aliasOf; + } + + + /** + * Set other destination that this is an alias of (or null). + * If non-null, don't build tunnels. + * @since 0.9.21 + */ + public void setAliasOf(Hash h) { + _aliasOf = h; + } /** * random key used for peer ordering @@ -235,7 +271,7 @@ public class TunnelPoolSettings { public int getPriority() { return _priority; } public Properties getUnknownOptions() { return _unknownOptions; } - + /** * Defaults in props are NOT honored. * In-JVM client side must promote defaults to the primary map. diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java index 10a480c78..d94bb897b 100644 --- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java +++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java @@ -16,6 +16,7 @@ import java.io.OutputStream; import java.net.Socket; import java.util.concurrent.ConcurrentHashMap; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -39,6 +40,7 @@ import net.i2p.data.i2cp.SendMessageMessage; import net.i2p.data.i2cp.SendMessageExpiresMessage; import net.i2p.data.i2cp.SessionConfig; import net.i2p.data.i2cp.SessionId; +import net.i2p.data.i2cp.SessionStatusMessage; import net.i2p.router.Job; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; @@ -51,6 +53,9 @@ import net.i2p.util.SimpleTimer; /** * Bridge the router and the client - managing state for a client. * + * As of release 0.9.21, multiple sessions are supported on a single + * I2CP connection. These sessions share tunnels and some configuration. + * * @author jrandom */ class ClientConnectionRunner { @@ -61,21 +66,16 @@ class ClientConnectionRunner { private final Socket _socket; /** output stream of the socket that I2CP messages bound to the client should be written to */ private OutputStream _out; - /** session ID of the current client */ - private SessionId _sessionId; - /** user's config */ - private SessionConfig _config; + + private final ConcurrentHashMap _sessions; + private String _clientVersion; /** * Mapping of MessageId to Payload, storing messages for retrieval. * Unused for i2cp.fastReceive = "true" (_dontSendMSMOnRecive = true) */ private final Map _messages; - /** lease set request state, or null if there is no request pending on at the moment */ - private LeaseRequestState _leaseRequest; private int _consecutiveLeaseRequestFails; - /** currently allocated leaseSet, or null if none is allocated */ - private LeaseSet _currentLeaseSet; /** * Set of messageIds created but not yet ACCEPTED. * Unused for i2cp.messageReliability = "none" (_dontSendMSM = true) @@ -83,7 +83,7 @@ class ClientConnectionRunner { private final Set _acceptedPending; /** thingy that does stuff */ protected I2CPMessageReader _reader; - /** just for this destination */ + /** Used for all sessions, which must all have the same crypto keys */ private SessionKeyManager _sessionKeyManager; /** * This contains the last 10 MessageIds that have had their (non-ack) status @@ -91,7 +91,6 @@ class ClientConnectionRunner { */ private final List _alreadyProcessed; private ClientWriterRunner _writer; - private Hash _destHashCache; /** are we, uh, dead */ private volatile boolean _dead; /** For outbound traffic. true if i2cp.messageReliability = "none"; @since 0.8.1 */ @@ -108,11 +107,31 @@ class ClientConnectionRunner { private static final int MAX_LEASE_FAILS = 5; private static final int BUF_SIZE = 32*1024; + private static final int MAX_SESSIONS = 4; /** @since 0.9.2 */ private static final String PROP_TAGS = "crypto.tagsToSend"; private static final String PROP_THRESH = "crypto.lowTagThreshold"; + /** + * For multisession + * @since 0.9.21 + */ + private static class SessionParams { + final Destination dest; + final boolean isPrimary; + SessionId sessionId; + SessionConfig config; + LeaseRequestState leaseRequest; + Rerequest rerequestTimer; + LeaseSet currentLeaseSet; + + SessionParams(Destination d, boolean isPrimary) { + dest = d; + this.isPrimary = isPrimary; + } + } + /** * Create a new runner against the given socket * @@ -124,6 +143,7 @@ class ClientConnectionRunner { _socket = socket; // unused for fastReceive _messages = new ConcurrentHashMap(); + _sessions = new ConcurrentHashMap(4); _alreadyProcessed = new ArrayList(); _acceptedPending = new ConcurrentHashSet(); _messageId = new AtomicInteger(_context.random().nextInt()); @@ -168,8 +188,7 @@ class ClientConnectionRunner { // router may be null in unit tests if ((_context.router() == null || _context.router().isAlive()) && _log.shouldWarn()) - _log.warn("Stop the I2CP connection! current leaseSet: " - + _currentLeaseSet, new Exception("Stop client connection")); + _log.warn("Stop the I2CP connection!", new Exception("Stop client connection")); _dead = true; // we need these keys to unpublish the leaseSet if (_reader != null) _reader.stopReading(); @@ -180,21 +199,61 @@ class ClientConnectionRunner { if (_sessionKeyManager != null) _sessionKeyManager.shutdown(); _manager.unregisterConnection(this); - if (_currentLeaseSet != null) - _context.netDb().unpublish(_currentLeaseSet); - _leaseRequest = null; + for (SessionParams sp : _sessions.values()) { + LeaseSet ls = sp.currentLeaseSet; + if (ls != null) + _context.netDb().unpublish(ls); + if (!sp.isPrimary) + _context.tunnelManager().removeAlias(sp.dest); + } synchronized (_alreadyProcessed) { _alreadyProcessed.clear(); } - //_config = null; - //_manager = null; + _sessions.clear(); } /** * Current client's config, - * will be null before session is established + * will be null if session not found + * IS subsession aware. + * @since 0.9.21 added hash param */ - public SessionConfig getConfig() { return _config; } + public SessionConfig getConfig(Hash h) { + SessionParams sp = _sessions.get(h); + if (sp == null) + return null; + return sp.config; + } + + /** + * Current client's config, + * will be null if session not found + * IS subsession aware. + * Returns null if id is null. + * @since 0.9.21 added id param + */ + public SessionConfig getConfig(SessionId id) { + if (id == null) + return null; + for (SessionParams sp : _sessions.values()) { + if (id.equals(sp.sessionId)) + return sp.config; + } + return null; + } + + /** + * Primary client's config, + * will be null if session not set up + * @since 0.9.21 + */ + public SessionConfig getPrimaryConfig() { + for (SessionParams sp : _sessions.values()) { + if (sp.isPrimary) + return sp.config; + } + return null; + } /** * The client version. @@ -216,41 +275,200 @@ class ClientConnectionRunner { /** current client's sessionkeymanager */ public SessionKeyManager getSessionKeyManager() { return _sessionKeyManager; } - /** currently allocated leaseSet */ - public LeaseSet getLeaseSet() { return _currentLeaseSet; } - void setLeaseSet(LeaseSet ls) { _currentLeaseSet = ls; } + /** + * Currently allocated leaseSet. + * IS subsession aware. Returns primary leaseset only. + * @return leaseSet or null if not yet set or unknown hash + * @since 0.9.21 added hash parameter + */ + public LeaseSet getLeaseSet(Hash h) { + SessionParams sp = _sessions.get(h); + if (sp == null) + return null; + return sp.currentLeaseSet; + } + + /** + * Currently allocated leaseSet. + * IS subsession aware. + */ + void setLeaseSet(LeaseSet ls) { + Hash h = ls.getDestination().calculateHash(); + SessionParams sp = _sessions.get(h); + if (sp == null) + return; + sp.currentLeaseSet = ls; + } /** * Equivalent to getConfig().getDestination().calculateHash(); * will be null before session is established + * Not subsession aware. Returns primary session hash. + * Don't use if you can help it. + * + * @return primary hash or null if not yet set */ - public Hash getDestHash() { return _destHashCache; } + public Hash getDestHash() { + SessionConfig cfg = getPrimaryConfig(); + if (cfg != null) + return cfg.getDestination().calculateHash(); + return null; + } + + /** + * Return the hash for the given ID + * @return hash or null if unknown + * @since 0.9.21 + */ + public Hash getDestHash(SessionId id) { + if (id == null) + return null; + for (Map.Entry e : _sessions.entrySet()) { + if (id.equals(e.getValue().sessionId)) + return e.getKey(); + } + return null; + } + + /** + * Return the dest for the given ID + * @return dest or null if unknown + * @since 0.9.21 + */ + public Destination getDestination(SessionId id) { + if (id == null) + return null; + for (SessionParams sp : _sessions.values()) { + if (id.equals(sp.sessionId)) + return sp.dest; + } + return null; + } /** - * @return current client's sessionId or null if not yet set + * Subsession aware. + * + * @param h the local target + * @return current client's sessionId or null if not yet set or not a valid hash + * @since 0.9.21 */ - SessionId getSessionId() { return _sessionId; } + SessionId getSessionId(Hash h) { + SessionParams sp = _sessions.get(h); + if (sp == null) + return null; + return sp.sessionId; + } + + /** + * Subsession aware. + * + * @return all current client's sessionIds, non-null + * @since 0.9.21 + */ + List getSessionIds() { + List rv = new ArrayList(_sessions.size()); + for (SessionParams sp : _sessions.values()) { + SessionId id = sp.sessionId; + if (id != null) + rv.add(id); + } + return rv; + } + + /** + * Subsession aware. + * + * @return all current client's destinations, non-null + * @since 0.9.21 + */ + List getDestinations() { + List rv = new ArrayList(_sessions.size()); + for (SessionParams sp : _sessions.values()) { + rv.add(sp.dest); + } + return rv; + } /** * To be called only by ClientManager. * + * @param hash for the session * @throws IllegalStateException if already set + * @since 0.9.21 added hash param */ - void setSessionId(SessionId id) { - if (_sessionId != null) + void setSessionId(Hash hash, SessionId id) { + if (hash == null) throw new IllegalStateException(); - _sessionId = id; + if (id == null) + throw new NullPointerException(); + SessionParams sp = _sessions.get(hash); + if (sp == null || sp.sessionId != null) + throw new IllegalStateException(); + sp.sessionId = id; + } + + /** + * Kill the session. Caller must kill runner if none left. + * + * @since 0.9.21 + */ + void removeSession(SessionId id) { + if (id == null) + return; + boolean isPrimary = false; + for (Iterator iter = _sessions.values().iterator(); iter.hasNext(); ) { + SessionParams sp = iter.next(); + if (id.equals(sp.sessionId)) { + if (_log.shouldLog(Log.INFO)) + _log.info("Destroying client session " + id); + iter.remove(); + // Tell client manger + _manager.unregisterSession(id, sp.dest); + LeaseSet ls = sp.currentLeaseSet; + if (ls != null) + _context.netDb().unpublish(ls); + isPrimary = sp.isPrimary; + if (!isPrimary) + _context.tunnelManager().removeAlias(sp.dest); + break; + } + } + if (isPrimary && !_sessions.isEmpty()) { + // kill all the others also + for (SessionParams sp : _sessions.values()) { + if (_log.shouldLog(Log.INFO)) + _log.info("Destroying remaining client subsession " + sp.sessionId); + _manager.unregisterSession(sp.sessionId, sp.dest); + LeaseSet ls = sp.currentLeaseSet; + if (ls != null) + _context.netDb().unpublish(ls); + _context.tunnelManager().removeAlias(sp.dest); + } + } } - /** data for the current leaseRequest, or null if there is no active leaseSet request */ - LeaseRequestState getLeaseRequest() { return _leaseRequest; } + /** + * Data for the current leaseRequest, or null if there is no active leaseSet request. + * Not subsession aware. Returns primary ID only. + * @since 0.9.21 added hash param + */ + LeaseRequestState getLeaseRequest(Hash h) { + SessionParams sp = _sessions.get(h); + if (sp == null) + return null; + return sp.leaseRequest; + } /** @param req non-null */ public void failLeaseRequest(LeaseRequestState req) { boolean disconnect = false; + Hash h = req.getRequested().getDestination().calculateHash(); + SessionParams sp = _sessions.get(h); + if (sp == null) + return; synchronized (this) { - if (_leaseRequest == req) { - _leaseRequest = null; + if (sp.leaseRequest == req) { + sp.leaseRequest = null; disconnect = ++_consecutiveLeaseRequestFails > MAX_LEASE_FAILS; } } @@ -291,19 +509,34 @@ class ClientConnectionRunner { * @return SessionStatusMessage return code, 1 for success, != 1 for failure */ public int sessionEstablished(SessionConfig config) { - _destHashCache = config.getDestination().calculateHash(); + Destination dest = config.getDestination(); + Hash destHash = dest.calculateHash(); if (_log.shouldLog(Log.DEBUG)) - _log.debug("SessionEstablished called for destination " + _destHashCache.toBase64()); - _config = config; + _log.debug("SessionEstablished called for destination " + destHash); + if (_sessions.size() > MAX_SESSIONS) + return SessionStatusMessage.STATUS_REFUSED; + boolean isPrimary = _sessions.isEmpty(); + if (!isPrimary) { + // all encryption keys must be the same + for (SessionParams sp : _sessions.values()) { + if (!dest.getPublicKey().equals(sp.dest.getPublicKey())) + return SessionStatusMessage.STATUS_INVALID; + } + } + SessionParams sp = new SessionParams(dest, isPrimary); + sp.config = config; + SessionParams old = _sessions.putIfAbsent(destHash, sp); + if (old != null) + return SessionStatusMessage.STATUS_INVALID; // We process a few options here, but most are handled by the tunnel manager. // The ones here can't be changed later. Properties opts = config.getOptions(); - if (opts != null) { + if (isPrimary && opts != null) { _dontSendMSM = "none".equals(opts.getProperty(I2PClient.PROP_RELIABILITY, "").toLowerCase(Locale.US)); _dontSendMSMOnReceive = Boolean.parseBoolean(opts.getProperty(I2PClient.PROP_FAST_RECEIVE)); } // per-destination session key manager to prevent rather easy correlation - if (_sessionKeyManager == null) { + if (isPrimary && _sessionKeyManager == null) { int tags = TransientSessionKeyManager.DEFAULT_TAGS; int thresh = TransientSessionKeyManager.LOW_THRESHOLD; if (opts != null) { @@ -317,10 +550,8 @@ class ClientConnectionRunner { } } _sessionKeyManager = new TransientSessionKeyManager(_context, tags, thresh); - } else { - _log.error("SessionEstablished called for twice for destination " + _destHashCache.toBase64().substring(0,4)); } - return _manager.destinationEstablished(this); + return _manager.destinationEstablished(this, dest); } /** @@ -331,14 +562,21 @@ class ClientConnectionRunner { * * Do not use for status = STATUS_SEND_ACCEPTED; use ackSendMessage() for that. * + * @param dest the client * @param id the router's ID for this message * @param messageNonce the client's ID for this message * @param status see I2CP MessageStatusMessage for success/failure codes */ - void updateMessageDeliveryStatus(MessageId id, long messageNonce, int status) { + void updateMessageDeliveryStatus(Destination dest, MessageId id, long messageNonce, int status) { if (_dead || messageNonce <= 0) return; - _context.jobQueue().addJob(new MessageDeliveryStatusUpdate(id, messageNonce, status)); + SessionParams sp = _sessions.get(dest.calculateHash()); + if (sp == null) + return; + SessionId sid = sp.sessionId; + if (sid == null) + return; // sid = new SessionId(foo) ??? + _context.jobQueue().addJob(new MessageDeliveryStatusUpdate(sid, id, messageNonce, status)); } /** @@ -346,19 +584,23 @@ class ClientConnectionRunner { * updated. This takes care of all the LeaseRequestState stuff (including firing any jobs) */ void leaseSetCreated(LeaseSet ls) { - LeaseRequestState state = null; + Hash h = ls.getDestination().calculateHash(); + SessionParams sp = _sessions.get(h); + if (sp == null) + return; + LeaseRequestState state; synchronized (this) { - state = _leaseRequest; + state = sp.leaseRequest; if (state == null) { if (_log.shouldLog(Log.WARN)) _log.warn("LeaseRequest is null and we've received a new lease?! perhaps this is odd... " + ls); return; } else { state.setIsSuccessful(true); - _currentLeaseSet = ls; + setLeaseSet(ls); if (_log.shouldLog(Log.DEBUG)) _log.debug("LeaseSet created fully: " + state + " / " + ls); - _leaseRequest = null; + sp.leaseRequest = null; _consecutiveLeaseRequestFails = 0; } } @@ -427,12 +669,12 @@ class ClientConnectionRunner { if (_log.shouldLog(Log.DEBUG)) _log.debug("** Receiving message " + id.getMessageId() + " with payload of size " - + payload.getSize() + " for session " + _sessionId.getSessionId()); + + payload.getSize() + " for session " + message.getSessionId()); //long beforeDistribute = _context.clock().now(); // the following blocks as described above - SessionConfig cfg = _config; - if (cfg != null) - _manager.distributeMessage(cfg.getDestination(), dest, payload, + Destination fromDest = getDestination(message.getSessionId()); + if (fromDest != null) + _manager.distributeMessage(fromDest, dest, payload, id, message.getNonce(), expiration, flags); // else log error? //long timeToDistribute = _context.clock().now() - beforeDistribute; @@ -452,11 +694,9 @@ class ClientConnectionRunner { * @param id OUR id for the message * @param nonce HIS id for the message */ - void ackSendMessage(MessageId id, long nonce) { + void ackSendMessage(SessionId sid, MessageId id, long nonce) { if (_dontSendMSM || nonce == 0) return; - SessionId sid = _sessionId; - if (sid == null) return; if (_log.shouldLog(Log.DEBUG)) _log.debug("Acking message send [accepted]" + id + " / " + nonce + " for sessionId " + sid); @@ -480,6 +720,9 @@ class ClientConnectionRunner { * * Note that no failure indication is available. * Fails silently on e.g. queue overflow to client, client dead, etc. + * + * @param toDest non-null + * @param fromDest generally null when from remote, non-null if from local */ void receiveMessage(Destination toDest, Destination fromDest, Payload payload) { if (_dead) return; @@ -489,13 +732,33 @@ class ClientConnectionRunner { j.runJob(); } + /** + * Asynchronously deliver the message to the current runner + * + * Note that no failure indication is available. + * Fails silently on e.g. queue overflow to client, client dead, etc. + * + * @param toHash non-null + * @param fromDest generally null when from remote, non-null if from local + * @since 0.9.21 + */ + void receiveMessage(Hash toHash, Destination fromDest, Payload payload) { + SessionParams sp = _sessions.get(toHash); + if (sp == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("No session found for receiveMessage()"); + return; + } + receiveMessage(sp.dest, fromDest, payload); + } + /** * Send async abuse message to the client * */ - public void reportAbuse(String reason, int severity) { + public void reportAbuse(Destination dest, String reason, int severity) { if (_dead) return; - _context.jobQueue().addJob(new ReportAbuseJob(_context, this, reason, severity)); + _context.jobQueue().addJob(new ReportAbuseJob(_context, this, dest, reason, severity)); } /** @@ -504,13 +767,17 @@ class ClientConnectionRunner { * within the timeout specified, queue up the onFailedJob. This call does not * block. * + * Job args are always null, may need some fixups if we start using them. + * + * @param h the Destination's hash * @param set LeaseSet with requested leases - this object must be updated to contain the * signed version (as well as any changed/added/removed Leases) + * The LeaseSet contains Leases and destination only, it is unsigned. * @param expirationTime ms to wait before failing * @param onCreateJob Job to run after the LeaseSet is authorized, null OK * @param onFailedJob Job to run after the timeout passes without receiving authorization, null OK */ - void requestLeaseSet(LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob) { + void requestLeaseSet(Hash h, LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob) { if (_dead) { if (_log.shouldLog(Log.WARN)) _log.warn("Requesting leaseSet from a dead client: " + set); @@ -518,6 +785,12 @@ class ClientConnectionRunner { _context.jobQueue().addJob(onFailedJob); return; } + SessionParams sp = _sessions.get(h); + if (sp == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Requesting leaseSet for an unknown sesssion"); + return; + } // We can't use LeaseSet.equals() here because the dest, keys, and sig on // the new LeaseSet are null. So we compare leases one by one. // In addition, the client rewrites the expiration time of all the leases to @@ -528,12 +801,16 @@ class ClientConnectionRunner { // so the comparison will always work. int leases = set.getLeaseCount(); // synch so _currentLeaseSet isn't changed out from under us + LeaseSet current = null; + Destination dest = sp.dest; + LeaseRequestState state; synchronized (this) { - if (_currentLeaseSet != null && _currentLeaseSet.getLeaseCount() == leases) { + current = sp.currentLeaseSet; + if (current != null && current.getLeaseCount() == leases) { for (int i = 0; i < leases; i++) { - if (! _currentLeaseSet.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId())) + if (! current.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId())) break; - if (! _currentLeaseSet.getLease(i).getGateway().equals(set.getLease(i).getGateway())) + if (! current.getLease(i).getGateway().equals(set.getLease(i).getGateway())) break; if (i == leases - 1) { if (_log.shouldLog(Log.INFO)) @@ -544,31 +821,51 @@ class ClientConnectionRunner { } } } - } - if (_log.shouldLog(Log.INFO)) - _log.info("Current leaseSet " + _currentLeaseSet + "\nNew leaseSet " + set); - LeaseRequestState state = null; - synchronized (this) { - state = _leaseRequest; + + if (_log.shouldLog(Log.INFO)) + _log.info("Current leaseSet " + current + "\nNew leaseSet " + set); + + state = sp.leaseRequest; if (state != null) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Already requesting " + state); LeaseSet requested = state.getRequested(); LeaseSet granted = state.getGranted(); long ours = set.getEarliestLeaseDate(); if ( ( (requested != null) && (requested.getEarliestLeaseDate() > ours) ) || ( (granted != null) && (granted.getEarliestLeaseDate() > ours) ) ) { // theirs is newer + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Already requesting, theirs newer, do nothing: " + state); } else { // ours is newer, so wait a few secs and retry - _context.simpleTimer2().addEvent(new Rerequest(set, expirationTime, onCreateJob, onFailedJob), 3*1000); + set.setDestination(dest); + Rerequest timer = new Rerequest(set, expirationTime, onCreateJob, onFailedJob); + sp.rerequestTimer = timer; + _context.simpleTimer2().addEvent(timer, 3*1000); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Already requesting, ours newer, wait 3 sec: " + state); } // fire onCreated? return; // already requesting } else { - _leaseRequest = state = new LeaseRequestState(onCreateJob, onFailedJob, _context.clock().now() + expirationTime, set); - if (_log.shouldLog(Log.DEBUG)) - _log.debug("New request: " + state); + set.setDestination(dest); + if (current == null && _context.tunnelManager().getOutboundClientTunnelCount(h) <= 0) { + // at startup of a client, where we don't have a leaseset, wait for + // an outbound tunnel also, so the client doesn't start sending data + // before we are ready + Rerequest timer = new Rerequest(set, expirationTime, onCreateJob, onFailedJob); + sp.rerequestTimer = timer; + _context.simpleTimer2().addEvent(timer, 1000); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("No current LS but no OB tunnels, wait 1 sec for " + h); + return; + } else { + // so the timer won't fire off with an older LS request + sp.rerequestTimer = null; + sp.leaseRequest = state = new LeaseRequestState(onCreateJob, onFailedJob, + _context.clock().now() + expirationTime, set); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("New request: " + state); + } } } _context.jobQueue().addJob(new RequestLeaseSetJob(_context, this, state)); @@ -580,6 +877,7 @@ class ClientConnectionRunner { private final Job _onCreate; private final Job _onFailed; + /** @param ls dest must be set */ public Rerequest(LeaseSet ls, long expirationTime, Job onCreate, Job onFailed) { _ls = ls; _expirationTime = expirationTime; @@ -588,7 +886,21 @@ class ClientConnectionRunner { } public void timeReached() { - requestLeaseSet(_ls, _expirationTime, _onCreate, _onFailed); + Hash h = _ls.getDestination().calculateHash(); + SessionParams sp = _sessions.get(h); + if (sp == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("cancelling rerequest, session went away: " + h); + return; + } + synchronized(ClientConnectionRunner.this) { + if (sp.rerequestTimer != Rerequest.this) { + if (_log.shouldLog(Log.WARN)) + _log.warn("cancelling rerequest, newer request came in: " + h); + return; + } + } + requestLeaseSet(h, _ls, _expirationTime, _onCreate, _onFailed); } } @@ -697,6 +1009,7 @@ class ClientConnectionRunner { private static final int MAX_REQUEUE = 60; // 30 sec. private class MessageDeliveryStatusUpdate extends JobImpl { + private final SessionId _sessId; private final MessageId _messageId; private final long _messageNonce; private final int _status; @@ -710,8 +1023,9 @@ class ClientConnectionRunner { * @param messageNonce the client's ID for this message * @param status see I2CP MessageStatusMessage for success/failure codes */ - public MessageDeliveryStatusUpdate(MessageId id, long messageNonce, int status) { + public MessageDeliveryStatusUpdate(SessionId sid, MessageId id, long messageNonce, int status) { super(ClientConnectionRunner.this._context); + _sessId = sid; _messageId = id; _messageNonce = messageNonce; _status = status; @@ -727,7 +1041,7 @@ class ClientConnectionRunner { MessageStatusMessage msg = new MessageStatusMessage(); msg.setMessageId(_messageId.getMessageId()); - msg.setSessionId(_sessionId.getSessionId()); + msg.setSessionId(_sessId.getSessionId()); // has to be >= 0, it is initialized to -1 msg.setNonce(_messageNonce); msg.setSize(0); @@ -738,12 +1052,12 @@ class ClientConnectionRunner { // bug requeueing forever? failsafe _log.error("Abandon update for message " + _messageId + " to " + MessageStatusMessage.getStatusString(msg.getStatus()) - + " for session " + _sessionId.getSessionId()); + + " for " + _sessId); } else { if (_log.shouldLog(Log.WARN)) _log.warn("Almost send an update for message " + _messageId + " to " + MessageStatusMessage.getStatusString(msg.getStatus()) - + " for session " + _sessionId.getSessionId() + + " for " + _sessId + " before they knew the messageId! delaying .5s"); _lastTried = _context.clock().now(); requeue(REQUEUE_DELAY); @@ -778,14 +1092,14 @@ class ClientConnectionRunner { if (_log.shouldLog(Log.DEBUG)) _log.info("Updating message status for message " + _messageId + " to " + MessageStatusMessage.getStatusString(msg.getStatus()) - + " for session " + _sessionId.getSessionId() + + " for " + _sessId + " (with nonce=2), retrying after " + (_context.clock().now() - _lastTried)); } else { if (_log.shouldLog(Log.DEBUG)) _log.debug("Updating message status for message " + _messageId + " to " + MessageStatusMessage.getStatusString(msg.getStatus()) - + " for session " + _sessionId.getSessionId() + " (with nonce=2)"); + + " for " + _sessId + " (with nonce=2)"); } try { diff --git a/router/java/src/net/i2p/router/client/ClientListenerRunner.java b/router/java/src/net/i2p/router/client/ClientListenerRunner.java index e88339b0e..10e924106 100644 --- a/router/java/src/net/i2p/router/client/ClientListenerRunner.java +++ b/router/java/src/net/i2p/router/client/ClientListenerRunner.java @@ -18,6 +18,7 @@ import net.i2p.client.I2PClient; import net.i2p.router.Router; import net.i2p.router.RouterContext; import net.i2p.util.Log; +import net.i2p.util.PortMapper; /** * Listen for connections on the specified port, and toss them onto the client manager's @@ -78,13 +79,18 @@ class ClientListenerRunner implements Runnable { protected void runServer() { _running = true; int curDelay = 1000; + final String portMapperService = (this instanceof SSLClientListenerRunner) ? PortMapper.SVC_I2CP_SSL + : PortMapper.SVC_I2CP; while (_running) { try { _socket = getServerSocket(); if (_log.shouldLog(Log.DEBUG)) _log.debug("ServerSocket created, before accept: " + _socket); - + if (_port > 0) { + // not for DomainClientListenerRunner + _context.portMapper().register(portMapperService, _socket.getInetAddress().getHostAddress(), _port); + } curDelay = 1000; _listening = true; while (_running) { @@ -115,6 +121,11 @@ class ClientListenerRunner implements Runnable { } catch (IOException ioe) { if (isAlive()) _log.error("Error listening on port " + _port, ioe); + } finally { + if (_port > 0) { + // not for DomainClientListenerRunner + _context.portMapper().unregister(portMapperService); + } } _listening = false; diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index e94f202d9..6665409a0 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -55,9 +55,11 @@ class ClientManager { protected final List _listeners; // Destination --> ClientConnectionRunner // Locked for adds/removes but not lookups + // If a runner has multiple sessions it will be in here multiple times, one for each dest private final Map _runners; // Same as what's in _runners, but for fast lookup by Hash // Locked for adds/removes but not lookups + // If a runner has multiple sessions it will be in here multiple times, one for each dest private final Map _runnersByHash; // ClientConnectionRunner for clients w/out a Dest yet private final Set _pendingRunners; @@ -214,24 +216,44 @@ class ClientManager { } } + /** + * Remove all sessions for this runner. + */ public void unregisterConnection(ClientConnectionRunner runner) { - _log.warn("Unregistering (dropping) a client connection"); synchronized (_pendingRunners) { _pendingRunners.remove(runner); } - if ( (runner.getConfig() != null) && (runner.getConfig().getDestination() != null) ) { - // after connection establishment - Destination dest = runner.getConfig().getDestination(); - synchronized (_runners) { - SessionId id = runner.getSessionId(); - if (id != null) - _runnerSessionIds.remove(id); + + List ids = runner.getSessionIds(); + List dests = runner.getDestinations(); + if (_log.shouldLog(Log.WARN)) + _log.warn("Unregistering (dropping) a client connection with ids: " + ids); + synchronized (_runners) { + for (SessionId id : ids) { + _runnerSessionIds.remove(id); + } + for (Destination dest : dests) { _runners.remove(dest); _runnersByHash.remove(dest.calculateHash()); } } } + /** + * Remove only the following session. Does not remove the runner if it has more. + * + * @since 0.9.21 + */ + public void unregisterSession(SessionId id, Destination dest) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Unregistering client session " + id); + synchronized (_runners) { + _runnerSessionIds.remove(id); + _runners.remove(dest); + _runnersByHash.remove(dest.calculateHash()); + } + } + /** * Add to the clients list. Check for a dup destination. * Side effect: Sets the session ID of the runner. @@ -239,8 +261,7 @@ class ClientManager { * * @return SessionStatusMessage return code, 1 for success, != 1 for failure */ - public int destinationEstablished(ClientConnectionRunner runner) { - Destination dest = runner.getConfig().getDestination(); + public int destinationEstablished(ClientConnectionRunner runner, Destination dest) { if (_log.shouldLog(Log.DEBUG)) _log.debug("DestinationEstablished called for destination " + dest.calculateHash().toBase64()); @@ -255,9 +276,10 @@ class ClientManager { } else { SessionId id = locked_getNextSessionId(); if (id != null) { - runner.setSessionId(id); + Hash h = dest.calculateHash(); + runner.setSessionId(h, id); _runners.put(dest, runner); - _runnersByHash.put(dest.calculateHash(), runner); + _runnersByHash.put(h, runner); rv = SessionStatusMessage.STATUS_CREATED; } else { rv = SessionStatusMessage.STATUS_REFUSED; @@ -323,8 +345,11 @@ class ClientManager { // sender went away return; } - ClientMessage msg = new ClientMessage(toDest, payload, runner.getConfig(), - runner.getConfig().getDestination(), msgId, + SessionConfig config = runner.getConfig(fromDest.calculateHash()); + if (config == null) + return; + ClientMessage msg = new ClientMessage(toDest, payload, config, + fromDest, msgId, messageNonce, expiration, flags); _ctx.clientMessagePool().add(msg, true); } @@ -362,7 +387,7 @@ class ClientManager { // note that receiveMessage() does not indicate a failure, // so a queue overflow is not recognized. we always return success. if (_from != null) { - _from.updateMessageDeliveryStatus(_msgId, _messageNonce, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL); + _from.updateMessageDeliveryStatus(_fromDest, _msgId, _messageNonce, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL); } } } @@ -378,7 +403,8 @@ class ClientManager { * * @param dest Destination from which the LeaseSet's authorization should be requested * @param set LeaseSet with requested leases - this object must be updated to contain the - * signed version (as well as any changed/added/removed Leases) + * signed version (as well as any changed/added/removed Leases). + * The LeaseSet contains Leases only; it is unsigned and does not have the destination set. * @param timeout ms to wait before failing * @param onCreateJob Job to run after the LeaseSet is authorized * @param onFailedJob Job to run after the timeout passes without receiving authorization @@ -386,20 +412,33 @@ class ClientManager { public void requestLeaseSet(Destination dest, LeaseSet set, long timeout, Job onCreateJob, Job onFailedJob) { ClientConnectionRunner runner = getRunner(dest); if (runner == null) { - if (_log.shouldLog(Log.ERROR)) + if (_log.shouldLog(Log.WARN)) _log.warn("Cannot request the lease set, as we can't find a client runner for " + dest.calculateHash().toBase64() + ". disconnected?"); _ctx.jobQueue().addJob(onFailedJob); } else { - runner.requestLeaseSet(set, timeout, onCreateJob, onFailedJob); + runner.requestLeaseSet(dest.calculateHash(), set, timeout, onCreateJob, onFailedJob); } } + /** + * Request that a particular client authorize the Leases contained in the + * LeaseSet. + * + * @param dest Destination from which the LeaseSet's authorization should be requested + * @param ls LeaseSet with requested leases - this object must be updated to contain the + * signed version (as well as any changed/added/removed Leases). + * The LeaseSet contains Leases only; it is unsigned and does not have the destination set. + */ public void requestLeaseSet(Hash dest, LeaseSet ls) { ClientConnectionRunner runner = getRunner(dest); if (runner != null) { // no need to fire off any jobs... - runner.requestLeaseSet(ls, REQUEST_LEASESET_TIMEOUT, null, null); + runner.requestLeaseSet(dest, ls, REQUEST_LEASESET_TIMEOUT, null, null); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn("Cannot request the lease set, as we can't find a client runner for " + + dest + ". disconnected?"); } } @@ -425,7 +464,9 @@ class ClientManager { if (destHash == null) return true; ClientConnectionRunner runner = getRunner(destHash); if (runner == null) return true; - return !Boolean.parseBoolean(runner.getConfig().getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY)); + SessionConfig config = runner.getConfig(destHash); + if (config == null) return true; + return !Boolean.parseBoolean(config.getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY)); } /** @@ -452,7 +493,7 @@ class ClientManager { public SessionConfig getClientSessionConfig(Destination dest) { ClientConnectionRunner runner = getRunner(dest); if (runner != null) - return runner.getConfig(); + return runner.getConfig(dest.calculateHash()); else return null; } @@ -490,7 +531,7 @@ class ClientManager { if (_log.shouldLog(Log.DEBUG)) _log.debug("Delivering status " + status + " to " + fromDest.calculateHash() + " for message " + id); - runner.updateMessageDeliveryStatus(id, messageNonce, status); + runner.updateMessageDeliveryStatus(fromDest, id, messageNonce, status); } else { if (_log.shouldLog(Log.WARN)) _log.warn("Cannot deliver status " + status + " to " @@ -514,7 +555,7 @@ class ClientManager { if (dest != null) { ClientConnectionRunner runner = getRunner(dest); if (runner != null) { - runner.reportAbuse(reason, severity); + runner.reportAbuse(dest, reason, severity); } } else { for (Destination d : _runners.keySet()) { @@ -592,21 +633,25 @@ class ClientManager { public void runJob() { ClientConnectionRunner runner; - if (_msg.getDestination() != null) - runner = getRunner(_msg.getDestination()); + Destination dest = _msg.getDestination(); + if (dest != null) + runner = getRunner(dest); else runner = getRunner(_msg.getDestinationHash()); if (runner != null) { //_ctx.statManager().addRateData("client.receiveMessageSize", // _msg.getPayload().getSize(), 0); - runner.receiveMessage(_msg.getDestination(), null, _msg.getPayload()); + if (dest != null) + runner.receiveMessage(dest, null, _msg.getPayload()); + else + runner.receiveMessage(_msg.getDestinationHash(), null, _msg.getPayload()); } else { // no client connection... // we should pool these somewhere... if (_log.shouldLog(Log.WARN)) _log.warn("Message received but we don't have a connection to " - + _msg.getDestination() + "/" + _msg.getDestinationHash() + + dest + "/" + _msg.getDestinationHash() + " currently. DROPPED"); } } @@ -634,9 +679,10 @@ class ClientManager { continue; if (runner.isDead()) continue; - if (runner.getConfig() == null) + SessionConfig cfg = runner.getPrimaryConfig(); + if (cfg == null) continue; // simple session or no session yet - if (runner.getLeaseSet() == null) + if (runner.getLeaseSet(cfg.getDestination().calculateHash()) == null) continue; // don't confuse client while waiting for CreateLeaseSet msg try { // only send version if the client can handle it (0.8.7 or greater) diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java index 6168ab794..385d3bd2b 100644 --- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java +++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java @@ -90,7 +90,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte for (Destination dest : _manager.getRunnerDestinations()) { ClientConnectionRunner runner = _manager.getRunner(dest); if ( (runner == null) || (runner.getIsDead())) continue; - LeaseSet ls = runner.getLeaseSet(); + LeaseSet ls = runner.getLeaseSet(dest.calculateHash()); if (ls == null) continue; // still building long howLongAgo = _context.clock().now() - ls.getEarliestLeaseDate(); @@ -115,6 +115,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte * @param dest Destination from which the LeaseSet's authorization should be requested * @param set LeaseSet with requested leases - this object must be updated to contain the * signed version (as well as any changed/added/removed Leases) + * The LeaseSet contains Leases only; it is unsigned and does not have the destination set. * @param timeout ms to wait before failing * @param onCreateJob Job to run after the LeaseSet is authorized * @param onFailedJob Job to run after the timeout passes without receiving authorization @@ -126,6 +127,15 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte _log.error("Null manager on requestLeaseSet!"); } + /** + * Request that a particular client authorize the Leases contained in the + * LeaseSet. + * + * @param dest Destination from which the LeaseSet's authorization should be requested + * @param set LeaseSet with requested leases - this object must be updated to contain the + * signed version (as well as any changed/added/removed Leases). + * The LeaseSet contains Leases only; it is unsigned and does not have the destination set. + */ public void requestLeaseSet(Hash dest, LeaseSet set) { if (_manager != null) _manager.requestLeaseSet(dest, set); diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index e20039b6e..d5697571e 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -8,6 +8,7 @@ package net.i2p.router.client; * */ +import java.util.List; import java.util.Properties; import net.i2p.CoreVersion; @@ -30,6 +31,7 @@ import net.i2p.data.i2cp.I2CPMessageException; import net.i2p.data.i2cp.I2CPMessageReader; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.MessagePayloadMessage; +import net.i2p.data.i2cp.MessageStatusMessage; import net.i2p.data.i2cp.ReceiveMessageBeginMessage; import net.i2p.data.i2cp.ReceiveMessageEndMessage; import net.i2p.data.i2cp.ReconfigureSessionMessage; @@ -80,7 +82,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi * */ public void messageReceived(I2CPMessageReader reader, I2CPMessage message) { - if (_runner.isDead()) return; + if (_runner.isDead()) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Received but runner dead: \n" + message); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("Message received: \n" + message); int type = message.getType(); @@ -190,7 +196,6 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi private void handleSetDate(SetDateMessage message) { //_context.clock().setNow(message.getDate().getTime()); } - /** * Handle a CreateSessionMessage. @@ -204,12 +209,13 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi */ private void handleCreateSession(CreateSessionMessage message) { SessionConfig in = message.getSessionConfig(); + Destination dest = in.getDestination(); if (in.verifySignature()) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Signature verified correctly on create session message"); } else { // For now, we do NOT send a SessionStatusMessage - see javadoc above - int itype = in.getDestination().getCertificate().getCertificateType(); + int itype = dest.getCertificate().getCertificateType(); SigType stype = SigType.getByCode(itype); if (stype == null || !stype.isAvailable()) { _log.error("Client requested unsupported signature type " + itype); @@ -235,7 +241,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi if (!checkAuth(inProps)) return; - SessionId id = _runner.getSessionId(); + SessionId id = _runner.getSessionId(dest.calculateHash()); if (id != null) { _runner.disconnectClient("Already have session " + id); return; @@ -244,11 +250,22 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi // Copy over the whole config structure so we don't later corrupt it on // the client side if we change settings or later get a // ReconfigureSessionMessage - SessionConfig cfg = new SessionConfig(in.getDestination()); + SessionConfig cfg = new SessionConfig(dest); cfg.setSignature(in.getSignature()); Properties props = new Properties(); - props.putAll(in.getOptions()); + boolean isPrimary = _runner.getSessionIds().isEmpty(); + if (!isPrimary) { + // all the primary options, then the overrides from the alias + SessionConfig pcfg = _runner.getPrimaryConfig(); + if (pcfg != null) { + props.putAll(pcfg.getOptions()); + } else { + _log.error("no primary config?"); + } + } + props.putAll(inProps); cfg.setOptions(props); + // this sets the session id int status = _runner.sessionEstablished(cfg); if (status != SessionStatusMessage.STATUS_CREATED) { // For now, we do NOT send a SessionStatusMessage - see javadoc above @@ -264,11 +281,33 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi _runner.disconnectClient(msg); return; } - sendStatusMessage(status); + // get the new session ID + id = _runner.getSessionId(dest.calculateHash()); if (_log.shouldLog(Log.INFO)) - _log.info("Session " + _runner.getSessionId() + " established for " + _runner.getDestHash()); - startCreateSessionJob(); + _log.info("Session " + id + " established for " + dest.calculateHash()); + if (isPrimary) { + sendStatusMessage(id, status); + startCreateSessionJob(cfg); + } else { + SessionConfig pcfg = _runner.getPrimaryConfig(); + if (pcfg != null) { + ClientTunnelSettings settings = new ClientTunnelSettings(dest.calculateHash()); + settings.readFromProperties(props); + // addAlias() sends the create lease set msg, so we have to send the SMS first + sendStatusMessage(id, status); + boolean ok = _context.tunnelManager().addAlias(dest, settings, pcfg.getDestination()); + if (!ok) { + _log.error("Add alias failed"); + // FIXME cleanup + } + } else { + _log.error("no primary config?"); + status = SessionStatusMessage.STATUS_INVALID; + sendStatusMessage(id, status); + // FIXME cleanup + } + } } /** @@ -314,8 +353,8 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi * @since 0.9.8 * */ - protected void startCreateSessionJob() { - _context.jobQueue().addJob(new CreateSessionJob(_context, _runner)); + protected void startCreateSessionJob(SessionConfig config) { + _context.jobQueue().addJob(new CreateSessionJob(_context, config)); } /** @@ -324,11 +363,32 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi * */ private void handleSendMessage(SendMessageMessage message) { - SessionConfig cfg = _runner.getConfig(); + SessionId sid = message.getSessionId(); + SessionConfig cfg = _runner.getConfig(sid); if (cfg == null) { + List current = _runner.getSessionIds(); + String msg = "SendMessage invalid session: " + sid + " current: " + current; if (_log.shouldLog(Log.ERROR)) - _log.error("SendMessage w/o session"); - _runner.disconnectClient("SendMessage w/o session"); + _log.error(msg); + // Just drop the message for now, don't kill the whole socket... + // bugs on client side, esp. prior to 0.9.21, may cause sending + // of messages before the session is established + //_runner.disconnectClient(msg); + // do this instead: + if (sid != null && message.getNonce() > 0) { + MessageStatusMessage status = new MessageStatusMessage(); + status.setMessageId(_runner.getNextMessageId()); + status.setSessionId(sid.getSessionId()); + status.setSize(0); + status.setNonce(message.getNonce()); + status.setStatus(MessageStatusMessage.STATUS_SEND_FAILURE_BAD_SESSION); + try { + _runner.doSend(status); + } catch (I2CPMessageException ime) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Error writing out the message status message", ime); + } + } return; } if (_log.shouldLog(Log.DEBUG)) @@ -336,10 +396,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi long beforeDistribute = _context.clock().now(); MessageId id = _runner.distributeMessage(message); long timeToDistribute = _context.clock().now() - beforeDistribute; - _runner.ackSendMessage(id, message.getNonce()); + // TODO validate session id + _runner.ackSendMessage(sid, id, message.getNonce()); _context.statManager().addRateData("client.distributeTime", timeToDistribute); - if ( (timeToDistribute > 50) && (_log.shouldLog(Log.INFO)) ) - _log.info("Took too long to distribute the message (which holds up the ack): " + timeToDistribute); + if ( (timeToDistribute > 50) && (_log.shouldLog(Log.DEBUG)) ) + _log.debug("Took too long to distribute the message (which holds up the ack): " + timeToDistribute); } @@ -350,10 +411,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi private void handleReceiveBegin(ReceiveMessageBeginMessage message) { if (_runner.isDead()) return; if (_log.shouldLog(Log.DEBUG)) - _log.debug("Handling recieve begin: id = " + message.getMessageId()); + _log.debug("Handling receive begin: id = " + message.getMessageId()); MessagePayloadMessage msg = new MessagePayloadMessage(); msg.setMessageId(message.getMessageId()); - msg.setSessionId(_runner.getSessionId().getSessionId()); + // TODO validate session id + msg.setSessionId(message.getSessionId()); Payload payload = _runner.getPayload(new MessageId(message.getMessageId())); if (payload == null) { if (_log.shouldLog(Log.WARN)) @@ -372,7 +434,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi } /** - * The client told us that the message has been recieved completely. This currently + * The client told us that the message has been received completely. This currently * does not do any security checking prior to removing the message from the * pending queue, though it should. * @@ -382,24 +444,38 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi } private void handleDestroySession(DestroySessionMessage message) { - if (_log.shouldLog(Log.INFO)) - _log.info("Destroying client session " + _runner.getSessionId()); - _runner.stopRunning(); + SessionId id = message.getSessionId(); + if (id != null) { + _runner.removeSession(id); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn("destroy session with null ID"); + } + int left = _runner.getSessionIds().size(); + if (left <= 0 || id == null) { + _runner.stopRunning(); + } else { + if (_log.shouldLog(Log.INFO)) + _log.info("Still " + left + " sessions left"); + } } /** override for testing */ - protected void handleCreateLeaseSet(CreateLeaseSetMessage message) { + protected void handleCreateLeaseSet(CreateLeaseSetMessage message) { if ( (message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null) ) { if (_log.shouldLog(Log.ERROR)) _log.error("Null lease set granted: " + message); _runner.disconnectClient("Invalid CreateLeaseSetMessage"); return; } - SessionConfig cfg = _runner.getConfig(); + SessionId id = message.getSessionId(); + SessionConfig cfg = _runner.getConfig(id); if (cfg == null) { + List current = _runner.getSessionIds(); + String msg = "CreateLeaseSet invalid session: " + id + " current: " + current; if (_log.shouldLog(Log.ERROR)) - _log.error("CreateLeaseSet w/o session"); - _runner.disconnectClient("CreateLeaseSet w/o session"); + _log.error(msg); + _runner.disconnectClient(msg); return; } Destination dest = cfg.getDestination(); @@ -446,8 +522,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi return; } if (_log.shouldLog(Log.INFO)) - _log.info("New lease set granted for destination " - + _runner.getDestHash()); + _log.info("New lease set granted for destination " + dest); // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs) _runner.leaseSetCreated(message.getLeaseSet()); @@ -455,6 +530,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi /** override for testing */ protected void handleDestLookup(DestLookupMessage message) { + // no session id in DLM _context.jobQueue().addJob(new LookupDestJob(_context, _runner, message.getHash(), _runner.getDestHash())); } @@ -464,10 +540,23 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi * @since 0.9.11 */ protected void handleHostLookup(HostLookupMessage message) { + SessionId sid = message.getSessionId(); + Hash h; + if (sid != null) { + h = _runner.getDestHash(sid); + } else { + // fixup if necessary + if (message.getReqID() >= 0) + sid = new SessionId(65535); + h = null; + } + if (h == null) { + h = _runner.getDestHash(); + // h may still be null, an LS lookup for b32 will go out expl. tunnels + } _context.jobQueue().addJob(new LookupDestJob(_context, _runner, message.getReqID(), - message.getTimeout(), message.getSessionId(), - message.getHash(), message.getHostname(), - _runner.getDestHash())); + message.getTimeout(), sid, + message.getHash(), message.getHostname(), h)); } /** @@ -482,23 +571,27 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi * In-JVM client side must promote defaults to the primary map. */ private void handleReconfigureSession(ReconfigureSessionMessage message) { - SessionConfig cfg = _runner.getConfig(); + SessionId id = message.getSessionId(); + SessionConfig cfg = _runner.getConfig(id); if (cfg == null) { + List current = _runner.getSessionIds(); + String msg = "ReconfigureSession invalid session: " + id + " current: " + current; if (_log.shouldLog(Log.ERROR)) - _log.error("ReconfigureSession w/o session"); - _runner.disconnectClient("ReconfigureSession w/o session"); + _log.error(msg); + //sendStatusMessage(id, SessionStatusMessage.STATUS_INVALID); + _runner.disconnectClient(msg); return; } if (_log.shouldLog(Log.INFO)) _log.info("Updating options - old: " + cfg + " new: " + message.getSessionConfig()); if (!message.getSessionConfig().getDestination().equals(cfg.getDestination())) { _log.error("Dest mismatch"); - sendStatusMessage(SessionStatusMessage.STATUS_INVALID); + sendStatusMessage(id, SessionStatusMessage.STATUS_INVALID); _runner.stopRunning(); return; } + Hash dest = cfg.getDestination().calculateHash(); cfg.getOptions().putAll(message.getSessionConfig().getOptions()); - Hash dest = _runner.getDestHash(); ClientTunnelSettings settings = new ClientTunnelSettings(dest); Properties props = new Properties(); props.putAll(cfg.getOptions()); @@ -507,14 +600,11 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi settings.getInboundSettings()); _context.tunnelManager().setOutboundSettings(dest, settings.getOutboundSettings()); - sendStatusMessage(SessionStatusMessage.STATUS_UPDATED); + sendStatusMessage(id, SessionStatusMessage.STATUS_UPDATED); } - private void sendStatusMessage(int status) { + private void sendStatusMessage(SessionId id, int status) { SessionStatusMessage msg = new SessionStatusMessage(); - SessionId id = _runner.getSessionId(); - if (id == null) - id = ClientManager.UNKNOWN_SESSION_ID; msg.setSessionId(id); msg.setStatus(status); try { diff --git a/router/java/src/net/i2p/router/client/CreateSessionJob.java b/router/java/src/net/i2p/router/client/CreateSessionJob.java index af01a496c..558dba8e7 100644 --- a/router/java/src/net/i2p/router/client/CreateSessionJob.java +++ b/router/java/src/net/i2p/router/client/CreateSessionJob.java @@ -26,25 +26,20 @@ import net.i2p.util.Log; */ class CreateSessionJob extends JobImpl { private final Log _log; - private final ClientConnectionRunner _runner; + private final SessionConfig _config; - public CreateSessionJob(RouterContext context, ClientConnectionRunner runner) { + public CreateSessionJob(RouterContext context, SessionConfig config) { super(context); _log = context.logManager().getLog(CreateSessionJob.class); - _runner = runner; + _config = config; if (_log.shouldLog(Log.DEBUG)) - _log.debug("CreateSessionJob for runner " + _runner + " / config: " + _runner.getConfig()); + _log.debug("CreateSessionJob for config: " + config); } public String getName() { return "Request tunnels for a new client"; } + public void runJob() { - SessionConfig cfg = _runner.getConfig(); - if ( (cfg == null) || (cfg.getDestination() == null) ) { - if (_log.shouldLog(Log.ERROR)) - _log.error("No session config on runner " + _runner); - return; - } - Hash dest = cfg.getDestination().calculateHash(); + Hash dest = _config.getDestination().calculateHash(); if (_log.shouldLog(Log.INFO)) _log.info("Requesting lease set for destination " + dest); ClientTunnelSettings settings = new ClientTunnelSettings(dest); @@ -61,10 +56,10 @@ class CreateSessionJob extends JobImpl { // XXX props.putAll(Router.getInstance().getConfigMap()); // override them by the client's settings - props.putAll(cfg.getOptions()); + props.putAll(_config.getOptions()); // and load 'em up (using anything not yet set as the software defaults) settings.readFromProperties(props); - getContext().tunnelManager().buildTunnels(cfg.getDestination(), settings); + getContext().tunnelManager().buildTunnels(_config.getDestination(), settings); } } diff --git a/router/java/src/net/i2p/router/client/LeaseRequestState.java b/router/java/src/net/i2p/router/client/LeaseRequestState.java index 03bc2e4fa..2fb6b9760 100644 --- a/router/java/src/net/i2p/router/client/LeaseRequestState.java +++ b/router/java/src/net/i2p/router/client/LeaseRequestState.java @@ -30,6 +30,9 @@ class LeaseRequestState { /** * @param expiration absolute time, when the request expires (not when the LS expires) + * @param requested LeaseSet with requested leases - this object must be updated to contain the + * signed version (as well as any changed/added/removed Leases) + * The LeaseSet contains Leases and destination only, it is unsigned. */ public LeaseRequestState(Job onGranted, Job onFailed, long expiration, LeaseSet requested) { _onGranted = onGranted; @@ -40,6 +43,7 @@ class LeaseRequestState { /** created lease set from client - FIXME always null */ public LeaseSet getGranted() { return _grantedLeaseSet; } + /** FIXME unused - why? */ public void setGranted(LeaseSet ls) { _grantedLeaseSet = ls; } diff --git a/router/java/src/net/i2p/router/client/MessageReceivedJob.java b/router/java/src/net/i2p/router/client/MessageReceivedJob.java index 0ee148282..3614d1693 100644 --- a/router/java/src/net/i2p/router/client/MessageReceivedJob.java +++ b/router/java/src/net/i2p/router/client/MessageReceivedJob.java @@ -14,6 +14,7 @@ import net.i2p.data.i2cp.I2CPMessageException; import net.i2p.data.i2cp.MessageId; import net.i2p.data.i2cp.MessagePayloadMessage; import net.i2p.data.i2cp.MessageStatusMessage; +import net.i2p.data.i2cp.SessionId; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -26,14 +27,20 @@ import net.i2p.util.Log; class MessageReceivedJob extends JobImpl { private final Log _log; private final ClientConnectionRunner _runner; + private final Destination _toDest; private final Payload _payload; private final boolean _sendDirect; + /** + * @param toDest non-null, required to pick session + * @param fromDest ignored, generally null + */ public MessageReceivedJob(RouterContext ctx, ClientConnectionRunner runner, Destination toDest, Destination fromDest, Payload payload, boolean sendDirect) { super(ctx); _log = ctx.logManager().getLog(MessageReceivedJob.class); _runner = runner; + _toDest = toDest; _payload = payload; _sendDirect = sendDirect; } @@ -43,8 +50,8 @@ class MessageReceivedJob extends JobImpl { public void runJob() { if (_runner.isDead()) return; MessageId id = null; - long nextID = _runner.getNextMessageId(); try { + long nextID = _runner.getNextMessageId(); if (_sendDirect) { sendMessage(nextID); } else { @@ -55,7 +62,7 @@ class MessageReceivedJob extends JobImpl { } catch (I2CPMessageException ime) { if (_log.shouldLog(Log.WARN)) _log.warn("Error writing out the message", ime); - if (!_sendDirect) + if (id != null && !_sendDirect) _runner.removePayload(id); } } @@ -69,7 +76,13 @@ class MessageReceivedJob extends JobImpl { // + " (with nonce=1)", new Exception("available")); MessageStatusMessage msg = new MessageStatusMessage(); msg.setMessageId(id.getMessageId()); - msg.setSessionId(_runner.getSessionId().getSessionId()); + SessionId sid = _runner.getSessionId(_toDest.calculateHash()); + if (sid == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("No session for " + _toDest.calculateHash()); + return; + } + msg.setSessionId(sid.getSessionId()); msg.setSize(size); // has to be >= 0, it is initialized to -1 msg.setNonce(1); @@ -84,7 +97,13 @@ class MessageReceivedJob extends JobImpl { private void sendMessage(long id) throws I2CPMessageException { MessagePayloadMessage msg = new MessagePayloadMessage(); msg.setMessageId(id); - msg.setSessionId(_runner.getSessionId().getSessionId()); + SessionId sid = _runner.getSessionId(_toDest.calculateHash()); + if (sid == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("No session for " + _toDest.calculateHash()); + return; + } + msg.setSessionId(sid.getSessionId()); msg.setPayload(_payload); _runner.doSend(msg); } diff --git a/router/java/src/net/i2p/router/client/ReportAbuseJob.java b/router/java/src/net/i2p/router/client/ReportAbuseJob.java index 8dd36ac3c..c24e5e9ba 100644 --- a/router/java/src/net/i2p/router/client/ReportAbuseJob.java +++ b/router/java/src/net/i2p/router/client/ReportAbuseJob.java @@ -8,10 +8,12 @@ package net.i2p.router.client; * */ +import net.i2p.data.Destination; import net.i2p.data.i2cp.AbuseReason; import net.i2p.data.i2cp.AbuseSeverity; import net.i2p.data.i2cp.I2CPMessageException; import net.i2p.data.i2cp.ReportAbuseMessage; +import net.i2p.data.i2cp.SessionId; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -23,17 +25,22 @@ import net.i2p.util.Log; class ReportAbuseJob extends JobImpl { private final Log _log; private final ClientConnectionRunner _runner; + private final Destination _dest; private final String _reason; private final int _severity; - public ReportAbuseJob(RouterContext context, ClientConnectionRunner runner, String reason, int severity) { + + public ReportAbuseJob(RouterContext context, ClientConnectionRunner runner, + Destination dest, String reason, int severity) { super(context); _log = context.logManager().getLog(ReportAbuseJob.class); _runner = runner; + _dest = dest; _reason = reason; _severity = severity; } public String getName() { return "Report Abuse"; } + public void runJob() { if (_runner.isDead()) return; AbuseReason res = new AbuseReason(); @@ -41,9 +48,11 @@ class ReportAbuseJob extends JobImpl { AbuseSeverity sev = new AbuseSeverity(); sev.setSeverity(_severity); ReportAbuseMessage msg = new ReportAbuseMessage(); - msg.setMessageId(null); msg.setReason(res); - msg.setSessionId(_runner.getSessionId()); + SessionId id = _runner.getSessionId(_dest.calculateHash()); + if (id == null) + return; + msg.setSessionId(id); msg.setSeverity(sev); try { _runner.doSend(msg); diff --git a/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java b/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java index 9b07978f6..81a3b6354 100644 --- a/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java +++ b/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java @@ -16,6 +16,7 @@ import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.I2CPMessageException; import net.i2p.data.i2cp.RequestLeaseSetMessage; import net.i2p.data.i2cp.RequestVariableLeaseSetMessage; +import net.i2p.data.i2cp.SessionId; import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -63,13 +64,16 @@ class RequestLeaseSetJob extends JobImpl { // _log.debug("Adding fudge " + fudge); endTime += fudge; + SessionId id = _runner.getSessionId(requested.getDestination().calculateHash()); + if (id == null) + return; I2CPMessage msg; if (getContext().getProperty(PROP_VARIABLE, DFLT_VARIABLE) && (_runner instanceof QueuedClientConnectionRunner || RequestVariableLeaseSetMessage.isSupported(_runner.getClientVersion()))) { // new style - leases will have individual expirations RequestVariableLeaseSetMessage rmsg = new RequestVariableLeaseSetMessage(); - rmsg.setSessionId(_runner.getSessionId()); + rmsg.setSessionId(id); for (int i = 0; i < requested.getLeaseCount(); i++) { Lease lease = requested.getLease(i); if (lease.getEndDate().getTime() < endTime) { @@ -90,7 +94,7 @@ class RequestLeaseSetJob extends JobImpl { RequestLeaseSetMessage rmsg = new RequestLeaseSetMessage(); Date end = new Date(endTime); rmsg.setEndDate(end); - rmsg.setSessionId(_runner.getSessionId()); + rmsg.setSessionId(id); for (int i = 0; i < requested.getLeaseCount(); i++) { Lease lease = requested.getLease(i); rmsg.addEndpoint(lease.getGateway(), @@ -144,8 +148,7 @@ class RequestLeaseSetJob extends JobImpl { CheckLeaseRequestStatus.this.getContext().statManager().addRateData("client.requestLeaseSetTimeout", 1); if (_log.shouldLog(Log.ERROR)) { long waited = System.currentTimeMillis() - _start; - _log.error("Failed to receive a leaseSet in the time allotted (" + waited + "): " + _requestState + " for " - + _runner.getConfig().getDestination().calculateHash().toBase64()); + _log.error("Failed to receive a leaseSet in the time allotted (" + waited + "): " + _requestState); } if (_requestState.getOnFailed() != null) RequestLeaseSetJob.this.getContext().jobQueue().addJob(_requestState.getOnFailed()); diff --git a/router/java/src/net/i2p/router/crypto/FamilyKeyCrypto.java b/router/java/src/net/i2p/router/crypto/FamilyKeyCrypto.java new file mode 100644 index 000000000..f69e62752 --- /dev/null +++ b/router/java/src/net/i2p/router/crypto/FamilyKeyCrypto.java @@ -0,0 +1,395 @@ +package net.i2p.router.crypto; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyStore; +import java.security.GeneralSecurityException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import net.i2p.crypto.CertUtil; +import net.i2p.crypto.KeyStoreUtil; +import net.i2p.crypto.SigType; +import net.i2p.crypto.SigUtil; +import net.i2p.data.Base64; +import net.i2p.data.DataHelper; +import net.i2p.data.Hash; +import net.i2p.data.Signature; +import net.i2p.data.SigningPrivateKey; +import net.i2p.data.SigningPublicKey; +import net.i2p.data.router.RouterInfo; +import net.i2p.router.RouterContext; +import net.i2p.router.StatisticsManager; +import net.i2p.util.ConcurrentHashSet; +import net.i2p.util.Log; +import net.i2p.util.SecureDirectory; + +/** + * Utilities for creating, storing, retrieving the signing keys for + * the netdb family feature + * + * @since 0.9.24 + */ +public class FamilyKeyCrypto { + + private final RouterContext _context; + private final Log _log; + private final Map _verified; + private final Set _negativeCache; + // following for verification only, otherwise null + private final String _fname; + private final SigningPrivateKey _privkey; + private final SigningPublicKey _pubkey; + + private static final String PROP_KEYSTORE_PASSWORD = "netdb.family.keystorePassword"; + public static final String PROP_FAMILY_NAME = "netdb.family.name"; + private static final String PROP_KEY_PASSWORD = "netdb.family.keyPassword"; + private static final String CERT_SUFFIX = ".crt"; + private static final String KEYSTORE_PREFIX = "family-"; + private static final String KEYSTORE_SUFFIX = ".ks"; + private static final int DEFAULT_KEY_VALID_DAYS = 3652; // 10 years + // Note that we can't use RSA here, as the b64 sig would exceed the 255 char limit for a Mapping + // Note that we can't use EdDSA here, as keystore doesn't know how, and encoding/decoding is unimplemented + private static final String DEFAULT_KEY_ALGORITHM = SigType.ECDSA_SHA256_P256.isAvailable() ? "EC" : "DSA"; + private static final int DEFAULT_KEY_SIZE = SigType.ECDSA_SHA256_P256.isAvailable() ? 256 : 1024; + private static final String KS_DIR = "keystore"; + private static final String CERT_DIR = "certificates/family"; + public static final String OPT_NAME = "family"; + public static final String OPT_SIG = "family.sig"; + public static final String OPT_KEY = "family.key"; + + + /** + * For signing and verification. + * + * If the context property netdb.family.name is set, this can be used for signing, + * else only for verification. + */ + public FamilyKeyCrypto(RouterContext context) throws GeneralSecurityException { + _context = context; + _log = _context.logManager().getLog(FamilyKeyCrypto.class); + _fname = _context.getProperty(PROP_FAMILY_NAME); + if (_fname != null) { + if (_fname.contains("/") || _fname.contains("\\") || + _fname.contains("..") || (new File(_fname)).isAbsolute()) + throw new GeneralSecurityException("Illegal family name"); + } + _privkey = (_fname != null) ? initialize() : null; + _pubkey = (_privkey != null) ? _privkey.toPublic() : null; + _verified = new ConcurrentHashMap(4); + _negativeCache = new ConcurrentHashSet(4); + } + + /** + * Create (if necessary) and load the key store, then run. + */ + private SigningPrivateKey initialize() throws GeneralSecurityException { + File dir = new SecureDirectory(_context.getConfigDir(), KS_DIR); + File keyStore = new File(dir, KEYSTORE_PREFIX + _fname + KEYSTORE_SUFFIX); + verifyKeyStore(keyStore); + return getPrivKey(keyStore); + } + + /** + * Clears the caches + */ + public void shutdown() { + _verified.clear(); + _negativeCache.clear(); + } + + /** + * Caller must add family to RI also. + * throws on all errors + * + * @param family non-null, must match that we were initialized with or will throw GSE + * @param h non-null + * @return non-null options to be added to the RI + * @throws GeneralSecurityException on null hash, null or changed family, or signing error + */ + public Map sign(String family, Hash h) throws GeneralSecurityException { + if (_privkey == null) { + _log.logAlways(Log.WARN, "family name now set, must restart router to generate or load keys"); + throw new GeneralSecurityException("family name now set, must restart router to generate or load keys"); + } + if (h == null) + throw new GeneralSecurityException("null router hash"); + if (!_fname.equals(family)) { + _log.logAlways(Log.WARN, "family name changed, must restart router to generate or load new keys"); + throw new GeneralSecurityException("family name changed, must restart router to generate or load new keys"); + } + byte[] nb = DataHelper.getUTF8(_fname); + int len = nb.length + Hash.HASH_LENGTH; + byte[] b = new byte[len]; + System.arraycopy(nb, 0, b, 0, nb.length); + System.arraycopy(h.getData(), 0, b, nb.length, Hash.HASH_LENGTH); + Signature sig = _context.dsa().sign(b, _privkey); + if (sig == null) + throw new GeneralSecurityException("sig failed"); + Map rv = new HashMap(3); + rv.put(OPT_NAME, family); + rv.put(OPT_KEY, _pubkey.getType().getCode() + ":" + _pubkey.toBase64()); + rv.put(OPT_SIG, sig.toBase64()); + return rv; + } + + /** + * Verify the family signature in a RouterInfo. + * @return true if good sig or if no family specified at all + */ + public boolean verify(RouterInfo ri) { + String name = ri.getOption(OPT_NAME); + if (name == null) + return true; + Hash h = ri.getHash(); + String ssig = ri.getOption(OPT_SIG); + if (ssig == null) { + if (_log.shouldInfo()) + _log.info("No sig for " + h + ' ' + name); + return false; + } + String nameAndSig = _verified.get(h); + String riNameAndSig = name + ssig; + if (nameAndSig != null) { + if (nameAndSig.equals(riNameAndSig)) + return true; + // name or sig changed + _verified.remove(h); + } + SigningPublicKey spk; + if (name.equals(_fname)) { + // us + spk = _pubkey; + } else { + if (_negativeCache.contains(h)) + return false; + spk = loadCert(name); + if (spk == null) { + // look for a b64 key in the RI + String skey = ri.getOption(OPT_KEY); + if (skey != null) { + int colon = skey.indexOf(':'); + // switched from ';' to ':' during dev, remove this later + if (colon < 0) + colon = skey.indexOf(';'); + if (colon > 0) { + try { + int code = Integer.parseInt(skey.substring(0, colon)); + SigType type = SigType.getByCode(code); + if (type != null) { + byte[] bkey = Base64.decode(skey.substring(colon + 1)); + if (bkey != null) { + spk = new SigningPublicKey(type, bkey); + } + } + } catch (NumberFormatException e) { + if (_log.shouldInfo()) + _log.info("Bad b64 family key: " + ri, e); + } catch (IllegalArgumentException e) { + if (_log.shouldInfo()) + _log.info("Bad b64 family key: " + ri, e); + } catch (ArrayIndexOutOfBoundsException e) { + if (_log.shouldInfo()) + _log.info("Bad b64 family key: " + ri, e); + } + } + } + if (spk == null) { + _negativeCache.add(h); + if (_log.shouldInfo()) + _log.info("No cert or valid key for " + h + ' ' + name); + return false; + } + } + } + if (!spk.getType().isAvailable()) { + _negativeCache.add(h); + if (_log.shouldInfo()) + _log.info("Unsupported crypto for sig for " + h); + return false; + } + byte[] bsig = Base64.decode(ssig); + if (bsig == null) { + _negativeCache.add(h); + if (_log.shouldInfo()) + _log.info("Bad sig for " + h + ' ' + name + ' ' + ssig); + return false; + } + Signature sig; + try { + sig = new Signature(spk.getType(), bsig); + } catch (IllegalArgumentException iae) { + // wrong size (type mismatch) + _negativeCache.add(h); + if (_log.shouldInfo()) + _log.info("Bad sig for " + ri, iae); + return false; + } + byte[] nb = DataHelper.getUTF8(name); + byte[] b = new byte[nb.length + Hash.HASH_LENGTH]; + System.arraycopy(nb, 0, b, 0, nb.length); + System.arraycopy(ri.getHash().getData(), 0, b, nb.length, Hash.HASH_LENGTH); + boolean rv = _context.dsa().verifySignature(sig, b, spk); + if (rv) + _verified.put(h, riNameAndSig); + else + _negativeCache.add(h); + if (_log.shouldInfo()) + _log.info("Verified? " + rv + " for " + h + ' ' + name + ' ' + ssig); + return rv; + } + + /** + * @return success if it exists and we have a password, or it was created successfully. + * @throws GeneralSecurityException on keystore error + */ + private void verifyKeyStore(File ks) throws GeneralSecurityException { + if (ks.exists()) { + if (_context.getProperty(PROP_KEY_PASSWORD) == null) { + String s ="Family key error, must set " + PROP_KEY_PASSWORD + " in " + + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath(); + _log.error(s); + throw new GeneralSecurityException(s); + } + return; + } + File dir = ks.getParentFile(); + if (!dir.exists()) { + File sdir = new SecureDirectory(dir.getAbsolutePath()); + if (!sdir.mkdirs()) { + String s ="Family key error, must set " + PROP_KEY_PASSWORD + " in " + + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath(); + _log.error(s); + throw new GeneralSecurityException(s); + } + } + createKeyStore(ks); + + // Now read it back out of the new keystore and save it in ascii form + // where the clients can get to it. + exportCert(ks); + } + + + /** + * Call out to keytool to create a new keystore with a keypair in it. + * Trying to do this programatically is a nightmare, requiring either BouncyCastle + * libs or using proprietary Sun libs, and it's a huge mess. + * If successful, stores the keystore password and key password in router.config. + * + * @throws GeneralSecurityException on all errors + */ + private void createKeyStore(File ks) throws GeneralSecurityException { + // make a random 48 character password (30 * 8 / 5) + String keyPassword = KeyStoreUtil.randomString(); + // and one for the cname + String cname = _fname + ".family.i2p.net"; + + boolean success = KeyStoreUtil.createKeys(ks, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD, _fname, cname, "family", + DEFAULT_KEY_VALID_DAYS, DEFAULT_KEY_ALGORITHM, + DEFAULT_KEY_SIZE, keyPassword); + if (success) { + success = ks.exists(); + if (success) { + Map changes = new HashMap(); + changes.put(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD); + changes.put(PROP_KEY_PASSWORD, keyPassword); + changes.put(PROP_FAMILY_NAME, _fname); + _context.router().saveConfig(changes, null); + } + } + if (success) { + _log.logAlways(Log.INFO, "Created new private key for netdb family \"" + _fname + + "\" in keystore: " + ks.getAbsolutePath() + "\n" + + "Copy the keystore to the other routers in the family,\n" + + "and add the following entries to their router.config file:\n" + + PROP_FAMILY_NAME + '=' + _fname + '\n' + + PROP_KEYSTORE_PASSWORD + '=' + KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD + '\n' + + PROP_KEY_PASSWORD + '=' + keyPassword); + + } else { + String s = "Failed to create NetDb family keystore.\n" + + "This is for the Sun/Oracle keytool, others may be incompatible.\n" + + "If you create the keystore manually, you must add " + PROP_KEYSTORE_PASSWORD + " and " + PROP_KEY_PASSWORD + + " to " + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath(); + _log.error(s); + throw new GeneralSecurityException(s); + } + } + + /** + * Pull the cert back OUT of the keystore and save it as ascii + * so the clients can get to it. + */ + private void exportCert(File ks) { + File sdir = new SecureDirectory(_context.getConfigDir(), CERT_DIR); + if (sdir.exists() || sdir.mkdirs()) { + String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD); + String name = _fname.replace("@", "_at_") + CERT_SUFFIX; + File out = new File(sdir, name); + boolean success = KeyStoreUtil.exportCert(ks, ksPass, _fname, out); + if (success) { + _log.logAlways(Log.INFO, "Created new public key certificate for netdb family \"" + _fname + + "\" in file: " + out.getAbsolutePath() + "\n" + + "The certificate will be associated with your router identity.\n" + + "Copy the certificate to the directory $I2P/" + CERT_DIR + " for each of the other routers in the family.\n" + + "Give this certificate to an I2P developer for inclusion in the next I2P release."); + } else { + _log.error("Error getting SSL cert to save as ASCII"); + } + } else { + _log.error("Error saving ASCII SSL keys"); + } + } + + /** + * Load a public key from a cert. + * + * @return null on all errors + */ + private SigningPublicKey loadCert(String familyName) { + if (familyName.contains("/") || familyName.contains("\\") || + familyName.contains("..") || (new File(familyName)).isAbsolute()) + return null; + familyName = familyName.replace("@", "_at_"); + File dir = new File(_context.getBaseDir(), CERT_DIR); + File file = new File(dir, familyName + CERT_SUFFIX); + if (!file.exists()) + return null; + try { + PublicKey pk = CertUtil.loadKey(file); + return SigUtil.fromJavaKey(pk); + } catch (GeneralSecurityException gse) { + _log.error("Error loading family key " + familyName, gse); + } catch (IOException ioe) { + _log.error("Error loading family key " + familyName, ioe); + } + return null; + } + + /** + * Get the private key from the keystore + * @return non-null, throws on all errors + */ + private SigningPrivateKey getPrivKey(File ks) throws GeneralSecurityException { + String ksPass = _context.getProperty(PROP_KEYSTORE_PASSWORD, KeyStoreUtil.DEFAULT_KEYSTORE_PASSWORD); + String keyPass = _context.getProperty(PROP_KEY_PASSWORD); + if (keyPass == null) + throw new GeneralSecurityException("No key password, set " + PROP_KEY_PASSWORD + + " in " + (new File(_context.getConfigDir(), "router.config")).getAbsolutePath()); + try { + PrivateKey pk = KeyStoreUtil.getPrivateKey(ks, ksPass, _fname, keyPass); + if (pk == null) + throw new GeneralSecurityException("Family key not found: " + _fname); + return SigUtil.fromJavaKey(pk); + } catch (IOException ioe) { + throw new GeneralSecurityException("Error loading family key " + _fname, ioe); + } + } +} diff --git a/router/java/src/net/i2p/router/dummy/DummyTunnelManagerFacade.java b/router/java/src/net/i2p/router/dummy/DummyTunnelManagerFacade.java index 5de3db1a3..96dceea18 100644 --- a/router/java/src/net/i2p/router/dummy/DummyTunnelManagerFacade.java +++ b/router/java/src/net/i2p/router/dummy/DummyTunnelManagerFacade.java @@ -50,6 +50,8 @@ public class DummyTunnelManagerFacade implements TunnelManagerFacade { public int getOutboundClientTunnelCount(Hash destination) { return 0; } public long getLastParticipatingExpiration() { return -1; } public void buildTunnels(Destination client, ClientTunnelSettings settings) {} + public boolean addAlias(Destination dest, ClientTunnelSettings settings, Destination existingClient) { return false; } + public void removeAlias(Destination dest) {} public TunnelPoolSettings getInboundSettings() { return null; } public TunnelPoolSettings getOutboundSettings() { return null; } public TunnelPoolSettings getInboundSettings(Hash client) { return null; } diff --git a/router/java/src/net/i2p/router/dummy/VMCommSystem.java b/router/java/src/net/i2p/router/dummy/VMCommSystem.java index e6c310d7c..29f232370 100644 --- a/router/java/src/net/i2p/router/dummy/VMCommSystem.java +++ b/router/java/src/net/i2p/router/dummy/VMCommSystem.java @@ -8,6 +8,7 @@ import java.util.Map; import net.i2p.data.Hash; import net.i2p.data.i2np.I2NPMessage; +import net.i2p.data.i2np.I2NPMessageException; import net.i2p.data.i2np.I2NPMessageHandler; import net.i2p.router.CommSystemFacade; import net.i2p.router.JobImpl; @@ -121,8 +122,8 @@ public class VMCommSystem extends CommSystemFacade { ReceiveJob.this.getContext().statManager().addRateData("transport.receiveMessageLarge", 1, 1); _ctx.inNetMessagePool().add(msg, null, _from); - } catch (Exception e) { - _log.error("wtf, error reading/formatting a VM message?", e); + } catch (I2NPMessageException e) { + _log.error("Error reading/formatting a VM message? Something is not right...", e); } } public String getName() { return "Receive Message"; } diff --git a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java index ae2f792a5..d6382f457 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java @@ -243,7 +243,7 @@ public class GarlicMessageBuilder { if (config instanceof PayloadGarlicConfig) { byte clove[] = buildClove(ctx, (PayloadGarlicConfig)config); baos = new ByteArrayOutputStream(clove.length + 16); - DataHelper.writeLong(baos, 1, 1); + baos.write((byte) 1); baos.write(clove); } else { byte cloves[][] = new byte[config.getCloveCount()][]; @@ -263,7 +263,7 @@ public class GarlicMessageBuilder { for (int i = 0; i < cloves.length; i++) len += cloves[i].length; baos = new ByteArrayOutputStream(len + 16); - DataHelper.writeLong(baos, 1, cloves.length); + baos.write((byte) cloves.length); for (int i = 0; i < cloves.length; i++) baos.write(cloves[i]); } diff --git a/router/java/src/net/i2p/router/message/GarlicMessageParser.java b/router/java/src/net/i2p/router/message/GarlicMessageParser.java index df83702a2..ef0e5f0b7 100644 --- a/router/java/src/net/i2p/router/message/GarlicMessageParser.java +++ b/router/java/src/net/i2p/router/message/GarlicMessageParser.java @@ -75,7 +75,7 @@ public class GarlicMessageParser { private CloveSet readCloveSet(byte data[]) throws DataFormatException { int offset = 0; - int numCloves = (int)DataHelper.fromLong(data, offset, 1); + int numCloves = data[offset] & 0xff; offset++; if (_log.shouldLog(Log.DEBUG)) _log.debug("# cloves to read: " + numCloves); diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java index 8a517a806..b98b7a2ed 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java @@ -38,10 +38,67 @@ import net.i2p.router.TunnelInfo; import net.i2p.util.Log; /** - * Send a client message out a random outbound tunnel and into a random inbound + * Send a client message out an outbound tunnel and into an inbound * tunnel on the target leaseSet. This also (sometimes) bundles the sender's leaseSet and * a DeliveryStatusMessage (for ACKing any sessionTags used in the garlic). * + *

              + * This class is where we make several important decisions about + * what to send and what path to send it over. These decisions + * will dramatically affect: + *

                + *
              • Local performance and outbound bandwidth usage + *
              • Streaming performance and reliability + *
              • Overall network performace and connection congestion + *
              + * + *

              + * For the outbound message, we build and encrypt a garlic message, + * after making the following decisions: + *

                + *
              • Whether to bundle our leaseset + *
              • Whether to bundle session tags, and if so, how many + *
              • Whether to bundle an encrypted DeliveryStatusMessage to be returned + * to us as an acknowledgement + *
              + * + *

              + * Also, we make the following path selection decisions: + *

                + *
              • What outbound client tunnel of ours to use send the message out + *
              • What inbound client tunnel of his (i.e. lease, chosen from his leaseset) + * to use to send the message in + *
              • If a DeliveryStatusMessage is bundled, What inbound client tunnel of ours + * do we specify to receive it + *
              + * + *

              + * Note that the 4th tunnel in the DeliveryStatusMessage's round trip (his outbound tunnel) + * is not selected by us, it is chosen by the recipient. + * + *

              + * If a DeliveryStatusMessage is sent, a listener is registered to wait for its reply. + * When a reply is received, or the timeout is reached, this is noted + * and will influence subsequent bundling and path selection decisions. + * + *

              + * Path selection decisions are cached and reused if still valid and if + * previous deliveries were apparently successful. This significantly + * reduces out-of-order delivery and network connection congestion. + * Caching is based on the local/remote destination pair. + * + *

              + * Bundling decisions, and both messaging and reply expiration times, are generally + * set here but may be overridden by the client on a per-message basis. + * Within clients, there may be overall settings or per-message settings. + * The streaming lib also overrides defaults for some messages. + * A datagram-based DHT application may need significantly different + * settings than a streaming application. For an application such as + * a bittorrent client that sends both types of traffic on the same tunnels, + * it is important to tune the settings for efficiency and performance. + * The per-session and per-message overrides are set via I2CP. + * + * */ public class OutboundClientMessageOneShotJob extends JobImpl { private final Log _log; @@ -949,15 +1006,19 @@ public class OutboundClientMessageOneShotJob extends JobImpl { if (_outTunnel.getLength() > 0) size = ((size + 1023) / 1024) * 1024; // messages are in ~1KB blocks - for (int i = 0; i < _outTunnel.getLength(); i++) { + // skip ourselves at first hop + for (int i = 1; i < _outTunnel.getLength(); i++) { getContext().profileManager().tunnelTestSucceeded(_outTunnel.getPeer(i), sendTime); getContext().profileManager().tunnelDataPushed(_outTunnel.getPeer(i), sendTime, size); } _outTunnel.incrementVerifiedBytesTransferred(size); } - if (_inTunnel != null) - for (int i = 0; i < _inTunnel.getLength(); i++) + if (_inTunnel != null) { + // skip ourselves at last hop + for (int i = 0; i < _inTunnel.getLength() - 1; i++) { getContext().profileManager().tunnelTestSucceeded(_inTunnel.getPeer(i), sendTime); + } + } } public void setMessage(I2NPMessage msg) {} diff --git a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java index cc7a337cc..6a4871e6c 100644 --- a/router/java/src/net/i2p/router/message/SendMessageDirectJob.java +++ b/router/java/src/net/i2p/router/message/SendMessageDirectJob.java @@ -43,22 +43,40 @@ public class SendMessageDirectJob extends JobImpl { private boolean _sent; private long _searchOn; + /** + * @param toPeer may be ourselves + */ public SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, int timeoutMs, int priority) { this(ctx, message, toPeer, null, null, null, null, timeoutMs, priority); } - public SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority) { + /** + * @param toPeer may be ourselves + * @param onSuccess may be null + * @param onFail may be null + * @param selector be null + */ + public SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, ReplyJob onSuccess, + Job onFail, MessageSelector selector, int timeoutMs, int priority) { this(ctx, message, toPeer, null, onSuccess, onFail, selector, timeoutMs, priority); } - public SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, Job onSend, ReplyJob onSuccess, Job onFail, MessageSelector selector, int timeoutMs, int priority) { + /** + * @param toPeer may be ourselves + * @param onSend may be null + * @param onSuccess may be null + * @param onFail may be null + * @param selector be null + */ + public SendMessageDirectJob(RouterContext ctx, I2NPMessage message, Hash toPeer, Job onSend, ReplyJob onSuccess, + Job onFail, MessageSelector selector, int timeoutMs, int priority) { super(ctx); _log = getContext().logManager().getLog(SendMessageDirectJob.class); _message = message; _targetHash = toPeer; if (timeoutMs < 10*1000) { if (_log.shouldLog(Log.WARN)) - _log.warn("Very little time given [" + timeoutMs + "], resetting to 5s", new Exception("stingy bastard")); + _log.warn("Very little time given [" + timeoutMs + "], resetting to 5s", new Exception("stingy caller!")); _expiration = ctx.clock().now() + 10*1000; } else { _expiration = timeoutMs + ctx.clock().now(); diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java index 5a4c3a00b..12d6c4e61 100644 --- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java @@ -83,6 +83,14 @@ public class HandleDatabaseLookupMessageJob extends JobImpl { return; } + // i2pd bug? + if (_message.getSearchKey().equals(Hash.FAKE_HASH)) { + if (_log.shouldWarn()) + _log.warn("Zero lookup", new Exception()); + getContext().statManager().addRateData("netDb.DLMAllZeros", 1); + return; + } + DatabaseLookupMessage.Type lookupType = _message.getSearchType(); // only lookup once, then cast to correct type DatabaseEntry dbe = getContext().netDb().lookupLocally(_message.getSearchKey()); diff --git a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java index d6c068588..5054d44c8 100644 --- a/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java +++ b/router/java/src/net/i2p/router/networkdb/PublishLocalRouterInfoJob.java @@ -82,9 +82,6 @@ public class PublishLocalRouterInfoJob extends JobImpl { List newAddrs = getContext().commSystem().createAddresses(); int count = _runCount.incrementAndGet(); RouterInfo ri = new RouterInfo(oldRI); - // this will get overwritten by setOptions() below, must restore it below - getContext().router().addCapabilities(ri); - String caps = ri.getCapabilities(); if (_notFirstTime && (count % 4) != 0 && oldAddrs.size() == newAddrs.size()) { // 3 times out of 4, we don't republish if everything is the same... // If something changed, including the cost, then publish, @@ -116,9 +113,6 @@ public class PublishLocalRouterInfoJob extends JobImpl { } ri.setPublished(getContext().clock().now()); Properties stats = getContext().statPublisher().publishStatistics(); - stats.setProperty(RouterInfo.PROP_NETWORK_ID, String.valueOf(Router.NETWORK_ID)); - // restore caps generated above - stats.setProperty(RouterInfo.PROP_CAPABILITIES, caps); ri.setOptions(stats); ri.setAddresses(newAddrs); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java index bb75b6825..768511fc9 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java @@ -78,7 +78,7 @@ class ExploreJob extends SearchJob { * @param expiration when the search should stop * @param peer the peer to send it to * - * @return a DatabaseLookupMessage or GarlicMessage + * @return a DatabaseLookupMessage or GarlicMessage or null on error */ @Override protected I2NPMessage buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration, RouterInfo peer) { @@ -146,6 +146,7 @@ class ExploreJob extends SearchJob { ' ' + sess.key + ' ' + sess.tag); msg.setReplySession(sess.key, sess.tag); } + // may be null outMsg = MessageWrapper.wrap(getContext(), msg, peer); if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Encrypted exploratory DLM for " + getState().getTarget() + " to " + diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java index 9fcbbeb79..39e410185 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java @@ -220,7 +220,7 @@ class FloodOnlySearchJob extends FloodSearchJob { getContext().profileManager().dbLookupFailed(h); } _facade.complete(_key); - getContext().statManager().addRateData("netDb.failedTime", time, 0); + getContext().statManager().addRateData("netDb.failedTime", time); for (Job j : _onFailed) { getContext().jobQueue().addJob(j); } @@ -251,7 +251,7 @@ class FloodOnlySearchJob extends FloodSearchJob { } } _facade.complete(_key); - getContext().statManager().addRateData("netDb.successTime", time, 0); + getContext().statManager().addRateData("netDb.successTime", time); for (Job j : _onFind) { getContext().jobQueue().addJob(j); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseLookupMessageHandler.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseLookupMessageHandler.java index a07ac8c70..3f57e1499 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseLookupMessageHandler.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseLookupMessageHandler.java @@ -43,7 +43,7 @@ public class FloodfillDatabaseLookupMessageHandler implements HandlerJobBuilder } public Job createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) { - _context.statManager().addRateData("netDb.lookupsReceived", 1, 0); + _context.statManager().addRateData("netDb.lookupsReceived", 1); DatabaseLookupMessage dlm = (DatabaseLookupMessage)receivedMessage; if (!_facade.shouldThrottleLookup(dlm.getFrom(), dlm.getReplyTunnel())) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseStoreMessageHandler.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseStoreMessageHandler.java index 99d8c6265..37ce81bf7 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseStoreMessageHandler.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillDatabaseStoreMessageHandler.java @@ -28,7 +28,7 @@ public class FloodfillDatabaseStoreMessageHandler implements HandlerJobBuilder { _context = context; _facade = facade; // following are for HFDSMJ - context.statManager().createRateStat("netDb.storeHandled", "How many netDb store messages have we handled?", "NetworkDatabase", new long[] { 60*60*1000l }); + context.statManager().createRateStat("netDb.storeHandled", "How many netDb store messages have we handled?", "NetworkDatabase", new long[] { 60*1000, 60*60*1000l }); context.statManager().createRateStat("netDb.storeLeaseSetHandled", "How many leaseSet store messages have we handled?", "NetworkDatabase", new long[] { 60*60*1000l }); context.statManager().createRateStat("netDb.storeRouterInfoHandled", "How many routerInfo store messages have we handled?", "NetworkDatabase", new long[] { 60*60*1000l }); context.statManager().createRateStat("netDb.storeRecvTime", "How long it takes to handle the local store part of a dbStore?", "NetworkDatabase", new long[] { 60*60*1000l }); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java index 6ea216545..2c1a929d9 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillMonitorJob.java @@ -6,6 +6,7 @@ import net.i2p.crypto.SigType; import net.i2p.data.Hash; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; +import net.i2p.router.Job; import net.i2p.router.JobImpl; import net.i2p.router.Router; import net.i2p.router.RouterContext; @@ -55,13 +56,27 @@ class FloodfillMonitorJob extends JobImpl { } else { getContext().router().eventLog().addEvent(EventLog.NOT_FLOODFILL); } - getContext().router().rebuildRouterInfo(); + getContext().router().rebuildRouterInfo(true); + Job routerInfoFlood = new FloodfillRouterInfoFloodJob(getContext(), _facade); + if(getContext().router().getUptime() < 5*60*1000) { + // Needed to prevent race if router.floodfillParticipant=true (not auto) + routerInfoFlood.getTiming().setStartAfter(getContext().clock().now() + 5*60*1000); + getContext().jobQueue().addJob(routerInfoFlood); + if(_log.shouldLog(Log.DEBUG)) { + _log.logAlways(Log.DEBUG, "Deferring our FloodfillRouterInfoFloodJob run because of low uptime."); + } + } else { + routerInfoFlood.runJob(); + if(_log.shouldLog(Log.DEBUG)) { + _log.logAlways(Log.DEBUG, "Running FloodfillRouterInfoFloodJob"); + } + } } if (_log.shouldLog(Log.INFO)) _log.info("Should we be floodfill? " + ff); int delay = (REQUEUE_DELAY / 2) + getContext().random().nextInt(REQUEUE_DELAY); // there's a lot of eligible non-floodfills, keep them from all jumping in at once - // To do: somehow assess the size of the network to make this adaptive? + // TODO: somehow assess the size of the network to make this adaptive? if (!ff) delay *= 4; // this was 7, reduced for moar FFs --zab requeue(delay); @@ -160,8 +175,9 @@ class FloodfillMonitorJob extends JobImpl { // For reference, the avg lifetime job lag on my Pi is 6. // Should we consider avg. dropped ff jobs? RateStat lagStat = getContext().statManager().getRate("jobQueue.jobLag"); + RateStat queueStat = getContext().statManager().getRate("router.tunnelBacklog"); happy = happy && lagStat.getRate(60*60*1000L).getAvgOrLifetimeAvg() < 25; - happy = happy && getContext().tunnelManager().getInboundBuildQueueSize() < 5; + happy = happy && queueStat.getRate(60*60*1000L).getAvgOrLifetimeAvg() < 5; // Only if we're pretty well integrated... happy = happy && _facade.getKnownRouters() >= 400; happy = happy && getContext().commSystem().countActivePeers() >= 50; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java index a02013a5f..0df3b3290 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java @@ -40,7 +40,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad * Was 7 through release 0.9; 5 for 0.9.1. * 4 as of 0.9.2; 3 as of 0.9.9 */ - private static final int MAX_TO_FLOOD = 3; + public static final int MAX_TO_FLOOD = 3; private static final int FLOOD_PRIORITY = OutNetMessage.PRIORITY_NETDB_FLOOD; private static final int FLOOD_TIMEOUT = 30*1000; @@ -129,7 +129,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad */ @Override public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException { - if (localRouterInfo == null) throw new IllegalArgumentException("wtf, null localRouterInfo?"); + if (localRouterInfo == null) throw new IllegalArgumentException("impossible: null localRouterInfo?"); // should this be after super? why not publish locally? if (_context.router().isHidden()) return; // DE-nied! super.publish(localRouterInfo); @@ -173,7 +173,8 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad * @since 0.7.11 */ boolean shouldThrottleLookup(Hash from, TunnelId id) { - return _lookupThrottler.shouldThrottle(from, id); + // null before startup + return _lookupThrottler == null || _lookupThrottler.shouldThrottle(from, id); } /** @@ -277,7 +278,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad @Override protected PeerSelector createPeerSelector() { return new FloodfillPeerSelector(_context); } - synchronized void setFloodfillEnabled(boolean yes) { + public synchronized void setFloodfillEnabled(boolean yes) { _floodfillEnabled = yes; if (yes && _floodThrottler == null) { _floodThrottler = new FloodThrottler(); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillRouterInfoFloodJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillRouterInfoFloodJob.java new file mode 100644 index 000000000..9ac4f7391 --- /dev/null +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillRouterInfoFloodJob.java @@ -0,0 +1,64 @@ +package net.i2p.router.networkdb.kademlia; + +import java.util.Collections; +import java.util.List; + +import net.i2p.data.Hash; +import net.i2p.data.i2np.DatabaseStoreMessage; +import net.i2p.data.router.RouterAddress; +import net.i2p.data.router.RouterInfo; +import net.i2p.router.JobImpl; +import net.i2p.router.OutNetMessage; +import net.i2p.router.Router; +import net.i2p.router.RouterContext; +import net.i2p.stat.Rate; +import net.i2p.stat.RateStat; +import net.i2p.util.Log; + +/** + * Job to flood nearby floodfill routers with our RI. + * Speeds up integration of new ffs. Created for #1195. + * Also called when opting out of ff to call off the hounds ASAP. + * Currently floods FNDF.MAX_TO_FLOOD * 2 routers nearest to us. + * + * @since 0.9.21 + */ +class FloodfillRouterInfoFloodJob extends JobImpl { + private final Log _log; + private final FloodfillNetworkDatabaseFacade _facade; + + private static final int FLOOD_PEERS = 2 * FloodfillNetworkDatabaseFacade.MAX_TO_FLOOD; + + public FloodfillRouterInfoFloodJob(RouterContext context, FloodfillNetworkDatabaseFacade facade) { + super(context); + _facade = facade; + _log = context.logManager().getLog(FloodfillRouterInfoFloodJob.class); + } + + public String getName() { return "Flood our RouterInfo to nearby floodfills"; } + + public void runJob() { + FloodfillPeerSelector sel = (FloodfillPeerSelector)_facade.getPeerSelector(); + DatabaseStoreMessage dsm; + OutNetMessage outMsg; + RouterInfo nextPeerInfo; + + List peers = sel.selectFloodfillParticipants(getContext().routerHash(), FLOOD_PEERS, null); + + for(Hash ri: peers) { + // Iterate through list of nearby (ff) peers + dsm = new DatabaseStoreMessage(getContext()); + dsm.setMessageExpiration(getContext().clock().now() + 10*1000); + dsm.setEntry(getContext().router().getRouterInfo()); + nextPeerInfo = getContext().netDb().lookupRouterInfoLocally(ri); + if(nextPeerInfo == null) { + continue; + } + outMsg = new OutNetMessage(getContext(), dsm, getContext().clock().now()+10*1000, OutNetMessage.PRIORITY_MY_NETDB_STORE, nextPeerInfo); + getContext().outNetMessagePool().add(outMsg); // Whoosh! + if(_log.shouldLog(Log.DEBUG)) { + _log.logAlways(Log.DEBUG, "Sending our RI to: " + nextPeerInfo.getHash()); + } + } + } +} diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java index 5618d2564..b7ad0465f 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java @@ -20,6 +20,8 @@ import net.i2p.util.Log; /** * This extends StoreJob to fire off a FloodfillVerifyStoreJob after success. * + * Stores through this class always request a reply. + * */ class FloodfillStoreJob extends StoreJob { private final FloodfillNetworkDatabaseFacade _facade; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java index 891b7ecb0..9ffda0201 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java @@ -257,7 +257,7 @@ class FloodfillVerifyStoreJob extends JobImpl { getContext().profileManager().dbLookupSuccessful(_target, delay); if (_sentTo != null) getContext().profileManager().dbStoreSuccessful(_sentTo); - getContext().statManager().addRateData("netDb.floodfillVerifyOK", delay, 0); + getContext().statManager().addRateData("netDb.floodfillVerifyOK", delay); if (_log.shouldLog(Log.INFO)) _log.info("Verify success for " + _key); if (_isRouterInfo) @@ -290,7 +290,7 @@ class FloodfillVerifyStoreJob extends JobImpl { // though it is the real problem. if (_target != null && !_target.equals(_sentTo)) getContext().profileManager().dbLookupFailed(_target); - getContext().statManager().addRateData("netDb.floodfillVerifyFail", delay, 0); + getContext().statManager().addRateData("netDb.floodfillVerifyFail", delay); resend(); } public void setMessage(I2NPMessage message) { _message = message; } @@ -328,7 +328,7 @@ class FloodfillVerifyStoreJob extends JobImpl { getContext().profileManager().dbLookupFailed(_target); //if (_sentTo != null) // getContext().profileManager().dbStoreFailed(_sentTo); - getContext().statManager().addRateData("netDb.floodfillVerifyTimeout", getContext().clock().now() - _sendTime, 0); + getContext().statManager().addRateData("netDb.floodfillVerifyTimeout", getContext().clock().now() - _sendTime); if (_log.shouldLog(Log.WARN)) _log.warn("Verify timed out for: " + _key); if (_ignore.size() < MAX_PEERS_TO_TRY) { diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java index ffb6d77f0..56fd1f0eb 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java @@ -14,14 +14,19 @@ import java.util.Date; import net.i2p.data.DatabaseEntry; import net.i2p.data.Hash; import net.i2p.data.LeaseSet; +import net.i2p.data.TunnelId; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterIdentity; import net.i2p.data.router.RouterInfo; import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.i2np.DeliveryStatusMessage; +import net.i2p.data.i2np.TunnelGatewayMessage; +import net.i2p.router.Job; import net.i2p.router.JobImpl; +import net.i2p.router.OutNetMessage; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; +import net.i2p.router.message.SendMessageDirectJob; import net.i2p.util.Log; /** @@ -34,8 +39,15 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { private final RouterIdentity _from; private Hash _fromHash; private final FloodfillNetworkDatabaseFacade _facade; + private final static int REPLY_TIMEOUT = 60*1000; + private final static int MESSAGE_PRIORITY = OutNetMessage.PRIORITY_NETDB_REPLY; - public HandleFloodfillDatabaseStoreMessageJob(RouterContext ctx, DatabaseStoreMessage receivedMessage, RouterIdentity from, Hash fromHash, FloodfillNetworkDatabaseFacade facade) { + /** + * @param receivedMessage must never have reply token set if it came down a tunnel + */ + public HandleFloodfillDatabaseStoreMessageJob(RouterContext ctx, DatabaseStoreMessage receivedMessage, + RouterIdentity from, Hash fromHash, + FloodfillNetworkDatabaseFacade facade) { super(ctx); _log = ctx.logManager().getLog(getClass()); _message = receivedMessage; @@ -136,6 +148,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { // somebody has our keys... if (getContext().routerHash().equals(key)) { //getContext().statManager().addRateData("netDb.storeLocalRouterInfoAttempt", 1, 0); + // This is initiated by PeerTestJob from another peer // throw rather than return, so that we send the ack below (prevent easy attack) dontBlamePeer = true; throw new IllegalArgumentException("Peer attempted to store our RouterInfo"); @@ -170,15 +183,18 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { if (_log.shouldLog(Log.ERROR)) _log.error("Invalid DatabaseStoreMessage data type - " + entry.getType() + ": " + _message); + // don't ack or flood + return; } long recvEnd = System.currentTimeMillis(); getContext().statManager().addRateData("netDb.storeRecvTime", recvEnd-recvBegin); - // ack even if invalid or unsupported + // ack even if invalid + // in particular, ack our own RI (from PeerTestJob) // TODO any cases where we shouldn't? if (_message.getReplyToken() > 0) - sendAck(); + sendAck(key); long ackEnd = System.currentTimeMillis(); if (_from != null) @@ -215,7 +231,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { // ERR: see comment in HandleDatabaseLookupMessageJob regarding hidden mode //else if (!_message.getRouterInfo().isHidden()) long floodEnd = System.currentTimeMillis(); - getContext().statManager().addRateData("netDb.storeFloodNew", floodEnd-floodBegin); + getContext().statManager().addRateData("netDb.storeFloodNew", floodEnd-floodBegin, 60*1000); } else { // don't flood it *again* getContext().statManager().addRateData("netDb.storeFloodOld", 1); @@ -223,7 +239,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { } } - private void sendAck() { + private void sendAck(Hash storedKey) { DeliveryStatusMessage msg = new DeliveryStatusMessage(getContext()); msg.setMessageId(_message.getReplyToken()); // Randomize for a little protection against clock-skew fingerprinting. @@ -231,31 +247,62 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl { // TODO just set to 0? // TODO we have no session to garlic wrap this with, needs new message msg.setArrival(getContext().clock().now() - getContext().random().nextInt(3*1000)); - /* - if (FloodfillNetworkDatabaseFacade.floodfillEnabled(getContext())) { - // no need to do anything but send it where they ask + // may be null + TunnelId replyTunnel = _message.getReplyTunnel(); + // A store of our own RI, only if we are not FF + DatabaseStoreMessage msg2; + if ((getContext().netDb().floodfillEnabled() && !getContext().router().gracefulShutdownInProgress()) || + storedKey.equals(getContext().routerHash())) { + // don't send our RI if the store was our RI (from PeerTestJob) + msg2 = null; + } else { + // we aren't ff, send a go-away message + msg2 = new DatabaseStoreMessage(getContext()); + RouterInfo me = getContext().router().getRouterInfo(); + msg2.setEntry(me); + if (_log.shouldWarn()) + _log.warn("Got a store w/ reply token, but we aren't ff: from: " + _from + + " fromHash: " + _fromHash + " msg: " + _message, new Exception()); + } + Hash toPeer = _message.getReplyGateway(); + boolean toUs = getContext().routerHash().equals(toPeer); + // to reduce connection congestion, send directly if connected already, + // else through an exploratory tunnel. + if (toUs && replyTunnel != null) { + // if we are the gateway, act as if we received it TunnelGatewayMessage tgm = new TunnelGatewayMessage(getContext()); tgm.setMessage(msg); - tgm.setTunnelId(_message.getReplyTunnel()); + tgm.setTunnelId(replyTunnel); tgm.setMessageExpiration(msg.getMessageExpiration()); - - getContext().jobQueue().addJob(new SendMessageDirectJob(getContext(), tgm, _message.getReplyGateway(), 10*1000, 200)); + getContext().tunnelDispatcher().dispatch(tgm); + if (msg2 != null) { + TunnelGatewayMessage tgm2 = new TunnelGatewayMessage(getContext()); + tgm2.setMessage(msg2); + tgm2.setTunnelId(replyTunnel); + tgm2.setMessageExpiration(msg.getMessageExpiration()); + getContext().tunnelDispatcher().dispatch(tgm2); + } + } else if (toUs || getContext().commSystem().isEstablished(toPeer)) { + Job send = new SendMessageDirectJob(getContext(), msg, toPeer, REPLY_TIMEOUT, MESSAGE_PRIORITY); + send.runJob(); + if (msg2 != null) { + Job send2 = new SendMessageDirectJob(getContext(), msg2, toPeer, REPLY_TIMEOUT, MESSAGE_PRIORITY); + send2.runJob(); + } } else { - */ - TunnelInfo outTunnel = selectOutboundTunnel(); + // pick tunnel with endpoint closest to toPeer + TunnelInfo outTunnel = getContext().tunnelManager().selectOutboundExploratoryTunnel(toPeer); if (outTunnel == null) { if (_log.shouldLog(Log.WARN)) _log.warn("No outbound tunnel could be found"); return; - } else { - getContext().tunnelDispatcher().dispatchOutbound(msg, outTunnel.getSendTunnelId(0), - _message.getReplyTunnel(), _message.getReplyGateway()); } - //} - } - - private TunnelInfo selectOutboundTunnel() { - return getContext().tunnelManager().selectOutboundTunnel(); + getContext().tunnelDispatcher().dispatchOutbound(msg, outTunnel.getSendTunnelId(0), + replyTunnel, toPeer); + if (msg2 != null) + getContext().tunnelDispatcher().dispatchOutbound(msg2, outTunnel.getSendTunnelId(0), + replyTunnel, toPeer); + } } public String getName() { return "Handle Database Store Message"; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/IterativeLookupJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/IterativeLookupJob.java index ac283109c..6b243b769 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/IterativeLookupJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/IterativeLookupJob.java @@ -58,7 +58,7 @@ class IterativeLookupJob extends JobImpl { continue; } if (peer.equals(from)) { - // wtf + // unusual invalidPeers++; continue; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java index 55464735e..8fc784ace 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/IterativeSearchJob.java @@ -71,10 +71,10 @@ class IterativeSearchJob extends FloodSearchJob { private static Hash _alwaysQueryHash; /** Max number of peers to query */ private final int _totalSearchLimit; - + private static final int MAX_NON_FF = 3; /** Max number of peers to query */ - private static final int TOTAL_SEARCH_LIMIT = 6; + private static final int TOTAL_SEARCH_LIMIT = 5; /** Max number of peers to query if we are ff */ private static final int TOTAL_SEARCH_LIMIT_WHEN_FF = 3; /** TOTAL_SEARCH_LIMIT * SINGLE_SEARCH_TIME, plus some extra */ @@ -84,6 +84,10 @@ class IterativeSearchJob extends FloodSearchJob { * Longer than the typ. response time of 1.0 - 1.5 sec, but short enough that we move * on to another peer quickly. */ + private final long _singleSearchTime; + /** + * The default single search time + */ private static final long SINGLE_SEARCH_TIME = 3*1000; /** the actual expire time for a search message */ private static final long SINGLE_SEARCH_MSG_TIME = 10*1000; @@ -92,6 +96,10 @@ class IterativeSearchJob extends FloodSearchJob { * For now, we don't do concurrent, but we keep SINGLE_SEARCH_TIME very short, * so we have effective concurrency in that we fail a search quickly. */ + private final int _maxConcurrent; + /** + * The default _maxConcurrent + */ private static final int MAX_CONCURRENT = 1; public static final String PROP_ENCRYPT_RI = "router.encryptRouterLookups"; @@ -125,8 +133,11 @@ class IterativeSearchJob extends FloodSearchJob { _expiration = _timeoutMs + ctx.clock().now(); _rkey = ctx.routingKeyGenerator().getRoutingKey(key); _toTry = new TreeSet(new XORComparator(_rkey)); - _totalSearchLimit = (facade.floodfillEnabled() && ctx.router().getUptime() > 30*60*1000) ? + int totalSearchLimit = (facade.floodfillEnabled() && ctx.router().getUptime() > 30*60*1000) ? TOTAL_SEARCH_LIMIT_WHEN_FF : TOTAL_SEARCH_LIMIT; + _totalSearchLimit = ctx.getProperty("netdb.searchLimit", totalSearchLimit); + _singleSearchTime = ctx.getProperty("netdb.singleSearchTime", SINGLE_SEARCH_TIME); + _maxConcurrent = ctx.getProperty("netdb.maxConcurrent", MAX_CONCURRENT); _unheardFrom = new HashSet(CONCURRENT_SEARCHES); _failedPeers = new HashSet(_totalSearchLimit); _sentTime = new ConcurrentHashMap(_totalSearchLimit); @@ -187,11 +198,17 @@ class IterativeSearchJob extends FloodSearchJob { floodfillPeers.add(iter.next()); } } - _toTry.addAll(floodfillPeers); - // don't ask ourselves or the target - _toTry.remove(getContext().routerHash()); - _toTry.remove(_key); - if (_toTry.isEmpty()) { + final boolean empty; + // outside sync to avoid deadlock + final Hash us = getContext().routerHash(); + synchronized(this) { + _toTry.addAll(floodfillPeers); + // don't ask ourselves or the target + _toTry.remove(us); + _toTry.remove(_key); + empty = _toTry.isEmpty(); + } + if (empty) { if (_log.shouldLog(Log.WARN)) _log.warn(getJobId() + ": ISJ for " + _key + " had no peers to send to"); // no floodfill peers, fail @@ -227,23 +244,26 @@ class IterativeSearchJob extends FloodSearchJob { } while (true) { Hash peer; + final int done, pend; synchronized (this) { if (_dead) return; - int pend = _unheardFrom.size(); - if (pend >= MAX_CONCURRENT) - return; - int done = _failedPeers.size(); - if (done >= _totalSearchLimit) { - failed(); - return; - } - // even if pend and todo are empty, we don't fail, as there may be more peers - // coming via newPeerToTry() - if (done + pend >= _totalSearchLimit) + pend = _unheardFrom.size(); + if (pend >= _maxConcurrent) return; + done = _failedPeers.size(); + } + if (done >= _totalSearchLimit) { + failed(); + return; + } + // even if pend and todo are empty, we don't fail, as there may be more peers + // coming via newPeerToTry() + if (done + pend >= _totalSearchLimit) + return; + synchronized(this) { if (_alwaysQueryHash != null && - !_unheardFrom.contains(_alwaysQueryHash) && - !_failedPeers.contains(_alwaysQueryHash)) { + !_unheardFrom.contains(_alwaysQueryHash) && + !_failedPeers.contains(_alwaysQueryHash)) { // For testing or local networks... we will // pretend that the specified router is floodfill, and always closest-to-the-key. // May be set after startup but can't be changed or unset later. @@ -404,7 +424,7 @@ class IterativeSearchJob extends FloodSearchJob { // The timeout job is always run (never cancelled) // Note that the timeout is much shorter than the message expiration (see above) Job j = new IterativeTimeoutJob(getContext(), peer, this); - long expire = Math.min(_expiration, now + SINGLE_SEARCH_TIME); + long expire = Math.min(_expiration, now + _singleSearchTime); j.getTiming().setStartAfter(expire); getContext().jobQueue().addJob(j); @@ -513,11 +533,14 @@ class IterativeSearchJob extends FloodSearchJob { _facade.lookupFailed(_key); getContext().messageRegistry().unregisterPending(_out); int tries; + final List unheard; synchronized(this) { tries = _unheardFrom.size() + _failedPeers.size(); - // blame the unheard-from (others already blamed in failed() above) - for (Hash h : _unheardFrom) - getContext().profileManager().dbLookupFailed(h); + unheard = new ArrayList(_unheardFrom); + } + // blame the unheard-from (others already blamed in failed() above) + for (Hash h : unheard) { + getContext().profileManager().dbLookupFailed(h); } long time = System.currentTimeMillis() - _created; if (_log.shouldLog(Log.INFO)) { @@ -525,8 +548,11 @@ class IterativeSearchJob extends FloodSearchJob { _log.info(getJobId() + ": ISJ for " + _key + " failed with " + timeRemaining + " remaining after " + time + ", peers queried: " + tries); } - getContext().statManager().addRateData("netDb.failedTime", time); - getContext().statManager().addRateData("netDb.failedRetries", Math.max(0, tries - 1)); + if (tries > 0) { + // don't bias the stats with immediate fails + getContext().statManager().addRateData("netDb.failedTime", time); + getContext().statManager().addRateData("netDb.failedRetries", tries - 1); + } for (Job j : _onFailed) { getContext().jobQueue().addJob(j); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index fb89f60a5..ea0aa6908 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -40,6 +40,7 @@ import net.i2p.router.Job; import net.i2p.router.NetworkDatabaseFacade; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.crypto.FamilyKeyCrypto; import net.i2p.router.networkdb.PublishLocalRouterInfoJob; import net.i2p.router.networkdb.reseed.ReseedChecker; import net.i2p.router.peermanager.PeerProfile; @@ -171,6 +172,10 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { context.statManager().createRateStat("netDb.replyTimeout", "How long after a netDb send does the timeout expire (when the peer doesn't reply in time)?", "NetworkDatabase", new long[] { 60*60*1000l }); // following is for RepublishLeaseSetJob context.statManager().createRateStat("netDb.republishLeaseSetCount", "How often we republish a leaseSet?", "NetworkDatabase", new long[] { 60*60*1000l }); + // following is for DatabaseStoreMessage + context.statManager().createRateStat("netDb.DSMAllZeros", "Store with zero key", "NetworkDatabase", new long[] { 60*60*1000l }); + // following is for HandleDatabaseLookupMessageJob + context.statManager().createRateStat("netDb.DLMAllZeros", "Lookup with zero key", "NetworkDatabase", new long[] { 60*60*1000l }); } @Override @@ -207,7 +212,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { public void removeFromExploreKeys(Collection toRemove) { if (!_initialized) return; _exploreKeys.removeAll(toRemove); - _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size(), 0); + _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size()); } public void queueForExploration(Collection keys) { @@ -215,7 +220,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { for (Iterator iter = keys.iterator(); iter.hasNext() && _exploreKeys.size() < MAX_EXPLORE_QUEUE; ) { _exploreKeys.add(iter.next()); } - _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size(), 0); + _context.statManager().addRateData("netDb.exploreKeySet", _exploreKeys.size()); } public synchronized void shutdown() { @@ -270,7 +275,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { //_ds = new TransientDataStore(); // _exploreKeys = new HashSet(64); _dbDir = dbDir; - _negativeCache = new NegativeLookupCache(); + _negativeCache = new NegativeLookupCache(_context); createHandlers(); @@ -642,7 +647,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { try { store(h, localLeaseSet); } catch (IllegalArgumentException iae) { - _log.error("wtf, locally published leaseSet is not valid?", iae); + _log.error("locally published leaseSet is not valid?", iae); throw iae; } if (!_context.clientManager().shouldPublishLeaseSet(h)) @@ -890,6 +895,15 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { _log.warn("Bad network: " + routerInfo); return "Not in our network"; } + FamilyKeyCrypto fkc = _context.router().getFamilyKeyCrypto(); + if (fkc != null) { + boolean validFamily = fkc.verify(routerInfo); + if (!validFamily) { + if (_log.shouldWarn()) + _log.warn("Bad family sig: " + routerInfo.getHash()); + } + // todo store in RI + } return validate(routerInfo); } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java index 28ae14f76..4e5bdcd10 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/LookupThrottler.java @@ -45,8 +45,8 @@ class LookupThrottler { /** yes, we could have a two-level lookup, or just do h.tostring() + id.tostring() */ private static class ReplyTunnel { - public Hash h; - public TunnelId id; + public final Hash h; + public final TunnelId id; ReplyTunnel(Hash h, TunnelId id) { this.h = h; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java b/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java index 1915caf4e..d9164225d 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/NegativeLookupCache.java @@ -4,6 +4,7 @@ import java.util.Map; import net.i2p.data.Destination; import net.i2p.data.Hash; +import net.i2p.router.RouterContext; import net.i2p.util.LHMCache; import net.i2p.util.ObjectCounter; import net.i2p.util.SimpleTimer; @@ -17,15 +18,18 @@ import net.i2p.util.SimpleTimer2; class NegativeLookupCache { private final ObjectCounter counter; private final Map badDests; - + private final int _maxFails; + private static final int MAX_FAILS = 3; private static final int MAX_BAD_DESTS = 128; private static final long CLEAN_TIME = 2*60*1000; - public NegativeLookupCache() { + public NegativeLookupCache(RouterContext context) { this.counter = new ObjectCounter(); this.badDests = new LHMCache(MAX_BAD_DESTS); - SimpleTimer2.getInstance().addPeriodicEvent(new Cleaner(), CLEAN_TIME); + this._maxFails = context.getProperty("netdb.negativeCache.maxFails",MAX_FAILS); + final long cleanTime = context.getProperty("netdb.negativeCache.cleanupInterval", CLEAN_TIME); + SimpleTimer2.getInstance().addPeriodicEvent(new Cleaner(), cleanTime); } public void lookupFailed(Hash h) { @@ -33,7 +37,7 @@ class NegativeLookupCache { } public boolean isCached(Hash h) { - if (counter.count(h) >= MAX_FAILS) + if (counter.count(h) >= _maxFails) return true; synchronized(badDests) { return badDests.get(h) != null; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java index 946aa0e60..0710cf5d8 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java @@ -112,15 +112,14 @@ class PeerSelector { /** UNUSED */ private class MatchSelectionCollector implements SelectionCollector { - private TreeMap _sorted; - private Hash _key; - private Set _toIgnore; + private final TreeMap _sorted; + private final Hash _key; + private final Set _toIgnore; private int _matches; public MatchSelectionCollector(Hash key, Set toIgnore) { _key = key; _sorted = new TreeMap(); _toIgnore = toIgnore; - _matches = 0; } public void add(Hash entry) { // deadlock seen here, and we don't mark profiles failing anymore diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 01c5e991f..80aae33e2 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -13,6 +13,7 @@ import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; +import java.io.Flushable; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -43,8 +44,10 @@ import net.i2p.util.SecureFileOutputStream; * Write out keys to disk when we get them and periodically read ones we don't know * about into memory, with newly read routers are also added to the routing table. * + * Public only for access to static methods by startup classes + * */ -class PersistentDataStore extends TransientDataStore { +public class PersistentDataStore extends TransientDataStore { private final File _dbDir; private final KademliaNetworkDatabaseFacade _facade; private final Writer _writer; @@ -162,7 +165,7 @@ class PersistentDataStore extends TransientDataStore { } private class RemoveJob extends JobImpl { - private Hash _key; + private final Hash _key; public RemoveJob(Hash key) { super(PersistentDataStore.this._context); _key = key; @@ -193,7 +196,7 @@ class PersistentDataStore extends TransientDataStore { * we will soon have to implement a scheme for keeping only * a subset of all DatabaseEntrys in memory and keeping the rest on disk. */ - private class Writer implements Runnable { + private class Writer implements Runnable, Flushable { private final Map_keys; private final Object _waitLock; private volatile boolean _quit; @@ -484,7 +487,7 @@ class PersistentDataStore extends TransientDataStore { // don't overwrite recent netdb RIs with reseed data return fileDate > _knownDate + (60*60*1000); } else { - // wtf - prevent injection from reseeding + // safety measure - prevent injection from reseeding _log.error("Prevented LS overwrite by RI " + _key + " from " + _routerFile); return false; } @@ -540,7 +543,7 @@ class PersistentDataStore extends TransientDataStore { if (_log.shouldLog(Log.INFO)) _log.info("Unable to read the router reference in " + _routerFile.getName(), ioe); corrupt = true; - } catch (Exception e) { + } catch (RuntimeException e) { // key certificate problems, etc., don't let one bad RI kill the whole thing if (_log.shouldLog(Log.INFO)) _log.info("Unable to read the router reference in " + _routerFile.getName(), e); @@ -629,7 +632,25 @@ class PersistentDataStore extends TransientDataStore { return ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX; return DIR_PREFIX + b64.charAt(0) + File.separatorChar + ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX; } + + /** + * The persistent RI file for a hash. + * This is available before the netdb subsystem is running, so we can delete our old RI. + * + * @return non-null, should be absolute, does not necessarily exist + * @since 0.9.23 + */ + public static File getRouterInfoFile(RouterContext ctx, Hash hash) { + String b64 = hash.toBase64(); + File dir = new File(ctx.getRouterDir(), ctx.getProperty(KademliaNetworkDatabaseFacade.PROP_DB_DIR, KademliaNetworkDatabaseFacade.DEFAULT_DB_DIR)); + if (ctx.getBooleanProperty(PROP_FLAT)) + return new File(dir, ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX); + return new File(dir, DIR_PREFIX + b64.charAt(0) + File.separatorChar + ROUTERINFO_PREFIX + b64 + ROUTERINFO_SUFFIX); + } + /** + * Package private for installer BundleRouterInfos + */ static Hash getRouterInfoHash(String filename) { return getHash(filename, ROUTERINFO_PREFIX, ROUTERINFO_SUFFIX); } @@ -645,7 +666,7 @@ class PersistentDataStore extends TransientDataStore { return null; Hash h = Hash.create(b); return h; - } catch (Exception e) { + } catch (RuntimeException e) { // static //_log.warn("Unable to fetch the key from [" + filename + "]", e); return null; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java index efe56d772..a95f1bc40 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java @@ -53,7 +53,7 @@ public class RepublishLeaseSetJob extends JobImpl { } else { if (_log.shouldLog(Log.INFO)) _log.info("Publishing " + ls); - getContext().statManager().addRateData("netDb.republishLeaseSetCount", 1, 0); + getContext().statManager().addRateData("netDb.republishLeaseSetCount", 1); _facade.sendStore(_dest, ls, null, new OnRepublishFailure(getContext(), this), REPUBLISH_LEASESET_TIMEOUT, null); _lastPublished = getContext().clock().now(); //getContext().jobQueue().addJob(new StoreJob(getContext(), _facade, _dest, ls, new OnSuccess(getContext()), new OnFailure(getContext()), REPUBLISH_LEASESET_TIMEOUT)); @@ -105,7 +105,7 @@ public class RepublishLeaseSetJob extends JobImpl { /** requeue */ private static class OnRepublishFailure extends JobImpl { - private RepublishLeaseSetJob _job; + private final RepublishLeaseSetJob _job; public OnRepublishFailure(RouterContext ctx, RepublishLeaseSetJob job) { super(ctx); _job = job; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 450aca443..272ed743b 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -94,7 +94,7 @@ class SearchJob extends JobImpl { Job onSuccess, Job onFailure, long timeoutMs, boolean keepStats, boolean isLease) { super(context); if ( (key == null) || (key.getData() == null) ) - throw new IllegalArgumentException("Search for null key? wtf"); + throw new IllegalArgumentException("Search for null key?"); _log = getContext().logManager().getLog(getClass()); _facade = facade; _state = new SearchState(getContext(), key); @@ -425,7 +425,7 @@ class SearchJob extends JobImpl { Hash to = router.getIdentity().getHash(); TunnelInfo inTunnel = getContext().tunnelManager().selectInboundExploratoryTunnel(to); if (inTunnel == null) { - _log.warn("No tunnels to get search replies through! wtf!"); + _log.warn("No tunnels to get search replies through!"); getContext().jobQueue().addJob(new FailedJob(getContext(), router)); return; } @@ -436,7 +436,7 @@ class SearchJob extends JobImpl { //RouterInfo inGateway = getContext().netDb().lookupRouterInfoLocally(inTunnel.getPeer(0)); //if (inGateway == null) { - // _log.error("We can't find the gateway to our inbound tunnel?! wtf"); + // _log.error("We can't find the gateway to our inbound tunnel?!"); // getContext().jobQueue().addJob(new FailedJob(getContext(), router)); // return; //} @@ -445,10 +445,14 @@ class SearchJob extends JobImpl { long expiration = getContext().clock().now() + timeout; I2NPMessage msg = buildMessage(inTunnelId, inTunnel.getPeer(0), expiration, router); - + if (msg == null) { + getContext().jobQueue().addJob(new FailedJob(getContext(), router)); + return; + } + TunnelInfo outTunnel = getContext().tunnelManager().selectOutboundExploratoryTunnel(to); if (outTunnel == null) { - _log.warn("No tunnels to send search out through! wtf!"); + _log.warn("No tunnels to send search out through! Impossible?"); getContext().jobQueue().addJob(new FailedJob(getContext(), router)); return; } @@ -480,6 +484,10 @@ class SearchJob extends JobImpl { // use the 4-arg one so we pick up the override in ExploreJob //I2NPMessage msg = buildMessage(expiration); I2NPMessage msg = buildMessage(null, router.getIdentity().getHash(), expiration, router); + if (msg == null) { + getContext().jobQueue().addJob(new FailedJob(getContext(), router)); + return; + } if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Sending router search directly to " + router.getIdentity().getHash() @@ -773,10 +781,10 @@ class SearchJob extends JobImpl { } private static class Search { - private Job _onFind; - private Job _onFail; - private long _expiration; - private boolean _isLease; + private final Job _onFind; + private final Job _onFail; + private final long _expiration; + private final boolean _isLease; public Search(Job onFind, Job onFail, long expiration, boolean isLease) { _onFind = onFind; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchReplyJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchReplyJob.java index a8354b096..330cdd6ca 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchReplyJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchReplyJob.java @@ -100,7 +100,7 @@ class SearchReplyJob extends JobImpl { } else { if (_log.shouldLog(Log.INFO)) _log.info("Peer " + _peer.toBase64() + " sends us bad replies, so not verifying " + peer.toBase64()); - getContext().statManager().addRateData("netDb.searchReplyValidationSkipped", 1, 0); + getContext().statManager().addRateData("netDb.searchReplyValidationSkipped", 1); } } @@ -125,14 +125,14 @@ class SearchReplyJob extends JobImpl { if (_log.shouldLog(Log.INFO)) _log.info("Peer reply from " + _peer.toBase64()); _repliesPendingVerification--; - getContext().statManager().addRateData("netDb.searchReplyValidated", 1, 0); + getContext().statManager().addRateData("netDb.searchReplyValidated", 1); } void replyNotVerified() { if (_log.shouldLog(Log.INFO)) _log.info("Peer reply from " + _peer.toBase64()); _repliesPendingVerification--; _invalidPeers++; - getContext().statManager().addRateData("netDb.searchReplyNotValidated", 1, 0); + getContext().statManager().addRateData("netDb.searchReplyNotValidated", 1); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java index 63cc1c18f..881410c4a 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchUpdateReplyFoundJob.java @@ -101,7 +101,7 @@ class SearchUpdateReplyFoundJob extends JobImpl implements ReplyJob { _job.replyFound((DatabaseSearchReplyMessage)message, _peer); } else { if (_log.shouldLog(Log.ERROR)) - _log.error(getJobId() + ": WTF, reply job matched a strange message: " + message); + _log.error(getJobId() + ": What?! Reply job matched a strange message: " + message); return; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java index 62a878d6d..b7fd6161e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SingleLookupJob.java @@ -42,7 +42,7 @@ class SingleLookupJob extends JobImpl { Hash peer = _dsrm.getReply(i); if (peer.equals(getContext().routerHash())) // us continue; - if (peer.equals(from)) // wtf + if (peer.equals(from)) // unusual? continue; RouterInfo ri = getContext().netDb().lookupRouterInfoLocally(peer); if (ri == null) diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java index 809b96015..5a76332fa 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java @@ -33,6 +33,8 @@ import net.i2p.util.Log; import net.i2p.util.VersionComparator; /** + * Stores through this always request a reply. + * * Unused directly - see FloodfillStoreJob */ class StoreJob extends JobImpl { @@ -291,7 +293,8 @@ class StoreJob extends JobImpl { throw new IllegalArgumentException("Storing an unknown data type! " + _state.getData()); } msg.setEntry(_state.getData()); - msg.setMessageExpiration(getContext().clock().now() + _timeoutMs); + long now = getContext().clock().now(); + msg.setMessageExpiration(now + _timeoutMs); if (router.getIdentity().equals(getContext().router().getRouterInfo().getIdentity())) { // don't send it to ourselves @@ -303,7 +306,7 @@ class StoreJob extends JobImpl { if (_log.shouldLog(Log.DEBUG)) _log.debug(getJobId() + ": Send store timeout is " + responseTime); - sendStore(msg, router, getContext().clock().now() + responseTime); + sendStore(msg, router, now + responseTime); } /** @@ -313,14 +316,14 @@ class StoreJob extends JobImpl { */ private void sendStore(DatabaseStoreMessage msg, RouterInfo peer, long expiration) { if (msg.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) { - getContext().statManager().addRateData("netDb.storeLeaseSetSent", 1, 0); + getContext().statManager().addRateData("netDb.storeLeaseSetSent", 1); // if it is an encrypted leaseset... if (getContext().keyRing().get(msg.getKey()) != null) sendStoreThroughGarlic(msg, peer, expiration); else sendStoreThroughClient(msg, peer, expiration); } else { - getContext().statManager().addRateData("netDb.storeRouterInfoSent", 1, 0); + getContext().statManager().addRateData("netDb.storeRouterInfoSent", 1); sendDirect(msg, peer, expiration); } } @@ -555,9 +558,9 @@ class StoreJob extends JobImpl { * */ private class SendSuccessJob extends JobImpl implements ReplyJob { - private RouterInfo _peer; - private TunnelInfo _sendThrough; - private int _msgSize; + private final RouterInfo _peer; + private final TunnelInfo _sendThrough; + private final int _msgSize; public SendSuccessJob(RouterContext enclosingContext, RouterInfo peer) { this(enclosingContext, peer, null, 0); @@ -613,8 +616,8 @@ class StoreJob extends JobImpl { * */ private class FailedJob extends JobImpl { - private RouterInfo _peer; - private long _sendOn; + private final RouterInfo _peer; + private final long _sendOn; public FailedJob(RouterContext enclosingContext, RouterInfo peer, long sendOn) { super(enclosingContext); @@ -633,7 +636,7 @@ class StoreJob extends JobImpl { _state.replyTimeout(hash); getContext().profileManager().dbStoreFailed(hash); - getContext().statManager().addRateData("netDb.replyTimeout", getContext().clock().now() - _sendOn, 0); + getContext().statManager().addRateData("netDb.replyTimeout", getContext().clock().now() - _sendOn); sendNext(); } diff --git a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java index 0fb2378a7..25cd334ac 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/ReseedChecker.java @@ -3,7 +3,7 @@ package net.i2p.router.networkdb.reseed; import java.io.File; import java.io.InputStream; import java.io.IOException; -import java.net.URL; +import java.net.URI; import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.data.DataHelper; @@ -31,6 +31,7 @@ public class ReseedChecker { private final AtomicBoolean _inProgress = new AtomicBoolean(); private volatile String _lastStatus = ""; private volatile String _lastError = ""; + private volatile boolean _networkLogged; public static final int MINIMUM = 50; private static final long STATUS_CLEAN_TIME = 20*60*1000; @@ -79,9 +80,13 @@ public class ReseedChecker { File noReseedFileAlt3 = new File(_context.getConfigDir(), "noreseed.i2p"); if (!noReseedFile.exists() && !noReseedFileAlt1.exists() && !noReseedFileAlt2.exists() && !noReseedFileAlt3.exists()) { if (!Addresses.isConnected()) { - _log.logAlways(Log.WARN, "Cannot reseed, no network connection"); + if (!_networkLogged) { + _log.logAlways(Log.WARN, "Cannot reseed, no network connection"); + _networkLogged = true; + } return false; } + _networkLogged = false; if (count <= 1) _log.logAlways(Log.INFO, "Downloading peer router information for a new I2P installation"); else @@ -126,7 +131,7 @@ public class ReseedChecker { * @throws IllegalArgumentException if it doesn't end with zip or su3 * @since 0.9.19 */ - public boolean requestReseed(URL url) throws IllegalArgumentException { + public boolean requestReseed(URI url) throws IllegalArgumentException { if (_inProgress.compareAndSet(false, true)) { Reseeder reseeder = new Reseeder(_context, this); try { diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index fbffa2e8b..e3617c669 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -7,10 +7,8 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; -import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; -import java.net.URL; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; @@ -81,7 +79,6 @@ public class Reseeder { // Disabling everything, use SSL //"http://i2p.mooo.com/netDb/" + "," + - //"http://193.150.121.66/netDb/" + "," + //"http://uk.reseed.i2p2.no/" + "," + //"http://netdb.i2p2.no/"; // Only SU3 (v3) support ""; @@ -89,14 +86,14 @@ public class Reseeder { /** @since 0.8.2 */ public static final String DEFAULT_SSL_SEED_URL = "https://reseed.i2p-projekt.de/" + "," + // Only HTTPS - "https://netdb.rows.io:444/" + "," + // Only HTTPS and SU3 (v3) support - "https://i2pseed.zarrenspry.info/" + "," + // Only HTTPS and SU3 (v3) support + //"https://i2pseed.zarrenspry.info/" + "," + // Only HTTPS and SU3 (v3) support "https://i2p.mooo.com/netDb/" + "," + - "https://193.150.121.66/netDb/" + "," + "https://netdb.i2p2.no/" + "," + // Only SU3 (v3) support, SNI required "https://us.reseed.i2p2.no:444/" + "," + "https://uk.reseed.i2p2.no:444/" + "," + - "https://link.mx24.eu/" + "," + // Only HTTPS and SU3 (v3) support + "https://www.torontocrypto.org:8443/" + "," + + "https://reseed.i2p.vzaws.com:8443/" + ", " + // Only SU3 (v3) support + "https://user.mx24.eu/" + "," + // Only HTTPS and SU3 (v3) support "https://ieb9oopo.mooo.com/"; // Only HTTPS and SU3 (v3) support private static final String SU3_FILENAME = "i2pseeds.su3"; @@ -153,7 +150,7 @@ public class Reseeder { * @throws IllegalArgumentException if it doesn't end with zip or su3 * @since 0.9.19 */ - void requestReseed(URL url) throws IllegalArgumentException { + void requestReseed(URI url) throws IllegalArgumentException { ReseedRunner reseedRunner = new ReseedRunner(url); // set to daemon so it doesn't hang a shutdown Thread reseed = new I2PAppThread(reseedRunner, "Reseed", true); @@ -207,7 +204,7 @@ public class Reseeder { if (fetched <= 0) throw new IOException("No seeds extracted"); _checker.setStatus( - _("Reseeding: got router info from file ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: got router info from file ({0} successful, {1} errors).", fetched, errors)); System.err.println("Reseed got " + fetched + " router infos from file with " + errors + " errors"); _context.router().eventLog().addEvent(EventLog.RESEED, fetched + " from file"); return fetched; @@ -239,7 +236,7 @@ public class Reseeder { /** bytes per sec for each su3 downloaded */ private final List _bandwidths; private static final int MAX_DATE_SETS = 2; - private final URL _url; + private final URI _url; /** * Start a reseed from the default URL list @@ -256,7 +253,7 @@ public class Reseeder { * @throws IllegalArgumentException if it doesn't end with zip or su3 * @since 0.9.19 */ - public ReseedRunner(URL url) throws IllegalArgumentException { + public ReseedRunner(URI url) throws IllegalArgumentException { String lc = url.getPath().toLowerCase(Locale.US); if (!(lc.endsWith(".zip") || lc.endsWith(".su3"))) throw new IllegalArgumentException("Reseed URL must end with .zip or .su3"); @@ -279,7 +276,7 @@ public class Reseeder { private void run2() { _isRunning = true; _checker.setError(""); - _checker.setStatus(_("Reseeding")); + _checker.setStatus(_t("Reseeding")); if (_context.getBooleanProperty(PROP_PROXY_ENABLE)) { _proxyHost = _context.getProperty(PROP_PROXY_HOST); _proxyPort = _context.getProperty(PROP_PROXY_PORT, -1); @@ -311,9 +308,9 @@ public class Reseeder { "and if nothing helps, read the FAQ about reseeding manually."); } // else < 0, no valid URLs String old = _checker.getError(); - _checker.setError(_("Reseed failed.") + ' ' + - _("See {0} for help.", - "" + _("reseed configuration page") + "") + + _checker.setError(_t("Reseed failed.") + ' ' + + _t("See {0} for help.", + "" + _t("reseed configuration page") + "") + "
              " + old); } _isRunning = false; @@ -412,7 +409,7 @@ public class Reseeder { * @return count of routerinfos successfully fetched, or -1 if no valid URLs */ private int reseed(boolean echoStatus) { - List URLList = new ArrayList(); + List URLList = new ArrayList(); String URLs = _context.getProperty(PROP_RESEED_URL); boolean defaulted = URLs == null; boolean SSLDisable = _context.getBooleanProperty(PROP_SSL_DISABLE); @@ -429,29 +426,29 @@ public class Reseeder { if (!u.endsWith("/")) u = u + '/'; try { - URLList.add(new URL(u)); - } catch (MalformedURLException mue) {} + URLList.add(new URI(u)); + } catch (URISyntaxException mue) {} } Collections.shuffle(URLList, _context.random()); if (!SSLDisable && !SSLRequired) { // put the non-SSL at the end of the SSL - List URLList2 = new ArrayList(); + List URLList2 = new ArrayList(); tok = new StringTokenizer(DEFAULT_SEED_URL, " ,"); while (tok.hasMoreTokens()) { String u = tok.nextToken().trim(); if (!u.endsWith("/")) u = u + '/'; try { - URLList2.add(new URL(u)); - } catch (MalformedURLException mue) {} + URLList2.add(new URI(u)); + } catch (URISyntaxException mue) {} } Collections.shuffle(URLList2, _context.random()); URLList.addAll(URLList2); } } else { // custom list given - List SSLList = new ArrayList(); - List nonSSLList = new ArrayList(); + List SSLList = new ArrayList(); + List nonSSLList = new ArrayList(); StringTokenizer tok = new StringTokenizer(URLs, " ,"); while (tok.hasMoreTokens()) { // format tokens @@ -461,12 +458,12 @@ public class Reseeder { // check if ssl or not then add to respective list if (u.startsWith("https")) { try { - SSLList.add(new URL(u)); - } catch (MalformedURLException mue) {} + SSLList.add(new URI(u)); + } catch (URISyntaxException mue) {} } else { try { - nonSSLList.add(new URL(u)); - } catch (MalformedURLException mue) {} + nonSSLList.add(new URI(u)); + } catch (URISyntaxException mue) {} } } // shuffle lists @@ -482,8 +479,8 @@ public class Reseeder { } if (!isSNISupported()) { try { - URLList.remove(new URL("https://netdb.i2p2.no/")); - } catch (MalformedURLException mue) {} + URLList.remove(new URI("https://netdb.i2p2.no/")); + } catch (URISyntaxException mue) {} } if (URLList.isEmpty()) { System.out.println("No valid reseed URLs"); @@ -501,19 +498,19 @@ public class Reseeder { * @param echoStatus apparently always false * @return count of routerinfos successfully fetched */ - private int reseed(List URLList, boolean echoStatus) { + private int reseed(List URLList, boolean echoStatus) { int total = 0; for (int i = 0; i < URLList.size() && _isRunning; i++) { if (_context.router().gracefulShutdownInProgress()) { System.out.println("Reseed aborted, shutdown in progress"); return total; } - URL url = URLList.get(i); + URI url = URLList.get(i); int dl = 0; if (ENABLE_SU3) { try { - dl = reseedSU3(new URL(url.toString() + SU3_FILENAME), echoStatus); - } catch (MalformedURLException mue) {} + dl = reseedSU3(new URI(url.toString() + SU3_FILENAME), echoStatus); + } catch (URISyntaxException mue) {} } if (ENABLE_NON_SU3) { if (dl <= 0) @@ -557,11 +554,11 @@ public class Reseeder { * @param echoStatus apparently always false * @return count of routerinfos successfully fetched **/ - private int reseedOne(URL seedURL, boolean echoStatus) { + private int reseedOne(URI seedURL, boolean echoStatus) { try { // Don't use context clock as we may be adjusting the time final long timeLimit = System.currentTimeMillis() + MAX_TIME_PER_HOST; - _checker.setStatus(_("Reseeding: fetching seed URL.")); + _checker.setStatus(_t("Reseeding: fetching seed URL.")); System.err.println("Reseeding from " + seedURL); byte contentRaw[] = readURL(seedURL); if (contentRaw == null) { @@ -570,7 +567,7 @@ public class Reseeder { System.err.println("Reseed got no router infos from " + seedURL); return 0; } - String content = new String(contentRaw); + String content = DataHelper.getUTF8(contentRaw); // This isn't really URLs, but Base64 hashes // but they may include % encoding Set urls = new HashSet(1024); @@ -618,7 +615,7 @@ public class Reseeder { iter.hasNext() && fetched < 200 && System.currentTimeMillis() < timeLimit; ) { try { _checker.setStatus( - _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); if (!fetchSeed(seedURL.toString(), iter.next())) continue; @@ -628,7 +625,7 @@ public class Reseeder { if (fetched % 60 == 0) System.out.println(); } - } catch (Exception e) { + } catch (RuntimeException e) { if (_log.shouldLog(Log.INFO)) _log.info("Failed fetch", e); errors++; @@ -659,7 +656,7 @@ public class Reseeder { * @return count of routerinfos successfully fetched * @since 0.9.14 **/ - public int reseedSU3(URL seedURL, boolean echoStatus) { + public int reseedSU3(URI seedURL, boolean echoStatus) { return reseedSU3OrZip(seedURL, true, echoStatus); } @@ -673,7 +670,7 @@ public class Reseeder { * @return count of routerinfos successfully fetched * @since 0.9.19 **/ - public int reseedZip(URL seedURL, boolean echoStatus) { + public int reseedZip(URI seedURL, boolean echoStatus) { return reseedSU3OrZip(seedURL, false, echoStatus); } @@ -687,12 +684,12 @@ public class Reseeder { * @return count of routerinfos successfully fetched * @since 0.9.19 **/ - private int reseedSU3OrZip(URL seedURL, boolean isSU3, boolean echoStatus) { + private int reseedSU3OrZip(URI seedURL, boolean isSU3, boolean echoStatus) { int fetched = 0; int errors = 0; File contentRaw = null; try { - _checker.setStatus(_("Reseeding: fetching seed URL.")); + _checker.setStatus(_t("Reseeding: fetching seed URL.")); System.err.println("Reseeding from " + seedURL); // don't use context time, as we may be step-changing it // from the server header @@ -728,7 +725,7 @@ public class Reseeder { contentRaw.delete(); } _checker.setStatus( - _("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); + _t("Reseeding: fetching router info from seed URL ({0} successful, {1} errors).", fetched, errors)); System.err.println("Reseed got " + fetched + " router infos from " + seedURL + " with " + errors + " errors"); return fetched; } @@ -869,7 +866,7 @@ public class Reseeder { if (ourHash != null && DataHelper.eq(hash, ourHash.getData())) return false; - URL url = new URL(seedURL + (seedURL.endsWith("/") ? "" : "/") + ROUTERINFO_PREFIX + peer + ROUTERINFO_SUFFIX); + URI url = new URI(seedURL + (seedURL.endsWith("/") ? "" : "/") + ROUTERINFO_PREFIX + peer + ROUTERINFO_SUFFIX); byte data[] = readURL(url); if (data == null || data.length <= 0) @@ -878,7 +875,7 @@ public class Reseeder { } /** @return null on error */ - private byte[] readURL(URL url) throws IOException { + private byte[] readURL(URI url) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); EepGet get; boolean ssl = url.toString().startsWith("https"); @@ -923,7 +920,7 @@ public class Reseeder { * @return null on error * @since 0.9.14 */ - private File fetchURL(URL url) throws IOException { + private File fetchURL(URI url) throws IOException { File out = new File(_context.getTempDir(), "reseed-" + _context.random().nextInt() + ".tmp"); EepGet get; boolean ssl = url.toString().startsWith("https"); @@ -1000,17 +997,17 @@ public class Reseeder { private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate */ - private String _(String key) { + private String _t(String key) { return Translate.getString(key, _context, BUNDLE_NAME); } /** translate */ - private String _(String s, Object o) { + private String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } /** translate */ - private String _(String s, Object o, Object o2) { + private String _t(String s, Object o, Object o2) { return Translate.getString(s, o, o2, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java index d433e889e..493e54a8a 100644 --- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java +++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java @@ -1,6 +1,8 @@ package net.i2p.router.peermanager; -import net.i2p.I2PAppContext; +import net.i2p.data.router.RouterInfo; +import net.i2p.router.RouterContext; +import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.stat.Rate; import net.i2p.stat.RateAverages; import net.i2p.stat.RateStat; @@ -25,6 +27,9 @@ class CapacityCalculator { private static final double BONUS_SAME_COUNTRY = 0; private static final double BONUS_XOR = .25; private static final double PENALTY_UNREACHABLE = 2; + // we make this a bonus for non-ff, not a penalty for ff, so we + // don't drive the ffs below the default + private static final double BONUS_NON_FLOODFILL = 1.0; public static double calc(PeerProfile profile) { double capacity; @@ -54,7 +59,7 @@ class CapacityCalculator { // now take into account non-rejection tunnel rejections (which haven't // incremented the rejection counter, since they were only temporary) - I2PAppContext context = profile.getContext(); + RouterContext context = profile.getContext(); long now = context.clock().now(); if (profile.getTunnelHistory().getLastRejectedTransient() > now - 5*60*1000) capacity = 1; @@ -83,8 +88,15 @@ class CapacityCalculator { // penalize unreachable peers if (profile.wasUnreachable()) capacity -= PENALTY_UNREACHABLE; + + // credit non-floodfill to reduce conn limit issues at floodfills + // TODO only if we aren't floodfill ourselves? + RouterInfo ri = context.netDb().lookupRouterInfoLocally(profile.getPeer()); + if (!FloodfillNetworkDatabaseFacade.isFloodfill(ri)) + capacity += BONUS_NON_FLOODFILL; + // a tiny tweak to break ties and encourage closeness, -.25 to +.25 - capacity -= profile.getXORDistance() * (BONUS_XOR / 128); + capacity -= profile.getXORDistance() * (BONUS_XOR / 128); capacity += profile.getCapacityBonus(); if (capacity < 0) @@ -173,7 +185,7 @@ class CapacityCalculator { case 30*60*1000: return .3; case 60*60*1000: return .2; case 24*60*60*1000: return .1; - default: throw new IllegalArgumentException("wtf, period [" + period + "]???"); + default: throw new IllegalArgumentException("undefined period passed, period [" + period + "]???"); } } } diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java index c5c94c2ca..7106b10e0 100644 --- a/router/java/src/net/i2p/router/peermanager/DBHistory.java +++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java @@ -16,17 +16,17 @@ import net.i2p.util.Log; public class DBHistory { private final Log _log; private final RouterContext _context; - private long _successfulLookups; - private long _failedLookups; + //private long _successfulLookups; + //private long _failedLookups; private RateStat _failedLookupRate; private RateStat _invalidReplyRate; - private long _lookupReplyNew; - private long _lookupReplyOld; - private long _lookupReplyDuplicate; - private long _lookupReplyInvalid; - private long _lookupsReceived; - private long _avgDelayBetweenLookupsReceived; - private long _lastLookupReceived; + //private long _lookupReplyNew; + //private long _lookupReplyOld; + //private long _lookupReplyDuplicate; + //private long _lookupReplyInvalid; + //private long _lookupsReceived; + //private long _avgDelayBetweenLookupsReceived; + //private long _lastLookupReceived; private long _lastLookupSuccessful; private long _lastLookupFailed; private long _lastStoreSuccessful; @@ -39,49 +39,68 @@ public class DBHistory { _context = context; _log = context.logManager().getLog(DBHistory.class); _statGroup = statGroup; - _lastLookupReceived = -1; + //_lastLookupReceived = -1; createRates(statGroup); } /** how many times we have sent them a db lookup and received the value back from them - * @deprecated unused */ - public long getSuccessfulLookups() { return _successfulLookups; } + //public long getSuccessfulLookups() { return _successfulLookups; } + /** how many times we have sent them a db lookup and not received the value or a lookup reply - * @deprecated unused */ - public long getFailedLookups() { return _failedLookups; } + //public long getFailedLookups() { return _failedLookups; } + /** how many peers that we have never seen before did lookups provide us with? - * @deprecated unused */ - public long getLookupReplyNew() { return _lookupReplyNew; } + //public long getLookupReplyNew() { return _lookupReplyNew; } + /** how many peers that we have already seen did lookups provide us with? - * @deprecated unused */ - public long getLookupReplyOld() { return _lookupReplyOld; } + //public long getLookupReplyOld() { return _lookupReplyOld; } + /** how many peers that we explicitly asked the peer not to send us did they reply with? - * @deprecated unused */ - public long getLookupReplyDuplicate() { return _lookupReplyDuplicate; } + //public long getLookupReplyDuplicate() { return _lookupReplyDuplicate; } + /** how many peers that were incorrectly formatted / expired / otherwise illegal did lookups provide us with? - * @deprecated unused */ - public long getLookupReplyInvalid() { return _lookupReplyInvalid; } + //public long getLookupReplyInvalid() { return _lookupReplyInvalid; } + /** how many lookups this peer has sent us? - * @deprecated unused */ - public long getLookupsReceived() { return _lookupsReceived; } + //public long getLookupsReceived() { return _lookupsReceived; } + /** how frequently do they send us lookup requests? - * @deprecated unused */ - public long getAvgDelayBetweenLookupsReceived() { return _avgDelayBetweenLookupsReceived; } + //public long getAvgDelayBetweenLookupsReceived() { return _avgDelayBetweenLookupsReceived; } + /** when did they last send us a request? - * @deprecated unused */ - public long getLastLookupReceived() { return _lastLookupReceived; } + // public long getLastLookupReceived() { return _lastLookupReceived; } + + /** + * Not persisted until 0.9.24 + * @since 0.7.8 + */ public long getLastLookupSuccessful() { return _lastLookupSuccessful; } + + /** + * Not persisted until 0.9.24 + * @since 0.7.8 + */ public long getLastLookupFailed() { return _lastLookupFailed; } + + /** + * Not persisted until 0.9.24 + * @since 0.7.8 + */ public long getLastStoreSuccessful() { return _lastStoreSuccessful; } + + /** + * Not persisted until 0.9.24 + * @since 0.7.8 + */ public long getLastStoreFailed() { return _lastStoreFailed; } /** how many times have they sent us data we didn't ask for and that we've never seen? */ @@ -103,8 +122,8 @@ public class DBHistory { * */ public void lookupSuccessful() { - _successfulLookups++; - _failedLookupRate.addData(0, 0); + //_successfulLookups++; + _failedLookupRate.addData(0); _context.statManager().addRateData("peer.failedLookupRate", 0); _lastLookupSuccessful = _context.clock().now(); } @@ -113,8 +132,8 @@ public class DBHistory { * Note that the peer failed to respond to the db lookup in any way */ public void lookupFailed() { - _failedLookups++; - _failedLookupRate.addData(1, 0); + //_failedLookups++; + _failedLookupRate.addData(1); _context.statManager().addRateData("peer.failedLookupRate", 1); _lastLookupFailed = _context.clock().now(); } @@ -123,22 +142,25 @@ public class DBHistory { * Note that we successfully stored to a floodfill peer and verified the result * by asking another floodfill peer * + * @since 0.7.8 */ public void storeSuccessful() { // Fixme, redefined this to include both lookup and store fails, // need to fix the javadocs - _failedLookupRate.addData(0, 0); + _failedLookupRate.addData(0); _context.statManager().addRateData("peer.failedLookupRate", 0); _lastStoreSuccessful = _context.clock().now(); } /** * Note that floodfill verify failed + * + * @since 0.7.8 */ public void storeFailed() { // Fixme, redefined this to include both lookup and store fails, // need to fix the javadocs - _failedLookupRate.addData(1, 0); + _failedLookupRate.addData(1); _lastStoreFailed = _context.clock().now(); } @@ -152,19 +174,21 @@ public class DBHistory { * themselves if they don't know anyone else) */ public void lookupReply(int newPeers, int oldPeers, int invalid, int duplicate) { - _lookupReplyNew += newPeers; - _lookupReplyOld += oldPeers; - _lookupReplyInvalid += invalid; - _lookupReplyDuplicate += duplicate; + //_lookupReplyNew += newPeers; + //_lookupReplyOld += oldPeers; + //_lookupReplyInvalid += invalid; + //_lookupReplyDuplicate += duplicate; if (invalid > 0) { - _invalidReplyRate.addData(invalid, 0); + _invalidReplyRate.addData(invalid); } } + /** * Note that the peer sent us a lookup * */ +/**** public void lookupReceived() { long now = _context.clock().now(); long delay = now - _lastLookupReceived; @@ -179,6 +203,8 @@ public class DBHistory { _avgDelayBetweenLookupsReceived = _avgDelayBetweenLookupsReceived - (delay / _lookupsReceived); } } +****/ + /** * Note that the peer sent us a data point without us asking for it * @param wasNew whether we already knew about this data point or not @@ -190,15 +216,15 @@ public class DBHistory { _unpromptedDbStoreOld++; } - public void setSuccessfulLookups(long num) { _successfulLookups = num; } - public void setFailedLookups(long num) { _failedLookups = num; } - public void setLookupReplyNew(long num) { _lookupReplyNew = num; } - public void setLookupReplyOld(long num) { _lookupReplyOld = num; } - public void setLookupReplyInvalid(long num) { _lookupReplyInvalid = num; } - public void setLookupReplyDuplicate(long num) { _lookupReplyDuplicate = num; } - public void setLookupsReceived(long num) { _lookupsReceived = num; } - public void setAvgDelayBetweenLookupsReceived(long ms) { _avgDelayBetweenLookupsReceived = ms; } - public void setLastLookupReceived(long when) { _lastLookupReceived = when; } + //public void setSuccessfulLookups(long num) { _successfulLookups = num; } + //public void setFailedLookups(long num) { _failedLookups = num; } + //public void setLookupReplyNew(long num) { _lookupReplyNew = num; } + //public void setLookupReplyOld(long num) { _lookupReplyOld = num; } + //public void setLookupReplyInvalid(long num) { _lookupReplyInvalid = num; } + //public void setLookupReplyDuplicate(long num) { _lookupReplyDuplicate = num; } + //public void setLookupsReceived(long num) { _lookupsReceived = num; } + //public void setAvgDelayBetweenLookupsReceived(long ms) { _avgDelayBetweenLookupsReceived = ms; } + //public void setLastLookupReceived(long when) { _lastLookupReceived = when; } public void setUnpromptedDbStoreNew(long num) { _unpromptedDbStoreNew = num; } public void setUnpromptedDbStoreOld(long num) { _unpromptedDbStoreOld = num; } @@ -217,18 +243,23 @@ public class DBHistory { buf.append("#################").append(NL); buf.append("# DB history").append(NL); buf.append("###").append(NL); - add(buf, "successfulLookups", _successfulLookups, "How many times have they successfully given us what we wanted when looking for it?"); - add(buf, "failedLookups", _failedLookups, "How many times have we sent them a db lookup and they didn't reply?"); - add(buf, "lookupsReceived", _lookupsReceived, "How many lookups have they sent us?"); - add(buf, "lookupReplyDuplicate", _lookupReplyDuplicate, "How many of their reply values to our lookups were something we asked them not to send us?"); - add(buf, "lookupReplyInvalid", _lookupReplyInvalid, "How many of their reply values to our lookups were invalid (expired, forged, corrupted)?"); - add(buf, "lookupReplyNew", _lookupReplyNew, "How many of their reply values to our lookups were brand new to us?"); - add(buf, "lookupReplyOld", _lookupReplyOld, "How many of their reply values to our lookups were something we had seen before?"); + //add(buf, "successfulLookups", _successfulLookups, "How many times have they successfully given us what we wanted when looking for it?"); + //add(buf, "failedLookups", _failedLookups, "How many times have we sent them a db lookup and they didn't reply?"); + //add(buf, "lookupsReceived", _lookupsReceived, "How many lookups have they sent us?"); + //add(buf, "lookupReplyDuplicate", _lookupReplyDuplicate, "How many of their reply values to our lookups were something we asked them not to send us?"); + //add(buf, "lookupReplyInvalid", _lookupReplyInvalid, "How many of their reply values to our lookups were invalid (expired, forged, corrupted)?"); + //add(buf, "lookupReplyNew", _lookupReplyNew, "How many of their reply values to our lookups were brand new to us?"); + //add(buf, "lookupReplyOld", _lookupReplyOld, "How many of their reply values to our lookups were something we had seen before?"); add(buf, "unpromptedDbStoreNew", _unpromptedDbStoreNew, "How times have they sent us something we didn't ask for and hadn't seen before?"); add(buf, "unpromptedDbStoreOld", _unpromptedDbStoreOld, "How times have they sent us something we didn't ask for but have seen before?"); - add(buf, "lastLookupReceived", _lastLookupReceived, "When was the last time they send us a lookup? (milliseconds since the epoch)"); - add(buf, "avgDelayBetweenLookupsReceived", _avgDelayBetweenLookupsReceived, "How long is it typically between each db lookup they send us? (in milliseconds)"); - out.write(buf.toString().getBytes()); + //add(buf, "lastLookupReceived", _lastLookupReceived, "When was the last time they send us a lookup? (milliseconds since the epoch)"); + //add(buf, "avgDelayBetweenLookupsReceived", _avgDelayBetweenLookupsReceived, "How long is it typically between each db lookup they send us? (in milliseconds)"); + // following 4 weren't persisted until 0.9.24 + add(buf, "lastLookupSuccessful", _lastLookupSuccessful, "When was the last time a lookup from them succeeded? (milliseconds since the epoch)"); + add(buf, "lastLookupFailed", _lastLookupFailed, "When was the last time a lookup from them failed? (milliseconds since the epoch)"); + add(buf, "lastStoreSuccessful", _lastStoreSuccessful, "When was the last time a store to them succeeded? (milliseconds since the epoch)"); + add(buf, "lastStoreFailed", _lastStoreFailed, "When was the last time a store to them failed? (milliseconds since the epoch)"); + out.write(buf.toString().getBytes("UTF-8")); _failedLookupRate.store(out, "dbHistory.failedLookupRate"); _invalidReplyRate.store(out, "dbHistory.invalidReplyRate"); } @@ -240,17 +271,22 @@ public class DBHistory { public void load(Properties props) { - _successfulLookups = getLong(props, "dbHistory.successfulLookups"); - _failedLookups = getLong(props, "dbHistory.failedLookups"); - _lookupsReceived = getLong(props, "dbHistory.lookupsReceived"); - _lookupReplyDuplicate = getLong(props, "dbHistory.lookupReplyDuplicate"); - _lookupReplyInvalid = getLong(props, "dbHistory.lookupReplyInvalid"); - _lookupReplyNew = getLong(props, "dbHistory.lookupReplyNew"); - _lookupReplyOld = getLong(props, "dbHistory.lookupReplyOld"); + //_successfulLookups = getLong(props, "dbHistory.successfulLookups"); + //_failedLookups = getLong(props, "dbHistory.failedLookups"); + //_lookupsReceived = getLong(props, "dbHistory.lookupsReceived"); + //_lookupReplyDuplicate = getLong(props, "dbHistory.lookupReplyDuplicate"); + //_lookupReplyInvalid = getLong(props, "dbHistory.lookupReplyInvalid"); + //_lookupReplyNew = getLong(props, "dbHistory.lookupReplyNew"); + //_lookupReplyOld = getLong(props, "dbHistory.lookupReplyOld"); _unpromptedDbStoreNew = getLong(props, "dbHistory.unpromptedDbStoreNew"); _unpromptedDbStoreOld = getLong(props, "dbHistory.unpromptedDbStoreOld"); - _lastLookupReceived = getLong(props, "dbHistory.lastLookupReceived"); - _avgDelayBetweenLookupsReceived = getLong(props, "dbHistory.avgDelayBetweenLookupsReceived"); + //_lastLookupReceived = getLong(props, "dbHistory.lastLookupReceived"); + //_avgDelayBetweenLookupsReceived = getLong(props, "dbHistory.avgDelayBetweenLookupsReceived"); + // following 4 weren't persisted until 0.9.24 + _lastLookupSuccessful = getLong(props, "dbHistory.lastLookupSuccessful"); + _lastLookupFailed = getLong(props, "dbHistory.lastLookupFailed"); + _lastStoreSuccessful = getLong(props, "dbHistory.lastStoreSuccessful"); + _lastStoreFailed = getLong(props, "dbHistory.lastStoreFailed"); try { _failedLookupRate.load(props, "dbHistory.failedLookupRate", true); _log.debug("Loading dbHistory.failedLookupRate"); @@ -266,7 +302,7 @@ public class DBHistory { } } - private void createRates(String statGroup) { + private synchronized void createRates(String statGroup) { if (_failedLookupRate == null) _failedLookupRate = new RateStat("dbHistory.failedLookupRate", "How often does this peer to respond to a lookup?", statGroup, new long[] { 10*60*1000l, 60*60*1000l, 24*60*60*1000l }); if (_invalidReplyRate == null) @@ -276,14 +312,6 @@ public class DBHistory { } private final static long getLong(Properties props, String key) { - String val = props.getProperty(key); - if (val != null) { - try { - return Long.parseLong(val); - } catch (NumberFormatException nfe) { - return 0; - } - } - return 0; + return ProfilePersistenceHelper.getLong(props, key); } } diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java index bb88fed79..b3cc3643b 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerManager.java +++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java @@ -165,7 +165,7 @@ class PeerManager { * @since 0.8.8 */ private void loadProfilesInBackground() { - (new Thread(new ProfileLoader())).start(); + (new I2PThread(new ProfileLoader())).start(); } /** @@ -193,7 +193,8 @@ class PeerManager { } /** - * Find some peers that meet the criteria and we have the netDb info for locally + * Find some peers that meet the criteria and we have the netDb info for locally. + * Returned list will not include ourselves. * * Only used by PeerTestJob (PURPOSE_TEST) */ diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java index 059ac96cb..3a6c02fa7 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java +++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java @@ -24,6 +24,9 @@ import net.i2p.util.Log; * Once it becomes necessary, we can simply compact the poorly performing profiles * (keeping only the most basic data) and maintain hundreds of thousands of profiles * in memory. Beyond that size, we can simply eject the peers (e.g. keeping the best 100,000). + * + * TODO most of the methods should be synchronized. + * */ public class PeerProfile { @@ -37,7 +40,7 @@ public class PeerProfile { private long _lastSentToSuccessfully; private long _lastFailedSend; private long _lastHeardFrom; - private double _tunnelTestResponseTimeAvg; + private float _tunnelTestResponseTimeAvg; // periodic rates //private RateStat _sendSuccessSize = null; //private RateStat _receiveSize = null; @@ -46,17 +49,20 @@ public class PeerProfile { private RateStat _tunnelTestResponseTime; private RateStat _dbIntroduction; // calculation bonuses - private long _speedBonus; - private long _capacityBonus; - private long _integrationBonus; + // ints to save some space + private int _speedBonus; + private int _capacityBonus; + private int _integrationBonus; // calculation values - private double _speedValue; - private double _capacityValue; - private double _integrationValue; + // floats to save some space + private float _speedValue; + private float _capacityValue; + private float _integrationValue; private boolean _isFailing; // new calculation values, to be updated - private double _speedValueNew; - private double _capacityValueNew; + // floats to save some space + private float _speedValueNew; + private float _capacityValueNew; // are we in coalescing state? private boolean _coalescing; // good vs bad behavior @@ -67,6 +73,24 @@ public class PeerProfile { private boolean _expandedDB; //private int _consecutiveBanlists; private final int _distance; + + /** keep track of the fastest 3 throughputs */ + private static final int THROUGHPUT_COUNT = 3; + /** + * fastest 1 minute throughput, in bytes per minute, ordered with fastest + * first. this is not synchronized, as we don't *need* perfection, and we only + * reorder/insert values on coallesce + */ + private final float _peakThroughput[] = new float[THROUGHPUT_COUNT]; + private volatile long _peakThroughputCurrentTotal; + private final float _peakTunnelThroughput[] = new float[THROUGHPUT_COUNT]; + /** total number of bytes pushed through a single tunnel in a 1 minute period */ + private final float _peakTunnel1mThroughput[] = new float[THROUGHPUT_COUNT]; + /** once a day, on average, cut the measured throughtput values in half */ + /** let's try once an hour times 3/4 */ + private static final int DROP_PERIOD_MINUTES = 60; + private static final float DEGRADE_FACTOR = 0.75f; + private long _lastCoalesceDate = System.currentTimeMillis(); /** * Countries with more than about a 2% share of the netdb. @@ -81,6 +105,8 @@ public class PeerProfile { } /** + * Caller should call setLastHeardAbout() and setFirstHeardAbout() + * * @param peer non-null */ public PeerProfile(RouterContext context, Hash peer) { @@ -88,15 +114,18 @@ public class PeerProfile { } /** + * Caller should call setLastHeardAbout() and setFirstHeardAbout() + * * @param peer non-null * @param expand must be true (see below) */ private PeerProfile(RouterContext context, Hash peer, boolean expand) { - _context = context; - _log = context.logManager().getLog(PeerProfile.class); if (peer == null) throw new NullPointerException(); + _context = context; + _log = context.logManager().getLog(PeerProfile.class); _peer = peer; + _firstHeardAbout = _context.clock().now(); // this is always true, and there are several places in the router that will NPE // if it is false, so all need to be fixed before we can have non-expanded profiles if (expand) @@ -191,14 +220,36 @@ public class PeerProfile { /** * When did we first hear about this peer? - * Currently unused, candidate for removal. + * @return greater than zero, set to now in consturctor */ - public long getFirstHeardAbout() { return _firstHeardAbout; } - public void setFirstHeardAbout(long when) { _firstHeardAbout = when; } + public synchronized long getFirstHeardAbout() { return _firstHeardAbout; } + + /** + * Set when did we first heard about this peer, only if older. + * Package private, only set by profile management subsystem. + */ + synchronized void setFirstHeardAbout(long when) { + if (when < _firstHeardAbout) + _firstHeardAbout = when; + } - /** when did we last hear about this peer? */ - public long getLastHeardAbout() { return _lastHeardAbout; } - public void setLastHeardAbout(long when) { _lastHeardAbout = when; } + /** + * when did we last hear about this peer? + * @return 0 if unset + */ + public synchronized long getLastHeardAbout() { return _lastHeardAbout; } + + /** + * Set when did we last hear about this peer, only if unset or newer + * Also sets FirstHeardAbout if earlier + */ + public synchronized void setLastHeardAbout(long when) { + if (_lastHeardAbout <= 0 || when > _lastHeardAbout) + _lastHeardAbout = when; + // this is called by netdb PersistentDataStore, so fixup first heard + if (when < _firstHeardAbout) + _firstHeardAbout = when; + } /** when did we last send to this peer successfully? */ public long getLastSendSuccessful() { return _lastSentToSuccessfully; } @@ -244,24 +295,24 @@ public class PeerProfile { * written to disk to affect how the algorithm ranks speed. Negative values are * penalties */ - public long getSpeedBonus() { return _speedBonus; } - public void setSpeedBonus(long bonus) { _speedBonus = bonus; } + public int getSpeedBonus() { return _speedBonus; } + public void setSpeedBonus(int bonus) { _speedBonus = bonus; } /** * extra factor added to the capacity ranking - this can be updated in the profile * written to disk to affect how the algorithm ranks capacity. Negative values are * penalties */ - public long getCapacityBonus() { return _capacityBonus; } - public void setCapacityBonus(long bonus) { _capacityBonus = bonus; } + public int getCapacityBonus() { return _capacityBonus; } + public void setCapacityBonus(int bonus) { _capacityBonus = bonus; } /** * extra factor added to the integration ranking - this can be updated in the profile * written to disk to affect how the algorithm ranks integration. Negative values are * penalties */ - public long getIntegrationBonus() { return _integrationBonus; } - public void setIntegrationBonus(long bonus) { _integrationBonus = bonus; } + public int getIntegrationBonus() { return _integrationBonus; } + public void setIntegrationBonus(int bonus) { _integrationBonus = bonus; } /** * How fast is the peer, taking into consideration both throughput and latency. @@ -269,26 +320,26 @@ public class PeerProfile { * (or measured) max rates, allowing this speed to reflect the speed /available/. * */ - public double getSpeedValue() { return _speedValue; } + public float getSpeedValue() { return _speedValue; } /** * How many tunnels do we think this peer can handle over the next hour? * */ - public double getCapacityValue() { return _capacityValue; } + public float getCapacityValue() { return _capacityValue; } /** * How well integrated into the network is this peer (as measured by how much they've * told us that we didn't already know). Higher numbers means better integrated * */ - public double getIntegrationValue() { return _integrationValue; } + public float getIntegrationValue() { return _integrationValue; } /** * is this peer actively failing (aka not worth touching)? * deprecated - unused - always false */ public boolean getIsFailing() { return _isFailing; } - public double getTunnelTestTimeAverage() { return _tunnelTestResponseTimeAvg; } - void setTunnelTestTimeAverage(double avg) { _tunnelTestResponseTimeAvg = avg; } + public float getTunnelTestTimeAverage() { return _tunnelTestResponseTimeAvg; } + void setTunnelTestTimeAverage(float avg) { _tunnelTestResponseTimeAvg = avg; } void updateTunnelTestTimeAverage(long ms) { if (_tunnelTestResponseTimeAvg <= 0) @@ -296,42 +347,32 @@ public class PeerProfile { // weighted since we want to let the average grow quickly and shrink slowly if (ms < _tunnelTestResponseTimeAvg) - _tunnelTestResponseTimeAvg = 0.95*_tunnelTestResponseTimeAvg + .05*ms; + _tunnelTestResponseTimeAvg = 0.95f * _tunnelTestResponseTimeAvg + .05f * ms; else - _tunnelTestResponseTimeAvg = 0.75*_tunnelTestResponseTimeAvg + .25*ms; + _tunnelTestResponseTimeAvg = 0.75f * _tunnelTestResponseTimeAvg + .25f * ms; if (_log.shouldLog(Log.INFO)) _log.info("Updating tunnel test time for " + _peer.toBase64().substring(0,6) + " to " + _tunnelTestResponseTimeAvg + " via " + ms); } - /** keep track of the fastest 3 throughputs */ - private static final int THROUGHPUT_COUNT = 3; - /** - * fastest 1 minute throughput, in bytes per minute, ordered with fastest - * first. this is not synchronized, as we don't *need* perfection, and we only - * reorder/insert values on coallesce - */ - private final double _peakThroughput[] = new double[THROUGHPUT_COUNT]; - private volatile long _peakThroughputCurrentTotal; - public double getPeakThroughputKBps() { - double rv = 0; + public float getPeakThroughputKBps() { + float rv = 0; for (int i = 0; i < THROUGHPUT_COUNT; i++) rv += _peakThroughput[i]; - rv /= (60d*1024d*THROUGHPUT_COUNT); + rv /= (60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakThroughputKBps(double kBps) { + public void setPeakThroughputKBps(float kBps) { _peakThroughput[0] = kBps*60*1024; //for (int i = 0; i < THROUGHPUT_COUNT; i++) // _peakThroughput[i] = kBps*60; } void dataPushed(int size) { _peakThroughputCurrentTotal += size; } - private final double _peakTunnelThroughput[] = new double[THROUGHPUT_COUNT]; /** the tunnel pushed that much data in its lifetime */ void tunnelDataTransferred(long tunnelByteLifetime) { - double lowPeak = _peakTunnelThroughput[THROUGHPUT_COUNT-1]; + float lowPeak = _peakTunnelThroughput[THROUGHPUT_COUNT-1]; if (tunnelByteLifetime > lowPeak) { synchronized (_peakTunnelThroughput) { for (int i = 0; i < THROUGHPUT_COUNT; i++) { @@ -345,22 +386,20 @@ public class PeerProfile { } } } - public double getPeakTunnelThroughputKBps() { - double rv = 0; + public float getPeakTunnelThroughputKBps() { + float rv = 0; for (int i = 0; i < THROUGHPUT_COUNT; i++) rv += _peakTunnelThroughput[i]; - rv /= (10d*60d*1024d*THROUGHPUT_COUNT); + rv /= (10 * 60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakTunnelThroughputKBps(double kBps) { - _peakTunnelThroughput[0] = kBps*60d*10d*1024d; + public void setPeakTunnelThroughputKBps(float kBps) { + _peakTunnelThroughput[0] = kBps * (60 * 10 * 1024); } - /** total number of bytes pushed through a single tunnel in a 1 minute period */ - private final double _peakTunnel1mThroughput[] = new double[THROUGHPUT_COUNT]; /** the tunnel pushed that much data in a 1 minute period */ void dataPushed1m(int size) { - double lowPeak = _peakTunnel1mThroughput[THROUGHPUT_COUNT-1]; + float lowPeak = _peakTunnel1mThroughput[THROUGHPUT_COUNT-1]; if (size > lowPeak) { synchronized (_peakTunnel1mThroughput) { for (int i = 0; i < THROUGHPUT_COUNT; i++) { @@ -388,14 +427,14 @@ public class PeerProfile { * through this peer. Ever. Except that the peak values are cut in half * once a day by coalesceThroughput(). This seems way too seldom. */ - public double getPeakTunnel1mThroughputKBps() { - double rv = 0; + public float getPeakTunnel1mThroughputKBps() { + float rv = 0; for (int i = 0; i < THROUGHPUT_COUNT; i++) rv += _peakTunnel1mThroughput[i]; - rv /= (60d*1024d*THROUGHPUT_COUNT); + rv /= (60 * 1024 * THROUGHPUT_COUNT); return rv; } - public void setPeakTunnel1mThroughputKBps(double kBps) { + public void setPeakTunnel1mThroughputKBps(float kBps) { _peakTunnel1mThroughput[0] = kBps*60*1024; } @@ -429,7 +468,7 @@ public class PeerProfile { * repeatedly * */ - public void expandProfile() { + public synchronized void expandProfile() { String group = (null == _peer ? "profileUnknown" : _peer.toBase64().substring(0,6)); //if (_sendSuccessSize == null) // _sendSuccessSize = new RateStat("sendSuccessSize", "How large successfully sent messages are", group, new long[] { 5*60*1000l, 60*60*1000l }); @@ -468,17 +507,12 @@ public class PeerProfile { _expandedDB = true; } - /** once a day, on average, cut the measured throughtput values in half */ - /** let's try once an hour times 3/4 */ - private static final int DROP_PERIOD_MINUTES = 60; - private static final double DEGRADE_FACTOR = 0.75; - private long _lastCoalesceDate = System.currentTimeMillis(); private void coalesceThroughput() { long now = System.currentTimeMillis(); long measuredPeriod = now - _lastCoalesceDate; if (measuredPeriod >= 60*1000) { long tot = _peakThroughputCurrentTotal; - double lowPeak = _peakThroughput[THROUGHPUT_COUNT-1]; + float lowPeak = _peakThroughput[THROUGHPUT_COUNT-1]; if (tot > lowPeak) { for (int i = 0; i < THROUGHPUT_COUNT; i++) { if (tot > _peakThroughput[i]) { @@ -562,9 +596,9 @@ public class PeerProfile { _capacityValue = _capacityValueNew; } - private double calculateSpeed() { return SpeedCalculator.calc(this); } - private double calculateCapacity() { return CapacityCalculator.calc(this); } - private double calculateIntegration() { return IntegrationCalculator.calc(this); } + private float calculateSpeed() { return (float) SpeedCalculator.calc(this); } + private float calculateCapacity() { return (float) CapacityCalculator.calc(this); } + private float calculateIntegration() { return (float) IntegrationCalculator.calc(this); } /** deprecated - unused - always false */ private boolean calculateIsFailing() { return false; } /** deprecated - unused - always false */ diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java index 466c63ec1..903386189 100644 --- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java +++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java @@ -24,7 +24,8 @@ import net.i2p.util.Log; * selection to the peer manager and tests the peer by sending it a useless * database store message * - * TODO - What's the point? Disable this? See also notes in PeerManager.selectPeers() + * TODO - What's the point? Disable this? See also notes in PeerManager.selectPeers(). + * TODO - Use something besides sending the peer's RI to itself? */ public class PeerTestJob extends JobImpl { private final Log _log; @@ -82,6 +83,7 @@ public class PeerTestJob extends JobImpl { /** * Retrieve a group of 0 or more peers that we want to test. + * Returned list will not include ourselves. * * @return set of RouterInfo structures */ @@ -110,12 +112,13 @@ public class PeerTestJob extends JobImpl { /** * Fire off the necessary jobs and messages to test the given peer - * + * The message is a store of the peer's RI to itself, + * with a reply token. */ private void testPeer(RouterInfo peer) { TunnelInfo inTunnel = getInboundTunnelId(); if (inTunnel == null) { - _log.warn("No tunnels to get peer test replies through! wtf!"); + _log.warn("No tunnels to get peer test replies through!"); return; } TunnelId inTunnelId = inTunnel.getReceiveTunnelId(0); @@ -123,19 +126,19 @@ public class PeerTestJob extends JobImpl { RouterInfo inGateway = getContext().netDb().lookupRouterInfoLocally(inTunnel.getPeer(0)); if (inGateway == null) { if (_log.shouldLog(Log.WARN)) - _log.warn("We can't find the gateway to our inbound tunnel?! wtf"); + _log.warn("We can't find the gateway to our inbound tunnel?! Impossible?"); return; } int timeoutMs = getTestTimeout(); long expiration = getContext().clock().now() + timeoutMs; - long nonce = getContext().random().nextLong(I2NPMessage.MAX_ID_VALUE); + long nonce = 1 + getContext().random().nextLong(I2NPMessage.MAX_ID_VALUE - 1); DatabaseStoreMessage msg = buildMessage(peer, inTunnelId, inGateway.getIdentity().getHash(), nonce, expiration); TunnelInfo outTunnel = getOutboundTunnelId(); if (outTunnel == null) { - _log.warn("No tunnels to send search out through! wtf!"); + _log.warn("No tunnels to send search out through! Something is wrong..."); return; } @@ -172,7 +175,9 @@ public class PeerTestJob extends JobImpl { } /** - * Build a message to test the peer with + * Build a message to test the peer with. + * The message is a store of the peer's RI to itself, + * with a reply token. */ private DatabaseStoreMessage buildMessage(RouterInfo peer, TunnelId replyTunnel, Hash replyGateway, long nonce, long expiration) { DatabaseStoreMessage msg = new DatabaseStoreMessage(getContext()); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java index d6911b8e7..b0a9c7785 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java @@ -222,8 +222,8 @@ public class ProfileManagerImpl implements ProfileManager { data.setLastHeardFrom(_context.clock().now()); if (!data.getIsExpandedDB()) return; - DBHistory hist = data.getDBHistory(); - hist.lookupReceived(); + //DBHistory hist = data.getDBHistory(); + //hist.lookupReceived(); } /** @@ -313,8 +313,7 @@ public class ProfileManagerImpl implements ProfileManager { public void heardAbout(Hash peer, long when) { PeerProfile data = getProfile(peer); //if (data == null) return; - if (when > data.getLastHeardAbout()) - data.setLastHeardAbout(when); + data.setLastHeardAbout(when); } /** @@ -340,7 +339,6 @@ public class ProfileManagerImpl implements ProfileManager { PeerProfile prof = _context.profileOrganizer().getProfile(peer); if (prof == null) { prof = new PeerProfile(_context, peer); - prof.setFirstHeardAbout(_context.clock().now()); _context.profileOrganizer().addProfile(prof); } return prof; diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index 87f751bdc..5e6e2f7a9 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -17,7 +17,7 @@ import java.util.TreeSet; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; -import net.i2p.crypto.SHA256Generator; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; @@ -156,6 +156,11 @@ public class ProfileOrganizer { * Blocking if a reorganize is happening. */ public PeerProfile getProfile(Hash peer) { + if (peer.equals(_us)) { + if (_log.shouldWarn()) + _log.warn("Who wanted our own profile?", new Exception("I did")); + return null; + } getReadLock(); try { return locked_getProfile(peer); @@ -168,6 +173,11 @@ public class ProfileOrganizer { * @since 0.8.12 */ public PeerProfile getProfileNonblocking(Hash peer) { + if (peer.equals(_us)) { + if (_log.shouldWarn()) + _log.warn("Who wanted our own profile?", new Exception("I did")); + return null; + } if (tryReadLock()) { try { return locked_getProfile(peer); @@ -184,6 +194,11 @@ public class ProfileOrganizer { if (profile == null) return null; Hash peer = profile.getPeer(); + if (peer.equals(_us)) { + if (_log.shouldWarn()) + _log.warn("Who added our own profile?", new Exception("I did")); + return null; + } if (_log.shouldLog(Log.DEBUG)) _log.debug("New profile created for " + peer); @@ -1219,12 +1234,15 @@ public class ProfileOrganizer { } /** + * + * As of 0.9.24, checks for a netdb family match as well, unless mask == 0. + * * @param mask 0-4 Number of bytes to match to determine if peers in the same IP range should * not be in the same tunnel. 0 = disable check; 1 = /8; 2 = /16; 3 = /24; 4 = exact IP match */ private void locked_selectPeers(Map peers, int howMany, Set toExclude, Set matches, int mask) { List all = new ArrayList(peers.keySet()); - Set IPSet = new HashSet(8); + Set IPSet = new HashSet(8); // use RandomIterator to avoid shuffling the whole thing for (Iterator iter = new RandomIterator(all); (matches.size() < howMany) && iter.hasNext(); ) { Hash peer = iter.next(); @@ -1250,11 +1268,14 @@ public class ProfileOrganizer { /** * Does the peer's IP address NOT match the IP address of any peer already in the set, * on any transport, within a given mask? + * + * As of 0.9.24, checks for a netdb family match as well. + * * @param mask is 1-4 (number of bytes to match) * @param IPMatches all IPs so far, modified by this routine */ - private boolean notRestricted(Hash peer, Set IPSet, int mask) { - Set peerIPs = maskedIPSet(peer, mask); + private boolean notRestricted(Hash peer, Set IPSet, int mask) { + Set peerIPs = maskedIPSet(peer, mask); if (containsAny(IPSet, peerIPs)) return false; IPSet.addAll(peerIPs); @@ -1265,10 +1286,12 @@ public class ProfileOrganizer { * The Set of IPs for this peer, with a given mask. * Includes the comm system's record of the IP, and all netDb addresses. * + * As of 0.9.24, returned set will include netdb family as well. + * * @return an opaque set of masked IPs for this peer */ - private Set maskedIPSet(Hash peer, int mask) { - Set rv = new HashSet(4); + private Set maskedIPSet(Hash peer, int mask) { + Set rv = new HashSet(4); byte[] commIP = _context.commSystem().getIP(peer); if (commIP != null) rv.add(maskedIP(commIP, mask)); @@ -1281,31 +1304,40 @@ public class ProfileOrganizer { if (pib == null) continue; rv.add(maskedIP(pib, mask)); } + String family = pinfo.getOption("family"); + if (family != null) { + // TODO should KNDF put a family-verified indicator in the RI, + // after checking the sig, or does it matter? + // What's the threat here of not avoid ding a router + // falsely claiming to be in the family? + // Prefix with something so an IP can't be spoofed + rv.add('x' + family); + } return rv; } /** * generate an arbitrary unique value for this ip/mask (mask = 1-4) - * If IPv6, force mask = 8. + * If IPv6, force mask = 6. */ - private static Integer maskedIP(byte[] ip, int mask) { - int rv = ip[0]; + private static String maskedIP(byte[] ip, int mask) { + final StringBuilder buf = new StringBuilder(1 + (mask*2)); + final char delim; if (ip.length == 16) { - for (int i = 1; i < 8; i++) { - rv <<= i * 4; - rv ^= ip[i]; - } + mask = 6; + delim = ':'; } else { - for (int i = 1; i < mask; i++) { - rv <<= 8; - rv ^= ip[i]; - } + delim = '.'; } - return Integer.valueOf(rv); + buf.append(delim); + buf.append(Long.toHexString(DataHelper.fromLong(ip, 0, mask))); + return buf.toString(); } /** does a contain any of the elements in b? */ private static boolean containsAny(Set a, Set b) { + if (a.isEmpty() || b.isEmpty()) + return false; for (T o : b) { if (a.contains(o)) return true; diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java index 32c15038c..f978194d3 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java +++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java @@ -48,12 +48,12 @@ class ProfilePersistenceHelper { private static final String B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-~"; /** - * If we haven't been able to get a message through to the peer in 3 days, + * If we haven't been able to get a message through to the peer in this much time, * drop the profile. They may reappear, but if they do, their config may * have changed (etc). * */ - private static final long EXPIRE_AGE = 3*24*60*60*1000; + private static final long EXPIRE_AGE = 15*24*60*60*1000; private final File _profileDir; private Hash _us; @@ -139,7 +139,7 @@ class ProfilePersistenceHelper { add(buf, "tunnelPeakTunnel1mThroughput", profile.getPeakTunnel1mThroughputKBps(), "KBytes/sec"); buf.append(NL); - out.write(buf.toString().getBytes()); + out.write(buf.toString().getBytes("UTF-8")); if (profile.getIsExpanded()) { // only write out expanded data if, uh, we've got it @@ -170,7 +170,7 @@ class ProfilePersistenceHelper { } /** @since 0.8.5 */ - private static void add(StringBuilder buf, String name, double val, String description) { + private static void add(StringBuilder buf, String name, float val, String description) { buf.append("# ").append(name).append(NL).append("# ").append(description).append(NL); buf.append(name).append('=').append(val).append(NL).append(NL); } @@ -263,29 +263,29 @@ class ProfilePersistenceHelper { file.delete(); } - profile.setCapacityBonus(getLong(props, "capacityBonus")); - profile.setIntegrationBonus(getLong(props, "integrationBonus")); - profile.setSpeedBonus(getLong(props, "speedBonus")); + profile.setCapacityBonus((int) getLong(props, "capacityBonus")); + profile.setIntegrationBonus((int) getLong(props, "integrationBonus")); + profile.setSpeedBonus((int) getLong(props, "speedBonus")); profile.setLastHeardAbout(getLong(props, "lastHeardAbout")); profile.setFirstHeardAbout(getLong(props, "firstHeardAbout")); profile.setLastSendSuccessful(getLong(props, "lastSentToSuccessfully")); profile.setLastSendFailed(getLong(props, "lastFailedSend")); profile.setLastHeardFrom(getLong(props, "lastHeardFrom")); - profile.setTunnelTestTimeAverage(getDouble(props, "tunnelTestTimeAverage")); - profile.setPeakThroughputKBps(getDouble(props, "tunnelPeakThroughput")); - profile.setPeakTunnelThroughputKBps(getDouble(props, "tunnelPeakTunnelThroughput")); - profile.setPeakTunnel1mThroughputKBps(getDouble(props, "tunnelPeakTunnel1mThroughput")); + profile.setTunnelTestTimeAverage(getFloat(props, "tunnelTestTimeAverage")); + profile.setPeakThroughputKBps(getFloat(props, "tunnelPeakThroughput")); + profile.setPeakTunnelThroughputKBps(getFloat(props, "tunnelPeakTunnelThroughput")); + profile.setPeakTunnel1mThroughputKBps(getFloat(props, "tunnelPeakTunnel1mThroughput")); profile.getTunnelHistory().load(props); // In the interest of keeping the in-memory profiles small, // don't load the DB info at all unless there is something interesting there // (i.e. floodfills) - // It seems like we do one or two lookups as a part of handshaking? - // Not sure, to be researched. - if (getLong(props, "dbHistory.successfulLookups") > 1 || - getLong(props, "dbHistory.failedlLokups") > 1) { + if (getLong(props, "dbHistory.lastLookupSuccessful") > 0 || + getLong(props, "dbHistory.lastLookupFailed") > 0 || + getLong(props, "dbHistory.lastStoreSuccessful") > 0 || + getLong(props, "dbHistory.lastStoreFailed") > 0) { profile.expandDBProfile(); profile.getDBHistory().load(props); profile.getDbIntroduction().load(props, "dbIntroduction", true); @@ -300,37 +300,87 @@ class ProfilePersistenceHelper { if (_log.shouldLog(Log.DEBUG)) _log.debug("Loaded the profile for " + peer.toBase64() + " from " + file.getName()); + fixupFirstHeardAbout(profile); return profile; - } catch (Exception e) { + } catch (IOException e) { if (_log.shouldLog(Log.WARN)) _log.warn("Error loading properties from " + file.getAbsolutePath(), e); file.delete(); return null; } } + + /** + * First heard about wasn't always set correctly before, + * set it to the minimum of all recorded timestamps. + * + * @since 0.9.24 + */ + private void fixupFirstHeardAbout(PeerProfile p) { + long min = Long.MAX_VALUE; + long t = p.getLastHeardAbout(); + if (t > 0 && t < min) min = t; + t = p.getLastSendSuccessful(); + if (t > 0 && t < min) min = t; + t = p.getLastSendFailed(); + if (t > 0 && t < min) min = t; + t = p.getLastHeardFrom(); + if (t > 0 && t < min) min = t; + // the first was never used and the last 4 were never persisted + //DBHistory dh = p.getDBHistory(); + //if (dh != null) { + // t = dh.getLastLookupReceived(); + // if (t > 0 && t < min) min = t; + // t = dh.getLastLookupSuccessful(); + // if (t > 0 && t < min) min = t; + // t = dh.getLastLookupFailed(); + // if (t > 0 && t < min) min = t; + // t = dh.getLastStoreSuccessful(); + // if (t > 0 && t < min) min = t; + // t = dh.getLastStoreFailed(); + // if (t > 0 && t < min) min = t; + //} + TunnelHistory th = p.getTunnelHistory(); + if (th != null) { + t = th.getLastAgreedTo(); + if (t > 0 && t < min) min = t; + t = th.getLastRejectedCritical(); + if (t > 0 && t < min) min = t; + t = th.getLastRejectedBandwidth(); + if (t > 0 && t < min) min = t; + t = th.getLastRejectedTransient(); + if (t > 0 && t < min) min = t; + t = th.getLastRejectedProbabalistic(); + if (t > 0 && t < min) min = t; + t = th.getLastFailed(); + if (t > 0 && t < min) min = t; + } + long fha = p.getFirstHeardAbout(); + if (min > 0 && min < Long.MAX_VALUE && (fha <= 0 || min < fha)) { + p.setFirstHeardAbout(min); + if (_log.shouldDebug()) + _log.debug("Fixed up the FHA time for " + p.getPeer().toBase64() + " to " + (new Date(min))); + } + } - private final static long getLong(Properties props, String key) { + static long getLong(Properties props, String key) { String val = props.getProperty(key); if (val != null) { try { return Long.parseLong(val); - } catch (NumberFormatException nfe) { - return 0; - } + } catch (NumberFormatException nfe) {} } return 0; } - private final static double getDouble(Properties props, String key) { + private final static float getFloat(Properties props, String key) { String val = props.getProperty(key); if (val != null) { try { - return Double.parseDouble(val); - } catch (NumberFormatException nfe) { - return 0.0; - } + return Float.parseFloat(val); + } catch (NumberFormatException nfe) {} } - return 0.0; + return 0.0f; } private void loadProps(Properties props, File file) throws IOException { @@ -369,7 +419,7 @@ class ProfilePersistenceHelper { return null; Hash h = Hash.create(b); return h; - } catch (Exception dfe) { + } catch (RuntimeException dfe) { _log.warn("Invalid base64 [" + key + "]", dfe); return null; } diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java index 8cffc431f..64e21a6e8 100644 --- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java +++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java @@ -89,10 +89,10 @@ public class TunnelHistory { _lifetimeRejected.incrementAndGet(); if (severity >= TUNNEL_REJECT_CRIT) { _lastRejectedCritical = _context.clock().now(); - _rejectRate.addData(1, 1); + _rejectRate.addData(1); } else if (severity >= TUNNEL_REJECT_BANDWIDTH) { _lastRejectedBandwidth = _context.clock().now(); - _rejectRate.addData(1, 1); + _rejectRate.addData(1); } else if (severity >= TUNNEL_REJECT_TRANSIENT_OVERLOAD) { _lastRejectedTransient = _context.clock().now(); // dont increment the reject rate in this case @@ -108,7 +108,7 @@ public class TunnelHistory { */ public void incrementFailed(int pct) { _lifetimeFailed.incrementAndGet(); - _failRate.addData(pct, 1); + _failRate.addData(pct); _lastFailed = _context.clock().now(); } @@ -151,7 +151,7 @@ public class TunnelHistory { add(buf, "lifetimeAgreedTo", _lifetimeAgreedTo.get(), "How many tunnels has the peer ever agreed to participate in?"); add(buf, "lifetimeFailed", _lifetimeFailed.get(), "How many tunnels has the peer ever agreed to participate in that failed prematurely?"); add(buf, "lifetimeRejected", _lifetimeRejected.get(), "How many tunnels has the peer ever refused to participate in?"); - out.write(buf.toString().getBytes()); + out.write(buf.toString().getBytes("UTF-8")); _rejectRate.store(out, "tunnelHistory.rejectRate"); _failRate.store(out, "tunnelHistory.failRate"); } @@ -190,14 +190,6 @@ public class TunnelHistory { } private final static long getLong(Properties props, String key) { - String val = props.getProperty(key); - if (val != null) { - try { - return Long.parseLong(val); - } catch (NumberFormatException nfe) { - return 0; - } - } - return 0; + return ProfilePersistenceHelper.getLong(props, key); } } diff --git a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java index 2b3be5586..bb9f30846 100644 --- a/router/java/src/net/i2p/router/startup/BootCommSystemJob.java +++ b/router/java/src/net/i2p/router/startup/BootCommSystemJob.java @@ -14,6 +14,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.RouterClock; import net.i2p.router.tasks.ReadConfigJob; import net.i2p.util.Log; +import net.i2p.util.SystemVersion; /** This actually boots almost everything */ class BootCommSystemJob extends JobImpl { @@ -46,9 +47,12 @@ class BootCommSystemJob extends JobImpl { // start I2CP getContext().jobQueue().addJob(new StartAcceptingClientsJob(getContext())); - Job j = new ReadConfigJob(getContext()); - j.getTiming().setStartAfter(getContext().clock().now() + 2*60*1000); - getContext().jobQueue().addJob(j); + if (!SystemVersion.isAndroid()) { + Job j = new ReadConfigJob(getContext()); + j.getTiming().setStartAfter(getContext().clock().now() + 2*60*1000); + getContext().jobQueue().addJob(j); + } + ((RouterClock) getContext().clock()).addShiftListener(getContext().router()); } diff --git a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java index 03076cb1e..47f5921dc 100644 --- a/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/CreateRouterInfoJob.java @@ -35,6 +35,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.util.EventLog; import net.i2p.util.Log; import net.i2p.util.SecureFileOutputStream; +import net.i2p.util.SystemVersion; /** * Warning - misnamed. This creates a new RouterIdentity, i.e. @@ -49,9 +50,10 @@ public class CreateRouterInfoJob extends JobImpl { public static final String INFO_FILENAME = "router.info"; public static final String KEYS_FILENAME = "router.keys"; public static final String KEYS2_FILENAME = "router.keys.dat"; - private static final String PROP_ROUTER_SIGTYPE = "router.sigType"; - /** TODO when changing, check isAvailable() and fallback to DSA_SHA1 */ - private static final SigType DEFAULT_SIGTYPE = SigType.DSA_SHA1; + static final String PROP_ROUTER_SIGTYPE = "router.sigType"; + /** TODO make everybody Ed */ + private static final SigType DEFAULT_SIGTYPE = (SystemVersion.isARM() || SystemVersion.isAndroid()) ? + SigType.DSA_SHA1 : SigType.EdDSA_SHA512_Ed25519; CreateRouterInfoJob(RouterContext ctx, Job next) { super(ctx); @@ -96,10 +98,6 @@ public class CreateRouterInfoJob extends JobImpl { OutputStream fos1 = null; try { info.setAddresses(getContext().commSystem().createAddresses()); - Properties stats = getContext().statPublisher().publishStatistics(); - stats.setProperty(RouterInfo.PROP_NETWORK_ID, Router.NETWORK_ID+""); - getContext().router().addCapabilities(info); - info.setOptions(stats); // not necessary, in constructor //info.setPeers(new HashSet()); info.setPublished(getCurrentPublishDate(getContext())); @@ -124,6 +122,8 @@ public class CreateRouterInfoJob extends JobImpl { padding = null; } info.setIdentity(ident); + Properties stats = getContext().statPublisher().publishStatistics(ident.getHash()); + info.setOptions(stats); info.sign(signingPrivKey); @@ -166,7 +166,7 @@ public class CreateRouterInfoJob extends JobImpl { * @since 0.9.16 */ public static SigType getSigTypeConfig(RouterContext ctx) { - SigType cstype = CreateRouterInfoJob.DEFAULT_SIGTYPE; + SigType cstype = DEFAULT_SIGTYPE; String sstype = ctx.getProperty(PROP_ROUTER_SIGTYPE); if (sstype != null) { SigType ntype = SigType.parseSigType(sstype); diff --git a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java index 3fbfc381f..67ab00951 100644 --- a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java +++ b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java @@ -123,7 +123,7 @@ public class LoadClientAppsJob extends JobImpl { for (int i = 0; i < data.length; i++) { switch (data[i]) { case '\'': - case '\"': + case '"': if (isQuoted) { String str = buf.toString().trim(); if (str.length() > 0) @@ -207,7 +207,7 @@ public class LoadClientAppsJob extends JobImpl { if (args == null) args = new String[0]; Class cls = Class.forName(className, true, cl); - Method method = cls.getMethod("main", new Class[] { String[].class }); + Method method = cls.getMethod("main", String[].class); method.invoke(cls, new Object[] { args }); } @@ -287,7 +287,7 @@ public class LoadClientAppsJob extends JobImpl { ClientApp app = (ClientApp) con.newInstance(conArgs); mgr.addAndStart(app, _args); } else { - Method method = cls.getMethod("main", new Class[] { String[].class }); + Method method = cls.getMethod("main", String[].class); method.invoke(cls, new Object[] { _args }); } } catch (Throwable t) { diff --git a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java index cebd333d2..c2cbc2dda 100644 --- a/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/LoadRouterInfoJob.java @@ -20,6 +20,7 @@ import net.i2p.crypto.SigType; import net.i2p.data.Certificate; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; +import net.i2p.data.Hash; import net.i2p.data.PrivateKey; import net.i2p.data.PublicKey; import net.i2p.data.SigningPrivateKey; @@ -30,6 +31,8 @@ import net.i2p.data.router.RouterPrivateKeyFile; import net.i2p.router.JobImpl; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.crypto.FamilyKeyCrypto; +import net.i2p.router.networkdb.kademlia.PersistentDataStore; import net.i2p.util.Log; /** @@ -83,7 +86,7 @@ class LoadRouterInfoJob extends JobImpl { try { // if we have a routerinfo but no keys, things go bad in a hurry: // CRIT ...rkdb.PublishLocalRouterInfoJob: Internal error - signing private key not known? rescheduling publish for 30s - // CRIT net.i2p.router.Router : Internal error - signing private key not known? wtf + // CRIT net.i2p.router.Router : Internal error - signing private key not known? Impossible? // CRIT ...sport.udp.EstablishmentManager: Error in the establisher java.lang.NullPointerException // at net.i2p.router.transport.udp.PacketBuilder.buildSessionConfirmedPacket(PacketBuilder.java:574) // so pretend the RI isn't there if there is no keyfile @@ -96,7 +99,13 @@ class LoadRouterInfoJob extends JobImpl { throw new DataFormatException("Our RouterInfo has a bad signature"); if (_log.shouldLog(Log.DEBUG)) _log.debug("Reading in routerInfo from " + rif.getAbsolutePath() + " and it has " + info.getAddresses().size() + " addresses"); - _us = info; + // don't reuse if family name changed + if (DataHelper.eq(info.getOption(FamilyKeyCrypto.OPT_NAME), + getContext().getProperty(FamilyKeyCrypto.PROP_FAMILY_NAME))) { + _us = info; + } else { + _log.logAlways(Log.WARN, "NetDb family name changed"); + } } if (keys2Exist || keysExist) { @@ -110,11 +119,30 @@ class LoadRouterInfoJob extends JobImpl { // check if the sigtype config changed SigType cstype = CreateRouterInfoJob.getSigTypeConfig(getContext()); boolean sigTypeChanged = stype != cstype; + if (sigTypeChanged && getContext().getProperty(CreateRouterInfoJob.PROP_ROUTER_SIGTYPE) == null) { + // Not explicitly configured, and default has changed + // Give a 25% chance of rekeying for each restart + // TODO reduce to ~3 (i.e. increase probability) in future release + if (getContext().random().nextInt(4) > 0) { + sigTypeChanged = false; + if (_log.shouldWarn()) + _log.warn("Deferring RI rekey from " + stype + " to " + cstype); + } + } if (sigTypeChanged || shouldRebuild(privkey)) { + if (_us != null) { + Hash h = _us.getIdentity().getHash(); + _log.logAlways(Log.WARN, "Deleting old router identity " + h.toBase64()); + // the netdb hasn't started yet, but we want to delete the RI + File f = PersistentDataStore.getRouterInfoFile(getContext(), h); + f.delete(); + // the banlist can be called at any time + getContext().banlist().banlistRouterForever(h, "Our previous identity"); + _us = null; + } if (sigTypeChanged) _log.logAlways(Log.WARN, "Rebuilding RouterInfo with new signature type " + cstype); - _us = null; // windows... close before deleting if (fis1 != null) { try { fis1.close(); } catch (IOException ioe) {} diff --git a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java index ef0826cf5..27a49b39e 100644 --- a/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java +++ b/router/java/src/net/i2p/router/startup/RebuildRouterInfoJob.java @@ -98,7 +98,13 @@ class RebuildRouterInfoJob extends JobImpl { KeyData kd = LoadRouterInfoJob.readKeyData(keyFile, keyFile2); info = new RouterInfo(); info.setIdentity(kd.routerIdentity); - } catch (Exception e) { + } catch (DataFormatException e) { + _log.log(Log.CRIT, "Error reading in the key data from " + keyFile.getAbsolutePath(), e); + keyFile.delete(); + keyFile2.delete(); + rebuildRouterInfo(alreadyRunning); + return; + } catch (IOException e) { _log.log(Log.CRIT, "Error reading in the key data from " + keyFile.getAbsolutePath(), e); keyFile.delete(); keyFile2.delete(); @@ -112,10 +118,8 @@ class RebuildRouterInfoJob extends JobImpl { try { info.setAddresses(getContext().commSystem().createAddresses()); - Properties stats = getContext().statPublisher().publishStatistics(); - stats.setProperty(RouterInfo.PROP_NETWORK_ID, ""+Router.NETWORK_ID); + Properties stats = getContext().statPublisher().publishStatistics(info.getHash()); info.setOptions(stats); - getContext().router().addCapabilities(info); // info.setPeers(new HashSet()); // this would have the trusted peers info.setPublished(CreateRouterInfoJob.getCurrentPublishDate(getContext())); diff --git a/router/java/src/net/i2p/router/startup/StartupJob.java b/router/java/src/net/i2p/router/startup/StartupJob.java index b6aa04ef0..b126f210e 100644 --- a/router/java/src/net/i2p/router/startup/StartupJob.java +++ b/router/java/src/net/i2p/router/startup/StartupJob.java @@ -36,7 +36,6 @@ public class StartupJob extends JobImpl { public void runJob() { if (!SystemVersion.isAndroid()) getContext().jobQueue().addJob(new LoadClientAppsJob(getContext())); - getContext().statPublisher().startup(); getContext().jobQueue().addJob(new LoadRouterInfoJob(getContext())); } } diff --git a/router/java/src/net/i2p/router/startup/WorkingDir.java b/router/java/src/net/i2p/router/startup/WorkingDir.java index b8503224f..a7ca9f330 100644 --- a/router/java/src/net/i2p/router/startup/WorkingDir.java +++ b/router/java/src/net/i2p/router/startup/WorkingDir.java @@ -211,7 +211,7 @@ public class WorkingDir { String[] files = dir.list(); if (files == null) return false; - String migrated[] = MIGRATE_BASE.split(","); + String migrated[] = DataHelper.split(MIGRATE_BASE, ","); for (String file: files) { for (int i = 0; i < migrated.length; i++) { if (file.equals(migrated[i])) @@ -252,7 +252,7 @@ public class WorkingDir { } System.setProperty(PROP_WRAPPER_LOG, logfile.getAbsolutePath()); try { - PrintStream ps = new PrintStream(new SecureFileOutputStream(logfile, true)); + PrintStream ps = new PrintStream(new SecureFileOutputStream(logfile, true), true, "UTF-8"); System.setOut(ps); System.setErr(ps); } catch (IOException ioe) { @@ -282,7 +282,7 @@ public class WorkingDir { private static boolean migrate(String list, File olddir, File todir) { boolean rv = true; - String files[] = list.split(","); + String files[] = DataHelper.split(list, ","); for (int i = 0; i < files.length; i++) { File from = new File(olddir, files[i]); if (!copy(from, todir)) { diff --git a/router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java b/router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java index 817847835..95f5c8469 100644 --- a/router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java +++ b/router/java/src/net/i2p/router/tasks/CoalesceStatsEvent.java @@ -32,13 +32,14 @@ public class CoalesceStatsEvent implements SimpleTimer.TimedEvent { // Please keep relatively short so it will fit on the graphs. ctx.statManager().createRequiredRateStat("bw.receiveBps", _x("Message receive rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); ctx.statManager().createRequiredRateStat("bw.sendBps", _x("Message send rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - ctx.statManager().createRequiredRateStat("bw.sendRate", _x("Low-level send rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000l, 5*60*1000l, 10*60*1000l, 60*60*1000l }); - ctx.statManager().createRequiredRateStat("bw.recvRate", _x("Low-level receive rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000l, 5*60*1000l, 10*60*1000l, 60*60*1000l }); - ctx.statManager().createRequiredRateStat("router.activePeers", _x("How many peers we are actively talking with"), "Throttle", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - ctx.statManager().createRequiredRateStat("router.highCapacityPeers", "How many high capacity peers we know", "Throttle", new long[] { 5*60*1000, 60*60*1000 }); - ctx.statManager().createRateStat("router.activeSendPeers", "How many peers we've sent to this minute", "Throttle", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); - ctx.statManager().createRequiredRateStat("router.fastPeers", _x("Known fast peers"), "Throttle", new long[] { 5*60*1000, 60*60*1000 }); - ctx.statManager().createRateStat("router.integratedPeers", _x("Known integrated (floodfill) peers"), "Throttle", new long[] { 60*1000, 5*60*1000, 60*60*1000 }); + ctx.statManager().createRequiredRateStat("bw.sendRate", _x("Low-level send rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); + ctx.statManager().createRequiredRateStat("bw.recvRate", _x("Low-level receive rate (bytes/sec)"), "Bandwidth", new long[] { 60*1000l, 5*60*1000l, 60*60*1000l }); + ctx.statManager().createRequiredRateStat("router.activePeers", _x("How many peers we are actively talking with"), "Throttle", new long[] { 60*1000 }); + ctx.statManager().createRequiredRateStat("router.highCapacityPeers", "How many high capacity peers we know", "Throttle", new long[] { 60*1000 }); + ctx.statManager().createRateStat("router.activeSendPeers", "How many peers we've sent to this minute", "Throttle", new long[] { 60*1000 }); + ctx.statManager().createRequiredRateStat("router.fastPeers", _x("Known fast peers"), "Throttle", new long[] { 60*1000 }); + ctx.statManager().createRateStat("router.integratedPeers", _x("Known integrated (floodfill) peers"), "Throttle", new long[] { 60*1000 }); + ctx.statManager().createRequiredRateStat("router.tunnelBacklog", _x("Size of tunnel acceptor backlog"), "Tunnels", new long[] { 60*60*1000 }); _maxMemory = Runtime.getRuntime().maxMemory(); String legend = "(Bytes)"; if (_maxMemory < Long.MAX_VALUE) @@ -68,6 +69,7 @@ public class CoalesceStatsEvent implements SimpleTimer.TimedEvent { getContext().statManager().addRateData("bw.sendRate", (long)getContext().bandwidthLimiter().getSendBps()); getContext().statManager().addRateData("bw.recvRate", (long)getContext().bandwidthLimiter().getReceiveBps()); + getContext().statManager().addRateData("router.tunnelBacklog", getContext().tunnelManager().getInboundBuildQueueSize(), 60*1000); long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); getContext().statManager().addRateData("router.memoryUsed", used); if (_maxMemory - used < LOW_MEMORY_THRESHOLD) diff --git a/router/java/src/net/i2p/router/tasks/CryptoChecker.java b/router/java/src/net/i2p/router/tasks/CryptoChecker.java index e022931ff..49bd84da5 100644 --- a/router/java/src/net/i2p/router/tasks/CryptoChecker.java +++ b/router/java/src/net/i2p/router/tasks/CryptoChecker.java @@ -5,6 +5,7 @@ import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; +import net.i2p.crypto.CryptoCheck; import net.i2p.crypto.SigType; import net.i2p.router.RouterContext; import net.i2p.util.Log; @@ -57,7 +58,7 @@ public class CryptoChecker { log.logAlways(Log.WARN, s); System.out.println(s); } - if (!isUnlimited()) { + if (!CryptoCheck.isUnlimited()) { s = "Please consider installing the Java Cryptography Unlimited Strength Jurisdiction Policy Files from "; //if (SystemVersion.isJava8()) // s += JRE8; @@ -79,28 +80,6 @@ public class CryptoChecker { } } - /** - * Copied from CryptixAESEngine - */ - private static boolean isUnlimited() { - try { - if (Cipher.getMaxAllowedKeyLength("AES") < 256) - return false; - } catch (NoSuchAlgorithmException e) { - return false; - } catch (NoSuchMethodError e) { - // JamVM, gij - try { - Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); - SecretKeySpec key = new SecretKeySpec(new byte[32], "AES"); - cipher.init(Cipher.ENCRYPT_MODE, key); - } catch (GeneralSecurityException gse) { - return false; - } - } - return true; - } - public static void main(String[] args) { warnUnavailableCrypto(null); } diff --git a/router/java/src/net/i2p/router/tasks/MarkLiveliness.java b/router/java/src/net/i2p/router/tasks/MarkLiveliness.java index 00bba1a5b..34420f2d9 100644 --- a/router/java/src/net/i2p/router/tasks/MarkLiveliness.java +++ b/router/java/src/net/i2p/router/tasks/MarkLiveliness.java @@ -12,6 +12,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import net.i2p.data.DataHelper; import net.i2p.router.Router; import net.i2p.util.Log; import net.i2p.util.SecureFileOutputStream; @@ -45,7 +46,7 @@ public class MarkLiveliness implements SimpleTimer.TimedEvent { FileOutputStream fos = null; try { fos = new SecureFileOutputStream(_pingFile); - fos.write(Long.toString(System.currentTimeMillis()).getBytes()); + fos.write(DataHelper.getASCII(Long.toString(System.currentTimeMillis()))); } catch (IOException ioe) { if (!_errorLogged) { Log log = _router.getContext().logManager().getLog(MarkLiveliness.class); diff --git a/router/java/src/net/i2p/router/tasks/OOMListener.java b/router/java/src/net/i2p/router/tasks/OOMListener.java index d30365993..7f09f677d 100644 --- a/router/java/src/net/i2p/router/tasks/OOMListener.java +++ b/router/java/src/net/i2p/router/tasks/OOMListener.java @@ -8,6 +8,7 @@ import net.i2p.router.RouterContext; import net.i2p.router.util.EventLog; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.SystemVersion; /** * Kaboom @@ -48,9 +49,19 @@ public class OOMListener implements I2PThread.OOMEventListener { log.log(Log.CRIT, "Thread ran out of memory, shutting down I2P", oom); log.log(Log.CRIT, "free mem: " + Runtime.getRuntime().freeMemory() + " total mem: " + Runtime.getRuntime().totalMemory()); - if (_context.hasWrapper()) + if (_context.hasWrapper()) { + // Can't find any System property or wrapper property that gives + // you the actual config file path, have to guess + String path; + if (!SystemVersion.isWindows() && !SystemVersion.isMac() && + "i2psvc".equals(System.getProperty("user.name"))) { + path = "/etc/i2p"; + } else { + path = _context.getBaseDir().toString(); + } log.log(Log.CRIT, "To prevent future shutdowns, increase wrapper.java.maxmemory in " + - _context.getBaseDir() + File.separatorChar + "wrapper.config"); + path + File.separatorChar + "wrapper.config"); + } } catch (OutOfMemoryError oome) {} try { ThreadDump.dump(_context, 1); diff --git a/router/java/src/net/i2p/router/time/NtpClient.java b/router/java/src/net/i2p/router/time/NtpClient.java index 68c325f94..d5fecdc2d 100644 --- a/router/java/src/net/i2p/router/time/NtpClient.java +++ b/router/java/src/net/i2p/router/time/NtpClient.java @@ -55,7 +55,8 @@ class NtpClient { /** difference between the unix epoch and jan 1 1900 (NTP uses that) */ private final static double SECONDS_1900_TO_EPOCH = 2208988800.0; private final static int NTP_PORT = 123; - + private static final int DEFAULT_TIMEOUT = 10*1000; + /** * Query the ntp servers, returning the current time from first one we find * @@ -84,7 +85,7 @@ class NtpClient { * @throws IllegalArgumentException if none of the servers are reachable * @since 0.7.12 */ - public static long[] currentTimeAndStratum(String serverNames[]) { + public static long[] currentTimeAndStratum(String serverNames[], int perServerTimeout) { if (serverNames == null) throw new IllegalArgumentException("No NTP servers specified"); ArrayList names = new ArrayList(serverNames.length); @@ -92,7 +93,7 @@ class NtpClient { names.add(serverNames[i]); Collections.shuffle(names); for (int i = 0; i < names.size(); i++) { - long[] rv = currentTimeAndStratum(names.get(i)); + long[] rv = currentTimeAndStratum(names.get(i), perServerTimeout); if (rv != null && rv[0] > 0) return rv; } @@ -105,7 +106,7 @@ class NtpClient { * @return milliseconds since january 1, 1970 (UTC), or -1 on error */ public static long currentTime(String serverName) { - long[] la = currentTimeAndStratum(serverName); + long[] la = currentTimeAndStratum(serverName, DEFAULT_TIMEOUT); if (la != null) return la[0]; return -1; @@ -116,7 +117,7 @@ class NtpClient { * @return time in rv[0] and stratum in rv[1], or null for error * @since 0.7.12 */ - private static long[] currentTimeAndStratum(String serverName) { + private static long[] currentTimeAndStratum(String serverName, int timeout) { DatagramSocket socket = null; try { // Send request @@ -135,7 +136,7 @@ class NtpClient { // Get response packet = new DatagramPacket(buf, buf.length); - socket.setSoTimeout(10*1000); + socket.setSoTimeout(timeout); socket.receive(packet); // Immediately record the incoming timestamp diff --git a/router/java/src/net/i2p/router/time/NtpMessage.java b/router/java/src/net/i2p/router/time/NtpMessage.java index 8a3aa0397..ea02cce5f 100644 --- a/router/java/src/net/i2p/router/time/NtpMessage.java +++ b/router/java/src/net/i2p/router/time/NtpMessage.java @@ -77,7 +77,7 @@ import net.i2p.util.RandomSource; class NtpMessage { /** * This is a two-bit code warning of an impending leap second to be - * inserted/deleted in the last minute of the current day. It's values + * inserted/deleted in the last minute of the current day. Its values * may be as follows: * * Value Meaning @@ -442,7 +442,13 @@ class NtpMessage { // or stratum-1 (primary) servers, this is a four-character ASCII // string, left justified and zero padded to 32 bits. if(stratum==0 || stratum==1) { - return new String(ref); + StringBuilder buf = new StringBuilder(4); + for (int i = 0; i < 4; i++) { + if (ref[i] == 0) + break; + buf.append((char) (ref[i] & 0xff)); + } + return buf.toString(); } // In NTP Version 3 secondary servers, this is the 32-bit IPv4 diff --git a/router/java/src/net/i2p/router/time/RouterTimestamper.java b/router/java/src/net/i2p/router/time/RouterTimestamper.java index 4d8892442..88d837a02 100644 --- a/router/java/src/net/i2p/router/time/RouterTimestamper.java +++ b/router/java/src/net/i2p/router/time/RouterTimestamper.java @@ -43,6 +43,9 @@ public class RouterTimestamper extends Timestamper { /** how many times do we have to query if we are changing the clock? */ private static final int DEFAULT_CONCURRING_SERVERS = 3; private static final int MAX_CONSECUTIVE_FAILS = 10; + private static final int DEFAULT_TIMEOUT = 10*1000; + private static final int SHORT_TIMEOUT = 5*1000; + private static final long MAX_WAIT_INITIALIZATION = 45*1000; public static final String PROP_QUERY_FREQUENCY = "time.queryFrequencyMs"; public static final String PROP_SERVER_LIST = "time.sntpServerList"; @@ -139,7 +142,7 @@ public class RouterTimestamper extends Timestamper { try { synchronized (this) { if (!_initialized) - wait(); + wait(MAX_WAIT_INITIALIZATION); } } catch (InterruptedException ie) {} } @@ -177,7 +180,7 @@ public class RouterTimestamper extends Timestamper { if (_log != null && _log.shouldDebug()) _log.debug("Querying servers " + servers); try { - lastFailed = !queryTime(servers.toArray(new String[servers.size()])); + lastFailed = !queryTime(servers.toArray(new String[servers.size()]), SHORT_TIMEOUT); } catch (IllegalArgumentException iae) { if (!lastFailed && _log != null && _log.shouldWarn()) _log.warn("Unable to reach any regional NTP servers: " + servers); @@ -192,7 +195,7 @@ public class RouterTimestamper extends Timestamper { if (_log != null && _log.shouldDebug()) _log.debug("Querying servers " + _servers); try { - lastFailed = !queryTime(_servers.toArray(new String[_servers.size()])); + lastFailed = !queryTime(_servers.toArray(new String[_servers.size()]), DEFAULT_TIMEOUT); } catch (IllegalArgumentException iae) { lastFailed = true; } @@ -259,18 +262,18 @@ public class RouterTimestamper extends Timestamper { /** * True if the time was queried successfully, false if it couldn't be */ - private boolean queryTime(String serverList[]) throws IllegalArgumentException { + private boolean queryTime(String serverList[], int perServerTimeout) throws IllegalArgumentException { long found[] = new long[_concurringServers]; long now = -1; int stratum = -1; long expectedDelta = 0; _wellSynced = false; for (int i = 0; i < _concurringServers; i++) { - if (i > 0) { - // this delays startup when net is disconnected or the timeserver list is bad, don't make it too long - try { Thread.sleep(2*1000); } catch (InterruptedException ie) {} - } - long[] timeAndStratum = NtpClient.currentTimeAndStratum(serverList); + //if (i > 0) { + // // this delays startup when net is disconnected or the timeserver list is bad, don't make it too long + // try { Thread.sleep(2*1000); } catch (InterruptedException ie) {} + //} + long[] timeAndStratum = NtpClient.currentTimeAndStratum(serverList, perServerTimeout); now = timeAndStratum[0]; stratum = (int) timeAndStratum[1]; long delta = now - _context.clock().now(); diff --git a/router/java/src/net/i2p/router/time/Zones.java b/router/java/src/net/i2p/router/time/Zones.java index 85d5e388e..d04c67408 100644 --- a/router/java/src/net/i2p/router/time/Zones.java +++ b/router/java/src/net/i2p/router/time/Zones.java @@ -10,6 +10,7 @@ import java.util.Locale; import java.util.Map; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.router.transport.GeoIP; /** @@ -105,7 +106,7 @@ class Zones { try { if (line.charAt(0) == '#') continue; - String[] s = line.split(","); + String[] s = DataHelper.split(line, ","); String ucContinent = s[1].toUpperCase(Locale.US).trim(); String zone = _continentToZone.get(ucContinent); if (zone == null) diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index a9b802060..7c1370222 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -155,23 +155,34 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } @Override - public boolean isBacklogged(Hash dest) { - return _manager.isBacklogged(dest); + public boolean isBacklogged(Hash peer) { + return _manager.isBacklogged(peer); } @Override - public boolean isEstablished(Hash dest) { - return _manager.isEstablished(dest); + public boolean isEstablished(Hash peer) { + return _manager.isEstablished(peer); } @Override - public boolean wasUnreachable(Hash dest) { - return _manager.wasUnreachable(dest); + public boolean wasUnreachable(Hash peer) { + return _manager.wasUnreachable(peer); } @Override - public byte[] getIP(Hash dest) { - return _manager.getIP(dest); + public byte[] getIP(Hash peer) { + return _manager.getIP(peer); + } + + /** + * Tell the comm system that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + @Override + public void mayDisconnect(Hash peer) { + _manager.mayDisconnect(peer); } @Override @@ -196,6 +207,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { * @deprecated unused */ @Override + @Deprecated public void recheckReachability() { _manager.recheckReachability(); } @Override @@ -499,7 +511,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { buf.append(""); boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; if (found) - buf.append(""); + buf.append(""); buf.append(h); if (found) buf.append(""); @@ -519,7 +531,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java index b650e5c03..209d7ba62 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java @@ -98,7 +98,7 @@ public class FIFOBandwidthLimiter { _lastStatsUpdated = now(); _refiller = new FIFOBandwidthRefiller(_context, this); _refillerThread = new I2PThread(_refiller, "BWRefiller", true); - _refillerThread.setPriority(I2PThread.NORM_PRIORITY-1); + _refillerThread.setPriority(I2PThread.NORM_PRIORITY + 1); _refillerThread.start(); } @@ -433,7 +433,7 @@ public class FIFOBandwidthLimiter { if (_log.shouldLog(Log.DEBUG)) _log.debug("Still denying the " + _pendingInboundRequests.size() + " pending inbound requests (status: " + getStatus().toString() - + ", longest waited " + locked_getLongestInboundWait() + " in)"); + + ", longest waited " + locked_getLongestInboundWait() + ')'); } } } @@ -505,7 +505,6 @@ public class FIFOBandwidthLimiter { */ private final void locked_satisfyInboundAvailable(List satisfied) { for (int i = 0; i < _pendingInboundRequests.size(); i++) { - if (_availableInbound.get() <= 0) break; SimpleRequest req = _pendingInboundRequests.get(i); long waited = now() - req.getRequestTime(); if (req.getAborted()) { @@ -520,17 +519,22 @@ public class FIFOBandwidthLimiter { i--; continue; } - if ( (req.getAllocationsSinceWait() > 0) && (req.getCompleteListener() == null) ) { + int avi = _availableInbound.get(); + if (avi <= 0) break; + // NO, don't do this, since SSU requires a full allocation to proceed. + // By stopping after a partial allocation, we stall SSU. + // This never affected NTCP (which also requires a full allocation) + // since it registers a CompleteListener, so getAllocationsSinceWait() was always zero. + //if (req.getAllocationsSinceWait() > 0) { // we have already allocated some values to this request, but // they haven't taken advantage of it yet (most likely they're // IO bound) // (also, the complete listener is only set for situations where // waitForNextAllocation() is never called) - continue; - } + // continue; + //} // ok, they are really waiting for us to give them stuff int requested = req.getPendingRequested(); - int avi = _availableInbound.get(); int allocated; if (avi >= requested) allocated = requested; @@ -579,7 +583,7 @@ public class FIFOBandwidthLimiter { if (_log.shouldLog(Log.INFO)) _log.info("Still denying the " + _pendingOutboundRequests.size() + " pending outbound requests (status: " + getStatus().toString() - + ", longest waited " + locked_getLongestOutboundWait() + " out)"); + + ", longest waited " + locked_getLongestOutboundWait() + ')'); } } } @@ -623,7 +627,6 @@ public class FIFOBandwidthLimiter { */ private final void locked_satisfyOutboundAvailable(List satisfied) { for (int i = 0; i < _pendingOutboundRequests.size(); i++) { - if (_availableOutbound.get() <= 0) break; SimpleRequest req = _pendingOutboundRequests.get(i); long waited = now() - req.getRequestTime(); if (req.getAborted()) { @@ -638,17 +641,22 @@ public class FIFOBandwidthLimiter { i--; continue; } - if (req.getAllocationsSinceWait() > 0) { + int avo = _availableOutbound.get(); + if (avo <= 0) break; + // NO, don't do this, since SSU requires a full allocation to proceed. + // By stopping after a partial allocation, we stall SSU. + // This never affected NTCP (which also requires a full allocation) + // since it registers a CompleteListener, so getAllocationsSinceWait() was always zero. + //if (req.getAllocationsSinceWait() > 0) { // we have already allocated some values to this request, but // they haven't taken advantage of it yet (most likely they're // IO bound) - if (_log.shouldLog(Log.WARN)) - _log.warn("multiple allocations since wait... ntcp shouldn't do this: " + req); - continue; - } + // if (_log.shouldLog(Log.WARN)) + // _log.warn("multiple allocations since wait... ntcp shouldn't do this: " + req); + // continue; + //} // ok, they are really waiting for us to give them stuff int requested = req.getPendingRequested(); - int avo = _availableOutbound.get(); int allocated; if (avo >= requested) allocated = requested; @@ -659,15 +667,6 @@ public class FIFOBandwidthLimiter { req.allocateBytes(allocated); satisfied.add(req); if (req.getPendingRequested() > 0) { - if (req.attachment() != null) { - if (_log.shouldLog(Log.INFO)) - _log.info("Allocating " + allocated + " bytes outbound as a partial grant to " - + req - + " waited " - + waited - + "ms) pending " + _pendingOutboundRequests.size() - + ", longest waited " + locked_getLongestOutboundWait() + " out"); - } if (_log.shouldLog(Log.DEBUG)) _log.debug("Allocating " + allocated + " bytes outbound as a partial grant to " + req @@ -676,15 +675,6 @@ public class FIFOBandwidthLimiter { + "ms) pending " + _pendingOutboundRequests.size() + ", longest waited " + locked_getLongestOutboundWait() + " out"); } else { - if (req.attachment() != null) { - if (_log.shouldLog(Log.INFO)) - _log.info("Allocating " + allocated + " bytes outbound to finish the partial grant to " - + req - + " waited " - + waited - + "ms) pending " + _pendingOutboundRequests.size() - + ", longest waited " + locked_getLongestOutboundWait() + " out)"); - } if (_log.shouldLog(Log.DEBUG)) _log.debug("Allocating " + allocated + " bytes outbound to finish the partial grant to " + req @@ -717,8 +707,8 @@ public class FIFOBandwidthLimiter { _availableInbound.addAndGet(0 - requested); _totalAllocatedInboundBytes.addAndGet(requested); } - if (_log.shouldLog(Log.INFO)) - _log.info("IB shortcut for " + requested + "B? " + rv); + //if (_log.shouldLog(Log.INFO)) + // _log.info("IB shortcut for " + requested + "B? " + rv); return rv; } @@ -739,8 +729,8 @@ public class FIFOBandwidthLimiter { _availableOutbound.addAndGet(0 - requested); _totalAllocatedOutboundBytes.addAndGet(requested); } - if (_log.shouldLog(Log.INFO)) - _log.info("OB shortcut for " + requested + "B? " + rv); + //if (_log.shouldLog(Log.INFO)) + // _log.info("OB shortcut for " + requested + "B? " + rv); return rv; } @@ -807,11 +797,19 @@ public class FIFOBandwidthLimiter { /** uses System clock, not context clock */ public long getRequestTime() { return _requestTime; } public int getTotalRequested() { return _total; } - public int getPendingRequested() { return _total - _allocated; } + public synchronized int getPendingRequested() { return _total - _allocated; } public boolean getAborted() { return _aborted; } - public void abort() { _aborted = true; } + public synchronized void abort() { + _aborted = true; + // so isComplete() will return true + _allocated = _total; + notifyAllocation(); + } public CompleteListener getCompleteListener() { return _lsnr; } + /** + * Only used by NTCP. + */ public void setCompleteListener(CompleteListener lsnr) { boolean complete = false; synchronized (this) { @@ -827,35 +825,44 @@ public class FIFOBandwidthLimiter { } } - private boolean isComplete() { return _allocated >= _total; } + private synchronized boolean isComplete() { return _allocated >= _total; } + /** + * Only used by SSU. + * May return without allocating. + * Check getPendingRequested() > 0 in a loop. + */ public void waitForNextAllocation() { - _waited = true; - _allocationsSinceWait = 0; boolean complete = false; try { synchronized (this) { + _waited = true; + _allocationsSinceWait = 0; if (isComplete()) complete = true; else - wait(); + wait(100); } } catch (InterruptedException ie) {} if (complete && _lsnr != null) _lsnr.complete(this); } - int getAllocationsSinceWait() { return _waited ? _allocationsSinceWait : 0; } + /** + * Only returns nonzero if there's no listener and waitForNextAllocation() + * has been called (i.e. SSU) + * Now unused. + */ + synchronized int getAllocationsSinceWait() { return _waited ? _allocationsSinceWait : 0; } - void allocateBytes(int bytes) { + /** + * Increments allocationsSinceWait only if there is a listener. + * Does not notify; caller must call notifyAllocation() + */ + synchronized void allocateBytes(int bytes) { _allocated += bytes; if (_lsnr == null) _allocationsSinceWait++; - //if (isComplete()) { - // if (_log.shouldLog(Log.INFO)) - // _log.info("allocate " + bytes + " completed, listener=" + _lsnr); - //} - //notifyAllocation(); // handled within the satisfy* methods } void notifyAllocation() { @@ -884,8 +891,8 @@ public class FIFOBandwidthLimiter { @Override public String toString() { - return "Req" + _requestId + " priority " + _priority + - _allocated + '/' + _total + " bytes"; + return "Req: " + _requestId + " priority: " + _priority + + ' ' + _allocated + '/' + _total + " bytes"; } } @@ -899,7 +906,11 @@ public class FIFOBandwidthLimiter { public int getTotalRequested(); /** how many bytes were requested and haven't yet been allocated? */ public int getPendingRequested(); - /** block until we are allocated some more bytes */ + /** + * Block until we are allocated some more bytes. + * May return without allocating. + * Check getPendingRequested() > 0 in a loop. + */ public void waitForNextAllocation(); /** we no longer want the data requested (the connection closed) */ public void abort(); diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java index 190c3b641..3ba1515af 100644 --- a/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java +++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthRefiller.java @@ -56,9 +56,9 @@ public class FIFOBandwidthRefiller implements Runnable { * of moving the default bandwidth class from L to M, or maybe * adjusting bandwidth class boundaries. */ - public static final int DEFAULT_OUTBOUND_BANDWIDTH = 40; + public static final int DEFAULT_OUTBOUND_BANDWIDTH = 60; public static final int DEFAULT_INBOUND_BURST_BANDWIDTH = 96; - public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 40; + public static final int DEFAULT_OUTBOUND_BURST_BANDWIDTH = 60; public static final int DEFAULT_BURST_SECONDS = 60; @@ -75,7 +75,7 @@ public class FIFOBandwidthRefiller implements Runnable { * Do not increase without adding a new Bloom filter size! * See util/DecayingBloomFilter and tunnel/BloomFilterIVValidator. */ - public static final int MAX_OUTBOUND_BANDWIDTH = 8192; + public static final int MAX_OUTBOUND_BANDWIDTH = 16384; /** * how often we replenish the queues. diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java index 3213be64e..6a2040164 100644 --- a/router/java/src/net/i2p/router/transport/GeoIP.java +++ b/router/java/src/net/i2p/router/transport/GeoIP.java @@ -17,6 +17,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicBoolean; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.router.Router; import net.i2p.router.RouterContext; @@ -209,7 +210,7 @@ public class GeoIP { if (line.charAt(0) == '#') { continue; } - String[] s = line.split(","); + String[] s = DataHelper.split(line, ","); String lc = s[0].toLowerCase(Locale.US); _codeToName.put(lc, s[1]); _codeCache.put(lc, lc); @@ -274,7 +275,7 @@ public class GeoIP { if (buf.charAt(0) == '#') { continue; } - String[] s = buf.split(","); + String[] s = DataHelper.split(buf, ","); long ip1 = Long.parseLong(s[0]); long ip2 = Long.parseLong(s[1]); while (idx < search.length && search[idx].longValue() < ip1) { diff --git a/router/java/src/net/i2p/router/transport/GeoIPv6.java b/router/java/src/net/i2p/router/transport/GeoIPv6.java index b93e3f004..af3120480 100644 --- a/router/java/src/net/i2p/router/transport/GeoIPv6.java +++ b/router/java/src/net/i2p/router/transport/GeoIPv6.java @@ -170,7 +170,7 @@ class GeoIPv6 { if (buf.charAt(0) == '#') { continue; } - String[] s = buf.split(","); + String[] s = DataHelper.split(buf, ","); String ips1 = s[0].replace("\"", "").trim(); String ips2 = s[1].replace("\"", "").trim(); byte[] ip1 = InetAddress.getByName(ips1).getAddress(); diff --git a/router/java/src/net/i2p/router/transport/GetBidsJob.java b/router/java/src/net/i2p/router/transport/GetBidsJob.java index 676f72e16..aaa50ee45 100644 --- a/router/java/src/net/i2p/router/transport/GetBidsJob.java +++ b/router/java/src/net/i2p/router/transport/GetBidsJob.java @@ -58,7 +58,7 @@ class GetBidsJob extends JobImpl { Hash us = context.routerHash(); if (to.equals(us)) { if (log.shouldLog(Log.ERROR)) - log.error("wtf, send a message to ourselves? nuh uh. msg = " + msg); + log.error("send a message to ourselves? nuh uh. msg = " + msg); context.statManager().addRateData("transport.bidFailSelf", msg.getLifetime()); fail(context, msg); return; diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java index 584da497f..9a5661b5f 100644 --- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java +++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java @@ -96,6 +96,7 @@ public class OutboundMessageRegistry { * @return non-null List of OutNetMessage describing messages that were waiting for * the payload */ + @SuppressWarnings("unchecked") public List getOriginalMessages(I2NPMessage message) { List matchedSelectors = null; List removedSelectors = null; @@ -193,11 +194,12 @@ public class OutboundMessageRegistry { /** * @param allowEmpty is msg.getMessage() allowed to be null? */ + @SuppressWarnings("unchecked") private void registerPending(OutNetMessage msg, boolean allowEmpty) { if ( (!allowEmpty) && (msg.getMessage() == null) ) - throw new IllegalArgumentException("OutNetMessage doesn't contain an I2NPMessage? wtf"); + throw new IllegalArgumentException("OutNetMessage doesn't contain an I2NPMessage? Impossible?"); MessageSelector sel = msg.getReplySelector(); - if (sel == null) throw new IllegalArgumentException("No reply selector? wtf"); + if (sel == null) throw new IllegalArgumentException("No reply selector? Impossible?"); if (!_activeMessages.add(msg)) return; // dont add dups @@ -229,6 +231,7 @@ public class OutboundMessageRegistry { /** * @param msg may be be null */ + @SuppressWarnings("unchecked") public void unregisterPending(OutNetMessage msg) { if (msg == null) return; MessageSelector sel = msg.getReplySelector(); @@ -255,6 +258,7 @@ public class OutboundMessageRegistry { public void renderStatusHTML(Writer out) throws IOException {} private class CleanupTask extends SimpleTimer2.TimedEvent { + /** LOCKING: _selectors */ private long _nextExpire; public CleanupTask() { @@ -262,6 +266,7 @@ public class OutboundMessageRegistry { _nextExpire = -1; } + @SuppressWarnings("unchecked") public void timeReached() { long now = _context.clock().now(); List removing = new ArrayList(8); @@ -321,21 +326,28 @@ public class OutboundMessageRegistry { if (log) { int e = removing.size(); - int r = _selectors.size(); + int r; + synchronized(_selectors) { + r = _selectors.size(); + } int a = _activeMessages.size(); if (r > 0 || e > 0 || a > 0) _log.debug("Expired: " + e + " remaining: " + r + " active: " + a); } - if (_nextExpire <= now) - _nextExpire = now + 10*1000; - schedule(_nextExpire - now); + synchronized(_selectors) { + if (_nextExpire <= now) + _nextExpire = now + 10*1000; + schedule(_nextExpire - now); + } } public void scheduleExpiration(MessageSelector sel) { long now = _context.clock().now(); - if ( (_nextExpire <= now) || (sel.getExpiration() < _nextExpire) ) { - _nextExpire = sel.getExpiration(); - reschedule(_nextExpire - now); + synchronized(_selectors) { + if ( (_nextExpire <= now) || (sel.getExpiration() < _nextExpire) ) { + _nextExpire = sel.getExpiration(); + reschedule(_nextExpire - now); + } } } } diff --git a/router/java/src/net/i2p/router/transport/Transport.java b/router/java/src/net/i2p/router/transport/Transport.java index a9c03b2ee..41c19211c 100644 --- a/router/java/src/net/i2p/router/transport/Transport.java +++ b/router/java/src/net/i2p/router/transport/Transport.java @@ -171,4 +171,12 @@ public interface Transport { public boolean isUnreachable(Hash peer); public boolean isEstablished(Hash peer); + + /** + * Tell the transport that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + public void mayDisconnect(Hash peer); } diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index df536c42c..c284269ef 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -141,9 +141,10 @@ public abstract class TransportImpl implements Transport { else // shouldn't happen maxProp = "i2np." + style.toLowerCase(Locale.US) + ".maxConnections"; int def = MAX_CONNECTION_FACTOR; - RouterInfo ri = _context.router().getRouterInfo(); - if (ri != null) { - char bw = ri.getBandwidthTier().charAt(0); + // get it from here, not the RI, to avoid deadlock + String caps = _context.router().getCapabilities(); + + char bw = caps.charAt(0); switch (bw) { case Router.CAPABILITY_BW12: case 'u': // unknown @@ -168,7 +169,7 @@ public abstract class TransportImpl implements Transport { def *= 12; break; } - } + if (_context.netDb().floodfillEnabled()) { // && !SystemVersion.isWindows()) { def *= 17; def /= 10; // 425 for Class O ff @@ -373,9 +374,9 @@ public abstract class TransportImpl implements Transport { + "): " + allTime + "ms/" + sendTime + "ms after failing on: " + msg.getFailedTransports() + " and succeeding on " + getStyle()); if ( (allTime > 60*1000) && (sendSuccessful) ) { - // WTF!!@# + // VERY slow if (_log.shouldLog(Log.WARN)) - _log.warn("WTF, more than a minute slow? " + msg.getMessageType() + _log.warn("Severe latency? More than a minute slow? " + msg.getMessageType() + " of id " + msg.getMessageId() + " (send begin on " + new Date(msg.getSendBegin()) + " / created on " + new Date(msg.getCreated()) + "): " + msg); @@ -497,7 +498,7 @@ public abstract class TransportImpl implements Transport { _listener.messageReceived(inMsg, remoteIdent, remoteIdentHash); } else { if (_log.shouldLog(Log.ERROR)) - _log.error("WTF! Null listener! this = " + toString(), new Exception("Null listener")); + _log.error("Null listener! this = " + toString(), new Exception("Null listener")); } } @@ -747,13 +748,11 @@ public abstract class TransportImpl implements Transport { * This can be called before startListening() to set an initial address, * or after the transport is running. * - * This implementation does nothing. Transports should override if they want notification. - * * @param source defined in Transport.java * @param ip typ. IPv4 or IPv6 non-local; may be null to indicate IPv4 failure or port info only * @param port 0 for unknown or unchanged */ - public void externalAddressReceived(AddressSource source, byte[] ip, int port) {} + public abstract void externalAddressReceived(AddressSource source, byte[] ip, int port); /** * Notify a transport of an external address change. @@ -810,6 +809,7 @@ public abstract class TransportImpl implements Transport { /** * @deprecated unused */ + @Deprecated public void recheckReachability() {} /** @@ -819,8 +819,16 @@ public abstract class TransportImpl implements Transport { return TransportUtil.isIPv4Firewalled(_context, getStyle()); } - public boolean isBacklogged(Hash dest) { return false; } - public boolean isEstablished(Hash dest) { return false; } + public boolean isBacklogged(Hash peer) { return false; } + public boolean isEstablished(Hash peer) { return false; } + + /** + * Tell the transport that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + public void mayDisconnect(Hash peer) {} public boolean isUnreachable(Hash peer) { long now = _context.clock().now(); @@ -983,7 +991,7 @@ public abstract class TransportImpl implements Transport { * Translate * @since 0.9.8 moved from transports */ - protected String _(String s) { + protected String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } @@ -991,7 +999,7 @@ public abstract class TransportImpl implements Transport { * Translate * @since 0.9.8 moved from transports */ - protected String _(String s, Object o) { + protected String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index e5240d6a2..80888ead7 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -407,35 +407,48 @@ public class TransportManager implements TransportEventListener { /** * @deprecated unused */ + @Deprecated public void recheckReachability() { for (Transport t : _transports.values()) t.recheckReachability(); } - public boolean isBacklogged(Hash dest) { + public boolean isBacklogged(Hash peer) { for (Transport t : _transports.values()) { - if (t.isBacklogged(dest)) + if (t.isBacklogged(peer)) return true; } return false; } - public boolean isEstablished(Hash dest) { + public boolean isEstablished(Hash peer) { for (Transport t : _transports.values()) { - if (t.isEstablished(dest)) + if (t.isEstablished(peer)) return true; } return false; } + /** + * Tell the transports that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + public void mayDisconnect(Hash peer) { + for (Transport t : _transports.values()) { + t.mayDisconnect(peer); + } + } + /** * Was the peer UNreachable (outbound only) on any transport, * based on the last time we tried it for each transport? * This is NOT reset if the peer contacts us. */ - public boolean wasUnreachable(Hash dest) { + public boolean wasUnreachable(Hash peer) { for (Transport t : _transports.values()) { - if (!t.wasUnreachable(dest)) + if (!t.wasUnreachable(peer)) return false; } return true; @@ -452,8 +465,8 @@ public class TransportManager implements TransportEventListener { * * @return IPv4 or IPv6 or null */ - public byte[] getIP(Hash dest) { - return TransportImpl.getIP(dest); + public byte[] getIP(Hash peer) { + return TransportImpl.getIP(peer); } /** @@ -530,7 +543,7 @@ public class TransportManager implements TransportEventListener { if (msg == null) throw new IllegalArgumentException("Null message? no bidding on a null outNetMessage!"); if (_context.router().getRouterInfo().equals(msg.getTarget())) - throw new IllegalArgumentException("WTF, bids for a message bound to ourselves?"); + throw new IllegalArgumentException("Bids for a message bound to ourselves?"); List rv = new ArrayList(_transports.size()); Set failedTransports = msg.getFailedTransports(); @@ -671,9 +684,9 @@ public class TransportManager implements TransportEventListener { public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { if (_context.getBooleanProperty(PROP_ADVANCED)) { out.write("

              "); - out.write(_("Status")); + out.write(_t("Status")); out.write(": "); - out.write(_(getReachabilityStatus().toStatusString())); + out.write(_t(getReachabilityStatus().toStatusString())); out.write("

              "); } TreeMap transports = new TreeMap(); @@ -689,7 +702,7 @@ public class TransportManager implements TransportEventListener { } StringBuilder buf = new StringBuilder(4*1024); - buf.append("

              ").append(_("Router Transport Addresses")).append("

              \n");
              +        buf.append("

              ").append(_t("Router Transport Addresses")).append("

              \n");
                       for (Transport t : _transports.values()) {
                           if (t.hasCurrentAddress()) {
                               for (RouterAddress ra : t.getCurrentAddresses()) {
              @@ -697,7 +710,7 @@ public class TransportManager implements TransportEventListener {
                                   buf.append("\n\n");
                               }
                           } else {
              -                buf.append(_("{0} is used for outbound connections only", t.getStyle()));
              +                buf.append(_t("{0} is used for outbound connections only", t.getStyle()));
                               buf.append("\n\n");
                           }
                       }
              @@ -708,7 +721,7 @@ public class TransportManager implements TransportEventListener {
                       } else if (_upnpManager != null) {
                           out.write(_upnpManager.renderStatusHTML());
                       } else {
              -            out.write("

              " + _("UPnP is not enabled") + "

              \n"); + out.write("

              " + _t("UPnP is not enabled") + "

              \n"); } out.write("

              \n"); out.flush(); @@ -717,38 +730,38 @@ public class TransportManager implements TransportEventListener { private final String getTransportsLegend() { StringBuilder buf = new StringBuilder(1024); - buf.append("

              ").append(_("Help")).append("

              ") - .append(_("Your transport connection limits are automatically set based on your configured bandwidth.")) + buf.append("

              ").append(_t("Help")).append("

              ") + .append(_t("Your transport connection limits are automatically set based on your configured bandwidth.")) .append('\n') - .append(_("To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page.")) + .append(_t("To override these limits, add the settings i2np.ntcp.maxConnections=nnn and i2np.udp.maxConnections=nnn on the advanced configuration page.")) .append("

              \n"); - buf.append("

              ").append(_("Definitions")).append("

              " + - "

              ").append(_("Peer")).append(": ").append(_("The remote peer, identified by router hash")).append("
              \n" + - "").append(_("Dir")).append(": " + - "\"Inbound\" ").append(_("Inbound connection")).append("
              \n" + + buf.append("

              ").append(_t("Definitions")).append("

              " + + "

              ").append(_t("Peer")).append(": ").append(_t("The remote peer, identified by router hash")).append("
              \n" + + "").append(_t("Dir")).append(": " + + "\"Inbound\" ").append(_t("Inbound connection")).append("
              \n" + "       " + - "\"Outbound\" ").append(_("Outbound connection")).append("
              \n" + + "\"Outbound\" ").append(_t("Outbound connection")).append("
              \n" + "       " + - "\"V\" ").append(_("They offered to introduce us (help other peers traverse our firewall)")).append("
              \n" + + "\"V\" ").append(_t("They offered to introduce us (help other peers traverse our firewall)")).append("
              \n" + "       " + - "\"^\" ").append(_("We offered to introduce them (help other peers traverse their firewall)")).append("
              \n" + - "").append(_("Idle")).append(": ").append(_("How long since a packet has been received / sent")).append("
              \n" + - "").append(_("In/Out")).append(": ").append(_("The smoothed inbound / outbound transfer rate (KBytes per second)")).append("
              \n" + - "").append(_("Up")).append(": ").append(_("How long ago this connection was established")).append("
              \n" + - "").append(_("Skew")).append(": ").append(_("The difference between the peer's clock and your own")).append("
              \n" + - "CWND: ").append(_("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" /
              \n" + - "        ").append(_("The number of sent messages awaiting acknowledgement")).append(" /
              \n" + - "        ").append(_("The maximum number of concurrent messages to send")).append(" /
              \n"+ - "        ").append(_("The number of pending sends which exceed congestion window")).append("
              \n" + - "SST: ").append(_("The slow start threshold")).append("
              \n" + - "RTT: ").append(_("The round trip time in milliseconds")).append("
              \n" + - //"").append(_("Dev")).append(": ").append(_("The standard deviation of the round trip time in milliseconds")).append("
              \n" + - "RTO: ").append(_("The retransmit timeout in milliseconds")).append("
              \n" + - "MTU: ").append(_("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("
              \n" + - "").append(_("TX")).append(": ").append(_("The total number of packets sent to the peer")).append("
              \n" + - "").append(_("RX")).append(": ").append(_("The total number of packets received from the peer")).append("
              \n" + - "").append(_("Dup TX")).append(": ").append(_("The total number of packets retransmitted to the peer")).append("
              \n" + - "").append(_("Dup RX")).append(": ").append(_("The total number of duplicate packets received from the peer")).append("

              " + + "\"^\" ").append(_t("We offered to introduce them (help other peers traverse their firewall)")).append("
              \n" + + "").append(_t("Idle")).append(": ").append(_t("How long since a packet has been received / sent")).append("
              \n" + + "").append(_t("In/Out")).append(": ").append(_t("The smoothed inbound / outbound transfer rate (KBytes per second)")).append("
              \n" + + "").append(_t("Up")).append(": ").append(_t("How long ago this connection was established")).append("
              \n" + + "").append(_t("Skew")).append(": ").append(_t("The difference between the peer's clock and your own")).append("
              \n" + + "CWND: ").append(_t("The congestion window, which is how many bytes can be sent without an acknowledgement")).append(" /
              \n" + + "        ").append(_t("The number of sent messages awaiting acknowledgement")).append(" /
              \n" + + "        ").append(_t("The maximum number of concurrent messages to send")).append(" /
              \n"+ + "        ").append(_t("The number of pending sends which exceed congestion window")).append("
              \n" + + "SST: ").append(_t("The slow start threshold")).append("
              \n" + + "RTT: ").append(_t("The round trip time in milliseconds")).append("
              \n" + + //"").append(_t("Dev")).append(": ").append(_t("The standard deviation of the round trip time in milliseconds")).append("
              \n" + + "RTO: ").append(_t("The retransmit timeout in milliseconds")).append("
              \n" + + "MTU: ").append(_t("Current maximum send packet size / estimated maximum receive packet size (bytes)")).append("
              \n" + + "").append(_t("TX")).append(": ").append(_t("The total number of messages sent to the peer")).append("
              \n" + + "").append(_t("RX")).append(": ").append(_t("The total number of messages received from the peer")).append("
              \n" + + "").append(_t("Dup TX")).append(": ").append(_t("The total number of packets retransmitted to the peer")).append("
              \n" + + "").append(_t("Dup RX")).append(": ").append(_t("The total number of duplicate packets received from the peer")).append("

              " + "
              \n"); return buf.toString(); } @@ -770,14 +783,14 @@ public class TransportManager implements TransportEventListener { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o) { + private final String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } } diff --git a/router/java/src/net/i2p/router/transport/TransportUtil.java b/router/java/src/net/i2p/router/transport/TransportUtil.java index 3ca7e8a2e..c583a21e3 100644 --- a/router/java/src/net/i2p/router/transport/TransportUtil.java +++ b/router/java/src/net/i2p/router/transport/TransportUtil.java @@ -98,7 +98,7 @@ public abstract class TransportUtil { */ public static boolean isIPv6(RouterAddress addr) { // do this the fast way, without calling getIP() to parse the host string - String host = addr.getOption(RouterAddress.PROP_HOST); + String host = addr.getHost(); return host != null && host.contains(":"); } @@ -134,6 +134,7 @@ public abstract class TransportUtil { int a1 = addr[1] & 0xFF; // Carrier Grade NAT RFC 6598 if (a0 == 100 && a1 >= 64 && a1 <= 127) return false; + // DHCP autoconfig RFC 3927 if (a0 == 169 && a1 == 254) return false; if (a0 == 172 && a1 >= 16 && a1 <= 31) return false; if (a0 == 192) { diff --git a/router/java/src/net/i2p/router/transport/UPnP.java b/router/java/src/net/i2p/router/transport/UPnP.java index 6753c09fc..58cc32c75 100644 --- a/router/java/src/net/i2p/router/transport/UPnP.java +++ b/router/java/src/net/i2p/router/transport/UPnP.java @@ -4,9 +4,9 @@ package net.i2p.router.transport; import java.net.InetAddress; -import java.net.MalformedURLException; import java.net.UnknownHostException; -import java.net.URL; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -19,6 +19,7 @@ import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.util.Addresses; +import net.i2p.util.I2PThread; import net.i2p.util.Log; import net.i2p.util.Translate; @@ -223,7 +224,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { boolean ignore = false; String toIgnore = _context.getProperty(PROP_IGNORE); if (toIgnore != null) { - String[] ignores = toIgnore.split("[,; \r\n\t]"); + String[] ignores = DataHelper.split(toIgnore, "[,; \r\n\t]"); for (int i = 0; i < ignores.length; i++) { if (ignores[i].equals(udn)) { ignore = true; @@ -475,7 +476,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { ServiceStateTable table; try { table = serv.getServiceStateTable(); - } catch (Exception e) { + } catch (RuntimeException e) { // getSCPDNode() returns null, // NPE at org.cybergarage.upnp.Service.getServiceStateTable(Service.java:526) sb.append(" : no state"); @@ -557,68 +558,68 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { for(int i=0; i").append(_("Service")).append(": "); + sb.append("
            3. ").append(_t("Service")).append(": "); // NOTE: Group all toString() of common actions together // to avoid excess fetches, since toString() caches. if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ - sb.append(_("WAN Common Interface Configuration")); - sb.append("
              • ").append(_("Status")).append(": ") + sb.append(_t("WAN Common Interface Configuration")); + sb.append("
                • ").append(_t("Status")).append(": ") .append(toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); - sb.append("
                • ").append(_("Type")).append(": ") + sb.append("
                • ").append(_t("Type")).append(": ") .append(toString("GetCommonLinkProperties", "NewWANAccessType", serv)); - sb.append("
                • ").append(_("Upstream")).append(": ") + sb.append("
                • ").append(_t("Upstream")).append(": ") .append(toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); - sb.append("
                • ").append(_("Downstream")).append(": ") + sb.append("
                • ").append(_t("Downstream")).append(": ") .append(toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv)) .append("
                • "); }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ - sb.append(_("WAN PPP Connection")); - sb.append("
                  • ").append(_("Status")).append(": ") + sb.append(_t("WAN PPP Connection")); + sb.append("
                    • ").append(_t("Status")).append(": ") .append(toString("GetStatusInfo", "NewConnectionStatus", serv)); String up = toString("GetStatusInfo", "NewUptime", serv); if (up != null) { try { long uptime = Long.parseLong(up); uptime *= 1000; - sb.append("
                    • ").append(_("Uptime")).append(": ") + sb.append("
                    • ").append(_t("Uptime")).append(": ") .append(DataHelper.formatDuration2(uptime)); } catch (NumberFormatException nfe) {} } - sb.append("
                    • ").append(_("Type")).append(": ") + sb.append("
                    • ").append(_t("Type")).append(": ") .append(toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
                    • ").append(_("Upstream")).append(": ") + sb.append("
                    • ").append(_t("Upstream")).append(": ") .append(toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); - sb.append("
                    • ").append(_("Downstream")).append(": ") + sb.append("
                    • ").append(_t("Downstream")).append(": ") .append(toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "
                      "); - sb.append("
                    • ").append(_("External IP")).append(": ") + sb.append("
                    • ").append(_t("External IP")).append(": ") .append(toString("GetExternalIPAddress", "NewExternalIPAddress", serv)) .append("
                    • "); }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ - sb.append(_("Layer 3 Forwarding")); - sb.append("
                      • ").append(_("Default Connection Service")).append(": ") + sb.append(_t("Layer 3 Forwarding")); + sb.append("
                        • ").append(_t("Default Connection Service")).append(": ") .append(toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)) .append("
                        • "); }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ - sb.append(_("WAN IP Connection")); - sb.append("
                          • ").append(_("Status")).append(": ") + sb.append(_t("WAN IP Connection")); + sb.append("
                            • ").append(_t("Status")).append(": ") .append(toString("GetStatusInfo", "NewConnectionStatus", serv)); String up = toString("GetStatusInfo", "NewUptime", serv); if (up != null) { try { long uptime = Long.parseLong(up); uptime *= 1000; - sb.append("
                            • ").append(_("Uptime")).append(": ") + sb.append("
                            • ").append(_t("Uptime")).append(": ") .append(DataHelper.formatDuration2(uptime)); } catch (NumberFormatException nfe) {} } - sb.append("
                            • ").append(_("Type")).append(": ") + sb.append("
                            • ").append(_t("Type")).append(": ") .append(toString("GetConnectionTypeInfo", "NewConnectionType", serv)); - sb.append("
                            • ").append(_("External IP")).append(": ") + sb.append("
                            • ").append(_t("External IP")).append(": ") .append(toString("GetExternalIPAddress", "NewExternalIPAddress", serv)) .append("
                            • "); }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ - sb.append(_("WAN Ethernet Link Configuration")); - sb.append("
                              • ").append(_("Status")).append(": ") + sb.append(_t("WAN Ethernet Link Configuration")); + sb.append("
                                • ").append(_t("Status")).append(": ") .append(toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv)) .append("
                                • "); } else { @@ -638,9 +639,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private void listSubDev(String prefix, Device dev, StringBuilder sb){ if (prefix == null) - sb.append("

                                  ").append(_("Found Device")).append(": "); + sb.append("

                                  ").append(_t("Found Device")).append(": "); else - sb.append("

                                • ").append(_("Subdevice")).append(": "); + sb.append("
                                • ").append(_t("Subdevice")).append(": "); sb.append(DataHelper.escapeHTML(dev.getFriendlyName())); if (prefix == null) sb.append("

                                  "); @@ -661,11 +662,11 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { /** warning - slow */ public String renderStatusHTML() { final StringBuilder sb = new StringBuilder(); - sb.append("

                                  ").append(_("UPnP Status")).append("

                                  "); + sb.append("

                                  ").append(_t("UPnP Status")).append("

                                  "); synchronized(_otherUDNs) { if (!_otherUDNs.isEmpty()) { - sb.append(_("Disabled UPnP Devices")); + sb.append(_t("Disabled UPnP Devices")); sb.append("
                                    "); for (Map.Entry e : _otherUDNs.entrySet()) { String udn = e.getKey(); @@ -679,10 +680,10 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { } if(isDisabled) { - sb.append(_("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); + sb.append(_t("UPnP has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?")); return sb.toString(); } else if(!isNATPresent()) { - sb.append(_("UPnP has not found any UPnP-aware, compatible device on your LAN.")); + sb.append(_t("UPnP has not found any UPnP-aware, compatible device on your LAN.")); return sb.toString(); } @@ -690,15 +691,15 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { String addr = getNATAddress(); sb.append("

                                    "); if (addr != null) - sb.append(_("The current external IP address reported by UPnP is {0}", DataHelper.escapeHTML(addr))); + sb.append(_t("The current external IP address reported by UPnP is {0}", DataHelper.escapeHTML(addr))); else - sb.append(_("The current external IP address is not available.")); + sb.append(_t("The current external IP address is not available.")); int downstreamMaxBitRate = getDownstreamMaxBitRate(); int upstreamMaxBitRate = getUpstreamMaxBitRate(); if(downstreamMaxBitRate > 0) - sb.append("
                                    ").append(_("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); + sb.append("
                                    ").append(_t("UPnP reports the maximum downstream bit rate is {0}bits/sec", DataHelper.formatSize2(downstreamMaxBitRate))); if(upstreamMaxBitRate > 0) - sb.append("
                                    ").append(_("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); + sb.append("
                                    ").append(_t("UPnP reports the maximum upstream bit rate is {0}bits/sec", DataHelper.formatSize2(upstreamMaxBitRate))); synchronized(lock) { for(ForwardPort port : portsToForward) { sb.append("
                                    "); @@ -706,9 +707,9 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { // {0} is TCP or UDP // {1,number,#####} prevents 12345 from being output as 12,345 in the English locale. // If you want the digit separator in your locale, translate as {1}. - sb.append(_("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); + sb.append(_t("{0} port {1,number,#####} was successfully forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); else - sb.append(_("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); + sb.append(_t("{0} port {1,number,#####} was not forwarded by UPnP.", protoToString(port.protocol), port.portNumber)); } } @@ -822,17 +823,17 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { String him = _router.getURLBase(); if (him != null && him.length() > 0) { try { - URL url = new URL(him); + URI url = new URI(him); hisIP = url.getHost(); - } catch (MalformedURLException mue) {} + } catch (URISyntaxException use) {} } if (hisIP == null) { him = _router.getLocation(); if (him != null && him.length() > 0) { try { - URL url = new URL(him); + URI url = new URI(him); hisIP = url.getHost(); - } catch (MalformedURLException mue) {} + } catch (URISyntaxException use) {} } } if (hisIP == null) @@ -994,7 +995,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { } if (_log.shouldLog(Log.INFO)) _log.info("Starting thread to forward " + portsToForwardNow.size() + " ports"); - Thread t = new Thread(new RegisterPortsThread(portsToForwardNow)); + Thread t = new I2PThread(new RegisterPortsThread(portsToForwardNow)); t.setName("UPnP Port Opener " + __id.incrementAndGet()); t.setDaemon(true); t.start(); @@ -1034,7 +1035,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { private void unregisterPorts(Set portsToForwardNow) { if (_log.shouldLog(Log.INFO)) _log.info("Starting thread to un-forward " + portsToForwardNow.size() + " ports"); - Thread t = new Thread(new UnregisterPortsThread(portsToForwardNow)); + Thread t = new I2PThread(new UnregisterPortsThread(portsToForwardNow)); t.setName("UPnP Port Closer " + __id.incrementAndGet()); t.setDaemon(true); t.start(); @@ -1067,9 +1068,16 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { I2PAppContext ctx = new I2PAppContext(props); UPnP upnp = new UPnP(ctx); ControlPoint cp = new ControlPoint(); - System.out.println("Searching for UPnP devices:"); + long start = System.currentTimeMillis(); cp.start(); + long s2 = System.currentTimeMillis(); + System.out.println("Start took " + (s2 - start)); + System.out.println("Searching for UPnP devices"); + start = System.currentTimeMillis(); cp.search(); + s2 = System.currentTimeMillis(); + System.out.println("Search kickoff took " + (s2 - start)); + System.out.println("Waiting 10 seconds for responses"); Thread.sleep(10000); //while(true) { DeviceList list = cp.getDeviceList(); @@ -1081,7 +1089,7 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { Device device = it.next(); upnp.listSubDev(device.toString(), device, sb); System.out.println("Here is the listing for device " + (++i) + - ' ' + device.getFriendlyName() + " :"); + ": " + device.getFriendlyName() + " :"); System.out.println(sb.toString()); sb.setLength(0); } @@ -1094,21 +1102,21 @@ class UPnP extends ControlPoint implements DeviceChangeListener, EventListener { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o) { + private final String _t(String s, Object o) { return Translate.getString(s, o, _context, BUNDLE_NAME); } /** * Translate */ - private final String _(String s, Object o, Object o2) { + private final String _t(String s, Object o, Object o2) { return Translate.getString(s, o, o2, _context, BUNDLE_NAME); } } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index a1ad8db3a..cd9963b06 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -37,7 +37,8 @@ class UPnPManager { private volatile boolean _isRunning; private volatile boolean _shouldBeRunning; private volatile long _lastRescan; - private volatile boolean _errorLogged; + private boolean _errorLogged; + private boolean _disconLogged; private InetAddress _detectedAddress; private final TransportManager _manager; private final SimpleTimer2.TimedEvent _rescanner; @@ -87,7 +88,7 @@ class UPnPManager { _isRunning = _upnp.runPlugin(); if (_log.shouldLog(Log.INFO)) _log.info("UPnP runPlugin took " + (_context.clock().now() - b)); - } catch (Exception e) { + } catch (RuntimeException e) { // NPE in UPnP (ticket #728), can't let it bring us down if (!_errorLogged) { _log.error("UPnP error, please report", e); @@ -103,10 +104,14 @@ class UPnPManager { _rescanner.schedule(RESCAN_SHORT_DELAY); // Do we have a non-loopback, non-broadcast address? // If not, that's why it failed (HTTPServer won't start) - if (!Addresses.isConnected()) - _log.logAlways(Log.WARN, "UPnP start failed - no network connection?"); - else + if (!Addresses.isConnected()) { + if (!_disconLogged) { + _log.logAlways(Log.WARN, "UPnP start failed - no network connection?"); + _disconLogged = true; + } + } else { _log.error("UPnP start failed - port conflict?"); + } } } @@ -228,7 +233,17 @@ class UPnPManager { public void portForwardStatus(Map statuses) { if (_log.shouldLog(Log.DEBUG)) _log.debug("UPnP Callback:"); + // Let's not have two of these running at once. + // Deadlock reported in ticket #1699 + // and the locking isn't foolproof in UDPTransport. + // UPnP runs the callbacks in a thread, so we can block. + // There is only one UPnPCallback, so lock on this + synchronized(this) { + locked_PFS(statuses); + } + } + private void locked_PFS(Map statuses) { byte[] ipaddr = null; DetectedIP[] ips = _upnp.getAddress(); if (ips != null) { @@ -239,6 +254,7 @@ class UPnPManager { _log.debug("External address: " + ip.publicAddress + " type: " + ip.natType); if (!ip.publicAddress.equals(_detectedAddress)) { _detectedAddress = ip.publicAddress; + // deadlock path 1 _manager.externalAddressReceived(SOURCE_UPNP, _detectedAddress.getAddress(), 0); } ipaddr = ip.publicAddress.getAddress(); @@ -264,6 +280,7 @@ class UPnPManager { else continue; boolean success = fps.status >= ForwardPortStatus.MAYBE_SUCCESS; + // deadlock path 2 _manager.forwardPortStatus(style, ipaddr, fp.portNumber, fps.externalPort, success, fps.reasonString); } } @@ -275,7 +292,7 @@ class UPnPManager { */ public String renderStatusHTML() { if (!_isRunning) - return "

                                    " + _("UPnP is not enabled") + "

                                    \n"; + return "

                                    " + _t("UPnP is not enabled") + "

                                    \n"; return _upnp.renderStatusHTML(); } @@ -284,7 +301,7 @@ class UPnPManager { /** * Translate */ - private final String _(String s) { + private final String _t(String s) { return Translate.getString(s, _context, BUNDLE_NAME); } diff --git a/router/java/src/net/i2p/router/transport/crypto/DHSessionKeyBuilder.java b/router/java/src/net/i2p/router/transport/crypto/DHSessionKeyBuilder.java index a30215ce3..1b09e2d62 100644 --- a/router/java/src/net/i2p/router/transport/crypto/DHSessionKeyBuilder.java +++ b/router/java/src/net/i2p/router/transport/crypto/DHSessionKeyBuilder.java @@ -470,7 +470,8 @@ public class DHSessionKeyBuilder { _log.debug("DH Precalc (minimum: " + _minSize + " max: " + _maxSize + ", delay: " + _calcDelay + ")"); _builders = new LinkedBlockingQueue(_maxSize); - setPriority(Thread.MIN_PRIORITY); + if (!SystemVersion.isWindows()) + setPriority(Thread.NORM_PRIORITY - 1); } /** @@ -504,9 +505,10 @@ public class DHSessionKeyBuilder { break; long curCalc = System.currentTimeMillis() - curStart; // for some relief... - try { - Thread.sleep(Math.min(200, Math.max(10, _calcDelay + (curCalc * 3)))); - } catch (InterruptedException ie) { // nop + if (!interrupted()) { + try { + Thread.sleep(Math.min(200, Math.max(10, _calcDelay + (curCalc * 3)))); + } catch (InterruptedException ie) {} } } } @@ -540,6 +542,8 @@ public class DHSessionKeyBuilder { if (_log.shouldLog(Log.INFO)) _log.info("No more builders, creating one now"); _context.statManager().addRateData("crypto.DHEmpty", 1); builder = precalc(); + // stop sleeping, wake up, make some more + this.interrupt(); } return builder; } diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index 053d4a373..c90a51b89 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -85,6 +85,7 @@ class EventPumper implements Runnable { /** tunnel test now disabled, but this should be long enough to allow an active tunnel to get started */ private static final long MIN_EXPIRE_IDLE_TIME = 120*1000l; private static final long MAX_EXPIRE_IDLE_TIME = 11*60*1000l; + private static final long MAY_DISCON_TIMEOUT = 10*1000; /** * Do we use direct buffers for reading? Default false. @@ -221,7 +222,8 @@ class EventPumper implements Runnable { int failsafeInvalid = 0; // Increase allowed idle time if we are well under allowed connections, otherwise decrease - if (_transport.haveCapacity(33)) + boolean haveCap = _transport.haveCapacity(33); + if (haveCap) _expireIdleWriteTime = Math.min(_expireIdleWriteTime + 1000, MAX_EXPIRE_IDLE_TIME); else _expireIdleWriteTime = Math.max(_expireIdleWriteTime - 3000, MIN_EXPIRE_IDLE_TIME); @@ -270,8 +272,16 @@ class EventPumper implements Runnable { failsafeWrites++; } - if ( con.getTimeSinceSend() > _expireIdleWriteTime && - con.getTimeSinceReceive() > _expireIdleWriteTime) { + final long expire; + if (!haveCap && con.getMayDisconnect() && + con.getMessagesReceived() <= 2 && con.getMessagesSent() <= 1) { + expire = MAY_DISCON_TIMEOUT; + } else { + expire = _expireIdleWriteTime; + } + + if ( con.getTimeSinceSend() > expire && + con.getTimeSinceReceive() > expire) { // we haven't sent or received anything in a really long time, so lets just close 'er up con.close(); failsafeCloses++; @@ -335,7 +345,7 @@ class EventPumper implements Runnable { con.close(); key.cancel(); } - } catch (Exception ke) { + } catch (IOException ke) { _log.error("Error closing key " + key + " on pumper shutdown", ke); } } @@ -344,7 +354,7 @@ class EventPumper implements Runnable { if (_log.shouldLog(Log.DEBUG)) _log.debug("Closing down the event pumper with no selection keys remaining"); } - } catch (Exception e) { + } catch (IOException e) { _log.error("Error closing keys on pumper shutdown", e); } _wantsConRegister.clear(); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 3468e9a3f..9fb9d4077 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -1,5 +1,6 @@ package net.i2p.router.transport.ntcp; +import java.io.Closeable; import java.io.IOException; import java.net.Inet6Address; import java.nio.ByteBuffer; @@ -12,6 +13,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.zip.Adler32; @@ -64,7 +66,7 @@ import net.i2p.util.VersionComparator; *
            4. * */ -class NTCPConnection { +class NTCPConnection implements Closeable { private final RouterContext _context; private final Log _log; private SocketChannel _chan; @@ -114,8 +116,8 @@ class NTCPConnection { private byte _prevWriteEnd[]; /** current partially read I2NP message */ private final ReadState _curReadState; - private final AtomicLong _messagesRead = new AtomicLong(); - private final AtomicLong _messagesWritten = new AtomicLong(); + private final AtomicInteger _messagesRead = new AtomicInteger(); + private final AtomicInteger _messagesWritten = new AtomicInteger(); private long _lastSendTime; private long _lastReceiveTime; private long _lastRateUpdated; @@ -133,6 +135,7 @@ class NTCPConnection { /** how many consecutive sends were failed due to (estimated) send queue time */ //private int _consecutiveBacklog; private long _nextInfoTime; + private boolean _mayDisconnect; /* * Update frequency for send/recv rates in console peers page @@ -324,11 +327,11 @@ class NTCPConnection { return _context.clock().now() -_establishedOn; } - public long getMessagesSent() { return _messagesWritten.get(); } + public int getMessagesSent() { return _messagesWritten.get(); } - public long getMessagesReceived() { return _messagesRead.get(); } + public int getMessagesReceived() { return _messagesRead.get(); } - public long getOutboundQueueSize() { + public int getOutboundQueueSize() { int queued; synchronized(_outbound) { queued = _outbound.size(); @@ -359,6 +362,17 @@ class NTCPConnection { */ public long getCreated() { return _created; } + /** + * Sets to true. + * @since 0.9.24 + */ + public void setMayDisconnect() { _mayDisconnect = true; } + + /** + * @since 0.9.24 + */ + public boolean getMayDisconnect() { return _mayDisconnect; } + /** * workaround for EventPumper * @since 0.8.12 @@ -462,7 +476,7 @@ class NTCPConnection { _transport.afterSend(msg, successful, allowRequeue, msg.getLifetime()); if (_consecutiveBacklog > 10) { // waaay too backlogged boolean wantsWrite = false; - try { wantsWrite = ( (_conKey.interestOps() & SelectionKey.OP_WRITE) != 0); } catch (Exception e) {} + try { wantsWrite = ( (_conKey.interestOps() & SelectionKey.OP_WRITE) != 0); } catch (RuntimeException e) {} if (_log.shouldLog(Log.WARN)) { int blocks = _writeBufs.size(); _log.warn("Too backlogged for too long (" + _consecutiveBacklog + " messages for " + DataHelper.formatDuration(queueTime()) + ", sched? " + wantsWrite + ", blocks: " + blocks + ") sending to " + _remotePeer.calculateHash()); @@ -520,7 +534,7 @@ class NTCPConnection { + ", wantsWrite? " + (0 != (_conKey.interestOps()&SelectionKey.OP_WRITE)) + ", currentOut set? " + currentOutboundSet + ", writeBufs: " + writeBufs + " on " + toString()); - } catch (Exception e) {} // java.nio.channels.CancelledKeyException + } catch (RuntimeException e) {} // java.nio.channels.CancelledKeyException } //_context.statManager().addRateData("ntcp.sendBacklogTime", queueTime); return true; @@ -1545,9 +1559,10 @@ class NTCPConnection { } } catch (I2NPMessageException ime) { if (_log.shouldLog(Log.WARN)) { - _log.warn("Error parsing I2NP message", ime); - _log.warn("DUMP:\n" + HexDump.dump(_dataBuf.getData(), 0, _size)); - _log.warn("RAW:\n" + Base64.encode(_dataBuf.getData(), 0, _size)); + _log.warn("Error parsing I2NP message" + + "\nDUMP:\n" + HexDump.dump(_dataBuf.getData(), 0, _size) + + "\nRAW:\n" + Base64.encode(_dataBuf.getData(), 0, _size) + + ime); } _context.statManager().addRateData("ntcp.corruptI2NPIME", 1); // Don't close the con, possible attack vector, not necessarily the peer's fault, diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java index 1431b110f..72061efe2 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java @@ -100,7 +100,7 @@ class NTCPSendFinisher { // appx 0.1 ms //_context.statManager().addRateData("ntcp.sendFinishTime", _context.clock().now() - _queued, 0); } catch (Throwable t) { - _log.log(Log.CRIT, " wtf, afterSend borked", t); + _log.log(Log.CRIT, " afterSend broken?", t); } } } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 382d4d89e..d16449968 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -486,6 +486,21 @@ public class NTCPTransport extends TransportImpl { return (con != null) && con.isEstablished() && con.tooBacklogged(); } + /** + * Tell the transport that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + @Override + public void mayDisconnect(final Hash peer) { + final NTCPConnection con = _conByIdent.get(peer); + if (con != null && con.isEstablished() && con.isInbound() && + con.getMessagesReceived() <= 2 && con.getMessagesSent() <= 1) { + con.setMayDisconnect(); + } + } + /** * @return usually the con passed in, but possibly a second connection with the same peer... */ @@ -1341,26 +1356,26 @@ public class NTCPTransport extends TransportImpl { } StringBuilder buf = new StringBuilder(512); - buf.append("

              ").append(_("NTCP connections")).append(": ").append(peers.size()); - buf.append(". ").append(_("Limit")).append(": ").append(getMaxConnections()); - buf.append(". ").append(_("Timeout")).append(": ").append(DataHelper.formatDuration2(_pumper.getIdleTimeout())); + buf.append("

              ").append(_t("NTCP connections")).append(": ").append(peers.size()); + buf.append(". ").append(_t("Limit")).append(": ").append(getMaxConnections()); + buf.append(". ").append(_t("Timeout")).append(": ").append(DataHelper.formatDuration2(_pumper.getIdleTimeout())); if (_context.getBooleanProperty(PROP_ADVANCED)) { - buf.append(". ").append(_("Status")).append(": ").append(_(getReachabilityStatus().toStatusString())); + buf.append(". ").append(_t("Status")).append(": ").append(_t(getReachabilityStatus().toStatusString())); } buf.append(".

              \n" + "\n" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - "" + - //"" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + //"" + " \n"); out.write(buf.toString()); buf.setLength(0); @@ -1372,9 +1387,9 @@ public class NTCPTransport extends TransportImpl { // buf.append(' ').append(_context.blocklist().toStr(ip)); buf.append("
              ").append(_("Peer")).append("").append(_("Dir")).append("").append(_("IPv6")).append("").append(_("Idle")).append("").append(_("In/Out")).append("").append(_("Up")).append("").append(_("Skew")).append("").append(_("TX")).append("").append(_("RX")).append("").append(_("Out Queue")).append("").append(_("Backlogged?")).append("").append(_("Reading?")).append("
              ").append(_t("Peer")).append("").append(_t("Dir")).append("").append(_t("IPv6")).append("").append(_t("Idle")).append("").append(_t("In/Out")).append("").append(_t("Up")).append("").append(_t("Skew")).append("").append(_t("TX")).append("").append(_t("RX")).append("").append(_t("Out Queue")).append("").append(_t("Backlogged?")).append("").append(_t("Reading?")).append("
              "); if (con.isInbound()) - buf.append("\"Inbound\""); + buf.append("\"Inbound\""); else - buf.append("\"Outbound\""); + buf.append("\"Outbound\""); buf.append(""); if (con.isIPv6()) buf.append("✓"); diff --git a/router/java/src/net/i2p/router/transport/ntcp/Reader.java b/router/java/src/net/i2p/router/transport/ntcp/Reader.java index d16ea85b7..1e7746d21 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/Reader.java +++ b/router/java/src/net/i2p/router/transport/ntcp/Reader.java @@ -98,8 +98,10 @@ class Reader { if (keepReading) { // keep on reading the same one } else { - _liveReads.remove(con); - con = null; + if (con != null) { + _liveReads.remove(con); + con = null; + } if (_pendingConnections.isEmpty()) { _pendingConnections.wait(); } else { @@ -116,6 +118,10 @@ class Reader { _log.debug("begin read for " + con); try { processRead(con); + } catch (IllegalStateException ise) { + // FailedEstablishState.receive() (race - see below) + if (_log.shouldWarn()) + _log.warn("Error in the ntcp reader", ise); } catch (RuntimeException re) { _log.log(Log.CRIT, "Error in the ntcp reader", re); } @@ -153,6 +159,7 @@ class Reader { EventPumper.releaseBuf(buf); break; } + // FIXME call est.isCorrupt() before also? throws ISE here... see above est.receive(buf); EventPumper.releaseBuf(buf); if (est.isCorrupt()) { diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java index a94572ace..60976d285 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -148,7 +148,7 @@ class ACKSender implements Runnable { try { // bulk operations may throw an exception _peersToACK.addAll(notYet); - } catch (Exception e) {} + } catch (RuntimeException e) {} if (_log.shouldLog(Log.DEBUG)) _log.debug("sleeping, pending size = " + notYet.size()); notYet.clear(); @@ -168,7 +168,7 @@ class ACKSender implements Runnable { if (wanted < 0) { if (_log.shouldLog(Log.WARN)) - _log.warn("wtf, why are we acking something they dont want? remaining=" + remaining + ", peer=" + peer + ", bitfields=" + ackBitfields); + _log.warn("why are we acking something they dont want? remaining=" + remaining + ", peer=" + peer + ", bitfields=" + ackBitfields); continue; } diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java index fce85e926..0fd9c83af 100644 --- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java +++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java @@ -29,6 +29,7 @@ import net.i2p.router.util.DecayingBloomFilter; import net.i2p.util.Addresses; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.VersionComparator; /** * Coordinate the establishment of new sessions - both inbound and outbound. @@ -126,6 +127,19 @@ class EstablishmentManager { /** for the DSM and or netdb store */ private static final int DATA_MESSAGE_TIMEOUT = 10*1000; + /** + * Java I2P has always parsed the length of the extended options field, + * but i2pd hasn't recognized it until this release. + * No matter, the options weren't defined until this release anyway. + * +********************************************************************************************************** + * FIXME 0.9.23 for testing, change to 0.9.24 for release + * + */ + private static final String VERSION_ALLOW_EXTENDED_OPTIONS = "0.9.23"; + private static final String PROP_DISABLE_EXT_OPTS = "i2np.udp.disableExtendedOptions"; + + public EstablishmentManager(RouterContext ctx, UDPTransport transport) { _context = ctx; _log = ctx.logManager().getLog(EstablishmentManager.class); @@ -356,8 +370,16 @@ class EstablishmentManager { _transport.failed(msg, "Peer has bad key, cannot establish"); return; } + boolean allowExtendedOptions = VersionComparator.comp(toRouterInfo.getVersion(), + VERSION_ALLOW_EXTENDED_OPTIONS) >= 0 + && !_context.getBooleanProperty(PROP_DISABLE_EXT_OPTS); + // w/o ext options, it's always 'requested', no need to set + // don't ask if they are indirect + boolean requestIntroduction = allowExtendedOptions && !isIndirect && + _transport.introducersMaybeRequired(); state = new OutboundEstablishState(_context, maybeTo, to, - toIdentity, + toIdentity, allowExtendedOptions, + requestIntroduction, sessionKey, addr, _transport.getDHFactory()); OutboundEstablishState oldState = _outboundStates.putIfAbsent(to, state); boolean isNew = oldState == null; @@ -477,7 +499,9 @@ class EstablishmentManager { // Don't offer to relay to privileged ports. // Only offer for an IPv4 session. // TODO if already we have their RI, only offer if they need it (no 'C' cap) - if (_transport.canIntroduce() && state.getSentPort() >= 1024 && + // if extended options, only if they asked for it + if (state.isIntroductionRequested() && + _transport.canIntroduce() && state.getSentPort() >= 1024 && state.getSentIP().length == 4) { // ensure > 0 long tag = 1 + _context.random().nextLong(MAX_TAG_VALUE); @@ -746,7 +770,7 @@ class EstablishmentManager { // so it needs to be caught in InNetMessagePool. dsm.setMessageExpiration(_context.clock().now() + DATA_MESSAGE_TIMEOUT); dsm.setMessageId(_context.random().nextLong(I2NPMessage.MAX_ID_VALUE)); - _transport.send(dsm, peer); + // sent below // just do this inline //_context.simpleTimer2().addEvent(new PublishToNewInbound(peer), 0); @@ -756,8 +780,14 @@ class EstablishmentManager { // ok, we are fine with them, send them our latest info //if (_log.shouldLog(Log.INFO)) // _log.info("Publishing to the peer after confirm plus delay (without banlist): " + peer); - sendOurInfo(peer, true); + // bundle the two messages together for efficiency + DatabaseStoreMessage dbsm = getOurInfo(); + List msgs = new ArrayList(2); + msgs.add(dsm); + msgs.add(dbsm); + _transport.send(msgs, peer); } else { + _transport.send(dsm, peer); // nuh uh. if (_log.shouldLog(Log.WARN)) _log.warn("NOT publishing to the peer after confirm plus delay (WITH banlist): " + (hash != null ? hash.toString() : "unknown")); @@ -804,12 +834,14 @@ class EstablishmentManager { _transport.setIP(remote.calculateHash(), state.getSentIP()); _context.statManager().addRateData("udp.outboundEstablishTime", state.getLifetime(), 0); + DatabaseStoreMessage dbsm = null; if (!state.isFirstMessageOurDSM()) { - sendOurInfo(peer, false); + dbsm = getOurInfo(); } else if (_log.shouldLog(Log.INFO)) { _log.info("Skipping publish: " + state); } + List msgs = new ArrayList(8); OutNetMessage msg; while ((msg = state.getNextQueuedMessage()) != null) { if (now - Router.CLOCK_FUDGE_FACTOR > msg.getExpiration()) { @@ -817,21 +849,33 @@ class EstablishmentManager { _transport.failed(msg, "Took too long to establish, but it was established"); } else { msg.timestamp("session fully established and sent"); - _transport.send(msg); + msgs.add(msg); } } + _transport.send(dbsm, msgs, peer); return peer; } +/**** private void sendOurInfo(PeerState peer, boolean isInbound) { if (_log.shouldLog(Log.INFO)) _log.info("Publishing to the peer after confirm: " + (isInbound ? " inbound con from " + peer : "outbound con to " + peer)); - + DatabaseStoreMessage m = getOurInfo(); + _transport.send(m, peer); + } +****/ + + /** + * A database store message with our router info + * @return non-null + * @since 0.9.24 split from sendOurInfo() + */ + private DatabaseStoreMessage getOurInfo() { DatabaseStoreMessage m = new DatabaseStoreMessage(_context); m.setEntry(_context.router().getRouterInfo()); m.setMessageExpiration(_context.clock().now() + DATA_MESSAGE_TIMEOUT); - _transport.send(m, peer); + return m; } /** the relay tag is a 4-byte field in the protocol */ @@ -850,11 +894,20 @@ class EstablishmentManager { if (_log.shouldLog(Log.WARN)) _log.warn("Peer " + state + " sent us an invalid DH parameter", ippe); _inboundStates.remove(state.getRemoteHostId()); + state.fail(); return; } - _transport.send(_builder.buildSessionCreatedPacket(state, + UDPPacket pkt = _builder.buildSessionCreatedPacket(state, _transport.getExternalPort(state.getSentIP().length == 16), - _transport.getIntroKey())); + _transport.getIntroKey()); + if (pkt == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Peer " + state + " sent us an invalid IP?"); + _inboundStates.remove(state.getRemoteHostId()); + state.fail(); + return; + } + _transport.send(pkt); state.createdPacketSent(); } diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java index 590aa29ed..332282c24 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java @@ -62,6 +62,8 @@ class InboundEstablishState { private final Queue _queuedMessages; // count for backoff private int _createdSentCount; + // default true + private boolean _introductionRequested = true; public enum InboundState { /** nothin known yet */ @@ -150,6 +152,12 @@ class InboundEstablishState { if (_bobIP == null) _bobIP = new byte[req.readIPSize()]; req.readIP(_bobIP, 0); + byte[] ext = req.readExtendedOptions(); + if (ext != null && ext.length >= UDPPacket.SESS_REQ_MIN_EXT_OPTIONS_LENGTH) { + _introductionRequested = (ext[1] & (byte) UDPPacket.SESS_REQ_EXT_FLAG_REQUEST_RELAY_TAG) != 0; + if (_log.shouldInfo()) + _log.info("got sess req. w/ ext. options, need intro? " + _introductionRequested + ' ' + this); + } if (_log.shouldLog(Log.DEBUG)) _log.debug("Receive sessionRequest, BobIP = " + Addresses.toString(_bobIP)); if (_currentState == InboundState.IB_STATE_UNKNOWN) @@ -160,6 +168,12 @@ class InboundEstablishState { public synchronized boolean sessionRequestReceived() { return _receivedX != null; } public synchronized byte[] getReceivedX() { return _receivedX; } public synchronized byte[] getReceivedOurIP() { return _bobIP; } + /** + * True (default) if no extended options in session request, + * or value of flag bit in the extended options. + * @since 0.9.24 + */ + public synchronized boolean isIntroductionRequested() { return _introductionRequested; } /** * Generates session key and mac key. diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java index 8c20dba17..f2209674f 100644 --- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java @@ -342,7 +342,8 @@ class InboundMessageState implements CDQEntry { buf.append(" completely received with "); //buf.append(getCompleteSize()).append(" bytes"); // may display -1 but avoid cascaded exceptions after release - buf.append(_completeSize).append(" bytes"); + buf.append(_completeSize).append(" bytes in "); + buf.append(_lastFragment + 1).append(" fragments"); } else { for (int i = 0; i <= _lastFragment; i++) { buf.append(" fragment ").append(i); diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java index 9bc2bfd72..5e644ec24 100644 --- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java +++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java @@ -3,6 +3,7 @@ package net.i2p.router.transport.udp; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -440,12 +441,33 @@ class IntroductionManager { // and we don't read it here. // FIXME implement for getting Alice's IPv4 in RelayRequest sent over IPv6? // or is that just too easy to spoof? - if (!isValid(alice.getIP(), alice.getPort()) || ipSize != 0 || port != 0) { - if (_log.shouldLog(Log.WARN)) { - byte ip[] = new byte[ipSize]; - rrReader.readIP(ip, 0); - _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port)); + byte[] aliceIP = alice.getIP(); + int alicePort = alice.getPort(); + if (!isValid(alice.getIP(), alice.getPort())) { + if (_log.shouldWarn()) + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, alicePort)); + _context.statManager().addRateData("udp.relayBadIP", 1); + return; + } + // prior to 0.9.24 we rejected any non-zero-length ip + // here we reject anything different + // TODO relay request over IPv6 + if (ipSize != 0) { + byte ip[] = new byte[ipSize]; + rrReader.readIP(ip, 0); + if (!Arrays.equals(aliceIP, ip)) { + if (_log.shouldWarn()) + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(ip, port)); + _context.statManager().addRateData("udp.relayBadIP", 1); + return; } + } + // prior to 0.9.24 we rejected any nonzero port + // here we reject anything different + // TODO relay request over IPv6 + if (port != 0 && port != alicePort) { + if (_log.shouldWarn()) + _log.warn("Bad relay req from " + alice + " for " + Addresses.toString(aliceIP, port)); _context.statManager().addRateData("udp.relayBadIP", 1); return; } diff --git a/router/java/src/net/i2p/router/transport/udp/MTU.java b/router/java/src/net/i2p/router/transport/udp/MTU.java index c6a2d1a2e..58d594e0d 100644 --- a/router/java/src/net/i2p/router/transport/udp/MTU.java +++ b/router/java/src/net/i2p/router/transport/udp/MTU.java @@ -40,6 +40,14 @@ abstract class MTU { ifcs = NetworkInterface.getNetworkInterfaces(); } catch (SocketException se) { return 0; + } catch (java.lang.Error e) { + // Windows, possibly when IPv6 only... + // https://bugs.openjdk.java.net/browse/JDK-8046500 + // java.lang.Error: IP Helper Library GetIfTable function failed + // at java.net.NetworkInterface.getAll(Native Method) + // at java.net.NetworkInterface.getNetworkInterfaces(Unknown Source) + // at net.i2p.util.Addresses.getAddresses ... + return 0; } if (ifcs != null) { while (ifcs.hasMoreElements()) { diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java index 01bca49ab..d2a3b0414 100644 --- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java @@ -4,6 +4,7 @@ import java.util.concurrent.BlockingQueue; import net.i2p.data.Base64; import net.i2p.data.ByteArray; +import net.i2p.data.i2np.DatabaseStoreMessage; import net.i2p.data.i2np.I2NPMessage; import net.i2p.data.i2np.I2NPMessageException; import net.i2p.data.i2np.I2NPMessageHandler; @@ -218,13 +219,31 @@ class MessageReceiver { return m; } catch (I2NPMessageException ime) { if (_log.shouldLog(Log.WARN)) { - _log.warn("Message invalid: " + state, ime); - _log.warn("DUMP:\n" + HexDump.dump(buf.getData(), 0, state.getCompleteSize())); - _log.warn("RAW:\n" + Base64.encode(buf.getData(), 0, state.getCompleteSize())); + ByteArray ba; + if (state.getFragmentCount() > 1) + ba = buf; + else + ba = state.getFragments()[0]; + byte[] data = ba.getData(); + _log.warn("Message invalid: " + state + + " PeerState: " + _transport.getPeerState(state.getFrom()) + + "\nDUMP:\n" + HexDump.dump(data, 0, state.getCompleteSize()) + + "\nRAW:\n" + Base64.encode(data, 0, state.getCompleteSize()), + ime); + } + if (state.getFragments()[0].getData()[0] == DatabaseStoreMessage.MESSAGE_TYPE) { + PeerState ps = _transport.getPeerState(state.getFrom()); + if (ps != null && ps.getRemotePort() == 65520) { + // distinct port of buggy router + _transport.sendDestroy(ps); + _transport.dropPeer(ps, true, "Corrupt DSM"); + _context.banlist().banlistRouterForever(state.getFrom(), + _x("Sent corrupt DSM")); + } } _context.messageHistory().droppedInboundMessage(state.getMessageId(), state.getFrom(), "error: " + ime.toString() + ": " + state.toString()); return null; - } catch (Exception e) { + } catch (RuntimeException e) { // e.g. AIOOBE if (_log.shouldLog(Log.WARN)) _log.warn("Error handling a message: " + state, e); @@ -234,4 +253,15 @@ class MessageReceiver { state.releaseResources(); } } + + /** + * Mark a string for extraction by xgettext and translation. + * Use this only in static initializers. + * It does not translate! + * @return s + * @since 0.9.20 + */ + private static final String _x(String s) { + return s; + } } diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java index 63497b5ea..918033dc8 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java @@ -56,6 +56,8 @@ class OutboundEstablishState { private RemoteHostId _remoteHostId; private final RemoteHostId _claimedAddress; private final RouterIdentity _remotePeer; + private final boolean _allowExtendedOptions; + private final boolean _needIntroduction; private final SessionKey _introKey; private final Queue _queuedMessages; private OutboundState _currentState; @@ -107,12 +109,17 @@ class OutboundEstablishState { * @param claimedAddress an IP/port based RemoteHostId, or null if unknown * @param remoteHostId non-null, == claimedAddress if direct, or a hash-based one if indirect * @param remotePeer must have supported sig type + * @param allowExtendedOptions are we allowed to send extended options to Bob? + * @param needIntroduction should we ask Bob to be an introducer for us? + ignored unless allowExtendedOptions is true * @param introKey Bob's introduction key, as published in the netdb * @param addr non-null */ public OutboundEstablishState(RouterContext ctx, RemoteHostId claimedAddress, RemoteHostId remoteHostId, - RouterIdentity remotePeer, SessionKey introKey, UDPAddress addr, + RouterIdentity remotePeer, boolean allowExtendedOptions, + boolean needIntroduction, + SessionKey introKey, UDPAddress addr, DHSessionKeyBuilder.Factory dh) { _context = ctx; _log = ctx.logManager().getLog(OutboundEstablishState.class); @@ -125,6 +132,8 @@ class OutboundEstablishState { } _claimedAddress = claimedAddress; _remoteHostId = remoteHostId; + _allowExtendedOptions = allowExtendedOptions; + _needIntroduction = needIntroduction; _remotePeer = remotePeer; _introKey = introKey; _queuedMessages = new LinkedBlockingQueue(); @@ -157,6 +166,19 @@ class OutboundEstablishState { /** @return -1 if unset */ public long getIntroNonce() { return _introductionNonce; } + + /** + * Are we allowed to send extended options to this peer? + * @since 0.9.24 + */ + public boolean isExtendedOptionsAllowed() { return _allowExtendedOptions; } + + /** + * Should we ask this peer to be an introducer for us? + * Ignored unless allowExtendedOptions is true + * @since 0.9.24 + */ + public boolean needIntroduction() { return _needIntroduction; } /** * Queue a message to be sent after the session is established. diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java index ab91478f1..b0350e2bd 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java @@ -172,18 +172,35 @@ class OutboundMessageFragments { } /** - * short circuit the OutNetMessage, letting us send the establish - * complete message reliably + * Short circuit the OutNetMessage, letting us send the establish + * complete message reliably. + * If you have multiple messages, use the list variant, + * so the messages may be bundled efficiently. */ - public void add(OutboundMessageState state) { - PeerState peer = state.getPeer(); + public void add(OutboundMessageState state, PeerState peer) { if (peer == null) - throw new RuntimeException("wtf, null peer for " + state); + throw new RuntimeException("null peer for " + state); peer.add(state); add(peer); //_context.statManager().addRateData("udp.outboundActiveCount", active, 0); } + /** + * Short circuit the OutNetMessage, letting us send multiple messages + * reliably and efficiently. + * @since 0.9.24 + */ + public void add(List states, PeerState peer) { + if (peer == null) + throw new RuntimeException("null peer"); + int sz = states.size(); + for (int i = 0; i < sz; i++) { + peer.add(states.get(i)); + } + add(peer); + //_context.statManager().addRateData("udp.outboundActiveCount", active, 0); + } + /** * Add the peer to the list of peers wanting to transmit something. * This wakes up the packet pusher if it is sleeping. @@ -400,8 +417,10 @@ class OutboundMessageFragments { int fragmentsToSend = toSend.size(); // sort by size, biggest first // don't bother unless more than one state (fragments are already sorted within a state) - if (fragmentsToSend > 1 && states.size() > 1) - Collections.sort(toSend, new FragmentComparator()); + // This puts the DeliveryStatusMessage after the DatabaseStoreMessage, don't do it for now. + // It also undoes the ordering of the priority queue in PeerState. + //if (fragmentsToSend > 1 && states.size() > 1) + // Collections.sort(toSend, new FragmentComparator()); List sendNext = new ArrayList(Math.min(toSend.size(), 4)); List rv = new ArrayList(toSend.size()); @@ -490,6 +509,7 @@ class OutboundMessageFragments { * Biggest first * @since 0.9.16 */ +/**** private static class FragmentComparator implements Comparator, Serializable { public int compare(Fragment l, Fragment r) { @@ -497,7 +517,9 @@ class OutboundMessageFragments { return r.state.fragmentSize(r.num) - l.state.fragmentSize(l.num); } } +****/ + /** throttle */ public interface ActiveThrottle { public void choke(Hash peer); public void unchoke(Hash peer); diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java index bc625bea4..de804ae9f 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java @@ -177,11 +177,14 @@ class OutboundMessageState implements CDPQEntry { /** * Note that we have pushed the message fragments. * Increments push count (and max sends... why?) + * @return true if this is the first push */ - public synchronized void push() { + public synchronized boolean push() { + boolean rv = _pushCount == 0; // these will never be different... _pushCount++; _maxSends = _pushCount; + return rv; } /** @@ -290,6 +293,7 @@ class OutboundMessageState implements CDPQEntry { public String toString() { StringBuilder buf = new StringBuilder(256); buf.append("OB Message ").append(_i2npMessage.getUniqueId()); + buf.append(" type ").append(_i2npMessage.getType()); buf.append(" with ").append(_numFragments).append(" fragments"); buf.append(" of size ").append(_messageBuf.length); buf.append(" volleys: ").append(_maxSends); @@ -301,6 +305,7 @@ class OutboundMessageState implements CDPQEntry { buf.append(i).append(' '); } } + //buf.append(" to: ").append(_peer.toString()); return buf.toString(); } } diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java index 35f2bb763..0f7e0ac80 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java @@ -9,13 +9,13 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; -import net.i2p.I2PAppContext; import net.i2p.data.Base64; import net.i2p.data.DataHelper; import net.i2p.data.Hash; import net.i2p.data.router.RouterIdentity; import net.i2p.data.SessionKey; import net.i2p.data.Signature; +import net.i2p.router.RouterContext; import net.i2p.router.transport.TransportUtil; import net.i2p.util.Addresses; import net.i2p.util.Log; @@ -57,10 +57,11 @@ to the various messages - a one byte flag and a four byte sending timestamp (*seconds* since the unix epoch). The flag byte contains the following bitfields:

              -  bits 0-3: payload type
              -     bit 4: rekey?
              -     bit 5: extended options included
              -  bits 6-7: reserved
              +Bit order: 76543210
              +  bits 7-4: payload type
              +     bit 3: rekey?
              +     bit 2: extended options included
              +  bits 1-0: reserved
               

              If the rekey flag is set, 64 bytes of keying material follow the @@ -99,7 +100,7 @@ around briefly, to address packet loss and reordering.

              * */ class PacketBuilder { - private final I2PAppContext _context; + private final RouterContext _context; private final Log _log; private final UDPTransport _transport; @@ -166,10 +167,23 @@ class PacketBuilder { private static final String PROP_PADDING = "i2np.udp.padding"; private static final boolean DEFAULT_ENABLE_PADDING = true; + /** + * The nine message types, 0-8, shifted to bits 7-4 for convenience + */ + private static final byte SESSION_REQUEST_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_SESSION_REQUEST << 4; + private static final byte SESSION_CREATED_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_SESSION_CREATED << 4; + private static final byte SESSION_CONFIRMED_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_SESSION_CONFIRMED << 4; + private static final byte PEER_RELAY_REQUEST_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_RELAY_REQUEST << 4; + private static final byte PEER_RELAY_RESPONSE_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE << 4; + private static final byte PEER_RELAY_INTRO_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_RELAY_INTRO << 4; + private static final byte DATA_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_DATA << 4; + private static final byte PEER_TEST_FLAG_BYTE = UDPPacket.PAYLOAD_TYPE_TEST << 4; + private static final byte SESSION_DESTROY_FLAG_BYTE = (byte) (UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY << 4); + /** * @param transport may be null for unit testing only */ - public PacketBuilder(I2PAppContext ctx, UDPTransport transport) { + public PacketBuilder(RouterContext ctx, UDPTransport transport) { _context = ctx; _transport = transport; _log = ctx.logManager().getLog(PacketBuilder.class); @@ -332,7 +346,7 @@ class PacketBuilder { int availableForExplicitAcks = availableForAcks; // make the packet - UDPPacket packet = buildPacketHeader((byte)(UDPPacket.PAYLOAD_TYPE_DATA << 4)); + UDPPacket packet = buildPacketHeader(DATA_FLAG_BYTE); DatagramPacket pkt = packet.getPacket(); byte data[] = pkt.getData(); int off = HEADER_SIZE; @@ -573,7 +587,7 @@ class PacketBuilder { * @param ackBitfields list of ACKBitfield instances to either fully or partially ACK */ public UDPPacket buildACK(PeerState peer, List ackBitfields) { - UDPPacket packet = buildPacketHeader((byte)(UDPPacket.PAYLOAD_TYPE_DATA << 4)); + UDPPacket packet = buildPacketHeader(DATA_FLAG_BYTE); DatagramPacket pkt = packet.getPacket(); byte data[] = pkt.getData(); int off = HEADER_SIZE; @@ -667,12 +681,6 @@ class PacketBuilder { return packet; } - /** - * full flag info for a sessionCreated message. this can be fixed, - * since we never rekey on startup, and don't need any extended options - */ - private static final byte SESSION_CREATED_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_SESSION_CREATED << 4); - /** * Build a new SessionCreated packet for the given peer, encrypting it * as necessary. @@ -768,12 +776,6 @@ class PacketBuilder { return packet; } - /** - * full flag info for a sessionRequest message. this can be fixed, - * since we never rekey on startup, and don't need any extended options - */ - private static final byte SESSION_REQUEST_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_SESSION_REQUEST << 4); - /** * Build a new SessionRequest packet for the given peer, encrypting it * as necessary. @@ -781,10 +783,23 @@ class PacketBuilder { * @return ready to send packet, or null if there was a problem */ public UDPPacket buildSessionRequestPacket(OutboundEstablishState state) { - UDPPacket packet = buildPacketHeader(SESSION_REQUEST_FLAG_BYTE); + int off = HEADER_SIZE; + byte[] options; + boolean ext = state.isExtendedOptionsAllowed(); + if (ext) { + options = new byte[UDPPacket.SESS_REQ_MIN_EXT_OPTIONS_LENGTH]; + boolean intro = state.needIntroduction(); + if (intro) + options[1] = (byte) UDPPacket.SESS_REQ_EXT_FLAG_REQUEST_RELAY_TAG; + if (_log.shouldInfo()) + _log.info("send sess req. w/ ext. options, need intro? " + intro + ' ' + state); + off += UDPPacket.SESS_REQ_MIN_EXT_OPTIONS_LENGTH + 1; + } else { + options = null; + } + UDPPacket packet = buildPacketHeader(SESSION_REQUEST_FLAG_BYTE, options); DatagramPacket pkt = packet.getPacket(); byte data[] = pkt.getData(); - int off = HEADER_SIZE; byte toIP[] = state.getSentIP(); if (!_transport.isValid(toIP)) { @@ -854,13 +869,6 @@ class PacketBuilder { return packets; } - - /** - * full flag info for a sessionConfirmed message. this can be fixed, - * since we never rekey on startup, and don't need any extended options - */ - private static final byte SESSION_CONFIRMED_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_SESSION_CONFIRMED << 4); - /** * Build a new SessionConfirmed packet for the given peer * @@ -1018,7 +1026,7 @@ class PacketBuilder { * @since 0.9.2 */ private UDPPacket buildSessionDestroyPacket(SessionKey cipherKey, SessionKey macKey, InetAddress addr, int port) { - UDPPacket packet = buildPacketHeader((byte)(UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY << 4)); + UDPPacket packet = buildPacketHeader(SESSION_DESTROY_FLAG_BYTE); int off = HEADER_SIZE; // no body in this message @@ -1034,12 +1042,6 @@ class PacketBuilder { return packet; } - /** - * full flag info for a peerTest message. this can be fixed, - * since we never rekey on test, and don't need any extended options - */ - private static final byte PEER_TEST_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_TEST << 4); - /** * Build a packet as if we are Alice and we either want Bob to begin a * peer test or Charlie to finish a peer test. @@ -1197,12 +1199,6 @@ class PacketBuilder { packet.setMessageType(TYPE_TCB); return packet; } - - /** - * full flag info for a relay request message. this can be fixed, - * since we never rekey on relay request, and don't need any extended options - */ - private static final byte PEER_RELAY_REQUEST_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_REQUEST << 4); // specify these if we know what our external receive ip/port is and if its different // from what bob is going to think @@ -1330,12 +1326,6 @@ class PacketBuilder { return packet; } - /** - * full flag info for a relay intro message. this can be fixed, - * since we never rekey on relay request, and don't need any extended options - */ - private static final byte PEER_RELAY_INTRO_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_INTRO << 4); - UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request) { UDPPacket packet = buildPacketHeader(PEER_RELAY_INTRO_FLAG_BYTE); DatagramPacket pkt = packet.getPacket(); @@ -1370,12 +1360,6 @@ class PacketBuilder { packet.setMessageType(TYPE_INTRO); return packet; } - - /** - * full flag info for a relay response message. this can be fixed, - * since we never rekey on relay response, and don't need any extended options - */ - private static final byte PEER_RELAY_RESPONSE_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE << 4); UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey cipherKey, SessionKey macKey) { @@ -1462,24 +1446,50 @@ class PacketBuilder { /** * Create a new packet and add the flag byte and the time stamp. * Caller should add data starting at HEADER_SIZE. - * At this point, adding support for extended options and rekeying is unlikely, - * but if we do, we'll have to change this. + * Does not include extended options or rekeying. * * @param flagByte contains type and flags * @since 0.8.1 */ private UDPPacket buildPacketHeader(byte flagByte) { + return buildPacketHeader(flagByte, null); + } + + /** + * Create a new packet and add the flag byte and the time stamp. + * Caller should add data starting at HEADER_SIZE. + * (if extendedOptions != null, at HEADER_SIZE + 1 + extendedOptions.length) + * Does not include rekeying. + * + * @param flagByte contains type and flags + * @param extendedOptions May be null. If non-null, we will add the associated flag here. + * 255 bytes max. + * @since 0.9.24 + */ + private UDPPacket buildPacketHeader(byte flagByte, byte[] extendedOptions) { UDPPacket packet = UDPPacket.acquire(_context, false); byte data[] = packet.getPacket().getData(); Arrays.fill(data, 0, data.length, (byte)0x0); int off = UDPPacket.MAC_SIZE + UDPPacket.IV_SIZE; // header + if (extendedOptions != null) + flagByte |= UDPPacket.HEADER_FLAG_EXTENDED_OPTIONS; data[off] = flagByte; off++; + // Note, this is unsigned, so we're good until February 2106 long now = (_context.clock().now() + 500) / 1000; DataHelper.toLong(data, off, 4, now); - // todo: add support for rekeying and extended options + // todo: add support for rekeying + // extended options + if (extendedOptions != null) { + off+= 4; + int len = extendedOptions.length; + if (len > 255) + throw new IllegalArgumentException(); + data[off++] = (byte) len; + System.arraycopy(extendedOptions, 0, data, off, len); + } return packet; } diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 6c3605174..1f5f990bc 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -88,6 +88,7 @@ class PacketHandler { _context.statManager().createRateStat("udp.droppedInvalidEstablish.new", "How old the packet we dropped due to invalidity (even though we do not have any active establishment with the peer) was", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.droppedInvalidInboundEstablish", "How old the packet we dropped due to invalidity (inbound establishment, bad key) was", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.droppedInvalidSkew", "How skewed the packet we dropped due to invalidity (valid except bad skew) was", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.destroyedInvalidSkew", "Destroyed session due to bad skew", "udp", UDPTransport.RATES); //_context.statManager().createRateStat("udp.packetDequeueTime", "How long it takes the UDPReader to pull a packet off the inbound packet queue (when its slow)", "udp", UDPTransport.RATES); //_context.statManager().createRateStat("udp.packetVerifyTime", "How long it takes the PacketHandler to verify a data packet after dequeueing (period is dequeue time)", "udp", UDPTransport.RATES); //_context.statManager().createRateStat("udp.packetVerifyTimeSlow", "How long it takes the PacketHandler to verify a data packet after dequeueing when its slow (period is dequeue time)", "udp", UDPTransport.RATES); @@ -214,7 +215,7 @@ class PacketHandler { _state = 5; handlePacket(_reader, packet); _state = 6; - } catch (Exception e) { + } catch (RuntimeException e) { _state = 7; if (_log.shouldLog(Log.ERROR)) _log.error("Crazy error handling a packet: " + packet, e); @@ -357,7 +358,7 @@ class PacketHandler { } else { if (_log.shouldLog(Log.WARN)) _log.warn("Validation with existing con failed, and validation as reestablish failed too. DROP " + packet); - _context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime(), packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidReestablish", packet.getLifetime()); } return; } @@ -455,7 +456,7 @@ class PacketHandler { if (_log.shouldLog(Log.WARN)) _log.warn("Cannot validate rcvd pkt (path) wasCached? " + alreadyFailed + ": " + packet); - _context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime(), packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidEstablish", packet.getLifetime()); switch (peerType) { case INBOUND_FALLBACK: _context.statManager().addRateData("udp.droppedInvalidEstablish.inbound", packet.getLifetime(), packet.getTimeSinceReceived()); @@ -532,7 +533,7 @@ class PacketHandler { _state = 34; receivePacket(reader, packet, INBOUND_FALLBACK); } else { - _context.statManager().addRateData("udp.droppedInvalidInboundEstablish", packet.getLifetime(), packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidInboundEstablish", packet.getLifetime()); } } @@ -631,19 +632,61 @@ class PacketHandler { // this doesn't seem to work for big skews, we never get anything back, // so we have to wait for NTCP to do it _context.clock().setOffset(0 - skew, true); - if (skew != 0) + if (skew != 0) { _log.logAlways(Log.WARN, "NTP failure, UDP adjusting clock by " + DataHelper.formatDuration(Math.abs(skew))); + skew = 0; + } } if (skew > GRACE_PERIOD) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Packet too far in the past: " + new Date(sendOn) + ": " + packet); - _context.statManager().addRateData("udp.droppedInvalidSkew", skew, packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidSkew", skew); + if (state != null && skew > 4 * GRACE_PERIOD && state.getPacketsReceived() <= 0) { + _transport.sendDestroy(state); + _transport.dropPeer(state, true, "Clock skew"); + if (state.getRemotePort() == 65520) { + // distinct port of buggy router + _context.banlist().banlistRouterForever(state.getRemotePeer(), + _x("Excessive clock skew: {0}"), + DataHelper.formatDuration(skew)); + } else { + _context.banlist().banlistRouter(DataHelper.formatDuration(skew), + state.getRemotePeer(), + _x("Excessive clock skew: {0}")); + } + _context.statManager().addRateData("udp.destroyedInvalidSkew", skew); + if (_log.shouldWarn()) + _log.warn("Dropped conn, packet too far in the past: " + new Date(sendOn) + ": " + packet + + " PeerState: " + state); + } else { + if (_log.shouldWarn()) + _log.warn("Packet too far in the past: " + new Date(sendOn) + ": " + packet + + " PeerState: " + state); + } return; } else if (skew < 0 - GRACE_PERIOD) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Packet too far in the future: " + new Date(sendOn) + ": " + packet); - _context.statManager().addRateData("udp.droppedInvalidSkew", 0-skew, packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidSkew", 0-skew); + if (state != null && skew < 0 - (4 * GRACE_PERIOD) && state.getPacketsReceived() <= 0) { + _transport.sendDestroy(state); + _transport.dropPeer(state, true, "Clock skew"); + if (state.getRemotePort() == 65520) { + // distinct port of buggy router + _context.banlist().banlistRouterForever(state.getRemotePeer(), + _x("Excessive clock skew: {0}"), + DataHelper.formatDuration(0 - skew)); + } else { + _context.banlist().banlistRouter(DataHelper.formatDuration(0 - skew), + state.getRemotePeer(), + _x("Excessive clock skew: {0}")); + } + _context.statManager().addRateData("udp.destroyedInvalidSkew", 0-skew); + if (_log.shouldWarn()) + _log.warn("Dropped conn, packet too far in the future: " + new Date(sendOn) + ": " + packet + + " PeerState: " + state); + } else { + if (_log.shouldWarn()) + _log.warn("Packet too far in the future: " + new Date(sendOn) + ": " + packet + + " PeerState: " + state); + } return; } @@ -790,9 +833,20 @@ class PacketHandler { _state = 52; if (_log.shouldLog(Log.WARN)) _log.warn("Dropping type " + type + " auth " + auth + ": " + packet); - _context.statManager().addRateData("udp.droppedInvalidUnknown", packet.getLifetime(), packet.getExpiration()); + _context.statManager().addRateData("udp.droppedInvalidUnknown", packet.getLifetime()); return; } } } + + /** + * Mark a string for extraction by xgettext and translation. + * Use this only in static initializers. + * It does not translate! + * @return s + * @since 0.9.20 + */ + private static final String _x(String s) { + return s; + } } diff --git a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java index f28ee9645..5c770175c 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java @@ -43,7 +43,7 @@ class PacketPusher implements Runnable { send(packets.get(i)); } } - } catch (Exception e) { + } catch (RuntimeException e) { _log.error("SSU Output Queue Error", e); } } diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java index ae998ad59..881d17858 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -172,23 +172,23 @@ class PeerState { private long _consecutiveSmall; /** when did we last check the MTU? */ //private long _mtuLastChecked; - private long _mtuIncreases; - private long _mtuDecreases; + private int _mtuIncreases; + private int _mtuDecreases; /** current round trip time estimate */ - private volatile int _rtt; + private int _rtt; /** smoothed mean deviation in the rtt */ - private volatile int _rttDeviation; + private int _rttDeviation; /** current retransmission timeout */ - private volatile int _rto; + private int _rto; /** how many packets will be considered within the retransmission rate calculation */ static final long RETRANSMISSION_PERIOD_WIDTH = 100; - private long _messagesReceived; - private long _messagesSent; - private long _packetsTransmitted; + private int _messagesReceived; + private int _messagesSent; + private int _packetsTransmitted; /** how many packets were retransmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */ - private long _packetsRetransmitted; + private int _packetsRetransmitted; /** how many packets were transmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */ //private long _packetsPeriodTransmitted; @@ -196,8 +196,9 @@ class PeerState { //private int _packetRetransmissionRate; /** how many dup packets were received within the last RETRANSMISSION_PERIOD_WIDTH packets */ - private long _packetsReceivedDuplicate; - private long _packetsReceived; + private int _packetsReceivedDuplicate; + private int _packetsReceived; + private boolean _mayDisconnect; /** list of InboundMessageState for active message */ private final Map _inboundMessages; @@ -447,6 +448,7 @@ class PeerState { * @return false always * @deprecated unused, ECNs are never sent, always returns false */ + @Deprecated public boolean getCurrentSecondECNReceived() { return _currentSecondECNReceived; } /** @@ -542,6 +544,7 @@ class PeerState { * connection, or null if we are not in the process of rekeying. * @deprecated unused */ + @Deprecated public void setNextMACKey(SessionKey key) { _nextMACKey = key; } /** @@ -550,6 +553,7 @@ class PeerState { * of rekeying. * @deprecated unused */ + @Deprecated public void setNextCipherKey(SessionKey key) { _nextCipherKey = key; } /** @@ -569,6 +573,7 @@ class PeerState { * when were the current cipher and MAC keys established/rekeyed? * @deprecated unused */ + @Deprecated public void setKeyEstablishedTime(long when) { _keyEstablishedTime = when; } /** @@ -621,7 +626,7 @@ class PeerState { /** return the smoothed send transfer rate */ public int getSendBps() { return _sendBps; } - public int getReceiveBps() { return _receiveBps; } + public synchronized int getReceiveBps() { return _receiveBps; } public int incrementConsecutiveFailedSends() { synchronized(_outboundMessages) { @@ -771,15 +776,23 @@ class PeerState { public long getIntroducerTime() { return _lastIntroducerTime; } public void setIntroducerTime() { _lastIntroducerTime = _context.clock().now(); } - /** we received the message specified completely */ + /** + * We received the message specified completely. + * @param bytes if less than or equal to zero, message is a duplicate. + */ public void messageFullyReceived(Long messageId, int bytes) { messageFullyReceived(messageId, bytes, false); } - /** FIXME synch */ - public void messageFullyReceived(Long messageId, int bytes, boolean isForACK) { + /** + * We received the message specified completely. + * @param isForACK unused + * @param bytes if less than or equal to zero, message is a duplicate. + */ + private synchronized void messageFullyReceived(Long messageId, int bytes, boolean isForACK) { if (bytes > 0) { _receiveBytes += bytes; //if (isForACK) // _receiveACKBytes += bytes; + _messagesReceived++; } else { //if (true || _retransmissionPeriodStart + 1000 < _context.clock().now()) { _packetsReceivedDuplicate++; @@ -804,7 +817,6 @@ class PeerState { if (_wantACKSendSince <= 0) _wantACKSendSince = now; _currentACKs.add(messageId); - _messagesReceived++; } public void messagePartiallyReceived() { @@ -959,6 +971,7 @@ class PeerState { * @return non-null, possibly empty * @deprecated unused */ + @Deprecated public List retrieveACKBitfields() { return retrieveACKBitfields(true); } /** @@ -1028,10 +1041,6 @@ class PeerState { } } - - - - int partialIncluded = 0; if (bytesRemaining > 4) { // ok, there's room to *try* to fit in some partial ACKs, so @@ -1171,7 +1180,6 @@ class PeerState { _sendWindowBytesRemaining = _sendWindowBytes; //} - _messagesSent++; if (numSends < 2) { // caller synchs //synchronized (this) { @@ -1256,60 +1264,51 @@ class PeerState { } /** we are resending a packet, so lets jack up the rto */ - public void messageRetransmitted(int packets) { - //long now = _context.clock().now(); - //if (true || _retransmissionPeriodStart + 1000 <= now) { - _packetsRetransmitted += packets; - /***** - } else { - _packetRetransmissionRate = (int)((float)(0.9f*_packetRetransmissionRate) + (float)(0.1f*_packetsRetransmitted)); - //_packetsPeriodTransmitted = _packetsTransmitted - _retransmissionPeriodStart; - _packetsPeriodRetransmitted = (int)_packetsRetransmitted; - _retransmissionPeriodStart = now; - _packetsRetransmitted = packets; - } - *****/ + public synchronized void messageRetransmitted(int packets) { _context.statManager().addRateData("udp.congestionOccurred", _sendWindowBytes); _context.statManager().addRateData("udp.congestedRTO", _rto, _rttDeviation); - synchronized (this) { - congestionOccurred(); - adjustMTU(); - } - //_rto *= 2; + _packetsRetransmitted += packets; + congestionOccurred(); + adjustMTU(); } - public void packetsTransmitted(int packets) { - //long now = _context.clock().now(); + public synchronized void packetsTransmitted(int packets) { _packetsTransmitted += packets; - //_packetsPeriodTransmitted += packets; - /***** - if (false && _retransmissionPeriodStart + 1000 <= now) { - _packetRetransmissionRate = (int)((float)(0.9f*_packetRetransmissionRate) + (float)(0.1f*_packetsRetransmitted)); - _retransmissionPeriodStart = 0; - _packetsPeriodRetransmitted = (int)_packetsRetransmitted; - _packetsRetransmitted = 0; - } - *****/ } /** how long does it usually take to get a message ACKed? */ - public int getRTT() { return _rtt; } + public synchronized int getRTT() { return _rtt; } /** how soon should we retransmit an unacked packet? */ - public int getRTO() { return _rto; } + public synchronized int getRTO() { return _rto; } /** how skewed are the measured RTTs? */ - public long getRTTDeviation() { return _rttDeviation; } + public synchronized int getRTTDeviation() { return _rttDeviation; } - public long getMessagesSent() { return _messagesSent; } - public long getMessagesReceived() { return _messagesReceived; } - public long getPacketsTransmitted() { return _packetsTransmitted; } - public long getPacketsRetransmitted() { return _packetsRetransmitted; } + /** + * I2NP messages sent. + * Does not include duplicates. + * As of 0.9.24, incremented when bandwidth is allocated just before sending, not when acked. + */ + public int getMessagesSent() { + synchronized (_outboundMessages) { + return _messagesSent; + } + } + + /** + * I2NP messages received. + * As of 0.9.24, does not include duplicates. + */ + public synchronized int getMessagesReceived() { return _messagesReceived; } + + public synchronized int getPacketsTransmitted() { return _packetsTransmitted; } + public synchronized int getPacketsRetransmitted() { return _packetsRetransmitted; } //public long getPacketsPeriodTransmitted() { return _packetsPeriodTransmitted; } //public int getPacketsPeriodRetransmitted() { return _packetsPeriodRetransmitted; } /** avg number of packets retransmitted for every 100 packets */ //public long getPacketRetransmissionRate() { return _packetRetransmissionRate; } - public long getPacketsReceived() { return _packetsReceived; } - public long getPacketsReceivedDuplicate() { return _packetsReceivedDuplicate; } + public synchronized int getPacketsReceived() { return _packetsReceived; } + public synchronized int getPacketsReceivedDuplicate() { return _packetsReceivedDuplicate; } private static final int MTU_RCV_DISPLAY_THRESHOLD = 20; /** 60 */ @@ -1322,7 +1321,7 @@ class PeerState { /** * @param size not including IP header, UDP header, MAC or IV */ - public void packetReceived(int size) { + public synchronized void packetReceived(int size) { _packetsReceived++; int minMTU; if (_remoteIP.length == 4) { @@ -1364,6 +1363,7 @@ class PeerState { public long getLastACKSend() { return _lastACKSend; } /** @deprecated unused */ + @Deprecated public void setLastACKSend(long when) { _lastACKSend = when; } public long getWantedACKSendSince() { return _wantACKSendSince; } @@ -1523,6 +1523,18 @@ class PeerState { if (_dead) return 0; return _outboundMessages.size() + _outboundQueue.size(); } + + /** + * Sets to true. + * @since 0.9.24 + */ + public void setMayDisconnect() { _mayDisconnect = true; } + + /** + * @since 0.9.24 + */ + public boolean getMayDisconnect() { return _mayDisconnect; } + /** * Expire / complete any outbound messages @@ -1796,7 +1808,8 @@ class PeerState { if (state.getPushCount() > 0) _retransmitter = state; - state.push(); + if (state.push()) + _messagesSent++; int rto = getRTO(); state.setNextSendTime(now + rto); @@ -2077,6 +2090,7 @@ class PeerState { if (_remotePeer != null) buf.append(" ").append(_remotePeer.toBase64().substring(0,6)); + buf.append(_isInbound? " IB " : " OB "); long now = _context.clock().now(); buf.append(" recvAge: ").append(now-_lastReceiveTime); buf.append(" sendAge: ").append(now-_lastSendFullyTime); @@ -2086,8 +2100,10 @@ class PeerState { buf.append(" cwin: ").append(_sendWindowBytes); buf.append(" acwin: ").append(_sendWindowBytesRemaining); buf.append(" consecFail: ").append(_consecutiveFailedSends); - buf.append(" recv OK/Dup: ").append(_packetsReceived).append('/').append(_packetsReceivedDuplicate); - buf.append(" send OK/Dup: ").append(_packetsTransmitted).append('/').append(_packetsRetransmitted); + buf.append(" msgs rcvd: ").append(_messagesReceived); + buf.append(" msgs sent: ").append(_messagesSent); + buf.append(" pkts rcvd OK/Dup: ").append(_packetsReceived).append('/').append(_packetsReceivedDuplicate); + buf.append(" pkts sent OK/Dup: ").append(_packetsTransmitted).append('/').append(_packetsRetransmitted); buf.append(" IBM: ").append(_inboundMessages.size()); buf.append(" OBQ: ").append(_outboundQueue.size()); buf.append(" OBL: ").append(_outboundMessages.size()); diff --git a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java index 193c1751f..c6dbdb8e2 100644 --- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java +++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java @@ -57,6 +57,7 @@ class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessage * specifically, this means how many messages in this queue * should be pulled off in a row before moving on to the next. */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public TimedWeightedPriorityMessageQueue(RouterContext ctx, int[] priorityLimits, int[] weighting, FailedListener lsnr) { _context = ctx; _log = ctx.logManager().getLog(TimedWeightedPriorityMessageQueue.class); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java index 691601933..2765418c8 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java @@ -4,6 +4,8 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; +import org.apache.http.conn.util.InetAddressUtils; + import net.i2p.data.Base64; import net.i2p.data.router.RouterAddress; import net.i2p.data.SessionKey; @@ -66,7 +68,7 @@ class UDPAddress { _introKey = null; return; } - _host = addr.getOption(PROP_HOST); + _host = addr.getHost(); _port = addr.getPort(); try { String mtu = addr.getOption(PROP_MTU); @@ -262,12 +264,9 @@ class UDPAddress { } if (rv == null) { try { - boolean isIPv4 = host.replaceAll("[0-9\\.]", "").length() == 0; - if (isIPv4 && host.replaceAll("[0-9]", "").length() != 3) - return null; rv = InetAddress.getByName(host); - if (isIPv4 || - host.replaceAll("[0-9a-fA-F:]", "").length() == 0) { + if (InetAddressUtils.isIPv4Address(host) || + InetAddressUtils.isIPv6Address(host)) { synchronized (_inetAddressCache) { _inetAddressCache.put(host, rv); } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java index 2f8cf4ea3..238ec16fd 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java @@ -6,11 +6,11 @@ import java.util.Arrays; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; -import net.i2p.I2PAppContext; import net.i2p.data.Base64; import net.i2p.data.DataHelper; import net.i2p.data.SessionKey; import net.i2p.router.RouterContext; +import net.i2p.router.transport.FIFOBandwidthLimiter; import net.i2p.router.util.CDQEntry; import net.i2p.util.Addresses; import net.i2p.util.Log; @@ -22,19 +22,19 @@ import net.i2p.util.SystemVersion; * */ class UDPPacket implements CDQEntry { - private I2PAppContext _context; + private RouterContext _context; private final DatagramPacket _packet; private volatile short _priority; private volatile long _initializeTime; - private volatile long _expiration; + //private volatile long _expiration; private final byte[] _data; private final byte[] _validateBuf; private final byte[] _ivBuf; private volatile int _markedType; - private volatile RemoteHostId _remoteHost; - private volatile boolean _released; - private volatile Exception _releasedBy; - private volatile Exception _acquiredBy; + private RemoteHostId _remoteHost; + private boolean _released; + //private volatile Exception _releasedBy; + //private volatile Exception _acquiredBy; private long _enqueueTime; private long _receivedTime; //private long _beforeValidate; @@ -43,6 +43,7 @@ class UDPPacket implements CDQEntry { //private long _afterHandlingTime; private int _validateCount; // private boolean _isInbound; + private FIFOBandwidthLimiter.Request _bandwidthRequest; // Warning - this mixes contexts in a multi-router JVM private static final Queue _packetCache; @@ -84,25 +85,45 @@ class UDPPacket implements CDQEntry { public static final int PAYLOAD_TYPE_RELAY_INTRO = 5; public static final int PAYLOAD_TYPE_DATA = 6; public static final int PAYLOAD_TYPE_TEST = 7; - public static final int MAX_PAYLOAD_TYPE = PAYLOAD_TYPE_TEST; /** @since 0.8.1 */ public static final int PAYLOAD_TYPE_SESSION_DESTROY = 8; + public static final int MAX_PAYLOAD_TYPE = PAYLOAD_TYPE_SESSION_DESTROY; + // various flag fields for use in the header + /** + * Defined in the spec from the beginning, Unused + * @since 0.9.24 + */ + public static final byte HEADER_FLAG_REKEY = (1 << 3); + /** + * Defined in the spec from the beginning, Used starting in 0.9.24 + * @since 0.9.24 + */ + public static final byte HEADER_FLAG_EXTENDED_OPTIONS = (1 << 2); + + // Extended options for session request + public static final int SESS_REQ_MIN_EXT_OPTIONS_LENGTH = 2; + // bytes 0-1 are flags + /** + * set to 1 to request a session tag, i.e. we want him to be an introducer for us + */ + public static final int SESS_REQ_EXT_FLAG_REQUEST_RELAY_TAG = 0x01; + // various flag fields for use in the data packets public static final byte DATA_FLAG_EXPLICIT_ACK = (byte)(1 << 7); public static final byte DATA_FLAG_ACK_BITFIELDS = (1 << 6); - // unused + /** unused */ public static final byte DATA_FLAG_ECN = (1 << 4); public static final byte DATA_FLAG_WANT_ACKS = (1 << 3); public static final byte DATA_FLAG_WANT_REPLY = (1 << 2); - // unused + /** unused */ public static final byte DATA_FLAG_EXTENDED = (1 << 1); public static final byte BITFIELD_CONTINUATION = (byte)(1 << 7); private static final int MAX_VALIDATE_SIZE = MAX_PACKET_SIZE; - private UDPPacket(I2PAppContext ctx) { + private UDPPacket(RouterContext ctx) { //ctx.statManager().createRateStat("udp.fetchRemoteSlow", "How long it takes to grab the remote ip info", "udp", UDPTransport.RATES); // the data buffer is clobbered on init(..), but we need it to bootstrap _data = new byte[MAX_PACKET_SIZE]; @@ -112,7 +133,7 @@ class UDPPacket implements CDQEntry { init(ctx); } - private void init(I2PAppContext ctx) { + private synchronized void init(RouterContext ctx) { _context = ctx; //_dataBuf = _dataCache.acquire(); Arrays.fill(_data, (byte)0); @@ -146,20 +167,20 @@ class UDPPacket implements CDQEntry { ****/ /** */ - public DatagramPacket getPacket() { verifyNotReleased(); return _packet; } - public short getPriority() { verifyNotReleased(); return _priority; } - public long getExpiration() { verifyNotReleased(); return _expiration; } - public long getBegin() { verifyNotReleased(); return _initializeTime; } + public synchronized DatagramPacket getPacket() { verifyNotReleased(); return _packet; } + public synchronized short getPriority() { verifyNotReleased(); return _priority; } + //public long getExpiration() { verifyNotReleased(); return _expiration; } + public synchronized long getBegin() { verifyNotReleased(); return _initializeTime; } public long getLifetime() { /** verifyNotReleased(); */ return _context.clock().now() - _initializeTime; } - public void resetBegin() { _initializeTime = _context.clock().now(); } + public synchronized void resetBegin() { _initializeTime = _context.clock().now(); } /** flag this packet as a particular type for accounting purposes */ - public void markType(int type) { verifyNotReleased(); _markedType = type; } + public synchronized void markType(int type) { verifyNotReleased(); _markedType = type; } /** * flag this packet as a particular type for accounting purposes, with * 1 implying the packet is an ACK, otherwise it is a data packet * */ - public int getMarkedType() { verifyNotReleased(); return _markedType; } + public synchronized int getMarkedType() { verifyNotReleased(); return _markedType; } private int _messageType; private int _fragmentCount; @@ -174,7 +195,7 @@ class UDPPacket implements CDQEntry { /** only for debugging and stats */ void setFragmentCount(int count) { _fragmentCount = count; } - RemoteHostId getRemoteHost() { + synchronized RemoteHostId getRemoteHost() { if (_remoteHost == null) { //long before = System.currentTimeMillis(); InetAddress addr = _packet.getAddress(); @@ -193,7 +214,7 @@ class UDPPacket implements CDQEntry { * MAC matches, false otherwise. * */ - public boolean validate(SessionKey macKey) { + public synchronized boolean validate(SessionKey macKey) { verifyNotReleased(); //_beforeValidate = _context.clock().now(); boolean eq = false; @@ -231,7 +252,7 @@ class UDPPacket implements CDQEntry { str.append("\n\tCalc HMAC: ").append(Base64.encode(calc, 0, MAC_SIZE)); str.append("\n\tRead HMAC: ").append(Base64.encode(_data, _packet.getOffset(), MAC_SIZE)); str.append("\n\tUsing key: ").append(macKey.toBase64()); - if (DataHelper.eq(macKey.getData(), 0, ((RouterContext)_context).routerHash().getData(), 0, 32)) + if (DataHelper.eq(macKey.getData(), 0, _context.routerHash().getData(), 0, 32)) str.append(" (Intro)"); else str.append(" (Session)"); @@ -242,7 +263,7 @@ class UDPPacket implements CDQEntry { } else { Log log = _context.logManager().getLog(UDPPacket.class); if (log.shouldLog(Log.WARN)) - log.warn("Payload length is " + payloadLength + ", too short!\n" + + log.warn("Payload length is " + payloadLength + ", too short! From: " + getRemoteHost() + '\n' + net.i2p.util.HexDump.dump(_data, _packet.getOffset(), _packet.getLength())); } @@ -256,7 +277,7 @@ class UDPPacket implements CDQEntry { * with the decrypted data (leaving the MAC and IV unaltered) * */ - public void decrypt(SessionKey cipherKey) { + public synchronized void decrypt(SessionKey cipherKey) { verifyNotReleased(); System.arraycopy(_data, MAC_SIZE, _ivBuf, 0, IV_SIZE); int len = _packet.getLength(); @@ -279,7 +300,7 @@ class UDPPacket implements CDQEntry { public void setEnqueueTime(long now) { _enqueueTime = now; } /** a packet handler has pulled it off the inbound queue */ - void received() { _receivedTime = _context.clock().now(); } + synchronized void received() { _receivedTime = _context.clock().now(); } /** a packet handler has decrypted and verified the packet and is about to parse out the good bits */ //void beforeReceiveFragments() { _beforeReceiveFragments = _context.clock().now(); } @@ -293,13 +314,47 @@ class UDPPacket implements CDQEntry { public long getEnqueueTime() { return _enqueueTime; } /** a packet handler has pulled it off the inbound queue */ - long getTimeSinceReceived() { return (_receivedTime > 0 ? _context.clock().now() - _receivedTime : 0); } + synchronized long getTimeSinceReceived() { return (_receivedTime > 0 ? _context.clock().now() - _receivedTime : 0); } /** a packet handler has decrypted and verified the packet and is about to parse out the good bits */ //long getTimeSinceReceiveFragments() { return (_beforeReceiveFragments > 0 ? _context.clock().now() - _beforeReceiveFragments : 0); } /** a packet handler has finished parsing out the good bits */ //long getTimeSinceHandling() { return (_afterHandlingTime > 0 ? _context.clock().now() - _afterHandlingTime : 0); } + /** + * So that we can compete with NTCP, we want to request bandwidth + * in parallel, on the way into the queue, not on the way out. + * Call before enqueueing. + * @since 0.9.21 + * @deprecated unused + */ + public synchronized void requestInboundBandwidth() { + verifyNotReleased(); + _bandwidthRequest = _context.bandwidthLimiter().requestInbound(_packet.getLength(), "UDP receiver"); + } + + /** + * So that we can compete with NTCP, we want to request bandwidth + * in parallel, on the way into the queue, not on the way out. + * Call before enqueueing. + * @since 0.9.21 + */ + public synchronized void requestOutboundBandwidth() { + verifyNotReleased(); + _bandwidthRequest = _context.bandwidthLimiter().requestOutbound(_packet.getLength(), 0, "UDP sender"); + } + + /** + * So that we can compete with NTCP, we want to request bandwidth + * in parallel, on the way into the queue, not on the way out. + * Call after dequeueing. + * @since 0.9.21 + */ + public synchronized FIFOBandwidthLimiter.Request getBandwidthRequest() { + verifyNotReleased(); + return _bandwidthRequest; + } + // Following 5: All used only for stats in PacketHandler, commented out /** when it was pulled off the endpoint receive queue */ @@ -339,20 +394,24 @@ class UDPPacket implements CDQEntry { /** * @param inbound unused */ - public static UDPPacket acquire(I2PAppContext ctx, boolean inbound) { + public static UDPPacket acquire(RouterContext ctx, boolean inbound) { UDPPacket rv = null; if (CACHE) { rv = _packetCache.poll(); - if (rv != null) - rv.init(ctx); + if (rv != null) { + synchronized(rv) { + if (!rv._released) { + Log log = rv._context.logManager().getLog(UDPPacket.class); + log.error("Unreleased cached packet", new Exception()); + rv = null; + } else { + rv.init(ctx); + } + } + } } if (rv == null) rv = new UDPPacket(ctx); - //if (rv._acquiredBy != null) { - // _log.log(Log.CRIT, "Already acquired! current stack trace is:", new Exception()); - // _log.log(Log.CRIT, "Earlier acquired:", rv._acquiredBy); - //} - //rv._acquiredBy = new Exception("acquired on"); return rv; } @@ -364,13 +423,20 @@ class UDPPacket implements CDQEntry { release(); } - public void release() { + public synchronized void release() { verifyNotReleased(); _released = true; //_releasedBy = new Exception("released by"); //_acquiredBy = null; // //_dataCache.release(_dataBuf); + if (_bandwidthRequest != null) { + synchronized(_bandwidthRequest) { + if (_bandwidthRequest.getPendingRequested() > 0) + _bandwidthRequest.abort(); + } + _bandwidthRequest = null; + } if (!CACHE) return; _packetCache.offer(this); @@ -385,7 +451,7 @@ class UDPPacket implements CDQEntry { _packetCache.clear(); } - private void verifyNotReleased() { + private synchronized void verifyNotReleased() { if (!CACHE) return; if (_released) { Log log = _context.logManager().getLog(UDPPacket.class); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java index adacea03f..c7c9d90cc 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java @@ -67,33 +67,68 @@ class UDPPacketReader { return (_message[_payloadBeginOffset] & 0xFF) >>> 4; } - /** does this packet include rekeying data? */ - public boolean readRekeying() { - return (_message[_payloadBeginOffset] & (1 << 3)) != 0; + /** + * Does this packet include rekeying data in the header? + * Unused, should always be false. + */ + public boolean isRekeyingIncluded() { + return (_message[_payloadBeginOffset] & UDPPacket.HEADER_FLAG_REKEY) != 0; } - public boolean readExtendedOptionsIncluded() { - return (_message[_payloadBeginOffset] & (1 << 2)) != 0; + /** + * Does this packet include extended options in the header? + */ + public boolean isExtendedOptionsIncluded() { + return (_message[_payloadBeginOffset] & UDPPacket.HEADER_FLAG_EXTENDED_OPTIONS) != 0; } /** @return seconds */ public long readTimestamp() { + // Note, this is unsigned, so we're good until February 2106 return DataHelper.fromLong(_message, _payloadBeginOffset + 1, 4); } - public void readKeyingMaterial(byte target[], int targetOffset) { - if (!readRekeying()) - throw new IllegalStateException("This packet is not rekeying!"); - System.arraycopy(_message, _payloadBeginOffset + 1 + 4, target, targetOffset, KEYING_MATERIAL_LENGTH); + /** + * Returns rekeying data (64 bytes), or null if none. + * Unused, should always return null. + * + * @deprecated unused + */ + @Deprecated + public byte[] readKeyingMaterial() { + if (!isRekeyingIncluded()) + return null; + byte[] rv = new byte[KEYING_MATERIAL_LENGTH]; + System.arraycopy(_message, _payloadBeginOffset + 1 + 4, rv, 0, KEYING_MATERIAL_LENGTH); + return rv; + } + + /** + * Returns extended option data, 0-255 bytes, or null if none. + * Returned array does NOT include the length byte. + * + * @return extended options or null if none is included + * @since 0.9.24 + */ + public byte[] readExtendedOptions() { + if (!isExtendedOptionsIncluded()) + return null; + int offset = _payloadBeginOffset + 1 + 4; + if (isRekeyingIncluded()) + offset += KEYING_MATERIAL_LENGTH; + int optionsSize = _message[offset++] & 0xff; + byte[] rv = new byte[optionsSize]; + System.arraycopy(_message, offset, rv, 0, optionsSize); + return rv; } /** index into the message where the body begins */ private int readBodyOffset() { int offset = _payloadBeginOffset + 1 + 4; - if (readRekeying()) + if (isRekeyingIncluded()) offset += KEYING_MATERIAL_LENGTH; - if (readExtendedOptionsIncluded()) { - int optionsSize = (int)DataHelper.fromLong(_message, offset, 1); + if (isExtendedOptionsIncluded()) { + int optionsSize = _message[offset] & 0xff; offset += optionsSize + 1; } return offset; @@ -142,8 +177,26 @@ class UDPPacketReader { /* ------- Begin Reader Classes ------- */ + /** + * Base + * + * @since 0.9.24 + */ + public abstract class Reader { + /** + * Returns extended option data from the header, 0-255 bytes, or null if none. + * Returned array does NOT include the length byte. + * + * @return extended options or null if none is included + * @since 0.9.24 + */ + public byte[] readExtendedOptions() { + return UDPPacketReader.this.readExtendedOptions(); + } + } + /** Help read the SessionRequest payload */ - public class SessionRequestReader { + public class SessionRequestReader extends Reader { public static final int X_LENGTH = 256; public void readX(byte target[], int targetOffset) { int readOffset = readBodyOffset(); @@ -152,20 +205,20 @@ class UDPPacketReader { public int readIPSize() { int offset = readBodyOffset() + X_LENGTH; - return (int)DataHelper.fromLong(_message, offset, 1); + return _message[offset] & 0xff; } /** what IP bob is reachable on */ public void readIP(byte target[], int targetOffset) { int offset = readBodyOffset() + X_LENGTH; - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); } } /** Help read the SessionCreated payload */ - public class SessionCreatedReader { + public class SessionCreatedReader extends Reader { public static final int Y_LENGTH = 256; public void readY(byte target[], int targetOffset) { int readOffset = readBodyOffset(); @@ -175,13 +228,13 @@ class UDPPacketReader { /** sizeof(IP) */ public int readIPSize() { int offset = readBodyOffset() + Y_LENGTH; - return (int)DataHelper.fromLong(_message, offset, 1); + return _message[offset] & 0xff; } /** what IP do they think we are coming on? */ public void readIP(byte target[], int targetOffset) { int offset = readBodyOffset() + Y_LENGTH; - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); } @@ -220,7 +273,7 @@ class UDPPacketReader { } /** parse out the confirmed message */ - public class SessionConfirmedReader { + public class SessionConfirmedReader extends Reader { /** which fragment is this? */ public int readCurrentFragmentNum() { int readOffset = readBodyOffset(); @@ -273,7 +326,7 @@ class UDPPacketReader { } /** parse out the data message */ - public class DataReader { + public class DataReader extends Reader { /** * @return the data size, NOT including IP header, UDP header, IV, or MAC @@ -307,7 +360,7 @@ class UDPPacketReader { public int readACKCount() { if (!readACKsIncluded()) return 0; int off = readBodyOffset() + 1; - return (int)DataHelper.fromLong(_message, off, 1); + return _message[off] & 0xff; } public long readACK(int index) { @@ -322,12 +375,12 @@ class UDPPacketReader { if (!readACKBitfieldsIncluded()) return null; int off = readBodyOffset() + 1; if (readACKsIncluded()) { - int numACKs = (int)DataHelper.fromLong(_message, off, 1); + int numACKs = _message[off] & 0xff; off++; off += 4 * numACKs; } - int numBitfields = (int)DataHelper.fromLong(_message, off, 1); + int numBitfields = _message[off] & 0xff; off++; PacketACKBitfield rv[] = new PacketACKBitfield[numBitfields]; @@ -341,12 +394,12 @@ class UDPPacketReader { public int readFragmentCount() throws DataFormatException { int off = readBodyOffset() + 1; if (readACKsIncluded()) { - int numACKs = (int)DataHelper.fromLong(_message, off, 1); + int numACKs = _message[off] & 0xff; off++; off += 4 * numACKs; } if (readACKBitfieldsIncluded()) { - int numBitfields = (int)DataHelper.fromLong(_message, off, 1); + int numBitfields = _message[off] & 0xff; off++; for (int i = 0; i < numBitfields; i++) { @@ -355,7 +408,7 @@ class UDPPacketReader { } } if (readExtendedDataIncluded()) { - int size = (int)DataHelper.fromLong(_message, off, 1); + int size = _message[off] & 0xff; off++; off += size; } @@ -397,12 +450,12 @@ class UDPPacketReader { private int getFragmentBegin(int fragmentNum) throws DataFormatException { int off = readBodyOffset() + 1; if (readACKsIncluded()) { - int numACKs = (int)DataHelper.fromLong(_message, off, 1); + int numACKs = _message[off] & 0xff; off++; off += 4 * numACKs; } if (readACKBitfieldsIncluded()) { - int numBitfields = (int)DataHelper.fromLong(_message, off, 1); + int numBitfields = _message[off] & 0xff; off++; PacketACKBitfield bf[] = new PacketACKBitfield[numBitfields]; @@ -412,7 +465,7 @@ class UDPPacketReader { } } if (readExtendedDataIncluded()) { - int size = (int)DataHelper.fromLong(_message, off, 1); + int size = _message[off] & 0xff; off++; off += size; } @@ -443,7 +496,7 @@ class UDPPacketReader { buf.append(" "); int off = readBodyOffset() + 1; if (readACKsIncluded()) { - int numACKs = (int)DataHelper.fromLong(_message, off, 1); + int numACKs = _message[off] & 0xff; off++; buf.append("with ACKs for "); for (int i = 0; i < numACKs; i++) { @@ -452,7 +505,7 @@ class UDPPacketReader { } } if (readACKBitfieldsIncluded()) { - int numBitfields = (int)DataHelper.fromLong(_message, off, 1); + int numBitfields = _message[off] & 0xff; off++; buf.append("with partial ACKs for "); @@ -468,7 +521,7 @@ class UDPPacketReader { } } if (readExtendedDataIncluded()) { - int size = (int)DataHelper.fromLong(_message, off, 1); + int size = _message[off] & 0xff; off++; buf.append("with extended size of "); buf.append(size); @@ -476,7 +529,7 @@ class UDPPacketReader { off += size; } - int numFragments = (int)DataHelper.fromLong(_message, off, 1); + int numFragments = _message[off] & 0xff; off++; buf.append("with fragmentCount of "); buf.append(numFragments); @@ -506,8 +559,7 @@ class UDPPacketReader { buf.append(" payload: "); int off = getFragmentBegin(0); // first fragment - off += 4; // messageId - off++; // fragment info + off += 4 + 1; // messageId + fragment info int size = ((int)DataHelper.fromLong(_message, off, 2)) & 0x3FFF; off += 2; buf.append(Base64.encode(_message, off, size)); @@ -610,7 +662,7 @@ class UDPPacketReader { } /** Help read the PeerTest payload */ - public class PeerTestReader { + public class PeerTestReader extends Reader { private static final int NONCE_LENGTH = 4; public long readNonce() { @@ -620,13 +672,13 @@ class UDPPacketReader { public int readIPSize() { int offset = readBodyOffset() + NONCE_LENGTH; - return (int)DataHelper.fromLong(_message, offset, 1); + return _message[offset] & 0xff; } /** what IP Alice is reachable on */ public void readIP(byte target[], int targetOffset) { int offset = readBodyOffset() + NONCE_LENGTH; - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); } @@ -634,7 +686,7 @@ class UDPPacketReader { /** what IP Alice is reachable on */ public int readPort() { int offset = readBodyOffset() + NONCE_LENGTH; - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; offset += size; // skip the IP return (int)DataHelper.fromLong(_message, offset, 2); @@ -643,16 +695,15 @@ class UDPPacketReader { /** what Alice's intro key is (if known - if unknown, the key is INVALID_KEY) */ public void readIntroKey(byte target[], int targetOffset) { int offset = readBodyOffset() + NONCE_LENGTH; - int size = (int)DataHelper.fromLong(_message, offset, 1); - offset++; + int size = _message[offset] & 0xff; + offset += 1 + 2; // skip the size + port offset += size; // skip the IP - offset += 2; // skip the port System.arraycopy(_message, offset, target, targetOffset, SessionKey.KEYSIZE_BYTES); } } /** Help read the RelayRequest payload */ - public class RelayRequestReader { + public class RelayRequestReader extends Reader { public long readTag() { long rv = DataHelper.fromLong(_message, readBodyOffset(), 4); if (_log.shouldLog(Log.DEBUG)) @@ -661,7 +712,7 @@ class UDPPacketReader { } public int readIPSize() { int offset = readBodyOffset() + 4; - int rv = (int)DataHelper.fromLong(_message, offset, 1); + int rv = _message[offset] & 0xff; if (_log.shouldLog(Log.DEBUG)) _log.debug("read alice ip size: " + rv); return rv; @@ -670,7 +721,7 @@ class UDPPacketReader { /** what IP Alice is reachable on */ public void readIP(byte target[], int targetOffset) { int offset = readBodyOffset() + 4; - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); if (_log.shouldLog(Log.DEBUG)) @@ -678,7 +729,7 @@ class UDPPacketReader { } public int readPort() { int offset = readBodyOffset() + 4; - offset += DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; offset++; int rv = (int)DataHelper.fromLong(_message, offset, 2); if (_log.shouldLog(Log.DEBUG)) @@ -689,10 +740,9 @@ class UDPPacketReader { /** unused */ public int readChallengeSize() { int offset = readBodyOffset() + 4; - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int rv = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int rv = _message[offset] & 0xff; if (_log.shouldLog(Log.DEBUG)) _log.debug("read challenge size: " + rv); return rv; @@ -701,10 +751,9 @@ class UDPPacketReader { /** unused */ public void readChallengeSize(byte target[], int targetOffset) { int offset = readBodyOffset() + 4; - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, sz); if (_log.shouldLog(Log.DEBUG)) @@ -712,10 +761,9 @@ class UDPPacketReader { } public void readAliceIntroKey(byte target[], int targetOffset) { int offset = readBodyOffset() + 4; - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; offset += sz; System.arraycopy(_message, offset, target, targetOffset, SessionKey.KEYSIZE_BYTES); @@ -725,10 +773,9 @@ class UDPPacketReader { } public long readNonce() { int offset = readBodyOffset() + 4; - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; offset += sz; offset += SessionKey.KEYSIZE_BYTES; @@ -740,22 +787,22 @@ class UDPPacketReader { } /** Help read the RelayIntro payload */ - public class RelayIntroReader { + public class RelayIntroReader extends Reader { public int readIPSize() { int offset = readBodyOffset(); - return (int)DataHelper.fromLong(_message, offset, 1); + return _message[offset] & 0xff; } /** what IP Alice is reachable on */ public void readIP(byte target[], int targetOffset) { int offset = readBodyOffset(); - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); } public int readPort() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; offset++; return (int)DataHelper.fromLong(_message, offset, 2); } @@ -763,19 +810,17 @@ class UDPPacketReader { /** unused */ public int readChallengeSize() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - return (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + return _message[offset] & 0xff; } /** unused */ public void readChallengeSize(byte target[], int targetOffset) { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, sz); } @@ -783,22 +828,22 @@ class UDPPacketReader { /** Help read the RelayResponse payload */ - public class RelayResponseReader { + public class RelayResponseReader extends Reader { public int readCharlieIPSize() { int offset = readBodyOffset(); - return (int)DataHelper.fromLong(_message, offset, 1); + return _message[offset] & 0xff; } /** what IP charlie is reachable on */ public void readCharlieIP(byte target[], int targetOffset) { int offset = readBodyOffset(); - int size = (int)DataHelper.fromLong(_message, offset, 1); + int size = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, size); } /** what port charlie is reachable on */ public int readCharliePort() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; offset++; return (int)DataHelper.fromLong(_message, offset, 2); } @@ -806,41 +851,36 @@ class UDPPacketReader { /** @deprecated unused */ public int readAliceIPSize() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - return (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + return _message[offset] & 0xff; } /** @deprecated unused */ public void readAliceIP(byte target[], int targetOffset) { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; System.arraycopy(_message, offset, target, targetOffset, sz); } /** @deprecated unused */ public int readAlicePort() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; offset++; offset += sz; return (int)DataHelper.fromLong(_message, offset, 2); } public long readNonce() { int offset = readBodyOffset(); - offset += DataHelper.fromLong(_message, offset, 1); - offset++; - offset += 2; - int sz = (int)DataHelper.fromLong(_message, offset, 1); - offset++; + offset += _message[offset] & 0xff; + offset += 1 + 2; + int sz = _message[offset] & 0xff; + offset += 1 + 2; // sz + port offset += sz; - offset += 2; return DataHelper.fromLong(_message, offset, 4); } } diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java index bc16de99c..cae3030f2 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java @@ -52,6 +52,7 @@ class UDPReceiver { //_context.statManager().createRateStat("udp.droppedInbound", "How many packet are queued up but not yet received when we drop", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.receiveHolePunch", "How often we receive a NAT hole punch", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.ignorePacketFromDroplist", "Packet lifetime for those dropped on the drop list", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.receiveFailsafe", "limiter stuck?", "udp", new long[] { 24*60*60*1000L }); } /** @@ -265,8 +266,16 @@ class UDPReceiver { //_context.bandwidthLimiter().requestInbound(req, size, "UDP receiver"); FIFOBandwidthLimiter.Request req = _context.bandwidthLimiter().requestInbound(size, "UDP receiver"); - while (req.getPendingRequested() > 0) + // failsafe, don't wait forever + int waitCount = 0; + while (req.getPendingRequested() > 0 && waitCount++ < 5) { req.waitForNextAllocation(); + } + if (waitCount >= 5) { + // tell FBL we didn't receive it, but receive it anyway + req.abort(); + _context.statManager().addRateData("udp.receiveFailsafe", 1); + } receive(packet); //_context.statManager().addRateData("udp.receivePacketSize", size); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPSender.java b/router/java/src/net/i2p/router/transport/udp/UDPSender.java index 9c1fdf2ab..ebb2de795 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java @@ -32,6 +32,9 @@ class UDPSender { private static final int TYPE_POISON = 99999; + // Queue needs to be big enough that we can compete with NTCP for + // bandwidth requests, and so CoDel can work well. + // When full, packets back up into the PacketPusher thread, pre-CoDel. private static final int MIN_QUEUE_SIZE = 64; private static final int MAX_QUEUE_SIZE = 384; @@ -54,6 +57,7 @@ class UDPSender { //_context.statManager().createRateStat("udp.socketSendTime", "How long the actual socket.send took", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.sendBWThrottleTime", "How long the send is blocked by the bandwidth throttle", "udp", UDPTransport.RATES); _context.statManager().createRateStat("udp.sendACKTime", "How long an ACK packet is blocked for (duration == lifetime)", "udp", UDPTransport.RATES); + _context.statManager().createRateStat("udp.sendFailsafe", "limiter stuck?", "udp", new long[] { 24*60*60*1000L }); // used in RouterWatchdog _context.statManager().createRequiredRateStat("udp.sendException", "Send fails (Windows exception?)", "udp", new long[] { 60*1000, 10*60*1000 }); @@ -194,9 +198,11 @@ class UDPSender { packet.release(); return; } + packet.requestOutboundBandwidth(); try { _outboundQueue.put(packet); } catch (InterruptedException ie) { + packet.release(); return; } //size = _outboundQueue.size(); @@ -228,10 +234,19 @@ class UDPSender { // ?? int size2 = packet.getPacket().getLength(); if (size > 0) { //_context.bandwidthLimiter().requestOutbound(req, size, "UDP sender"); - FIFOBandwidthLimiter.Request req = - _context.bandwidthLimiter().requestOutbound(size, 0, "UDP sender"); - while (req.getPendingRequested() > 0) - req.waitForNextAllocation(); + FIFOBandwidthLimiter.Request req = packet.getBandwidthRequest(); + if (req != null) { + // failsafe, don't wait forever + int waitCount = 0; + while (req.getPendingRequested() > 0 && waitCount++ < 5) { + req.waitForNextAllocation(); + } + if (waitCount >= 5) { + // tell FBL we didn't send it, but send it anyway + req.abort(); + _context.statManager().addRateData("udp.sendFailsafe", 1); + } + } } long afterBW = _context.clock().now(); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index a502eb327..503fb0fef 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -86,6 +86,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private final DHSessionKeyBuilder.Factory _dhFactory; private int _mtu; private int _mtu_ipv6; + private boolean _mismatchLogged; /** * Do we have a public IPv6 address? @@ -330,6 +331,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority String fixedHost = _context.getProperty(PROP_EXTERNAL_HOST); if (fixedHost != null && fixedHost.length() > 0) { try { + // TODO getAllByName(), bind to each String testAddr = InetAddress.getByName(fixedHost).getHostAddress(); if (Addresses.getAddresses().contains(testAddr)) bindTo = testAddr; @@ -339,7 +341,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority List bindToAddrs = new ArrayList(4); if (bindTo != null) { - String[] bta = bindTo.split("[,; \r\n\t]"); + String[] bta = DataHelper.split(bindTo, "[,; \r\n\t]"); for (int i = 0; i < bta.length; i++) { String bt = bta[i]; if (bt.length() <= 0) @@ -732,8 +734,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _log.warn("Received address: " + Addresses.toString(ip, port) + " from: " + source); if (ip == null) return; + // this is essentially isValid(ip), but we can't use that because + // _haveIPv6Address is not set yet + if (!(isPubliclyRoutable(ip) || allowLocal())) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Invalid address: " + Addresses.toString(ip, port) + " from: " + source); + return; + } if (source == SOURCE_INTERFACE && ip.length == 16) { - // must be set before isValid() call + // NOW we can set it, it's a valid v6 address + // (we don't want to set this for Teredo, 6to4, ...) _haveIPv6Address = true; } if (explicitAddressSpecified()) @@ -741,11 +751,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority String sources = _context.getProperty(PROP_SOURCES, DEFAULT_SOURCES); if (!sources.contains(source.toConfigString())) return; - if (!isValid(ip)) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Invalid address: " + Addresses.toString(ip, port) + " from: " + source); - return; - } if (!isAlive()) { if (source == SOURCE_INTERFACE || source == SOURCE_UPNP) { try { @@ -992,6 +997,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // save PROP_EXTERNAL_PORT _context.router().saveConfig(changes, null); } + // deadlock thru here ticket #1699 _context.router().rebuildRouterInfo(); } _testEvent.forceRunImmediately(); @@ -1229,10 +1235,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _expireEvent.remove(oldPeer2); } - if (_log.shouldLog(Log.WARN) && _peersByIdent.size() != _peersByRemoteHost.size()) + if (_log.shouldLog(Log.WARN) && !_mismatchLogged && _peersByIdent.size() != _peersByRemoteHost.size()) { + _mismatchLogged = true; _log.warn("Size Mismatch after add: " + peer + " byIDsz = " + _peersByIdent.size() + " byHostsz = " + _peersByRemoteHost.size()); + } _activeThrottle.unchoke(peer.getRemotePeer()); markReachable(peer.getRemotePeer(), peer.isInbound()); @@ -1310,6 +1318,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority markUnreachable(peerHash); _context.banlist().banlistRouter(peerHash, "Part of the wrong network, version = " + ((RouterInfo) entry).getVersion()); //_context.banlist().banlistRouter(peerHash, "Part of the wrong network", STYLE); + if (peer != null) + sendDestroy(peer); dropPeer(peerHash, false, "wrong network"); if (_log.shouldLog(Log.WARN)) _log.warn("Dropping the peer " + peerHash + " because they are in the wrong net: " + entry); @@ -1343,12 +1353,22 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority boolean isInDropList(RemoteHostId peer) { return _dropList.contains(peer); } + /** + * This does not send a session destroy, caller must do that if desired. + * + * @param shouldBanlist doesn't really, only sets unreachable + */ void dropPeer(Hash peer, boolean shouldBanlist, String why) { PeerState state = getPeerState(peer); if (state != null) dropPeer(state, shouldBanlist, why); } + /** + * This does not send a session destroy, caller must do that if desired. + * + * @param shouldBanlist doesn't really, only sets unreachable + */ void dropPeer(PeerState peer, boolean shouldBanlist, String why) { if (_log.shouldLog(Log.INFO)) { long now = _context.clock().now(); @@ -1402,6 +1422,11 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority rebuildIfNecessary(); } + /** + * This does not send a session destroy, caller must do that if desired. + * + * @param shouldBanlist doesn't really, only sets unreachable + */ private void locked_dropPeer(PeerState peer, boolean shouldBanlist, String why) { peer.dropOutbound(); peer.expireInboundMessages(); @@ -1562,7 +1587,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * * @since 0.8.9 */ - private void sendDestroy(PeerState peer) { + void sendDestroy(PeerState peer) { // peer must be fully established if (peer.getCurrentCipherKey() == null) return; @@ -1803,14 +1828,74 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } /** - * "injected" message from the EstablishmentManager + * "injected" message from the EstablishmentManager. + * If you have multiple messages, use the list variant, + * so the messages may be bundled efficiently. + * + * @param peer all messages MUST be going to this peer */ void send(I2NPMessage msg, PeerState peer) { try { OutboundMessageState state = new OutboundMessageState(_context, msg, peer); if (_log.shouldLog(Log.DEBUG)) _log.debug("Injecting a data message to a new peer: " + peer); - _fragments.add(state); + _fragments.add(state, peer); + } catch (IllegalArgumentException iae) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Shouldnt happen", new Exception("I did it")); + } + } + + /** + * "injected" message from the EstablishmentManager, + * plus pending messages to send, + * so the messages may be bundled efficiently. + * Called at end of outbound establishment. + * + * @param msg may be null if nothing to inject + * @param msgs non-null, may be empty + * @param peer all messages MUST be going to this peer + * @since 0.9.24 + */ + void send(I2NPMessage msg, List msgs, PeerState peer) { + try { + int sz = msgs.size(); + List states = new ArrayList(sz + 1); + if (msg != null) { + OutboundMessageState state = new OutboundMessageState(_context, msg, peer); + states.add(state); + } + for (int i = 0; i < sz; i++) { + OutboundMessageState state = new OutboundMessageState(_context, msgs.get(i), peer); + states.add(state); + } + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Injecting " + states.size() + " data messages to a new peer: " + peer); + _fragments.add(states, peer); + } catch (IllegalArgumentException iae) { + if (_log.shouldLog(Log.WARN)) + _log.warn("Shouldnt happen", new Exception("I did it")); + } + } + + /** + * "injected" messages from the EstablishmentManager. + * Called at end of inbound establishment. + * + * @param peer all messages MUST be going to this peer + * @since 0.9.24 + */ + void send(List msgs, PeerState peer) { + try { + int sz = msgs.size(); + List states = new ArrayList(sz); + for (int i = 0; i < sz; i++) { + OutboundMessageState state = new OutboundMessageState(_context, msgs.get(i), peer); + states.add(state); + } + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Injecting " + sz + " data messages to a new peer: " + peer); + _fragments.add(states, peer); } catch (IllegalArgumentException iae) { if (_log.shouldLog(Log.WARN)) _log.warn("Shouldnt happen", new Exception("I did it")); @@ -1875,7 +1960,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (explicitAddressSpecified()) { host = _context.getProperty(PROP_EXTERNAL_HOST); if (host != null) { - String[] hosts = host.split("[,; \r\n\t]"); + String[] hosts = DataHelper.split(host, "[,; \r\n\t]"); RouterAddress rv = null; for (int i = 0; i < hosts.length; i++) { String h = hosts[i]; @@ -2095,6 +2180,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority * @since 0.9.18 */ private RouterAddress getCurrentExternalAddress(boolean isIPv6) { + // deadlock thru here ticket #1699 synchronized (_rebuildLock) { return isIPv6 ? _currentOurV6Address : _currentOurV4Address; } @@ -2194,6 +2280,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.DEBUG)) _log.debug("Require introducers, because our status is " + status); return true; + default: if (!allowDirectUDP()) { if (_log.shouldLog(Log.DEBUG)) @@ -2204,6 +2291,30 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } + /** + * MIGHT we require introducers? + * This is like introducersRequired, but if we aren't sure, this returns true. + * Used only by EstablishmentManager. + * + * @since 0.9.24 + */ + boolean introducersMaybeRequired() { + Status status = getReachabilityStatus(); + switch (status) { + case REJECT_UNSOLICITED: + case DIFFERENT: + case IPV4_FIREWALLED_IPV6_OK: + case IPV4_FIREWALLED_IPV6_UNKNOWN: + case IPV4_UNKNOWN_IPV6_OK: + case IPV4_UNKNOWN_IPV6_FIREWALLED: + case UNKNOWN: + return true; + + default: + return !allowDirectUDP(); + } + } + /** * For EstablishmentManager * @since 0.9.3 @@ -2244,7 +2355,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority void failed(OutboundMessageState msg, boolean allowPeerFailure) { if (msg == null) return; - int consecutive = 0; OutNetMessage m = msg.getMessage(); if ( allowPeerFailure && (msg.getPeer() != null) && ( (msg.getMaxSends() >= OutboundMessageFragments.MAX_VOLLEYS) || @@ -2256,7 +2366,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // + " lastReceived: " + recvDelay // + " lastSentFully: " + sendDelay // + " expired? " + msg.isExpired()); - consecutive = msg.getPeer().incrementConsecutiveFailedSends(); + int consecutive = msg.getPeer().incrementConsecutiveFailedSends(); if (_log.shouldLog(Log.INFO)) _log.info("Consecutive failure #" + consecutive + " on " + msg.toString() @@ -2265,6 +2375,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // ok, a few conseutive failures, but we /are/ getting through to them } else { _context.statManager().addRateData("udp.dropPeerConsecutiveFailures", consecutive, msg.getPeer().getInactivityTime()); + sendDestroy(msg.getPeer()); dropPeer(msg.getPeer(), false, "too many failures"); } //if ( (consecutive > MAX_CONSECUTIVE_FAILED) && (msg.getPeer().getInactivityTime() > DROP_INACTIVITY_TIME)) @@ -2381,6 +2492,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return peer != null && peer.isBacklogged(); } + /** + * Tell the transport that we may disconnect from this peer. + * This is advisory only. + * + * @since 0.9.24 + */ + @Override + public void mayDisconnect(final Hash peer) { + final PeerState ps = _peersByIdent.get(peer); + if (ps != null && ps.isInbound() && + ps.getMessagesReceived() <= 2 && ps.getMessagesSent() <= 2) { + ps.setMayDisconnect(); + } + } + public boolean allowConnection() { return _peersByIdent.size() < getMaxConnections(); } @@ -2445,58 +2571,58 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority int numPeers = 0; StringBuilder buf = new StringBuilder(512); - buf.append("

              ").append(_("UDP connections")).append(": ").append(peers.size()); - buf.append(". ").append(_("Limit")).append(": ").append(getMaxConnections()); - buf.append(". ").append(_("Timeout")).append(": ").append(DataHelper.formatDuration2(_expireTimeout)); + buf.append("

              ").append(_t("UDP connections")).append(": ").append(peers.size()); + buf.append(". ").append(_t("Limit")).append(": ").append(getMaxConnections()); + buf.append(". ").append(_t("Timeout")).append(": ").append(DataHelper.formatDuration2(_expireTimeout)); if (_context.getBooleanProperty(PROP_ADVANCED)) { - buf.append(". ").append(_("Status")).append(": ").append(_(_reachabilityStatus.toStatusString())); + buf.append(". ").append(_t("Status")).append(": ").append(_t(_reachabilityStatus.toStatusString())); } buf.append(".

              \n"); buf.append("\n"); - buf.append(""); - buf.append("\n"); - buf.append("\n"); buf.append("\n"); buf.append("\n"); buf.append("\n"); - buf.append("\n"); out.write(buf.toString()); buf.setLength(0); @@ -2512,17 +2638,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // buf.append(' ').append(_context.blocklist().toStr(ip)); buf.append(""); buf.append(""); - long sent = peer.getPacketsTransmitted(); - long recv = peer.getPacketsReceived(); + long sent = peer.getMessagesSent(); + long recv = peer.getMessagesReceived(); buf.append("
              ").append(_("Peer")).append("
              "); + buf.append("
              ").append(_t("Peer")).append("
              "); if (sortFlags != FLAG_ALPHA) - appendSortLinks(buf, urlBase, sortFlags, _("Sort by peer hash"), FLAG_ALPHA); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by peer hash"), FLAG_ALPHA); buf.append("
              ").append(_("Dir")) - .append("").append(_("IPv6")) - .append("").append(_("Idle")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by idle inbound"), FLAG_IDLE_IN); + .append(_t("Direction/Introduction")).append("\">").append(_t("Dir")) + .append("
              ").append(_t("IPv6")) + .append("").append(_t("Idle")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by idle inbound"), FLAG_IDLE_IN); buf.append(" / "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by idle outbound"), FLAG_IDLE_OUT); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by idle outbound"), FLAG_IDLE_OUT); buf.append("
              ").append(_("In/Out")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by inbound rate"), FLAG_RATE_IN); + buf.append("
              ").append(_t("In/Out")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by inbound rate"), FLAG_RATE_IN); buf.append(" / "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by outbound rate"), FLAG_RATE_OUT); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by outbound rate"), FLAG_RATE_OUT); buf.append("
              ").append(_("Up")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by connection uptime"), FLAG_UPTIME); - buf.append("
              ").append(_("Skew")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by clock skew"), FLAG_SKEW); + buf.append("
              ").append(_t("Up")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by connection uptime"), FLAG_UPTIME); + buf.append("
              ").append(_t("Skew")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by clock skew"), FLAG_SKEW); buf.append("
              CWND
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by congestion window"), FLAG_CWND); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by congestion window"), FLAG_CWND); buf.append("
              SST
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by slow start threshold"), FLAG_SSTHRESH); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by slow start threshold"), FLAG_SSTHRESH); buf.append("
              RTT
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time"), FLAG_RTT); - //buf.append("
              ").append(_("Dev")).append("
              "); - //appendSortLinks(buf, urlBase, sortFlags, _("Sort by round trip time deviation"), FLAG_DEV); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by round trip time"), FLAG_RTT); + //buf.append("
              ").append(_t("Dev")).append("
              "); + //appendSortLinks(buf, urlBase, sortFlags, _t("Sort by round trip time deviation"), FLAG_DEV); buf.append("
              RTO
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by retransmission timeout"), FLAG_RTO); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by retransmission timeout"), FLAG_RTO); buf.append("
              MTU
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by outbound maximum transmit unit"), FLAG_MTU); - buf.append("
              ").append(_("TX")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets sent"), FLAG_SEND); - buf.append("
              ").append(_("RX")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets received"), FLAG_RECV); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by outbound maximum transmit unit"), FLAG_MTU); + buf.append("
              ").append(_t("TX")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets sent"), FLAG_SEND); + buf.append("
              ").append(_t("RX")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets received"), FLAG_RECV); buf.append("
              ").append(_("Dup TX")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets retransmitted"), FLAG_RESEND); - buf.append("
              ").append(_("Dup RX")).append("
              "); - appendSortLinks(buf, urlBase, sortFlags, _("Sort by packets received more than once"), FLAG_DUP); + buf.append("
              ").append(_t("Dup TX")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets retransmitted"), FLAG_RESEND); + buf.append("
              ").append(_t("Dup RX")).append("
              "); + appendSortLinks(buf, urlBase, sortFlags, _t("Sort by packets received more than once"), FLAG_DUP); buf.append("
              "); if (peer.isInbound()) - buf.append("\"Inbound\""); + buf.append("\"Inbound\""); else - buf.append("\"Outbound\""); + buf.append("\"Outbound\""); if (peer.getWeRelayToThemAs() > 0) - buf.append("  \"^\""); + buf.append("  \"^\""); if (peer.getTheyRelayToUsAs() > 0) - buf.append("  \"V\""); + buf.append("  \"V\""); boolean appended = false; if (_activeThrottle.isChoked(peer.getRemotePeer())) { - buf.append("
              ").append(_("Choked")).append(""); + buf.append("
              ").append(_t("Choked")).append(""); appended = true; } int cfs = peer.getConsecutiveFailedSends(); @@ -2530,15 +2656,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (!appended) buf.append("
              "); buf.append(" "); if (cfs == 1) - buf.append(_("1 fail")); + buf.append(_t("1 fail")); else - buf.append(_("{0} fails", cfs)); + buf.append(_t("{0} fails", cfs)); buf.append(""); appended = true; } if (_context.banlist().isBanlisted(peer.getRemotePeer(), STYLE)) { if (!appended) buf.append("
              "); - buf.append(" ").append(_("Banned")).append(""); + buf.append(" ").append(_t("Banned")).append(""); appended = true; } //byte[] ip = getIP(peer.getRemotePeer()); @@ -2597,7 +2723,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(THINSP).append(peer.getConcurrentSendWindow()); buf.append(THINSP).append(peer.getConsecutiveSendRejections()); if (peer.isBacklogged()) - buf.append(' ').append(_("backlogged")); + buf.append(' ').append(_t("backlogged")); buf.append("
              "); @@ -2627,8 +2753,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority //buf.append(peer.getMTUDecreases()); buf.append(""); buf.append(sent); @@ -2769,6 +2895,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private static final long LONG_LOOP_TIME = 25*1000; private static final long EXPIRE_INCREMENT = 15*1000; private static final long EXPIRE_DECREMENT = 45*1000; + private static final long MAY_DISCON_TIMEOUT = 10*1000; public ExpirePeerEvent() { super(_context.simpleTimer2()); @@ -2778,7 +2905,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public void timeReached() { // Increase allowed idle time if we are well under allowed connections, otherwise decrease - if (haveCapacity(33)) { + boolean haveCap = haveCapacity(33); + if (haveCap) { long inc; // don't adjust too quickly if we are looping fast if (_lastLoopShort) @@ -2797,6 +2925,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority long now = _context.clock().now(); long shortInactivityCutoff = now - _expireTimeout; long longInactivityCutoff = now - EXPIRE_TIMEOUT; + final long mayDisconCutoff = now - MAY_DISCON_TIMEOUT; long pingCutoff = now - (2 * 60*60*1000); long pingFirewallCutoff = now - PING_FIREWALL_CUTOFF; boolean shouldPingFirewall = _reachabilityStatus != Status.OK; @@ -2811,10 +2940,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority PeerState peer = iter.next(); long inactivityCutoff; // if we offered to introduce them, or we used them as introducer in last 2 hours - if (peer.getWeRelayToThemAs() > 0 || peer.getIntroducerTime() > pingCutoff) + if (peer.getWeRelayToThemAs() > 0 || peer.getIntroducerTime() > pingCutoff) { inactivityCutoff = longInactivityCutoff; - else + } else if (!haveCap && peer.getMayDisconnect() && + peer.getMessagesReceived() <= 2 && peer.getMessagesSent() <= 2) { + inactivityCutoff = mayDisconCutoff; + } else { inactivityCutoff = shortInactivityCutoff; + } if ( (peer.getLastReceiveTime() < inactivityCutoff) && (peer.getLastSendTime() < inactivityCutoff) ) { _expireBuffer.add(peer); iter.remove(); @@ -2929,7 +3062,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority " from: ", new Exception("traceback")); if (old != Status.UNKNOWN) _context.router().eventLog().addEvent(EventLog.REACHABILITY, - "from " + _(old.toStatusString()) + " to " + _(status.toStatusString())); + "from " + _t(old.toStatusString()) + " to " + _t(status.toStatusString())); // Always rebuild when the status changes, even if our address hasn't changed, // as rebuildExternalAddress() calls replaceAddress() which calls CSFI.notifyReplaceAddress() // which will start up NTCP inbound when we transition to OK. diff --git a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java index d363d7a3f..69fe08243 100644 --- a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java +++ b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java @@ -370,7 +370,7 @@ class BatchedPreprocessor extends TrivialPreprocessor { if (offset <= 0) { StringBuilder buf = new StringBuilder(128); - buf.append("wtf, written offset is ").append(offset); + buf.append("uh? written offset is ").append(offset); buf.append(" for ").append(startAt).append(" through ").append(sendThrough); for (int i = startAt; i <= sendThrough; i++) { buf.append(" ").append(pending.get(i).toString()); diff --git a/router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java b/router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java index 0c872fea6..62fa46231 100644 --- a/router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java +++ b/router/java/src/net/i2p/router/tunnel/BloomFilterIVValidator.java @@ -30,10 +30,12 @@ class BloomFilterIVValidator implements IVValidator { private static final int MIN_SHARE_KBPS_FOR_BIG_BLOOM = 512; private static final int MIN_SHARE_KBPS_FOR_HUGE_BLOOM = 1536; private static final int MIN_SHARE_KBPS_FOR_HUGE2_BLOOM = 4096; + private static final int MIN_SHARE_KBPS_FOR_HUGE3_BLOOM = 8192; private static final long MIN_MEM_TO_USE_BLOOM = 64*1024*1024l; private static final long MIN_MEM_FOR_BIG_BLOOM = 128*1024*1024l; private static final long MIN_MEM_FOR_HUGE_BLOOM = 256*1024*1024l; private static final long MIN_MEM_FOR_HUGE2_BLOOM = 384*1024*1024l; + private static final long MIN_MEM_FOR_HUGE3_BLOOM = 512*1024*1024l; /** for testing */ private static final String PROP_FORCE = "router.forceDecayingBloomFilter"; /** for testing */ @@ -57,8 +59,12 @@ class BloomFilterIVValidator implements IVValidator { if (KBps >= MIN_SHARE_KBPS_TO_USE_BLOOM) warn(maxMemory, KBps, MIN_MEM_TO_USE_BLOOM, MIN_SHARE_KBPS_TO_USE_BLOOM); _filter = new DecayingHashSet(ctx, HALFLIFE_MS, 16, "TunnelIVV"); // appx. 4MB max + } else if (KBps >= MIN_SHARE_KBPS_FOR_HUGE3_BLOOM && maxMemory >= MIN_MEM_FOR_HUGE3_BLOOM) { + _filter = new DecayingBloomFilter(ctx, HALFLIFE_MS, 16, "TunnelIVV", 27); // 32MB fixed } else if (KBps >= MIN_SHARE_KBPS_FOR_HUGE2_BLOOM && maxMemory >= MIN_MEM_FOR_HUGE2_BLOOM) { _filter = new DecayingBloomFilter(ctx, HALFLIFE_MS, 16, "TunnelIVV", 26); // 16MB fixed + if (KBps >= MIN_SHARE_KBPS_FOR_HUGE3_BLOOM) + warn(maxMemory, KBps, MIN_MEM_FOR_HUGE3_BLOOM, MIN_SHARE_KBPS_FOR_HUGE3_BLOOM); } else if (KBps >= MIN_SHARE_KBPS_FOR_HUGE_BLOOM && maxMemory >= MIN_MEM_FOR_HUGE_BLOOM) { if (KBps >= MIN_SHARE_KBPS_FOR_HUGE2_BLOOM) warn(maxMemory, KBps, MIN_MEM_FOR_HUGE2_BLOOM, MIN_SHARE_KBPS_FOR_HUGE2_BLOOM); @@ -96,16 +102,26 @@ class BloomFilterIVValidator implements IVValidator { private void warn(long maxMemory, int KBps, long recMaxMem, int threshKBps) { if (SystemVersion.isAndroid()) return; + // Can't find any System property or wrapper property that gives + // you the actual config file path, have to guess + // TODO if !SystemVersion.hasWrapper ... + String path; + if (!SystemVersion.isWindows() && !SystemVersion.isMac() && + "i2psvc".equals(System.getProperty("user.name"))) { + path = "/etc/i2p"; + } else { + path = _context.getBaseDir().toString(); + } String msg = - "Configured for " + DataHelper.formatSize(KBps *1024) + + "Configured for " + DataHelper.formatSize(KBps *1024L) + "Bps share bandwidth but only " + DataHelper.formatSize(maxMemory) + "B available memory." + " Recommend increasing wrapper.java.maxmemory in " + - _context.getBaseDir() + File.separatorChar + "wrapper.config" + + path + File.separatorChar + "wrapper.config" + // getMaxMemory() returns significantly lower than wrapper config, so add 10% " to at least " + (recMaxMem * 11 / 10 / (1024*1024)) + " (MB)" + " if the actual share bandwidth exceeds " + - DataHelper.formatSize(threshKBps * 1024) + "Bps."; + DataHelper.formatSize(threshKBps * 1024L) + "Bps."; System.out.println("WARN: " + msg); _context.logManager().getLog(BloomFilterIVValidator.class).logAlways(Log.WARN, msg); } diff --git a/router/java/src/net/i2p/router/tunnel/BuildReplyHandler.java b/router/java/src/net/i2p/router/tunnel/BuildReplyHandler.java index 2196a851e..8514d6db1 100644 --- a/router/java/src/net/i2p/router/tunnel/BuildReplyHandler.java +++ b/router/java/src/net/i2p/router/tunnel/BuildReplyHandler.java @@ -120,7 +120,7 @@ public class BuildReplyHandler { return -1; } else { SimpleByteCache.release(h); - int rv = (int)DataHelper.fromLong(data, TunnelBuildReplyMessage.RECORD_SIZE - 1, 1); + int rv = data[TunnelBuildReplyMessage.RECORD_SIZE - 1] & 0xff; if (log.shouldLog(Log.DEBUG)) log.debug(reply.getUniqueId() + ": Verified: " + rv + " for record " + recordNum + "/" + hop); return rv; diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java index f02e2d573..eef132712 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java @@ -164,7 +164,7 @@ class FragmentHandler { if (_log.shouldLog(Log.ERROR)) _log.error("Corrupt fragment received: offset = " + offset, e); _context.statManager().addRateData("tunnel.corruptMessage", 1, 1); - // java.lang.IllegalStateException: wtf, don't get the completed size when we're not complete - null fragment i=0 of 1 + // java.lang.IllegalStateException: don't get the completed size when we're not complete - null fragment i=0 of 1 // at net.i2p.router.tunnel.FragmentedMessage.getCompleteSize(FragmentedMessage.java:194) // at net.i2p.router.tunnel.FragmentedMessage.toByteArray(FragmentedMessage.java:223) // at net.i2p.router.tunnel.FragmentHandler.receiveComplete(FragmentHandler.java:380) @@ -340,7 +340,7 @@ class FragmentHandler { offset += 4; } if (extended) { - int extendedSize = (int)DataHelper.fromLong(preprocessed, offset, 1); + int extendedSize = preprocessed[offset] & 0xff; offset++; offset += extendedSize; // we don't interpret these yet, but skip them for now } diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java index c692b2b20..effc2a4c6 100644 --- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java +++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java @@ -164,7 +164,7 @@ class FragmentedMessage { } public int getCompleteSize() { if (!_lastReceived) - throw new IllegalStateException("wtf, don't get the completed size when we're not complete"); + throw new IllegalStateException("don't get the completed size when we're not complete!"); if (_releasedAfter > 0) { RuntimeException e = new RuntimeException("use after free in FragmentedMessage"); _log.error("FM completeSize()", e); @@ -175,7 +175,7 @@ class FragmentedMessage { ByteArray ba = _fragments[i]; // NPE seen here, root cause unknown if (ba == null) - throw new IllegalStateException("wtf, don't get the completed size when we're not complete - null fragment i=" + i + " of " + _highFragmentNum); + throw new IllegalStateException("don't get the completed size when we're not complete! - null fragment i=" + i + " of " + _highFragmentNum); size += ba.getValid(); } return size; diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java index 447f6a083..3045c3371 100644 --- a/router/java/src/net/i2p/router/tunnel/HopConfig.java +++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java @@ -26,6 +26,7 @@ public class HopConfig { // these 4 were longs, let's save some space // 2 billion * 1KB / 10 minutes = 3 GBps in a single tunnel + // we use synchronization instead of an AtomicInteger here to save space private int _messagesProcessed; private int _oldMessagesProcessed; //private int _messagesSent; @@ -50,12 +51,14 @@ public class HopConfig { public void setReceiveTunnelId(byte id[]) { _receiveTunnelId = id; } public void setReceiveTunnelId(TunnelId id) { _receiveTunnelId = DataHelper.toLong(4, id.getTunnelId()); } - /** what is the previous peer in the tunnel (if any)? */ + /** what is the previous peer in the tunnel (null if gateway) */ public Hash getReceiveFrom() { return _receiveFrom; } public void setReceiveFrom(Hash from) { _receiveFrom = from; } - /** what is the next tunnel ID we are sending to? */ + /** what is the next tunnel ID we are sending to? (null if endpoint) */ public byte[] getSendTunnelId() { return _sendTunnelId; } + + /** what is the next tunnel we are sending to? (null if endpoint) */ public TunnelId getSendTunnel() { if (_sendTunnel == null) _sendTunnel = getTunnel(_sendTunnelId); @@ -70,7 +73,7 @@ public class HopConfig { return new TunnelId(DataHelper.fromLong(id, 0, id.length)); } - /** what is the next peer in the tunnel (if any)? */ + /** what is the next peer in the tunnel (null if endpoint) */ public Hash getSendTo() { return _sendTo; } public void setSendTo(Hash to) { _sendTo = to; } @@ -125,12 +128,29 @@ public class HopConfig { /** * Take note of a message being pumped through this tunnel. * "processed" is for incoming and "sent" is for outgoing (could be dropped in between) + * We use synchronization instead of an AtomicInteger here to save space. */ - public void incrementProcessedMessages() { _messagesProcessed++; } + public synchronized void incrementProcessedMessages() { _messagesProcessed++; } - public int getProcessedMessagesCount() { return _messagesProcessed; } + public synchronized int getProcessedMessagesCount() { return _messagesProcessed; } - public int getRecentMessagesCount() { + /** + * This returns the number of processed messages since + * the last time getAndResetRecentMessagesCount() was called. + * As of 0.9.23, does NOT reset the count, see getAndResetRecentMessagesCount(). + */ + public synchronized int getRecentMessagesCount() { + return _messagesProcessed - _oldMessagesProcessed; + } + + /** + * This returns the number of processed messages since the last time this was called, + * and resets the count. It should only be called by code that updates the router stats. + * See TunnelDispatcher.updateParticipatingStats(). + * + * @since 0.9.23 + */ + synchronized int getAndResetRecentMessagesCount() { int rv = _messagesProcessed - _oldMessagesProcessed; _oldMessagesProcessed = _messagesProcessed; return rv; @@ -169,8 +189,9 @@ public class HopConfig { } buf.append(" exp. ").append(TunnelCreatorConfig.format(_expiration)); - if (_messagesProcessed > 0) - buf.append(" used ").append(_messagesProcessed).append("KB"); + int messagesProcessed = getProcessedMessagesCount(); + if (messagesProcessed > 0) + buf.append(" used ").append(messagesProcessed).append("KB"); return buf.toString(); } } diff --git a/router/java/src/net/i2p/router/tunnel/InboundGatewayProcessor.java b/router/java/src/net/i2p/router/tunnel/InboundGatewayProcessor.java index 696825a06..0902de47b 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundGatewayProcessor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundGatewayProcessor.java @@ -20,6 +20,6 @@ class InboundGatewayProcessor extends HopProcessor { public void process(byte orig[], int offset, int length) { boolean ok = super.process(orig, offset, length, null); if (!ok) - throw new RuntimeException("wtf, we are the gateway, how did it fail?"); + throw new RuntimeException("we are the gateway, how did it fail?"); } } diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java index 62c1e6ed6..a686278e3 100644 --- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java +++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java @@ -18,6 +18,7 @@ import net.i2p.data.i2np.VariableTunnelBuildReplyMessage; import net.i2p.router.ClientMessage; import net.i2p.router.RouterContext; import net.i2p.router.TunnelInfo; +import net.i2p.router.TunnelPoolSettings; import net.i2p.router.message.GarlicMessageReceiver; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.util.Log; @@ -117,8 +118,8 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { } return; } else if (dsm.getReplyToken() != 0) { - if (_log.shouldLog(Log.WARN)) - _log.warn("Dropping LS DSM w/ reply token down a tunnel for " + _client + ": " + msg); + _context.statManager().addRateData("tunnel.dropDangerousClientTunnelMessage", 1, type); + _log.error("Dropping LS DSM w/ reply token down a tunnel for " + _client + ": " + msg); return; } else { // allow DSM of our own key (used by FloodfillVerifyStoreJob) @@ -143,6 +144,33 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { return; } // switch + } else { + // expl. tunnel + switch (type) { + case DatabaseStoreMessage.MESSAGE_TYPE: + DatabaseStoreMessage dsm = (DatabaseStoreMessage) msg; + if (dsm.getReplyToken() != 0) { + _context.statManager().addRateData("tunnel.dropDangerousExplTunnelMessage", 1, type); + _log.error("Dropping DSM w/ reply token down a expl. tunnel: " + msg); + return; + } + if (dsm.getEntry().getType() == DatabaseEntry.KEY_TYPE_LEASESET) + ((LeaseSet)dsm.getEntry()).setReceivedAsReply(); + break; + + case DatabaseSearchReplyMessage.MESSAGE_TYPE: + case DeliveryStatusMessage.MESSAGE_TYPE: + case GarlicMessage.MESSAGE_TYPE: + case TunnelBuildReplyMessage.MESSAGE_TYPE: + case VariableTunnelBuildReplyMessage.MESSAGE_TYPE: + // these are safe, handled below + break; + + default: + _context.statManager().addRateData("tunnel.dropDangerousExplTunnelMessage", 1, type); + _log.error("Dropped dangerous message down expl tunnel: " + msg, new Exception("cause")); + return; + } // switch } // client != null if ( (target == null) || ( (tunnel == null) && (_context.routerHash().equals(target) ) ) ) { @@ -188,7 +216,7 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { TunnelId outId = out.getSendTunnelId(0); if (outId == null) { if (_log.shouldLog(Log.ERROR)) - _log.error("wtf, outbound tunnel has no outboundId? " + out + _log.error("strange? outbound tunnel has no outboundId? " + out + " failing to distribute " + msg); return; } @@ -204,11 +232,11 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { * */ public void handleClove(DeliveryInstructions instructions, I2NPMessage data) { + int type = data.getType(); switch (instructions.getDeliveryMode()) { case DeliveryInstructions.DELIVERY_MODE_LOCAL: if (_log.shouldLog(Log.DEBUG)) _log.debug("local delivery instructions for clove: " + data.getClass().getSimpleName()); - int type = data.getType(); if (type == GarlicMessage.MESSAGE_TYPE) { _receiver.receive((GarlicMessage)data); } else if (type == DatabaseStoreMessage.MESSAGE_TYPE) { @@ -296,28 +324,45 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { _context.inNetMessagePool().add(data, null, null); } return; + case DeliveryInstructions.DELIVERY_MODE_DESTINATION: + Hash to = instructions.getDestination(); // Can we route UnknownI2NPMessages to a destination too? - if (!(data instanceof DataMessage)) { + if (type != DataMessage.MESSAGE_TYPE) { if (_log.shouldLog(Log.ERROR)) _log.error("cant send a " + data.getClass().getSimpleName() + " to a destination"); - } else if ( (_client != null) && (_client.equals(instructions.getDestination())) ) { + } else if (_client != null && _client.equals(to)) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("data message came down a tunnel for " - + _client); + _log.debug("data message came down a tunnel for " + _client); DataMessage dm = (DataMessage)data; Payload payload = new Payload(); payload.setEncryptedData(dm.getData()); ClientMessage m = new ClientMessage(_client, payload); _context.clientManager().messageReceived(m); + } else if (_client != null) { + // Shared tunnel? + TunnelPoolSettings tgt = _context.tunnelManager().getInboundSettings(to); + if (tgt != null && _client.equals(tgt.getAliasOf())) { + // same as above, just different log + if (_log.shouldLog(Log.DEBUG)) + _log.debug("data message came down a tunnel for " + + _client + " targeting shared " + to); + DataMessage dm = (DataMessage)data; + Payload payload = new Payload(); + payload.setEncryptedData(dm.getData()); + ClientMessage m = new ClientMessage(to, payload); + _context.clientManager().messageReceived(m); + } else { + if (_log.shouldLog(Log.ERROR)) + _log.error("Data message came down a tunnel for " + + _client + " but targetted " + to); + } } else { if (_log.shouldLog(Log.ERROR)) - _log.error("this data message came down a tunnel for " - + (_client == null ? "no one" : _client) - + " but targetted " - + instructions.getDestination()); + _log.error("Data message came down an exploratory tunnel targeting " + to); } return; + case DeliveryInstructions.DELIVERY_MODE_ROUTER: // fall through case DeliveryInstructions.DELIVERY_MODE_TUNNEL: if (_log.shouldLog(Log.INFO)) @@ -325,6 +370,7 @@ class InboundMessageDistributor implements GarlicMessageReceiver.CloveReceiver { + ", treat recursively to prevent leakage"); distribute(data, instructions.getRouter(), instructions.getTunnelId()); return; + default: if (_log.shouldLog(Log.ERROR)) _log.error("Unknown instruction " + instructions.getDeliveryMode() + ": " + instructions); diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java index 614c7faab..4f1f82d87 100644 --- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java @@ -58,6 +58,7 @@ class PumpedTunnelGateway extends TunnelGateway { * @param receiver this receives the encrypted message and forwards it off * to the first hop */ + @SuppressWarnings({ "unchecked", "rawtypes" }) public PumpedTunnelGateway(RouterContext context, QueuePreprocessor preprocessor, Sender sender, Receiver receiver, TunnelGatewayPumper pumper) { super(context, preprocessor, sender, receiver); diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java index 9340477c6..734490d6a 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java @@ -30,16 +30,32 @@ public class TunnelCreatorConfig implements TunnelInfo { private long _replyMessageId; private final boolean _isInbound; private int _messagesProcessed; - private volatile long _verifiedBytesTransferred; + private long _verifiedBytesTransferred; private boolean _failed; private int _failures; private boolean _reused; private int _priority; + //private static final int THROUGHPUT_COUNT = 3; + // Fastest 1 minute throughput, in bytes per minute, ordered with fastest first. + //private final double _peakThroughput[] = new double[THROUGHPUT_COUNT]; + private long _peakThroughputCurrentTotal; + private long _peakThroughputLastCoallesce = System.currentTimeMillis(); + // Make configurable? - but can't easily get to pool options from here + private static final int MAX_CONSECUTIVE_TEST_FAILURES = 3; + private static final SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss", Locale.UK); + /** + * For exploratory only (null destination) + * @param length 1 minimum (0 hop is length 1) + */ public TunnelCreatorConfig(RouterContext ctx, int length, boolean isInbound) { this(ctx, length, isInbound, null); } + /** + * @param length 1 minimum (0 hop is length 1) + * @param destination null for exploratory + */ public TunnelCreatorConfig(RouterContext ctx, int length, boolean isInbound, Hash destination) { _context = ctx; if (length <= 0) @@ -131,10 +147,13 @@ public class TunnelCreatorConfig implements TunnelInfo { public void setReplyMessageId(long id) { _replyMessageId = id; } /** take note of a message being pumped through this tunnel */ - public void incrementProcessedMessages() { _messagesProcessed++; } - public int getProcessedMessagesCount() { return _messagesProcessed; } + public synchronized void incrementProcessedMessages() { _messagesProcessed++; } + public synchronized int getProcessedMessagesCount() { return _messagesProcessed; } - public void incrementVerifiedBytesTransferred(int bytes) { + /** + * This calls profile manager tunnelDataPushed1m() for each peer + */ + public synchronized void incrementVerifiedBytesTransferred(int bytes) { _verifiedBytesTransferred += bytes; _peakThroughputCurrentTotal += bytes; long now = System.currentTimeMillis(); @@ -144,38 +163,34 @@ public class TunnelCreatorConfig implements TunnelInfo { double normalized = tot * 60d*1000d / timeSince; _peakThroughputLastCoallesce = now; _peakThroughputCurrentTotal = 0; - if (_context != null) - for (int i = 0; i < _peers.length; i++) + if (_context != null) { + // skip ourselves + int start = _isInbound ? 0 : 1; + int end = _isInbound ? _peers.length - 1 : _peers.length; + for (int i = start; i < end; i++) { _context.profileManager().tunnelDataPushed1m(_peers[i], (int)normalized); + } + } } } - public long getVerifiedBytesTransferred() { return _verifiedBytesTransferred; } + public synchronized long getVerifiedBytesTransferred() { return _verifiedBytesTransferred; } - private static final int THROUGHPUT_COUNT = 3; - /** - * fastest 1 minute throughput, in bytes per minute, ordered with fastest - * first. - */ - private final double _peakThroughput[] = new double[THROUGHPUT_COUNT]; - private volatile long _peakThroughputCurrentTotal; - private volatile long _peakThroughputLastCoallesce = System.currentTimeMillis(); - public double getPeakThroughputKBps() { +/**** unused + public synchronized double getPeakThroughputKBps() { double rv = 0; for (int i = 0; i < THROUGHPUT_COUNT; i++) rv += _peakThroughput[i]; rv /= (60d*1024d*THROUGHPUT_COUNT); return rv; } - public void setPeakThroughputKBps(double kBps) { + + public synchronized void setPeakThroughputKBps(double kBps) { _peakThroughput[0] = kBps*60*1024; //for (int i = 0; i < THROUGHPUT_COUNT; i++) // _peakThroughput[i] = kBps*60; } - - - // Make configurable? - but can't easily get to pool options from here - private static final int MAX_CONSECUTIVE_TEST_FAILURES = 3; +****/ /** * The tunnel failed a test, so (maybe) stop using it @@ -264,11 +279,10 @@ public class TunnelCreatorConfig implements TunnelInfo { return buf.toString(); } - private static final SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss", Locale.UK); - private String getExpirationString() { return format(_expiration); } + static String format(long date) { Date d = new Date(date); synchronized (_fmt) { diff --git a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java index 09744c569..6c80375ed 100644 --- a/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java +++ b/router/java/src/net/i2p/router/tunnel/TunnelDispatcher.java @@ -163,9 +163,14 @@ public class TunnelDispatcher implements Service { ctx.statManager().createRateStat("tunnel.participatingMessageDropped", "Dropped for exceeding share limit", "Tunnels", new long[] { 60*1000l, 60*10*1000l }); + // count for console ctx.statManager().createRequiredRateStat("tunnel.participatingMessageCount", "Number of 1KB participating messages", "Tunnels", new long[] { 60*1000l, 60*10*1000l, 60*60*1000l }); + // estimate for RouterThrottleImpl + ctx.statManager().createRequiredRateStat("tunnel.participatingMessageCountAvgPerTunnel", + "Estimate of participating messages per tunnel lifetime", "Tunnels", + new long[] { 60*1000l }); ctx.statManager().createRateStat("tunnel.ownedMessageCount", "How many messages are sent through a tunnel we created (period == failures)?", "Tunnels", new long[] { 60*1000l, 10*60*1000l, 60*60*1000l }); @@ -211,7 +216,8 @@ public class TunnelDispatcher implements Service { ctx.statManager().createRequiredRateStat("tunnel.corruptMessage", "Corrupt messages received", "Tunnels", RATES); // following are for InboundMessageDistributor - ctx.statManager().createRateStat("tunnel.dropDangerousClientTunnelMessage", "How many tunnel messages come down a client tunnel that we shouldn't expect (lifetime is the 'I2NP type')", "Tunnels", new long[] { 60*60*1000 }); + ctx.statManager().createRateStat("tunnel.dropDangerousClientTunnelMessage", "(lifetime is the I2NP type)", "Tunnels", new long[] { 60*60*1000 }); + ctx.statManager().createRateStat("tunnel.dropDangerousExplTunnelMessage", "(lifetime is the I2NP type)", "Tunnels", new long[] { 60*60*1000 }); ctx.statManager().createRateStat("tunnel.handleLoadClove", "When do we receive load test cloves", "Tunnels", new long[] { 60*60*1000 }); // following is for PumpedTunnelGateway ctx.statManager().createRateStat("tunnel.dropGatewayOverflow", "Dropped message at GW, queue full", "Tunnels", new long[] { 60*60*1000 }); @@ -451,7 +457,8 @@ public class TunnelDispatcher implements Service { _inboundGateways.remove(recvId); } else { // update stats based off getCompleteCount() + getFailedCount() - for (int i = 0; i < cfg.getLength(); i++) { + // skip last hop (us) + for (int i = 0; i < cfg.getLength() - 1; i++) { Hash peer = cfg.getPeer(i); PeerProfile profile = _context.profileOrganizer().getProfile(peer); if (profile != null) { @@ -630,7 +637,7 @@ public class TunnelDispatcher implements Service { * @param targetPeer gateway to the tunnel to receive the message */ public void dispatchOutbound(I2NPMessage msg, TunnelId outboundTunnel, TunnelId targetTunnel, Hash targetPeer) { - if (outboundTunnel == null) throw new IllegalArgumentException("wtf, null outbound tunnel?"); + if (outboundTunnel == null) throw new IllegalArgumentException("null outbound tunnel?"); long before = _context.clock().now(); TunnelGateway gw = _outboundGateways.get(outboundTunnel); if (gw != null) { @@ -677,7 +684,7 @@ public class TunnelDispatcher implements Service { //long dispatchTime = _context.clock().now() - before; //if (dispatchTime > 1000) { // if (_log.shouldLog(Log.WARN)) - // _log.warn("wtf, took " + dispatchTime + " to dispatch " + msg + " out " + outboundTunnel + " in " + gw); + // _log.warn("slow? took " + dispatchTime + " to dispatch " + msg + " out " + outboundTunnel + " in " + gw); //} //if (gw instanceof TunnelGatewayZeroHop) // _context.statManager().addRateData("tunnel.dispatchOutboundZeroHopTime", dispatchTime, dispatchTime); @@ -710,7 +717,7 @@ public class TunnelDispatcher implements Service { long tooYoung = _context.clock().now() - 60*1000; long tooOld = tooYoung - 9*60*1000; for (HopConfig cfg : _participatingConfig.values()) { - long c = cfg.getRecentMessagesCount(); + long c = cfg.getAndResetRecentMessagesCount(); bw += c; //bwOut += cfg.getRecentSentMessagesCount(); long created = cfg.getCreation(); @@ -719,9 +726,15 @@ public class TunnelDispatcher implements Service { tcount++; count += c; } + // This is an estimate of the average number of participating messages per tunnel + // in a tunnel lifetime, used only by RouterThrottleImpl + // 10 minutes / 50 seconds = 12 if (tcount > 0) - count = count * 30 / tcount; - _context.statManager().addRateData("tunnel.participatingMessageCount", count, ms); + count = count * (10*60*1000 / ms) / tcount; + _context.statManager().addRateData("tunnel.participatingMessageCountAvgPerTunnel", count, ms); + // This is a straight count of the total participating messages, used in the router console + _context.statManager().addRateData("tunnel.participatingMessageCount", bw, ms); + // Bandwidth in bits per second _context.statManager().addRateData("tunnel.participatingBandwidth", bw*1024/(ms/1000), ms); // moved to FIFOBandwidthRefiller //_context.statManager().addRateData("tunnel.participatingBandwidthOut", bwOut*1024/(ms/1000), ms); diff --git a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java new file mode 100644 index 000000000..1dc45eb61 --- /dev/null +++ b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java @@ -0,0 +1,156 @@ +package net.i2p.router.tunnel.pool; + +import java.util.List; + +import net.i2p.data.Hash; +import net.i2p.data.Lease; +import net.i2p.data.LeaseSet; +import net.i2p.data.TunnelId; +import net.i2p.router.RouterContext; +import net.i2p.router.TunnelInfo; +import net.i2p.router.TunnelPoolSettings; +import net.i2p.util.Log; + +/** + * A tunnel pool with its own settings and Destination, + * but uses another pool for its tunnels. + * + * @since 0.9.21 + */ +public class AliasedTunnelPool extends TunnelPool { + + private final TunnelPool _aliasOf; + + AliasedTunnelPool(RouterContext ctx, TunnelPoolManager mgr, TunnelPoolSettings settings, TunnelPool aliasOf) { + super(ctx, mgr, settings, null); + if (settings.isExploratory()) + throw new IllegalArgumentException(); + if (settings.getAliasOf() == null) + throw new IllegalArgumentException(); + _aliasOf = aliasOf; + } + + @Override + synchronized void startup() { + if (_log.shouldLog(Log.INFO)) + _log.info(toString() + ": Startup() called, was already alive? " + _alive, new Exception()); + _alive = true; + super.refreshLeaseSet(); + } + + @Override + synchronized void shutdown() { + if (_log.shouldLog(Log.WARN)) + _log.warn(toString() + ": Shutdown called"); + _alive = false; + } + + @Override + TunnelInfo selectTunnel() { + return _aliasOf.selectTunnel(); + } + + @Override + TunnelInfo selectTunnel(Hash closestTo) { + return _aliasOf.selectTunnel(closestTo); + } + + @Override + public TunnelInfo getTunnel(TunnelId gatewayId) { + return _aliasOf.getTunnel(gatewayId); + } + + @Override + public List listTunnels() { + return _aliasOf.listTunnels(); + } + + @Override + boolean needFallback() { + return false; + } + + @Override + public List listPending() { + return _aliasOf.listPending(); + } + + @Override + public boolean isAlive() { + return _alive && _aliasOf.isAlive(); + } + + @Override + public int size() { + return _aliasOf.size(); + } + + @Override + void addTunnel(TunnelInfo info) { + _aliasOf.addTunnel(info); + } + + @Override + void removeTunnel(TunnelInfo info) { + _aliasOf.removeTunnel(info); + } + + @Override + void tunnelFailed(TunnelInfo cfg) { + _aliasOf.tunnelFailed(cfg); + } + + @Override + void tunnelFailed(TunnelInfo cfg, Hash blamePeer) { + _aliasOf.tunnelFailed(cfg, blamePeer); + } + + @Override + void refreshLeaseSet() {} + + @Override + boolean buildFallback() { + return _aliasOf.buildFallback(); + } + + @Override + protected LeaseSet locked_buildNewLeaseSet() { + LeaseSet ls = _context.netDb().lookupLeaseSetLocally(_aliasOf.getSettings().getDestination()); + if (ls == null) + return null; + // copy everything so it isn't corrupted + LeaseSet rv = new LeaseSet(); + for (int i = 0; i < ls.getLeaseCount(); i++) { + Lease old = ls.getLease(i); + Lease lease = new Lease(); + lease.setEndDate(old.getEndDate()); + lease.setTunnelId(old.getTunnelId()); + lease.setGateway(old.getGateway()); + rv.addLease(lease); + } + return rv; + } + + @Override + public long getLifetimeProcessed() { + return _aliasOf.getLifetimeProcessed(); + } + + @Override + int countHowManyToBuild() { + return 0; + } + + @Override + PooledTunnelCreatorConfig configureNewTunnel() { + return null; + } + + @Override + void buildComplete(PooledTunnelCreatorConfig cfg) {} + + @Override + public String toString() { + return "Aliased " + super.toString(); + } +} diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java index ca1b03ff4..0fdca373b 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java @@ -213,7 +213,7 @@ class BuildHandler implements Runnable { while (_isRunning && !_manager.isShutdown()) { try { handleInboundRequest(); - } catch (Exception e) { + } catch (RuntimeException e) { _log.log(Log.CRIT, "B0rked in the tunnel handler", e); } } @@ -352,7 +352,7 @@ class BuildHandler implements Runnable { default: _context.statManager().addRateData("tunnel.receiveRejectionCritical", 1); } - // penalize peer based on their bitchiness level + // penalize peer based on their reported error level _context.profileManager().tunnelRejected(peer, rtt, howBad); _context.messageHistory().tunnelParticipantRejected(peer, "peer rejected after " + rtt + " with " + howBad + ": " + cfg.toString()); } @@ -629,9 +629,17 @@ class BuildHandler implements Runnable { boolean isInGW = req.readIsInboundGateway(); boolean isOutEnd = req.readIsOutboundEndpoint(); + Hash from = state.fromHash; + if (from == null && state.from != null) + from = state.from.calculateHash(); + // warning, from could be null, but it should only + // happen if we will be a IBGW and it came from us as a OBEP + if (isInGW && isOutEnd) { _context.statManager().addRateData("tunnel.rejectHostile", 1); _log.error("Dropping build request, IBGW+OBEP"); + if (from != null) + _context.commSystem().mayDisconnect(from); return; } @@ -640,24 +648,24 @@ class BuildHandler implements Runnable { _context.statManager().addRateData("tunnel.rejectHostile", 1); // We are 2 hops in a row? Drop it without a reply. // No way to recognize if we are every other hop, but see below - _log.error("Dropping build request, we are the next hop"); + // old i2pd + if (_log.shouldWarn()) + _log.warn("Dropping build request, we are the next hop"); + if (from != null) + _context.commSystem().mayDisconnect(from); return; } - // previous test should be sufficient to keep it from getting here but maybe not? if (!isInGW) { - Hash from = state.fromHash; - if (from == null) - from = state.from.calculateHash(); - if (_context.routerHash().equals(from)) { + // if from is null, it came via OutboundMessageDistributor.distribute(), + // i.e. we were the OBEP, which is fine if we're going to be an IBGW + // but if not, something is seriously wrong here. + if (from == null || _context.routerHash().equals(from)) { _context.statManager().addRateData("tunnel.rejectHostile", 1); _log.error("Dropping build request, we are the previous hop"); return; } } if ((!isOutEnd) && (!isInGW)) { - Hash from = state.fromHash; - if (from == null) - from = state.from.calculateHash(); // Previous and next hop the same? Don't help somebody be evil. Drop it without a reply. // A-B-C-A is not preventable if (nextPeer.equals(from)) { @@ -665,6 +673,7 @@ class BuildHandler implements Runnable { _context.statManager().addRateData("tunnel.rejectHostile", 1); if (_log.shouldLog(Log.WARN)) _log.warn("Dropping build request with the same previous and next hop"); + _context.commSystem().mayDisconnect(from); return; } } @@ -679,12 +688,16 @@ class BuildHandler implements Runnable { _context.statManager().addRateData("tunnel.rejectTooOld", 1); if (_log.shouldLog(Log.WARN)) _log.warn("Dropping build request too old... replay attack? " + DataHelper.formatDuration(timeDiff)); + if (from != null) + _context.commSystem().mayDisconnect(from); return; } if (timeDiff < 0 - MAX_REQUEST_FUTURE) { _context.statManager().addRateData("tunnel.rejectFuture", 1); if (_log.shouldLog(Log.WARN)) _log.warn("Dropping build request too far in future " + DataHelper.formatDuration(0 - timeDiff)); + if (from != null) + _context.commSystem().mayDisconnect(from); return; } @@ -759,9 +772,6 @@ class BuildHandler implements Runnable { // This is at the end as it compares to a percentage of created tunnels. // We may need another counter above for requests. if (response == 0 && !isInGW) { - Hash from = state.fromHash; - if (from == null) - from = state.from.calculateHash(); if (from != null && _throttler.shouldThrottle(from)) { if (_log.shouldLog(Log.WARN)) _log.warn("Rejecting tunnel (hop throttle), previous hop: " + from); @@ -782,8 +792,7 @@ class BuildHandler implements Runnable { if (_log.shouldLog(Log.DEBUG)) _log.debug("Responding to " + state.msg.getUniqueId() + "/" + ourId + " after " + recvDelay + " with " + response - + " from " + (state.fromHash != null ? state.fromHash : - state.from != null ? state.from.calculateHash() : "tunnel")); + + " from " + (from != null ? from : "tunnel")); HopConfig cfg = null; if (response == 0) { @@ -793,12 +802,11 @@ class BuildHandler implements Runnable { cfg.setIVKey(req.readIVKey()); cfg.setLayerKey(req.readLayerKey()); if (isInGW) { - cfg.setReceiveFrom(null); + // default + //cfg.setReceiveFrom(null); } else { - if (state.fromHash != null) { - cfg.setReceiveFrom(state.fromHash); - } else if (state.from != null) { - cfg.setReceiveFrom(state.from.calculateHash()); + if (from != null) { + cfg.setReceiveFrom(from); } else { // b0rk return; @@ -806,8 +814,9 @@ class BuildHandler implements Runnable { } cfg.setReceiveTunnelId(DataHelper.toLong(4, ourId)); if (isOutEnd) { - cfg.setSendTo(null); - cfg.setSendTunnelId(null); + // default + //cfg.setSendTo(null); + //cfg.setSendTunnelId(null); } else { cfg.setSendTo(nextPeer); cfg.setSendTunnelId(DataHelper.toLong(4, nextId)); @@ -834,27 +843,33 @@ class BuildHandler implements Runnable { _log.warn("DUP ID failure " + state.msg.getUniqueId() + "/" + cfg.getReceiveTunnel() + " as " + (isOutEnd ? "outbound endpoint" : isInGW ? "inbound gw" : "participant")); } } + + // determination of response is now complete + if (response != 0) { _context.statManager().addRateData("tunnel.reject." + response, 1); - _context.messageHistory().tunnelRejected(state.fromHash, new TunnelId(ourId), nextPeer, + _context.messageHistory().tunnelRejected(from, new TunnelId(ourId), nextPeer, "rejecting for " + response + ": " + state.msg.getUniqueId() + "/" + ourId + "/" + req.readNextTunnelId() + " delay " + recvDelay + " as " + (isOutEnd ? "outbound endpoint" : isInGW ? "inbound gw" : "participant")); - } - - // Connection congestion control: - // If we rejected the request, are near our conn limits, and aren't connected to the next hop, - // just drop it. - // 81% = between 75% control measures in Transports and 87% rejection above - if (response != 0 && - (! _context.routerHash().equals(nextPeer)) && - (! _context.commSystem().haveOutboundCapacity(81)) && - (! _context.commSystem().isEstablished(nextPeer))) { - _context.statManager().addRateData("tunnel.dropConnLimits", 1); - if (_log.shouldLog(Log.WARN)) - _log.warn("Not sending rejection due to conn limits"); - return; + if (from != null) + _context.commSystem().mayDisconnect(from); + // Connection congestion control: + // If we rejected the request, are near our conn limits, and aren't connected to the next hop, + // just drop it. + // 81% = between 75% control measures in Transports and 87% rejection above + if ((! _context.routerHash().equals(nextPeer)) && + (! _context.commSystem().haveOutboundCapacity(81)) && + (! _context.commSystem().isEstablished(nextPeer))) { + _context.statManager().addRateData("tunnel.dropConnLimits", 1); + if (_log.shouldLog(Log.WARN)) + _log.warn("Not sending rejection due to conn limits"); + return; + } + } else if (isInGW && from != null) { + // we're the start of the tunnel, no use staying connected + _context.commSystem().mayDisconnect(from); } EncryptedBuildRecord reply = BuildResponseRecord.create(_context, response, req.readReplyKey(), req.readReplyIV(), state.msg.getUniqueId()); @@ -930,6 +945,11 @@ class BuildHandler implements Runnable { * but could also be the reply where we are the IBEP. */ private class TunnelBuildMessageHandlerJobBuilder implements HandlerJobBuilder { + + /** + * Either from or fromHash may be null, but both should be null only if + * we're to be a IBGW and it came from us as a OBEP. + */ public Job createJob(I2NPMessage receivedMessage, RouterIdentity from, Hash fromHash) { // need to figure out if this is a reply to an inbound tunnel request (where we are the // endpoint, receiving the request at the last hop) @@ -1056,6 +1076,10 @@ class BuildHandler implements Runnable { final Hash fromHash; final long recvTime; + /** + * Either f or h may be null, but both should be null only if + * we're to be a IBGW and it came from us as a OBEP. + */ public BuildMessageState(RouterContext ctx, I2NPMessage m, RouterIdentity f, Hash h) { _ctx = ctx; msg = (TunnelBuildMessage)m; diff --git a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java index 68ad4e046..b6b141e7a 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java +++ b/router/java/src/net/i2p/router/tunnel/pool/ExploratoryPeerSelector.java @@ -24,7 +24,7 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { super(context); } - public List selectPeers(TunnelPoolSettings settings) { + public List selectPeers(TunnelPoolSettings settings) { Log l = ctx.logManager().getLog(getClass()); int length = getLength(settings); if (length < 0) { @@ -33,12 +33,12 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { return null; } - if (false && shouldSelectExplicit(settings)) { - List rv = selectExplicit(settings, length); - if (l.shouldLog(Log.DEBUG)) - l.debug("Explicit peers selected: " + rv); - return rv; - } + //if (false && shouldSelectExplicit(settings)) { + // List rv = selectExplicit(settings, length); + // if (l.shouldLog(Log.DEBUG)) + // l.debug("Explicit peers selected: " + rv); + // return rv; + //} Set exclude = getExclude(settings.isInbound(), true); exclude.add(ctx.routerHash()); @@ -55,34 +55,43 @@ class ExploratoryPeerSelector extends TunnelPeerSelector { // FloodfillNetworkDatabaseFacade fac = (FloodfillNetworkDatabaseFacade)ctx.netDb(); // exclude.addAll(fac.getFloodfillPeers()); HashSet matches = new HashSet(length); - boolean exploreHighCap = shouldPickHighCap(); - // - // We don't honor IP Restriction here, to be fixed - // + if (length > 0) { + boolean exploreHighCap = shouldPickHighCap(); - // If hidden and inbound, use fast peers - that we probably have recently - // connected to and so they have our real RI - to maximize the chance - // that the adjacent hop can connect to us. - if (settings.isInbound() && ctx.router().isHidden()) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectFastPeers(length, exclude, matches); - } else if (exploreHighCap) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SHCP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches); - } else if (ctx.commSystem().haveHighOutboundCapacity()) { - if (l.shouldLog(Log.INFO)) - l.info("EPS SNFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false); - } else { // use only connected peers so we don't make more connections - if (l.shouldLog(Log.INFO)) - l.info("EPS SANFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); - ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches); + // + // We don't honor IP Restriction here, to be fixed + // + + // If hidden and inbound, use fast peers - that we probably have recently + // connected to and so they have our real RI - to maximize the chance + // that the adjacent hop can connect to us. + if (settings.isInbound() && ctx.router().isHidden()) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectFastPeers(length, exclude, matches); + } else if (exploreHighCap) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SHCP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches); + } else if (ctx.commSystem().haveHighOutboundCapacity()) { + if (l.shouldLog(Log.INFO)) + l.info("EPS SNFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + // As of 0.9.23, we include a max of 2 not failing peers, + // to improve build success on 3-hop tunnels. + // Peer org credits existing items in matches + if (length > 2) + ctx.profileOrganizer().selectHighCapacityPeers(length - 2, exclude, matches); + ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false); + } else { // use only connected peers so we don't make more connections + if (l.shouldLog(Log.INFO)) + l.info("EPS SANFP " + length + (settings.isInbound() ? " IB" : " OB") + " exclude " + exclude.size()); + ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches); + } + + matches.remove(ctx.routerHash()); } - - matches.remove(ctx.routerHash()); + ArrayList rv = new ArrayList(matches); if (rv.size() > 1) orderPeers(rv, settings.getRandomKey()); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java index 521ff740a..aaf24387c 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -8,6 +8,7 @@ import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Properties; +import java.util.Set; import java.util.TreeSet; import net.i2p.data.Hash; @@ -30,13 +31,13 @@ import net.i2p.util.Log; */ public class TunnelPool { private final List _inProgress = new ArrayList(); - private final RouterContext _context; - private final Log _log; + protected final RouterContext _context; + protected final Log _log; private TunnelPoolSettings _settings; private final List _tunnels; private final TunnelPeerSelector _peerSelector; private final TunnelPoolManager _manager; - private volatile boolean _alive; + protected volatile boolean _alive; private long _lifetimeProcessed; private TunnelInfo _lastSelected; private long _lastSelectionPeriod; @@ -118,19 +119,15 @@ public class TunnelPool { } } - void refreshSettings() { - if (!_settings.isExploratory()) { + private void refreshSettings() { + if (!_settings.isExploratory()) return; // don't override client specified settings - } else { - if (_settings.isExploratory()) { - Properties props = new Properties(); - props.putAll(_context.router().getConfigMap()); - if (_settings.isInbound()) - _settings.readFromProperties(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY, props); - else - _settings.readFromProperties(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY, props); - } - } + Properties props = new Properties(); + props.putAll(_context.router().getConfigMap()); + if (_settings.isInbound()) + _settings.readFromProperties(TunnelPoolSettings.PREFIX_INBOUND_EXPLORATORY, props); + else + _settings.readFromProperties(TunnelPoolSettings.PREFIX_OUTBOUND_EXPLORATORY, props); } /** @@ -412,11 +409,17 @@ public class TunnelPool { public List listPending() { synchronized (_inProgress) { return new ArrayList(_inProgress); } } /** duplicate of size(), let's pick one */ - int getTunnelCount() { synchronized (_tunnels) { return _tunnels.size(); } } + int getTunnelCount() { return size(); } public TunnelPoolSettings getSettings() { return _settings; } void setSettings(TunnelPoolSettings settings) { + if (settings != null && _settings != null) { + if (!(settings.isExploratory() || _settings.isExploratory())) { + settings.getAliases().addAll(_settings.getAliases()); + settings.setAliasOf(_settings.getAliasOf()); + } + } _settings = settings; if (_settings != null) { if (_log.shouldLog(Log.INFO)) @@ -606,12 +609,18 @@ public class TunnelPool { if (_settings.isInbound() && !_settings.isExploratory()) { if (_log.shouldLog(Log.DEBUG)) _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)"); - LeaseSet ls = null; + LeaseSet ls; synchronized (_tunnels) { ls = locked_buildNewLeaseSet(); } if (ls != null) { _context.clientManager().requestLeaseSet(_settings.getDestination(), ls); + Set aliases = _settings.getAliases(); + if (aliases != null && !aliases.isEmpty()) { + for (Hash h : aliases) { + _context.clientManager().requestLeaseSet(h, ls); + } + } } } } @@ -710,7 +719,7 @@ public class TunnelPool { * * @return null on failure */ - private LeaseSet locked_buildNewLeaseSet() { + protected LeaseSet locked_buildNewLeaseSet() { if (!_alive) return null; @@ -749,7 +758,7 @@ public class TunnelPool { TunnelId inId = tunnel.getReceiveTunnelId(0); Hash gw = tunnel.getPeer(0); if ( (inId == null) || (gw == null) ) { - _log.error(toString() + ": wtf, tunnel has no inbound gateway/tunnelId? " + tunnel); + _log.error(toString() + ": broken? tunnel has no inbound gateway/tunnelId? " + tunnel); continue; } Lease lease = new Lease(); @@ -1159,7 +1168,7 @@ public class TunnelPool { int j = peers.size() - 1 - i; cfg.setPeer(j, peers.get(i)); HopConfig hop = cfg.getConfig(j); - hop.setCreation(_context.clock().now()); + hop.setCreation(now); hop.setExpiration(expiration); hop.setIVKey(_context.keyGenerator().generateSessionKey()); hop.setLayerKey(_context.keyGenerator().generateSessionKey()); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 4cf54cb69..e2e54e6e1 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -97,7 +97,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { ctx.statManager().createRateStat("tunnel.testAborted", "Tunnel test could not occur, since there weren't any tunnels to test with", "Tunnels", RATES); } - + /** * Pick a random inbound exploratory tunnel. * Warning - selectInboundExploratoryTunnel(Hash) is preferred. @@ -113,7 +113,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return info; } - + /** * Pick a random inbound tunnel from the given destination's pool. * Warning - selectOutboundTunnel(Hash, Hash) is preferred. @@ -132,7 +132,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { " but there isn't a pool?"); return null; } - + /** * Pick a random outbound exploratory tunnel. * Warning - selectOutboundExploratoryTunnel(Hash) is preferred. @@ -148,7 +148,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return info; } - + /** * Pick a random outbound tunnel from the given destination's pool. * Warning - selectOutboundTunnel(Hash, Hash) is preferred. @@ -164,7 +164,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return null; } - + /** * Pick the inbound exploratory tunnel with the gateway closest to the given hash. * By using this instead of the random selectTunnel(), @@ -184,7 +184,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return info; } - + /** * Pick the inbound tunnel with the gateway closest to the given hash * from the given destination's pool. @@ -208,7 +208,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { " but there isn't a pool?"); return null; } - + /** * Pick the outbound exploratory tunnel with the endpoint closest to the given hash. * By using this instead of the random selectTunnel(), @@ -228,7 +228,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return info; } - + /** * Pick the outbound tunnel with the endpoint closest to the given hash * from the given destination's pool. @@ -249,7 +249,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } return null; } - + /** * Expensive (iterates through all tunnels of all pools) and unnecessary. * @deprecated unused @@ -267,7 +267,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { if (info != null) return info; return null; } - + /** @return number of inbound exploratory tunnels */ public int getFreeTunnelCount() { return _inboundExploratory.size(); @@ -304,10 +304,11 @@ public class TunnelPoolManager implements TunnelManagerFacade { return pool.getTunnelCount(); return 0; } - + public int getParticipatingCount() { return _context.tunnelDispatcher().getParticipatingCount(); } + public long getLastParticipatingExpiration() { return _context.tunnelDispatcher().getLastParticipatingExpiration(); } - + /** * @return (number of part. tunnels) / (estimated total number of hops in our expl.+client tunnels) * 100 max. @@ -330,7 +331,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { return Math.min(part / (double) count, 100d); } - public boolean isValidTunnel(Hash client, TunnelInfo tunnel) { if (tunnel.getExpiration() < _context.clock().now()) return false; @@ -386,17 +386,18 @@ public class TunnelPoolManager implements TunnelManagerFacade { pool.setSettings(settings); } } - + public synchronized void restart() { _handler.restart(); _executor.restart(); shutdownExploratory(); startup(); } - + /** * Used only at session startup. * Do not use to change settings. + * Do not use for aliased destinations; use addAlias(). */ public void buildTunnels(Destination client, ClientTunnelSettings settings) { Hash dest = client.calculateHash(); @@ -434,8 +435,89 @@ public class TunnelPoolManager implements TunnelManagerFacade { else outbound.startup(); } - - + + /** + * Add another destination to the same tunnels. + * Must have same encryption key an a different signing key. + * @throws IllegalArgumentException if not + * @return success + * @since 0.9.21 + */ + public boolean addAlias(Destination dest, ClientTunnelSettings settings, Destination existingClient) { + if (dest.getSigningPublicKey().equals(existingClient.getSigningPublicKey())) + throw new IllegalArgumentException("signing key must differ"); + if (!dest.getPublicKey().equals(existingClient.getPublicKey())) + throw new IllegalArgumentException("encryption key mismatch"); + Hash h = dest.calculateHash(); + Hash e = existingClient.calculateHash(); + synchronized(this) { + TunnelPool inbound = _clientInboundPools.get(h); + TunnelPool outbound = _clientOutboundPools.get(h); + if (inbound != null || outbound != null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("already have alias " + dest); + return false; + } + TunnelPool eInbound = _clientInboundPools.get(e); + TunnelPool eOutbound = _clientOutboundPools.get(e); + if (eInbound == null || eOutbound == null) { + if (_log.shouldLog(Log.WARN)) + _log.warn("primary not found " + existingClient); + return false; + } + eInbound.getSettings().getAliases().add(h); + eOutbound.getSettings().getAliases().add(h); + TunnelPoolSettings newIn = settings.getInboundSettings(); + TunnelPoolSettings newOut = settings.getOutboundSettings(); + newIn.setAliasOf(e); + newOut.setAliasOf(e); + inbound = new AliasedTunnelPool(_context, this, newIn, eInbound); + outbound = new AliasedTunnelPool(_context, this, newOut, eOutbound); + _clientInboundPools.put(h, inbound); + _clientOutboundPools.put(h, outbound); + inbound.startup(); + outbound.startup(); + } + if (_log.shouldLog(Log.WARN)) + _log.warn("Added " + h + " as alias for " + e + " with settings " + settings); + return true; + } + + /** + * Remove a destination for the same tunnels as another. + * @since 0.9.21 + */ + public void removeAlias(Destination dest) { + Hash h = dest.calculateHash(); + synchronized(this) { + TunnelPool inbound = _clientInboundPools.remove(h); + if (inbound != null) { + Hash p = inbound.getSettings().getAliasOf(); + if (p != null) { + TunnelPool pri = _clientInboundPools.get(p); + if (pri != null) { + Set aliases = pri.getSettings().getAliases(); + if (aliases != null) + aliases.remove(h); + } + } + } + TunnelPool outbound = _clientOutboundPools.remove(h); + if (outbound != null) { + Hash p = outbound.getSettings().getAliasOf(); + if (p != null) { + TunnelPool pri = _clientOutboundPools.get(p); + if (pri != null) { + Set aliases = pri.getSettings().getAliases(); + if (aliases != null) + aliases.remove(h); + } + } + } + // TODO if primary already vanished... + } + } + private static class DelayedStartup implements SimpleTimer.TimedEvent { private final TunnelPool pool; @@ -469,7 +551,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { if (outbound != null) outbound.shutdown(); } - + /** queue a recurring test job if appropriate */ void buildComplete(PooledTunnelCreatorConfig cfg) { if (cfg.getLength() > 1 && @@ -518,7 +600,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { _context.jobQueue().addJob(new BootstrapPool(_context, _inboundExploratory)); _context.jobQueue().addJob(new BootstrapPool(_context, _outboundExploratory)); } - + private static class BootstrapPool extends JobImpl { private TunnelPool _pool; public BootstrapPool(RouterContext ctx, TunnelPool pool) { @@ -531,7 +613,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { _pool.buildFallback(); } } - + /** * Cannot be restarted */ @@ -546,7 +628,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { _inboundExploratory.shutdown(); _outboundExploratory.shutdown(); } - + /** list of TunnelPool instances currently in play */ public void listPools(List out) { out.addAll(_clientInboundPools.values()); diff --git a/router/java/src/net/i2p/router/util/DecayingBloomFilter.java b/router/java/src/net/i2p/router/util/DecayingBloomFilter.java index a5910e36e..bafd1c2c8 100644 --- a/router/java/src/net/i2p/router/util/DecayingBloomFilter.java +++ b/router/java/src/net/i2p/router/util/DecayingBloomFilter.java @@ -86,16 +86,24 @@ public class DecayingBloomFilter { this(context, durationMs, entryBytes, name, context.getProperty("router.decayingBloomFilterM", DEFAULT_M)); } - /** @param m filter size exponent */ + /** + * @param m filter size exponent, max is 29 + */ public DecayingBloomFilter(I2PAppContext context, int durationMs, int entryBytes, String name, int m) { _context = context; _log = context.logManager().getLog(DecayingBloomFilter.class); _entryBytes = entryBytes; _name = name; int k = DEFAULT_K; - // max is (23,11) or (26,10); see KeySelector for details - if (m > DEFAULT_M) + // max is (23,11) or (26,10) or (29,9); see KeySelector for details + if (m > DEFAULT_M) { k--; + if (m > 26) { + k--; + if (m > 29) + throw new IllegalArgumentException("Max m is 29"); + } + } _current = new BloomSHA1(m, k); _previous = new BloomSHA1(m, k); _durationMs = durationMs; @@ -375,6 +383,9 @@ public class DecayingBloomFilter { * * Following stats for m=26, k=10: * 4096 7.3E-6; 5120 4.5E-5; 6144 1.8E-4; 8192 0.14%; 10240 0.6%, 12288 1.7% + * + * Following stats for m=27, k=9: + * 8192 1.1E-5; 10240 5.6E-5; 12288 2.0E-4; 14336 5.8E-4; 16384 0.14% * */ /***** diff --git a/router/java/src/net/i2p/router/util/EventLog.java b/router/java/src/net/i2p/router/util/EventLog.java index 1cad4b9b4..c1ec7c464 100644 --- a/router/java/src/net/i2p/router/util/EventLog.java +++ b/router/java/src/net/i2p/router/util/EventLog.java @@ -13,7 +13,9 @@ import java.util.SortedMap; import java.util.TreeMap; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.util.SecureFileOutputStream; +import net.i2p.util.SystemVersion; /** * Simple event logger for occasional events, @@ -93,6 +95,8 @@ public class EventLog { buf.append(_context.clock().now()).append(' ').append(event); if (info != null && info.length() > 0) buf.append(' ').append(info); + if (SystemVersion.isWindows()) + buf.append('\r'); buf.append('\n'); out.write(buf.toString().getBytes("UTF-8")); } catch (IOException ioe) { @@ -125,7 +129,7 @@ public class EventLog { String line = null; while ( (line = br.readLine()) != null) { try { - String[] s = line.split(" ", 3); + String[] s = DataHelper.split(line.trim(), " ", 3); if (!s[1].equals(event)) continue; long time = Long.parseLong(s[0]); @@ -167,7 +171,7 @@ public class EventLog { String line = null; while ( (line = br.readLine()) != null) { try { - String[] s = line.split(" ", 2); + String[] s = DataHelper.split(line.trim(), " ", 2); if (s.length < 2) continue; long time = Long.parseLong(s[0]); diff --git a/router/java/src/net/i2p/router/util/PriBlockingQueue.java b/router/java/src/net/i2p/router/util/PriBlockingQueue.java index ac2cf8563..7a46741c8 100644 --- a/router/java/src/net/i2p/router/util/PriBlockingQueue.java +++ b/router/java/src/net/i2p/router/util/PriBlockingQueue.java @@ -11,7 +11,7 @@ import net.i2p.util.Log; /** * Priority Blocking Queue using methods in the entries, - * as definied in PQEntry, to store priority and sequence number, + * as defined in PQEntry, to store priority and sequence number, * ensuring FIFO order within a priority. * * Input: add(), offer(), and put() are overridden to add a sequence number. diff --git a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java index 332c5525f..af84b14f3 100644 --- a/router/java/src/org/cybergarage/xml/parser/JaxpParser.java +++ b/router/java/src/org/cybergarage/xml/parser/JaxpParser.java @@ -184,6 +184,40 @@ public class JaxpParser extends Parser } return rv; } + + /** @since 0.9.22 */ + @Override + public int read(byte[] b) throws IOException { + return this.read(b, 0, b.length); + } + + /** @since 0.9.22 */ + @Override + public int read(byte[] b, int off, int len) throws IOException { + if (b == null) { + throw new NullPointerException(); + } else if (off < 0 || len < 0 || len > b.length - off) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return 0; + } + + int rv = this.read(); + if (-1 == rv) { + return -1; + } + + int i = 1; + b[off] = (byte) rv; + for (; i < len; i++) { + rv = this.read(); + if (-1 == rv) { + break; + } + b[off + i] = (byte) rv; + } + return i; + } } /** diff --git a/router/java/test/junit/net/i2p/router/client/LocalClientConnectionRunner.java b/router/java/test/junit/net/i2p/router/client/LocalClientConnectionRunner.java index 9ded6ce90..11bed79a9 100644 --- a/router/java/test/junit/net/i2p/router/client/LocalClientConnectionRunner.java +++ b/router/java/test/junit/net/i2p/router/client/LocalClientConnectionRunner.java @@ -42,9 +42,9 @@ class LocalClientConnectionRunner extends ClientConnectionRunner { * don't instantiate a RequestLeaseSetJob */ @Override - void requestLeaseSet(LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob) { + void requestLeaseSet(Hash h, LeaseSet set, long expirationTime, Job onCreateJob, Job onFailedJob) { RequestVariableLeaseSetMessage msg = new RequestVariableLeaseSetMessage(); - msg.setSessionId(getSessionId()); + msg.setSessionId(getSessionId(h)); for (int i = 0; i < set.getLeaseCount(); i++) { Lease lease = set.getLease(i); msg.addEndpoint(lease); @@ -60,12 +60,12 @@ class LocalClientConnectionRunner extends ClientConnectionRunner { * No job queue, so super NPEs */ @Override - void updateMessageDeliveryStatus(MessageId id, long messageNonce, int status) { + void updateMessageDeliveryStatus(Destination dest, MessageId id, long messageNonce, int status) { if (messageNonce <= 0) return; MessageStatusMessage msg = new MessageStatusMessage(); msg.setMessageId(id.getMessageId()); - msg.setSessionId(getSessionId().getSessionId()); + msg.setSessionId(getSessionId(dest.calculateHash()).getSessionId()); // has to be >= 0, it is initialized to -1 msg.setNonce(messageNonce); msg.setSize(0); diff --git a/router/java/test/junit/net/i2p/router/client/LocalClientManager.java b/router/java/test/junit/net/i2p/router/client/LocalClientManager.java index 12666969d..0f9ba30ab 100644 --- a/router/java/test/junit/net/i2p/router/client/LocalClientManager.java +++ b/router/java/test/junit/net/i2p/router/client/LocalClientManager.java @@ -58,12 +58,12 @@ class LocalClientManager extends ClientManager { if (runner != null) { runner.receiveMessage(toDest, fromDest, payload); if (sender != null) - sender.updateMessageDeliveryStatus(msgId, messageNonce, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL); + sender.updateMessageDeliveryStatus(fromDest, msgId, messageNonce, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL); } else { // remote. ignore. System.out.println("Message " + msgId + " is targeting a REMOTE destination - DROPPED"); if (sender != null) - sender.updateMessageDeliveryStatus(msgId, messageNonce, MessageStatusMessage.STATUS_SEND_GUARANTEED_FAILURE); + sender.updateMessageDeliveryStatus(fromDest, msgId, messageNonce, MessageStatusMessage.STATUS_SEND_GUARANTEED_FAILURE); } } diff --git a/router/java/test/junit/net/i2p/router/client/LocalClientMessageEventListener.java b/router/java/test/junit/net/i2p/router/client/LocalClientMessageEventListener.java index 17cd20e71..d4873f4a8 100644 --- a/router/java/test/junit/net/i2p/router/client/LocalClientMessageEventListener.java +++ b/router/java/test/junit/net/i2p/router/client/LocalClientMessageEventListener.java @@ -25,6 +25,7 @@ import net.i2p.data.i2cp.GetBandwidthLimitsMessage; import net.i2p.data.i2cp.HostLookupMessage; import net.i2p.data.i2cp.HostReplyMessage; import net.i2p.data.i2cp.I2CPMessageException; +import net.i2p.data.i2cp.SessionConfig; import net.i2p.data.i2cp.SessionId; import net.i2p.router.RouterContext; @@ -43,7 +44,7 @@ class LocalClientMessageEventListener extends ClientMessageEventListener { * Immediately send a fake leaseset */ @Override - protected void startCreateSessionJob() { + protected void startCreateSessionJob(SessionConfig config) { long exp = _context.clock().now() + 10*60*1000; LeaseSet ls = new LeaseSet(); Lease lease = new Lease(); @@ -53,7 +54,7 @@ class LocalClientMessageEventListener extends ClientMessageEventListener { Date date = new Date(exp); lease.setEndDate(date); ls.addLease(lease); - _runner.requestLeaseSet(ls, exp, null, null); + _runner.requestLeaseSet(config.getDestination().calculateHash(), ls, exp, null, null); } /** diff --git a/router/java/test/junit/net/i2p/router/crypto/SessionEncryptionTest.java b/router/java/test/junit/net/i2p/router/crypto/SessionEncryptionTest.java index fe2b1d9ef..9f2b04180 100644 --- a/router/java/test/junit/net/i2p/router/crypto/SessionEncryptionTest.java +++ b/router/java/test/junit/net/i2p/router/crypto/SessionEncryptionTest.java @@ -46,7 +46,7 @@ public class SessionEncryptionTest extends TestCase{ SessionKeyManager skm = new TransientSessionKeyManager(_context); SessionKey curKey = skm.createSession(pubKey); - byte[] msg = "msg 1".getBytes(); + byte[] msg = DataHelper.getASCII("msg 1"); byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, 64); byte dmsg[] = _context.elGamalAESEngine().decrypt(emsg, privKey, skm); @@ -60,7 +60,7 @@ public class SessionEncryptionTest extends TestCase{ SessionKeyManager skm = new TransientSessionKeyManager(_context); SessionKey curKey = skm.createSession(pubKey); - byte[] msg = "msg 2".getBytes(); + byte[] msg = DataHelper.getASCII("msg 2"); byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, 64); byte dmsg[] = _context.elGamalAESEngine().decrypt(emsg, privKey, skm); @@ -95,11 +95,11 @@ public class SessionEncryptionTest extends TestCase{ secondTags.add(tag3); secondTags.add(tag4); - byte[] msg1 = "msg 1".getBytes(); - byte[] msg2 = "msg 2".getBytes(); - byte[] msg3 = "msg 3".getBytes(); - byte[] msg4 = "msg 4".getBytes(); - byte[] msg5 = "msg 5".getBytes(); + byte[] msg1 = DataHelper.getASCII("msg 1"); + byte[] msg2 = DataHelper.getASCII("msg 2"); + byte[] msg3 = DataHelper.getASCII("msg 3"); + byte[] msg4 = DataHelper.getASCII("msg 4"); + byte[] msg5 = DataHelper.getASCII("msg 5"); byte emsg1[] = _context.elGamalAESEngine().encrypt(msg1, pubKey, curKey, firstTags, 64); @@ -195,11 +195,11 @@ public class SessionEncryptionTest extends TestCase{ secondTags.add(tag3); secondTags.add(tag4); - byte[] msg1 = "msg 1".getBytes(); - byte[] msg2 = "msg 2".getBytes(); - byte[] msg3 = "msg 3".getBytes(); - byte[] msg4 = "msg 4".getBytes(); - byte[] msg5 = "msg 5".getBytes(); + byte[] msg1 = DataHelper.getASCII("msg 1"); + byte[] msg2 = DataHelper.getASCII("msg 2"); + byte[] msg3 = DataHelper.getASCII("msg 3"); + byte[] msg4 = DataHelper.getASCII("msg 4"); + byte[] msg5 = DataHelper.getASCII("msg 5"); byte emsg1[] = _context.elGamalAESEngine().encrypt(msg1, pubKey, curKey, firstTags, 64); @@ -291,7 +291,7 @@ public class SessionEncryptionTest extends TestCase{ if (i % 50 == 0) nextKey = KeyGenerator.getInstance().generateSessionKey(); - byte[] msg = ("msg " + i).getBytes(); + byte[] msg = DataHelper.getASCII("msg " + i); byte emsg[] = _context.elGamalAESEngine().encrypt(msg, pubKey, curKey, tags, curTag, nextKey, 64); diff --git a/router/java/test/junit/net/i2p/router/transport/crypto/DHSessionKeyBuilderTest.java b/router/java/test/junit/net/i2p/router/transport/crypto/DHSessionKeyBuilderTest.java index 44a43d3e9..190e048d6 100644 --- a/router/java/test/junit/net/i2p/router/transport/crypto/DHSessionKeyBuilderTest.java +++ b/router/java/test/junit/net/i2p/router/transport/crypto/DHSessionKeyBuilderTest.java @@ -13,6 +13,7 @@ import java.math.BigInteger; import junit.framework.TestCase; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.SessionKey; import net.i2p.util.RandomSource; @@ -40,7 +41,7 @@ public class DHSessionKeyBuilderTest extends TestCase { String origVal = "1234567890123456"; // 16 bytes max using AESEngine byte enc[] = new byte[16]; byte dec[] = new byte[16]; - ctx.aes().encrypt(origVal.getBytes(), 0, enc, 0, key1, iv, 16); + ctx.aes().encrypt(DataHelper.getASCII(origVal), 0, enc, 0, key1, iv, 16); ctx.aes().decrypt(enc, 0, dec, 0, key2, iv, 16); String tranVal = new String(dec); assertEquals(origVal, tranVal); diff --git a/router/java/test/junit/net/i2p/router/tunnel/BatchedFragmentTest.java b/router/java/test/junit/net/i2p/router/tunnel/BatchedFragmentTest.java index f3ac2747b..3cc09e582 100644 --- a/router/java/test/junit/net/i2p/router/tunnel/BatchedFragmentTest.java +++ b/router/java/test/junit/net/i2p/router/tunnel/BatchedFragmentTest.java @@ -131,7 +131,7 @@ public class BatchedFragmentTest extends FragmentTest { */ public void runBatches() { //success += testBatched(1, false, false, 1024, false, false); - // this takes a long fucking time + // this takes a long long time for (int i = 1; i <= 1024; i++) { testBatched(i, false, false, 1024, false, false, 1024, false, false); testBatched(i, true, false, 1024, false, false, 1024, false, false);