Changeset 47beb82 for apps


Ignore:
Timestamp:
Jan 11, 2019 1:51:41 PM (17 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
24fd4881
Parents:
d4caafb5 (diff), 17228de (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

propagate from branch 'i2p.i2p' (head ff155397f79c33f8f6767c2c120e57cb7dd30d88)

to branch 'i2p.i2p.zzz.i2pcontrol' (head 9e68613e29f1a3bd5a4e2b3d8c5637b48f499e5e)

Location:
apps
Files:
6 added
2 deleted
41 edited

Legend:

Unmodified
Added
Removed
  • apps/BOB/src/net/i2p/BOB/BOB.java

    rd4caafb5 r47beb82  
    243243                }
    244244                if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
    245                         props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
     245                        props.setProperty(I2PClient.PROP_TCP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
    246246                        save = true;
    247247                }
  • apps/BOB/src/net/i2p/BOB/MUXlisten.java

    rd4caafb5 r47beb82  
    9797
    9898                        String i2cpHost = Q.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
    99                         int i2cpPort = 7654;
    100                         String i2cpPortStr = Q.getProperty(I2PClient.PROP_TCP_PORT, "7654");
    101                         try {
    102                                 i2cpPort = Integer.parseInt(i2cpPortStr);
    103                         } catch (NumberFormatException nfe) {
    104                                 throw new IllegalArgumentException("Invalid I2CP port specified [" + i2cpPortStr + "]");
     99                        int i2cpPort = I2PClient.DEFAULT_LISTEN_PORT;
     100                        String i2cpPortStr = Q.getProperty(I2PClient.PROP_TCP_PORT);
     101                        if (i2cpPortStr != null) {
     102                                try {
     103                                        i2cpPort = Integer.parseInt(i2cpPortStr);
     104                                } catch (NumberFormatException nfe) {
     105                                        throw new IllegalArgumentException("Invalid I2CP port specified [" + i2cpPortStr + "]");
     106                                }
    105107                        }
    106108
  • apps/desktopgui/build.xml

    rd4caafb5 r47beb82  
    3535                    <pathelement location="../../installer/lib/wrapper/all/wrapper.jar" />
    3636                    <pathelement location="../../router/java/build/router.jar" />
     37                    <pathelement location="../systray/java/build/systray.jar" />
    3738                </classpath>
    3839            </javac>
  • apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java

    rd4caafb5 r47beb82  
    77import java.awt.event.ActionEvent;
    88import java.awt.event.ActionListener;
    9 
     9import java.io.IOException;
    1010import javax.swing.JMenu;
    1111import javax.swing.JMenuItem;
     
    1313import javax.swing.SwingWorker;
    1414
     15import net.i2p.apps.systray.UrlLauncher;
    1516import net.i2p.data.DataHelper;
    1617import net.i2p.desktopgui.router.RouterManager;
    17 import net.i2p.desktopgui.util.BrowseException;
    18 import net.i2p.desktopgui.util.I2PDesktop;
    1918import net.i2p.router.RouterContext;
    2019import net.i2p.util.Log;
     
    434433     *
    435434     * Modified from I2PTunnelHTTPClientBase.
    436      * TODO perhaps move this to a new PortMapper method.
    437435     *
    438436     * @since 0.9.26
    439437     */
    440438    private void launchBrowser() {
     439        // null args ok
     440        UrlLauncher launcher = new UrlLauncher(_context, null, null);
    441441        String url = _context.portMapper().getConsoleURL();
    442442        try {
    443             I2PDesktop.browse(url);
    444         } catch (BrowseException e1) {
     443            launcher.openUrl(url);
     444        } catch (IOException e1) {
    445445            log.log(Log.WARN, "Failed to open browser!", e1);
    446446        }   
  • apps/desktopgui/src/net/i2p/desktopgui/Main.java

    rd4caafb5 r47beb82  
    1818import static net.i2p.app.ClientAppState.*;
    1919import net.i2p.desktopgui.router.RouterManager;
    20 import net.i2p.desktopgui.util.*;
    2120import net.i2p.router.RouterContext;
    2221import net.i2p.router.app.RouterApp;
  • apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java

    rd4caafb5 r47beb82  
    100100        _opts = new HashMap<String, String>();
    101101        //setProxy("127.0.0.1", 4444);
    102         setI2CPConfig("127.0.0.1", 7654, null);
     102        setI2CPConfig("127.0.0.1", I2PClient.DEFAULT_LISTEN_PORT, null);
    103103        _banlist = new ConcurrentHashSet<Hash>();
    104104        _maxUploaders = Snark.MAX_TOTAL_UPLOADERS;
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    rd4caafb5 r47beb82  
    2929import net.i2p.app.ClientAppManager;
    3030import net.i2p.app.ClientAppState;
     31import net.i2p.client.I2PClient;
    3132import net.i2p.crypto.SHA1Hash;
    3233import net.i2p.crypto.SigType;
     
    786787            _config.setProperty(PROP_I2CP_HOST, "127.0.0.1");
    787788        if (!_config.containsKey(PROP_I2CP_PORT))
    788             _config.setProperty(PROP_I2CP_PORT, "7654");
     789            _config.setProperty(PROP_I2CP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
    789790        if (!_config.containsKey(PROP_I2CP_OPTS))
    790791            _config.setProperty(PROP_I2CP_OPTS, "inbound.length=3 outbound.length=3" +
     
    912913    private void updateConfig() {
    913914        String i2cpHost = _config.getProperty(PROP_I2CP_HOST);
    914         int i2cpPort = getInt(PROP_I2CP_PORT, 7654);
     915        int i2cpPort = getInt(PROP_I2CP_PORT, I2PClient.DEFAULT_LISTEN_PORT);
    915916        String opts = _config.getProperty(PROP_I2CP_OPTS);
    916917        Map<String, String> i2cpOpts = new HashMap<String, String>();
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java

    rd4caafb5 r47beb82  
    9898
    9999    /** the I2CP port, non-null */
    100     public String port = System.getProperty(I2PClient.PROP_TCP_PORT, "7654");
     100    public String port = System.getProperty(I2PClient.PROP_TCP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
    101101    /** the I2CP host, non-null */
    102102    public String host = System.getProperty(I2PClient.PROP_TCP_HOST, "127.0.0.1");
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java

    rd4caafb5 r47beb82  
    410410        Properties props = new Properties();
    411411        props.putAll(tunnel.getClientOptions());
    412         int portNum = 7654;
     412        int portNum = I2PClient.DEFAULT_LISTEN_PORT;
    413413        if (tunnel.port != null) {
    414414            try {
     
    472472                String portNum = getTunnel().port;
    473473                if (portNum == null)
    474                     portNum = "7654";
     474                    portNum = Integer.toString(I2PClient.DEFAULT_LISTEN_PORT);
    475475                String msg;
    476476                if (getTunnel().getContext().isRouterContext())
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelServer.java

    rd4caafb5 r47beb82  
    211211        Properties props = new Properties();
    212212        props.putAll(getTunnel().getClientOptions());
    213         int portNum = 7654;
     213        int portNum = I2PClient.DEFAULT_LISTEN_PORT;
    214214        if (getTunnel().port != null) {
    215215            try {
     
    306306                String portNum = getTunnel().port;
    307307                if (portNum == null)
    308                     portNum = "7654";
     308                    portNum = Integer.toString(I2PClient.DEFAULT_LISTEN_PORT);
    309309                String msg;
    310310                if (getTunnel().getContext().isRouterContext())
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java

    rd4caafb5 r47beb82  
    734734                _tunnel.port = String.valueOf(portNum);
    735735            } catch (NumberFormatException nfe) {
    736                 _tunnel.port = "7654";
     736                _tunnel.port = Integer.toString(I2PClient.DEFAULT_LISTEN_PORT);
    737737            }
    738738        } else {
    739             _tunnel.port = "7654";
     739            _tunnel.port = Integer.toString(I2PClient.DEFAULT_LISTEN_PORT);
    740740        }
    741741    }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ui/TunnelConfig.java

    rd4caafb5 r47beb82  
    837837                config.setProperty(TunnelController.PROP_I2CP_PORT, _i2cpPort);
    838838            } else {
    839                 config.setProperty(TunnelController.PROP_I2CP_PORT, "7654");
     839                config.setProperty(TunnelController.PROP_I2CP_PORT, Integer.toString(I2PClient.DEFAULT_LISTEN_PORT));
    840840            }
    841841        }
  • apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java

    rd4caafb5 r47beb82  
    1515
    1616import net.i2p.I2PException;
     17import net.i2p.client.I2PClient;
    1718import net.i2p.crypto.SigType;
    1819import net.i2p.data.Base64;
     
    447448            return tun.getI2CPPort();
    448449        else
    449             return "7654";
     450            return Integer.toString(I2PClient.DEFAULT_LISTEN_PORT);
    450451    }
    451452
  • apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketManagerFactory.java

    rd4caafb5 r47beb82  
    276276
    277277    private static int getPort() {
    278         int i2cpPort = 7654;
     278        int i2cpPort = I2PClient.DEFAULT_LISTEN_PORT;
    279279        String i2cpPortStr = System.getProperty(I2PClient.PROP_TCP_PORT);
    280280        if (i2cpPortStr != null) {
  • apps/routerconsole/java/bundle-messages.sh

    rd4caafb5 r47beb82  
    5555
    5656# add ../java/ so the refs will work in the po file
    57 JPATHS="../java/src ../jsp/WEB-INF ../java/strings $ROUTERFILES"
     57# do not scan 3rd-party code in java/src/com or java/src/edu
     58JPATHS="../java/src/net ../jsp/WEB-INF ../java/strings $ROUTERFILES"
    5859for i in ../locale/messages_*.po
    5960do
  • apps/routerconsole/java/src/edu/internet2/ndt/OsfwWorker.java

    rd4caafb5 r47beb82  
    88 * OsfwWorker creates a thread that listens for a message from the server. It
    99 * functions to check if the server has sent a message that is valid and
    10  * sufficient to determine if the server->client direction has a fire-wall.
     10 * sufficient to determine if the server-&gt;client direction has a fire-wall.
    1111 *
    1212 * <p>
     
    5050         *            Test time duration to wait for message from server
    5151         * @param _localParam
    52          *            Applet object used to set the result of the S->C firewall test
     52         *            Applet object used to set the result of the S-&gt;C firewall test
    5353         */
    5454        OsfwWorker(ServerSocket srvSocketParam, int iParamTestTime,
     
    7777         * run() method of this SFW Worker thread. This thread listens on the socket
    7878         * from the server for a given time period, and checks to see if the server
    79          * has sent a message that is valid and sufficient to determine if the S->C
     79         * has sent a message that is valid and sufficient to determine if the S-&gt;C
    8080         * direction has a fire-wall.
    8181         * */
  • apps/routerconsole/java/src/edu/internet2/ndt/Tcpbw100.java

    rd4caafb5 r47beb82  
    564564
    565565        /**
    566          * Get Client->Server fire-wall test results.
     566         * Get Client-&gt;Server fire-wall test results.
    567567         *
    568          * @return integer indicating C->S test results
     568         * @return integer indicating C-&gt;S test results
    569569         * */
    570570        public int getC2sSFWTestResults() {
     
    573573
    574574        /**
    575          * Set Client->Server fire-wall test results.
     575         * Set Client-&gt;Server fire-wall test results.
    576576         *
    577577         * @param iParamC2SRes
    578          *          integer indicating C->S test results
     578         *          integer indicating C-&gt;S test results
    579579         * */
    580580        public void setC2sSFWTestResults(int iParamC2SRes) {
     
    583583
    584584        /**
    585          * Get Server->Client fire-wall test results.
     585         * Get Server-&gt;Client fire-wall test results.
    586586         *
    587          * @return integer indicating C->S test results
     587         * @return integer indicating C-&gt;S test results
    588588         * */
    589589        public int getS2cSFWTestResults() {
     
    592592
    593593        /**
    594          * Set server->Client fire-wall test results.
     594         * Set server-&gt;Client fire-wall test results.
    595595         *
    596596         * @param iParamS2CRes
    597          *            integer indicating C->S test results
     597         *            integer indicating C-&gt;S test results
    598598         * */
    599599        public void setS2cSFWTestResults(int iParamS2CRes) {
     
    959959                // 3. configure number of tests
    960960                SpinnerNumberModel model = new SpinnerNumberModel();
    961                 model.setMinimum(new Integer(0));
    962                 model.setValue(new Integer(1));
     961                model.setMinimum(Integer.valueOf(0));
     962                model.setValue(Integer.valueOf(1));
    963963                _spinnerTestCount.setModel(model);
    964964                _spinnerTestCount.setPreferredSize(new Dimension(60, 20));
     
    45494549                                                t.interrupt();
    45504550                                        } catch (RuntimeException re) {
    4551                                                 _log.warn("TG", re);
     4551                                                _log.debug("TG", re);
    45524552                                        }
    45534553                                        try {
     
    45604560                                                        t.stop();
    45614561                                                } catch (RuntimeException re) {
    4562                                                         _log.warn("TG", re);
     4562                                                        _log.debug("TG", re);
    45634563                                                }
    45644564                                        }
     
    45724572                                        break;
    45734573                                }catch( Throwable e ){
    4574                                         _log.warn("TG", e);
     4574                                        _log.debug("TG", e);
    45754575                                }
    45764576                        }
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigServiceHandler.java

    rd4caafb5 r47beb82  
    229229    @Override
    230230    protected void processForm() {
    231         if (_action == null) return;
    232        
    233231        if (_t("Shutdown gracefully").equals(_action)) {
    234232            if (_context.hasWrapper())
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java

    rd4caafb5 r47beb82  
    158158    @Override
    159159    protected void processForm() {
    160         if (_action == null)
    161             return;
    162160        if (_action.equals(_t("Check for updates"))) {
    163161            ConsoleUpdateManager mgr = UpdateHandler.updateManager(_context);
  • apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java

    rd4caafb5 r47beb82  
    11package net.i2p.router.web;
    22
     3import java.io.Writer;
    34import java.util.ArrayList;
    45import java.util.HashMap;
     
    3738    private boolean _processed;
    3839    private boolean _valid;
     40    protected Writer _out;
    3941   
    4042    public FormHandler() {
     
    112114
    113115    /**
     116     * @since 0.9.38
     117     */
     118    public void storeWriter(Writer out) { _out = out; }
     119
     120    /**
    114121     * The old nonces from the session
    115122     * @since 0.9.4
     
    121128   
    122129    /**
    123      * Override this to perform the final processing (in turn, adding formNotice
     130     * Implement this to perform the final processing (in turn, adding formNotice
    124131     * and formError messages, etc)
    125132     *
    126      */
    127     protected void processForm() {}
     133     * Will only be called if _action is non-null and the nonce is valid.
     134     */
     135    protected abstract void processForm();
    128136   
    129137    /**
  • apps/routerconsole/java/src/net/i2p/router/web/RouterConsoleRunner.java

    rd4caafb5 r47beb82  
    3535import net.i2p.router.app.RouterApp;
    3636import net.i2p.router.news.NewsManager;
     37import net.i2p.router.sybil.Analysis;
    3738import net.i2p.router.update.ConsoleUpdateManager;
    3839import net.i2p.util.Addresses;
     
    343344        boolean noPack200 = (PluginStarter.pluginsEnabled(_context) || !NewsHelper.isUpdateDisabled(_context)) &&
    344345                            !FileUtil.isPack200Supported();
    345         boolean openARM = SystemVersion.isARM() && SystemVersion.isOpenJDK();
    346         boolean isJava11 = SystemVersion.isJava11();
    347         if (noJava7 || noPack200 || openARM || isJava11) {
     346        boolean openARM = SystemVersion.isARM() && SystemVersion.isOpenJDK() && !SystemVersion.isJava9();
     347        boolean isZero = SystemVersion.isZeroVM();
     348        boolean isJava11 = false; // SystemVersion.isJava11();
     349        if (noJava7 || noPack200 || openARM || isZero || isJava11) {
    348350            String s = "Java version: " + System.getProperty("java.version") +
    349351                       " OS: " + System.getProperty("os.name") + ' ' +
     
    364366            }
    365367            if (openARM) {
    366                 s = "OpenJDK is not recommended for ARM. Use Oracle Java 8";
     368                s = "OpenJDK 7/8 are not recommended for ARM. Use OpenJDK 9 (or higher) or Oracle Java 8 (or higher)";
    367369                log.logAlways(net.i2p.util.Log.WARN, s);
    368370                System.out.println("Warning: " + s);
    369371            }
    370             if (isJava11) {
    371                 s = "Java 11+ support is beta, and not recommended for general use";
     372            if (isZero) {
     373                s = "OpenJDK Zero is a very slow interpreter-only JVM. Not recommended for use with I2P. Please use a faster JVM if possible.";
    372374                log.logAlways(net.i2p.util.Log.WARN, s);
    373375                System.out.println("Warning: " + s);
    374376            }
     377            //if (isJava11) {
     378            //    s = "Java 11+ support is beta, and not recommended for general use";
     379            //    log.logAlways(net.i2p.util.Log.WARN, s);
     380            //    System.out.println("Warning: " + s);
     381            //}
    375382        }
    376383    }
     
    866873                _context.addShutdownTask(new ServerShutdown());
    867874            ConfigServiceHandler.registerSignalHandler(_context);
     875
     876            if (_mgr != null &&
     877                _context.getBooleanProperty(HelperBase.PROP_ADVANCED) &&
     878                _context.getProperty(Analysis.PROP_FREQUENCY, 0L) > 0) {
     879                // registers and starts itself
     880                Analysis.getInstance(_context);
     881            }
    868882    }
    869883   
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java

    rd4caafb5 r47beb82  
    1919    @Override
    2020    protected void processForm() {
    21         if (_action == null) return;
    2221        String group = getJettyString("group");
    2322        boolean deleting = _action.equals(_t("Delete selected"));
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java

    rd4caafb5 r47beb82  
    1616    @Override
    1717    protected void processForm() {
    18         if (_action == null) return;
    1918        boolean adding = _action.equals(_t("Add key"));
    2019        if (adding || _action.equals(_t("Delete key"))) {
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java

    rd4caafb5 r47beb82  
    2121    @Override
    2222    protected void processForm() {
    23         if (_action == null) return;
    2423        String group = getJettyString("group");
    2524        boolean deleting = _action.equals(_t("Delete selected"));
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigUIHelper.java

    rd4caafb5 r47beb82  
    3737            buf.append("value=\"").append(theme).append("\" id=\"").append(theme).append("\">" +
    3838                       "<object height=\"48\" width=\"48\" data=\"/themes/console/").append(theme).append("/images/thumbnail.png\">" +
    39                        "<img height=\"48\" width=\"48\" alt=\"\" src=\"/themes/console/images/thumbnail.png\">" +
     39                       "<img height=\"48\" width=\"48\" alt=\"\" src=\"/themes/console/").append(theme).append("/images/thumbnail.png\">" +
    4040                       "</object><br>" +
    4141                       "<div class=\"themelabel\">").append(_t(theme)).append("</div>" +
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java

    rd4caafb5 r47beb82  
    22
    33import java.io.IOException;
    4 import java.io.Writer;
    54import java.text.Collator;
    65import java.text.DateFormat;
     
    2524 */
    2625public class EventLogHelper extends FormHandler {
    27     protected Writer _out;
    2826    private long _from, _age;
    2927    //private long _to = Long.MAX_VALUE;
     
    6462    }
    6563
     64    protected void processForm() {}
     65
    6666    /** set the defaults after we have a context */
    6767    @Override
     
    7373    }
    7474   
    75     public void storeWriter(Writer out) { _out = out; }
    76 
    7775    public void setFrom(String s) {
    7876        try {
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/GraphHelper.java

    rd4caafb5 r47beb82  
    33import java.io.IOException;
    44import java.io.Serializable;
    5 import java.io.Writer;
    65import java.util.Comparator;
    76import java.util.HashMap;
     
    2625 */
    2726public class GraphHelper extends FormHandler {
    28     protected Writer _out;
    2927    private int _periodCount;
    3028    private boolean _showEvents;
     
    7472        return "<meta http-equiv=\"refresh\" content=\"" + (_refreshDelaySeconds - 3) + "\">";
    7573    }
    76 
    77     /**
    78      *  This was a HelperBase but now it's a FormHandler
    79      *  @since 0.8.2
    80      */
    81     public void storeWriter(Writer out) { _out = out; }
    8274
    8375    public void setPeriodCount(String str) {
     
    404396                _out.write("<option value=\"");
    405397                _out.write(Integer.toString(times[i]));
    406                 _out.write("\"");
     398                _out.write('"');
    407399                if (times[i] == _refreshDelaySeconds)
    408400                    _out.write(" selected=\"selected\"");
    409                 _out.write(">");
     401                _out.write('>');
    410402                if (times[i] > 0)
    411403                    _out.write(DataHelper.formatDuration2(times[i] * 1000));
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java

    rd4caafb5 r47beb82  
    77import net.i2p.data.DataHelper;
    88import net.i2p.util.SystemVersion;
    9 import net.i2p.router.web.HelperBase;
    10 
    11 public class NetDbHelper extends HelperBase {
     9import net.i2p.router.sybil.Analysis;
     10import net.i2p.router.web.FormHandler;
     11
     12/**
     13 *  /netdb
     14 *  A FormHandler since 0.9.38.
     15 *  Most output is generated in NetDbRenderer and SybilRender.
     16 */
     17public class NetDbHelper extends FormHandler {
    1218    private String _routerPrefix;
    1319    private String _version;
    1420    private String _country;
    1521    private String _family, _caps, _ip, _sybil, _mtu, _ssucaps, _ipv6, _transport;
    16     private int _full, _port, _cost, _page;
     22    private int _full, _port, _cost, _page, _mode;
     23    private long _date;
    1724    private int _limit = DEFAULT_LIMIT;
    1825    private boolean _lease;
     
    2027    private boolean _graphical;
    2128    private SigType _type;
     29    private String _newNonce;
     30    private boolean _postOK;
    2231
    2332    private static final int DEFAULT_LIMIT = SystemVersion.isARM() ? 250 : 500;
     
    142151    }
    143152
     153    /** @since 0.9.38 */
     154    public void setMode(String f) {
     155        try {
     156            _mode = Integer.parseInt(f);
     157        } catch (NumberFormatException nfe) {}
     158    }
     159
     160    /** @since 0.9.38 */
     161    public void setDate(String f) {
     162        try {
     163            _date = Long.parseLong(f);
     164        } catch (NumberFormatException nfe) {}
     165    }
     166
    144167    public void setFull(String f) {
    145168        try {
     
    180203        _graphical = true;
    181204    }
     205   
     206    /**
     207     *  Override to save it
     208     *  @since 0.9.38
     209     */
     210    @Override
     211    public String getNewNonce() {
     212        _newNonce = super.getNewNonce();
     213        return _newNonce;
     214    }
     215
     216    /**
     217     *  Now we're a FormHandler
     218     *  @since 0.9.38
     219     */
     220    protected void processForm() {
     221        _postOK = "Run new analysis".equals(_action) ||
     222                  "Review analysis".equals(_action);
     223        if ("Save".equals(_action)) {
     224            String newTime = getJettyString("runFrequency");
     225            if (newTime != null) {
     226                try {
     227                    long ntime = Long.parseLong(newTime) * 60*60*1000;
     228                    if (_context.router().saveConfig(Analysis.PROP_FREQUENCY, Long.toString(ntime)))
     229                        addFormNotice(_t("Configuration saved successfully."));
     230                    else
     231                        addFormError("Error saving the configuration (applied but not saved) - please see the error logs");
     232                    Analysis.getInstance(_context).schedule();
     233                } catch (NumberFormatException nfe) {
     234                        addFormError("bad value");
     235                }
     236            }
     237        }
     238    }
    182239
    183240    /**
     
    191248                _family != null || _caps != null || _ip != null || _sybil != null ||
    192249                _port != 0 || _type != null || _mtu != null || _ipv6 != null ||
    193                 _ssucaps != null || _transport != null || _cost != 0)
     250                _ssucaps != null || _transport != null || _cost != 0) {
    194251                renderer.renderRouterInfoHTML(_out, _limit, _page,
    195252                                              _routerPrefix, _version, _country,
    196253                                              _family, _caps, _ip, _sybil, _port, _type,
    197254                                              _mtu, _ipv6, _ssucaps, _transport, _cost);
    198             else if (_lease)
     255            } else if (_lease) {
    199256                renderer.renderLeaseSetHTML(_out, _debug);
    200             else if (_full == 3)
    201                 (new SybilRenderer(_context)).getNetDbSummary(_out);
    202             else if (_full == 4)
     257            } else if (_full == 3) {
     258                if (_mode == 12 && !_postOK)
     259                    _mode = 0;
     260                else if (_mode == 13 && !_postOK)
     261                    _mode = 14;
     262                (new SybilRenderer(_context)).getNetDbSummary(_out, _newNonce, _mode, _date);
     263            } else if (_full == 4) {
    203264                renderLookupForm();
    204             else
     265            } else {
    205266                renderer.renderStatusHTML(_out, _limit, _page, _full);
     267            }
    206268        } catch (IOException ioe) {
    207269            ioe.printStackTrace();
     
    249311            if (i == 2 && tab != 2)
    250312                continue;   // can't nav to lookup
    251             if ((i == 5 || i == 7 || i == 8) && !_context.getBooleanProperty(PROP_ADVANCED))
     313            if ((i == 5 || i == 7 || i == 8) && !isAdvanced())
    252314                continue;
    253315            if (i == tab) {
     
    278340    private void renderLookupForm() throws IOException {
    279341        _out.write("<form action=\"/netdb\" method=\"POST\">\n" +
     342                   "<input type=\"hidden\" name=\"nonce\" value=\"" + _newNonce + "\" >\n" +
    280343                   "<table id=\"netdblookup\"><tr><th colspan=\"3\">Network Database Search</th></tr>\n" +
    281344                   "<tr><td colspan=\"3\" class=\"subheading\"><b>Enter one search field <i>only</i>:</b></td></tr>\n" +
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java

    rd4caafb5 r47beb82  
    2727
    2828import net.i2p.crypto.SigType;
     29import net.i2p.data.DatabaseEntry;
    2930import net.i2p.data.DataHelper;
    3031import net.i2p.data.Destination;
     
    3839import net.i2p.router.util.HashDistance;   // debug
    3940import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
     41import static net.i2p.router.sybil.Util.biLog2;
    4042import net.i2p.router.web.Messages;
    4143import net.i2p.router.web.WebAppStarter;
     
    518520                }
    519521                buf.append("&nbsp;&nbsp;<b>Distance: </b>").append(fmt.format(biLog2(dist)));
     522                buf.append("&nbsp;&nbsp;<b>Type: </b>").append(ls.getType());
    520523                buf.append("</td></tr>\n<tr><td colspan=\"2\">");
    521524                //buf.append(dest.toBase32()).append("<br>");
     
    528531            }
    529532            buf.append("<tr><td colspan=\"2\"><ul class=\"netdb_leases\">");
     533            boolean isMeta = ls.getType() == DatabaseEntry.KEY_TYPE_META_LS2;
    530534            for (int i = 0; i < ls.getLeaseCount(); i++) {
    531535                Lease lease = ls.getLease(i);
     
    534538                   .append(_t("Gateway")).append("\"></span> <span class=\"tunnel_peer\">");
    535539                buf.append(_context.commSystem().renderPeerHTML(lease.getGateway()));
    536                 buf.append("</span> <span class=\"netdb_tunnel\">").append(_t("Tunnel")).append(" <span class=\"tunnel_id\">")
    537                    .append(lease.getTunnelId().getTunnelId()).append("</span></span> ");
     540                buf.append("</span> ");
     541                if (!isMeta) {
     542                    buf.append("<span class=\"netdb_tunnel\">").append(_t("Tunnel")).append(" <span class=\"tunnel_id\">")
     543                       .append(lease.getTunnelId().getTunnelId()).append("</span></span> ");
     544                }
    538545                if (debug) {
    539546                    long exl = lease.getEndDate().getTime() - now;
     
    574581
    575582    /**
    576      * For debugging
    577      * http://forums.sun.com/thread.jspa?threadID=597652
    578      * @since 0.7.14
    579      */
    580     public static double biLog2(BigInteger a) {
    581         int b = a.bitLength() - 1;
    582         double c = 0;
    583         double d = 0.5;
    584         for (int i = b; i >= 0; --i) {
    585              if (a.testBit(i))
    586                  c += d;
    587              d /= 2;
    588         }
    589         return b + c;
    590     }
    591 
    592     /**
    593583     *  @param mode 0: charts only; 1: full routerinfos; 2: abbreviated routerinfos
    594584     */
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/PeerHelper.java

    rd4caafb5 r47beb82  
    267267        buf.append(". ").append(_t("Limit")).append(": ").append(nt.getMaxConnections());
    268268        //buf.append(". ").append(_t("Timeout")).append(": ").append(DataHelper.formatDuration2(_pumper.getIdleTimeout()));
    269         if (_context.getBooleanProperty(PROP_ADVANCED)) {
     269        if (isAdvanced()) {
    270270            buf.append(". ").append(_t("Status")).append(": ").append(_t(nt.getReachabilityStatus().toStatusString()));
    271271        }
     
    289289        out.write(buf.toString());
    290290        buf.setLength(0);
     291        long now = _context.clock().now();
    291292        for (NTCPConnection con : peers) {
    292293            buf.append("<tr><td class=\"cells\" align=\"left\" nowrap>");
     
    307308            buf.append("</td><td class=\"cells peeripv6\" align=\"center\">").append(con.getVersion());
    308309            buf.append("</td><td class=\"cells\" align=\"center\"><span class=\"right\">");
    309             buf.append(DataHelper.formatDuration2(con.getTimeSinceReceive()));
    310             buf.append("</span>").append(THINSP).append("<span class=\"left\">").append(DataHelper.formatDuration2(con.getTimeSinceSend()));
     310            buf.append(DataHelper.formatDuration2(con.getTimeSinceReceive(now)));
     311            buf.append("</span>").append(THINSP).append("<span class=\"left\">").append(DataHelper.formatDuration2(con.getTimeSinceSend(now)));
    311312            buf.append("</span></td><td class=\"cells\" align=\"center\"><span class=\"right\">");
    312             if (con.getTimeSinceReceive() < 2*60*1000) {
     313            if (con.getTimeSinceReceive(now) < 2*60*1000) {
    313314                float r = con.getRecvRate();
    314315                buf.append(formatRate(r / 1000));
     
    318319            }
    319320            buf.append("</span>").append(THINSP).append("<span class=\"left\">");
    320             if (con.getTimeSinceSend() < 2*60*1000) {
     321            if (con.getTimeSinceSend(now) < 2*60*1000) {
    321322                float r = con.getSendRate();
    322323                buf.append(formatRate(r / 1000));
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java

    rd4caafb5 r47beb82  
    66import java.math.BigInteger;
    77import java.text.Collator;
     8import java.text.DateFormat;
    89import java.text.DecimalFormat;
    910import java.util.ArrayList;
     
    1314import java.util.Date;
    1415import java.util.HashMap;
     16import java.util.Iterator;
    1517import java.util.List;
    1618import java.util.Locale;
     
    3133import net.i2p.router.peermanager.DBHistory;
    3234import net.i2p.router.peermanager.PeerProfile;
     35import net.i2p.router.sybil.Analysis;
     36import net.i2p.router.sybil.Pair;
     37import net.i2p.router.sybil.PersistSybil;
     38import net.i2p.router.sybil.Points;
     39import static net.i2p.router.sybil.Util.biLog2;
    3340import net.i2p.router.tunnel.pool.TunnelPool;
    3441import net.i2p.router.util.HashDistance;
     
    4047import net.i2p.util.Log;
    4148import net.i2p.util.ObjectCounter;
     49import net.i2p.util.SystemVersion;
    4250import net.i2p.util.Translate;
    4351import net.i2p.util.VersionComparator;
     
    5159 *
    5260 */
    53 class SybilRenderer {
     61public class SybilRenderer {
    5462
    5563    private final RouterContext _context;
    5664    private final DecimalFormat fmt = new DecimalFormat("#0.00");
    5765
    58     private static final int PAIRMAX = 20;
    59     private static final int MAX = 10;
    60     // multiplied by size - 1, will also get POINTS24 added
    61     private static final double POINTS32 = 5.0;
    62     // multiplied by size - 1, will also get POINTS16 added
    63     private static final double POINTS24 = 5.0;
    64     // multiplied by size - 1
    65     private static final double POINTS16 = 0.25;
    66     private static final double POINTS_US32 = 25.0;
    67     private static final double POINTS_US24 = 25.0;
    68     private static final double POINTS_US16 = 10.0;
    69     private static final double POINTS_FAMILY = -10.0;
    70     private static final double POINTS_BAD_OUR_FAMILY = 100.0;
    71     private static final double POINTS_OUR_FAMILY = -100.0;
    72     private static final double MIN_CLOSE = 242.0;
    73     private static final double PAIR_DISTANCE_FACTOR = 2.0;
    74     private static final double OUR_KEY_FACTOR = 4.0;
     66    private static final int PAIRMAX = Analysis.PAIRMAX;
     67    private static final int MAX = Analysis.MAX;
     68    private static final double MIN_CLOSE = Analysis.MIN_CLOSE;
    7569    private static final double MIN_DISPLAY_POINTS = 12.01;
    76     private static final double VERSION_FACTOR = 1.0;
    77     private static final double POINTS_BAD_VERSION = 50.0;
    78     private static final double POINTS_UNREACHABLE = 4.0;
    79     private static final double POINTS_NEW = 4.0;
    80     private static final double POINTS_BANLIST = 25.0;
     70    private static final int[] HOURS = { 1, 6, 24, 7*24, 30*24, 0 };
    8171
    8272    public SybilRenderer(RouterContext ctx) {
     
    8676    /**
    8777     *   Entry point
    88      */
    89     public String getNetDbSummary(Writer out) throws IOException {
    90         renderRouterInfoHTML(out, (String)null);
     78     *
     79     *  @param mode what tab to show
     80     *  @param date only for mode = 12
     81     */
     82    public String getNetDbSummary(Writer out, String nonce, int mode, long date) throws IOException {
     83        renderRouterInfoHTML(out, nonce, mode, date);
    9184        return "";
    92     }
    93 
    94     private static class RouterInfoRoutingKeyComparator implements Comparator<RouterInfo>, Serializable {
    95          private final Hash _us;
    96          /** @param us ROUTING KEY */
    97          public RouterInfoRoutingKeyComparator(Hash us) {
    98              _us = us;
    99          }
    100          public int compare(RouterInfo l, RouterInfo r) {
    101              return HashDistance.getDistance(_us, l.getHash()).compareTo(HashDistance.getDistance(_us, r.getHash()));
    102         }
    103     }
    104 
    105     /**
    106      *  A total score and a List of reason Strings
    107      */
    108     public static class Points implements Comparable<Points> {
    109          private double points;
    110          private final List<String> reasons;
    111 
    112          public Points(double points, String reason) {
    113              this.points = points;
    114              reasons = new ArrayList<String>(4);
    115              reasons.add(reason);
    116          }
    117          public int compareTo(Points r) {
    118              return Double.compare(points, r.points);
    119         }
    12085    }
    12186
     
    157122
    158123    /**
    159      *  Merge points1 into points2.
    160      *  points1 is unmodified.
    161      */
    162     private void mergePoints(Map<Hash, Points> points1, Map<Hash, Points> points2) {
    163         for (Map.Entry<Hash, Points> e : points1.entrySet()) {
    164              Hash h = e.getKey();
    165              Points p1 = e.getValue();
    166              Points p2 = points2.get(h);
    167              if (p2 != null) {
    168                  p2.points += p1.points;
    169                  p2.reasons.addAll(p1.reasons);
    170              } else {
    171                  points2.put(h, p1);
    172              }
    173         }
    174     }
    175 
    176     private void addPoints(Map<Hash, Points> points, Hash h, double d, String reason) {
    177         String rsn = fmt.format(d) + ": " + reason;
    178         Points dd = points.get(h);
    179         if (dd != null) {
    180             dd.points += d;
    181             dd.reasons.add(rsn);
    182         } else {
    183             points.put(h, new Points(d, rsn));
    184         }
    185     }
    186 
    187     /**
    188      *  All the floodfills, not including us
    189      *  @since 0.9.38 split out from renderRouterInfoHTML
    190      */
    191     private List<RouterInfo> getFloodfills(Hash us) {
    192         Set<Hash> ffs = _context.peerManager().getPeersByCapability('f');
    193         List<RouterInfo> ris = new ArrayList<RouterInfo>(ffs.size());
    194         for (Hash ff : ffs) {
    195              if (ff.equals(us))
    196                  continue;
    197              RouterInfo ri = _context.netDb().lookupRouterInfoLocally(ff);
    198              if (ri != null)
    199                  ris.add(ri);
    200         }
    201         return ris;
    202     }
    203 
    204     private double getAvgMinDist(List<RouterInfo> ris) {
    205         double tot = 0;
    206         int count = 200;
    207         byte[] b = new byte[32];
    208         for (int i = 0; i < count; i++) {
    209             _context.random().nextBytes(b);
    210             Hash h = new Hash(b);
    211             double d = closestDistance(h, ris);
    212             tot += d;
    213         }
    214         double avgMinDist = tot / count;
    215         return avgMinDist;
    216     }
    217 
    218     /**
    219124     *  The whole thing
    220125     *
    221      *  @param routerPrefix ignored
    222      */
    223     private void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException {
     126     *  @param mode what tab to show
     127     *  @param date only for mode = 12
     128     */
     129    private void renderRouterInfoHTML(Writer out, String nonce, int mode, long date) throws IOException {
    224130        Hash us = _context.routerHash();
    225         Hash ourRKey = _context.router().getRouterInfo().getRoutingKey();
    226         List<RouterInfo> ris = getFloodfills(us);
    227         if (ris.isEmpty()) {
    228             out.write("<h3 class=\"sybils\">No known floodfills</h3>");
    229             return;
     131        Analysis analysis = Analysis.getInstance(_context);
     132        List<RouterInfo> ris = null;
     133        if (mode != 0 && mode != 12 && mode != 13 && mode != 14) {
     134            ris = analysis.getFloodfills(us);
     135            if (ris.isEmpty()) {
     136                out.write("<h3 class=\"sybils\">No known floodfills</h3>");
     137                return;
     138            }
    230139        }
    231140
    232141        StringBuilder buf = new StringBuilder(4*1024);
    233142        buf.append("<p id=\"sybilinfo\"><b>This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " +
    234                    "Possible \"threats\" are summarized at the bottom, however these are unlikely to be real threats. " +
     143                   "Possible \"threats\" are summarized, however these are unlikely to be real threats. " +
    235144                   "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.</b></p>" +
    236                    "<div id=\"sybilnav\"><ul><li><a href=\"#known\">FF Summary</a>" +
    237                    "</li><li><a href=\"#family\">Same Family</a>" +
    238                    "</li><li><a href=\"#ourIP\">IP close to us</a>" +
    239                    "</li><li><a href=\"#sameIP\">Same IP</a>" +
    240                    "</li><li><a href=\"#same24\">Same /24</a>" +
    241                    "</li><li><a href=\"#same16\">Same /16</a>" +
    242                    "</li><li><a href=\"#pairs\">Pair distance</a>" +
    243                    "</li><li><a href=\"#ritoday\">Close to us</a>" +
    244                    "</li><li><a href=\"#ritmrw\">Close to us tomorrow</a>" +
    245                    "</li><li><a href=\"#dht\">DHT neighbors</a>" +
    246                    "</li><li><a href=\"#dest\">Close to our destinations</a>" +
    247                    "</li><li><a href=\"#threats\">Highest threats</a>" +
     145                   "<div id=\"sybilnav\"><ul><li><a href=\"netdb?f=3\">Review stored analysis</a>" +
     146                   "</li><li><a href=\"netdb?f=3&amp;m=14\">Run new analysis</a>" +
     147                   "</li><li><a href=\"netdb?f=3&amp;m=15\">Configure periodic analysis</a>" +
     148                   "</li><li><a href=\"netdb?f=3&amp;m=1\">Floodfill Summary</a>" +
     149                   "</li><li><a href=\"netdb?f=3&amp;m=2\">Same Family</a>" +
     150                   "</li><li><a href=\"netdb?f=3&amp;m=3\">IP close to us</a>" +
     151                   "</li><li><a href=\"netdb?f=3&amp;m=4\">Same IP</a>" +
     152                   "</li><li><a href=\"netdb?f=3&amp;m=5\">Same /24</a>" +
     153                   "</li><li><a href=\"netdb?f=3&amp;m=6\">Same /16</a>" +
     154                   "</li><li><a href=\"netdb?f=3&amp;m=7\">Pair distance</a>" +
     155                   "</li><li><a href=\"netdb?f=3&amp;m=8\">Close to us</a>" +
     156                   "</li><li><a href=\"netdb?f=3&amp;m=9\">Close to us tomorrow</a>" +
     157                   "</li><li><a href=\"netdb?f=3&amp;m=10\">DHT neighbors</a>" +
     158                   "</li><li><a href=\"netdb?f=3&amp;m=11\">Close to our destinations</a>" +
    248159                   "</li></ul></div>");
    249 
     160        writeBuf(out, buf);
     161
     162        double avgMinDist = 0;
     163        if (mode == 1 || mode == 8 || mode == 9 || mode == 10 || mode == 11) {
     164            avgMinDist = analysis.getAvgMinDist(ris);
     165        }
     166        Map<Hash, Points> points = new HashMap<Hash, Points>(64);
     167
     168        if (mode == 0) {
     169            renderOverview(out, buf, nonce, analysis);
     170        } else if (mode == 1) {
     171            renderFFSummary(out, buf, ris, avgMinDist);
     172        } else if (mode == 2) {
     173            renderFamilySummary(out, buf, analysis, ris, points);
     174        } else if (mode == 3) {
     175            renderIPUsSummary(out, buf, analysis, ris, points);
     176        } else if (mode == 4) {
     177            renderIP32Summary(out, buf, analysis, ris, points);
     178        } else if (mode == 5) {
     179            renderIP24Summary(out, buf, analysis, ris, points);
     180        } else if (mode == 6) {
     181            renderIP16Summary(out, buf, analysis, ris, points);
     182        } else if (mode == 7) {
     183            renderPairSummary(out, buf, analysis, ris, points);
     184        } else if (mode == 8) {
     185            renderCloseSummary(out, buf, analysis, avgMinDist, ris, points);
     186        } else if (mode == 9) {
     187            renderCloseTmrwSummary(out, buf, analysis, us, avgMinDist, ris, points);
     188        } else if (mode == 10) {
     189            renderDHTSummary(out, buf, analysis, us, avgMinDist, ris, points);
     190        } else if (mode == 11) {
     191            renderDestSummary(out, buf, analysis, avgMinDist, ris, points);
     192        } else if (mode == 12) {
     193            // load stored analysis
     194            PersistSybil ps = analysis.getPersister();
     195            try {
     196                points = ps.load(date);
     197            } catch (IOException ioe) {
     198                out.write("<b>No analysis found for " + new Date(date) + "</b>");
     199                return;
     200            }
     201            if (points.isEmpty()) {
     202                out.write("<b>No analysis found for " + new Date(date) + "</b>");
     203            } else {
     204                renderThreatsHTML(out, buf, date, points);
     205            }
     206        } else if (mode == 13) {
     207            // run analysis and store it
     208            long now = _context.clock().now();
     209            points = analysis.backgroundAnalysis();
     210            if (!points.isEmpty()) {
     211                PersistSybil ps = analysis.getPersister();
     212                try {
     213                    ps.store(now, points);
     214                } catch (IOException ioe) {
     215                    out.write("<b>Failed to store analysis: " + ioe + "</b>");
     216                }
     217            }
     218            renderThreatsHTML(out, buf, now, points);
     219        } else if (mode == 14) {
     220            // show run form
     221            renderRunForm(out, buf, nonce);
     222        } else if (mode == 15) {
     223            // show background form
     224            renderBackgroundForm(out, buf, nonce);
     225        } else {
     226            out.write("Unknown mode " + mode);
     227        }
     228        writeBuf(out, buf);
     229    }
     230
     231    /**
     232     *  @since 0.9.38
     233     */
     234    private void renderOverview(Writer out, StringBuilder buf, String nonce, Analysis analysis) throws IOException {
     235        PersistSybil ps = analysis.getPersister();
     236        List<Long> dates = ps.load();
     237        if (dates.isEmpty()) {
     238            out.write("No stored analysis");
     239        } else {
     240            buf.append("<form action=\"netdb\" method=\"POST\">\n" +
     241                       "<input type=\"hidden\" name=\"f\" value=\"3\">\n" +
     242                       "<input type=\"hidden\" name=\"m\" value=\"12\">\n" +
     243                       "<input type=\"hidden\" name=\"nonce\" value=\"").append(nonce).append("\" >\n" +
     244                       "Select stored analysis: " +
     245                       "<select name=\"date\">\n");
     246            boolean first = true;
     247            DateFormat dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
     248            dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
     249            for (Long date : dates) {
     250                buf.append("<option value=\"").append(date).append('\"');
     251                if (first) {
     252                    buf.append(" selected=\"selected\"");
     253                    first = false;
     254                }
     255                buf.append('>').append(dfmt.format(new Date(date.longValue()))).append("</option>\n");
     256            }       
     257            buf.append("</select>\n" +
     258                       "<input type=\"submit\" name=\"action\" class=\"go\" value=\"Review analysis\" />" +
     259                       "</form>\n");
     260        }       
     261        writeBuf(out, buf);
     262    }
     263
     264    /**
     265     *  @since 0.9.38
     266     */
     267    private static void renderRunForm(Writer out, StringBuilder buf, String nonce) throws IOException {
     268        buf.append("<form action=\"netdb\" method=\"POST\">\n" +
     269                   "<input type=\"hidden\" name=\"f\" value=\"3\">\n" +
     270                   "<input type=\"hidden\" name=\"m\" value=\"13\">\n" +
     271                   "<input type=\"hidden\" name=\"nonce\" value=\"").append(nonce).append("\" >\n" +
     272                   "<input type=\"submit\" name=\"action\" class=\"go\" value=\"Run new analysis\" />" +
     273                   "</form>\n");
     274        writeBuf(out, buf);
     275    }
     276
     277    /**
     278     *  @since 0.9.38
     279     */
     280    private void renderBackgroundForm(Writer out, StringBuilder buf, String nonce) throws IOException {
     281        long freq = _context.getProperty(Analysis.PROP_FREQUENCY, 0L);
     282        buf.append("<form action=\"netdb\" method=\"POST\">\n" +
     283                   "<input type=\"hidden\" name=\"f\" value=\"3\">\n" +
     284                   "<input type=\"hidden\" name=\"m\" value=\"15\">\n" +
     285                   "<input type=\"hidden\" name=\"nonce\" value=\"").append(nonce).append("\" >\n" +
     286                   "Background analysis run frequency: <select name=\"runFrequency\">");
     287        for (int i = 0; i < HOURS.length; i++) {
     288            buf.append("<option value=\"");
     289            buf.append(Integer.toString(HOURS[i]));
     290            buf.append('"');
     291            long time = HOURS[i] * 60*60*1000L;
     292            if (time == freq)
     293                buf.append(" selected=\"selected\"");
     294            buf.append('>');
     295            if (HOURS[i] > 0)
     296                buf.append(DataHelper.formatDuration2(time));
     297            else
     298                buf.append(_t("Never"));
     299            buf.append("</option>\n");
     300        }
     301        buf.append("</select> " +
     302                   "<input type=\"submit\" name=\"action\" class=\"accept\" value=\"Save\" />" +
     303                   "</form>\n");
     304        writeBuf(out, buf);
     305    }
     306
     307    /**
     308     *  @since 0.9.38 split out from renderRouterInfoHTML()
     309     */
     310    private void renderFFSummary(Writer out, StringBuilder buf, List<RouterInfo> ris, double avgMinDist) throws IOException {
    250311        renderRouterInfo(buf, _context.router().getRouterInfo(), null, true, false);
    251312        buf.append("<h3 id=\"known\" class=\"sybils\">Known Floodfills: ").append(ris.size()).append("</h3>");
    252 
    253         double avgMinDist = getAvgMinDist(ris);
     313        DateFormat dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
     314        dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
    254315        buf.append("<div id=\"sybils_summary\">\n" +
    255316                   "<b>Average closest floodfill distance:</b> ").append(fmt.format(avgMinDist)).append("<br>\n" +
    256317                   "<b>Routing Data:</b> \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData()))
    257            .append("\" <b>Last Changed:</b> ").append(new Date(_context.routerKeyGenerator().getLastChanged())).append("<br>\n" +
     318           .append("\" <b>Last Changed:</b> ").append(dfmt.format(new Date(_context.routerKeyGenerator().getLastChanged()))).append("<br>\n" +
    258319                   "<b>Next Routing Data:</b> \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData()))
    259320           .append("\" <b>Rotates in:</b> ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())).append("\n" +
    260321                   "</div>\n");
    261 
    262         Map<Hash, Points> points = new HashMap<Hash, Points>(64);
    263 
    264         // IP analysis
    265         renderIPGroupsFamily(out, buf, ris, points);
    266         renderIPGroupsUs(out, buf, ris, points);
    267         renderIPGroups32(out, buf, ris, points);
    268         renderIPGroups24(out, buf, ris, points);
    269         renderIPGroups16(out, buf, ris, points);
    270 
     322        writeBuf(out, buf);
     323    }
     324
     325    /**
     326     *  @since 0.9.38 split out from renderRouterInfoHTML()
     327     */
     328    private void renderFamilySummary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     329        Map<String, List<RouterInfo>> fmap = analysis.calculateIPGroupsFamily(ris, points);
     330        renderIPGroupsFamily(out, buf, fmap);
     331    }
     332
     333    /**
     334     *  @since 0.9.38 split out from renderRouterInfoHTML()
     335     */
     336    private void renderIPUsSummary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     337        List<RouterInfo> ri32 = new ArrayList<RouterInfo>(4);
     338        List<RouterInfo> ri24 = new ArrayList<RouterInfo>(4);
     339        List<RouterInfo> ri16 = new ArrayList<RouterInfo>(4);
     340        analysis.calculateIPGroupsUs(ris, points, ri32, ri24, ri16);
     341        renderIPGroupsUs(out, buf, ri32, ri24, ri16);
     342    }
     343
     344    /**
     345     *  @since 0.9.38 split out from renderRouterInfoHTML()
     346     */
     347    private void renderIP32Summary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     348        Map<Integer, List<RouterInfo>> map = analysis.calculateIPGroups32(ris, points);
     349        renderIPGroups32(out, buf, map);
     350    }
     351
     352    /**
     353     *  @since 0.9.38 split out from renderRouterInfoHTML()
     354     */
     355    private void renderIP24Summary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     356        Map<Integer, List<RouterInfo>> map = analysis.calculateIPGroups24(ris, points);
     357        renderIPGroups24(out, buf, map);
     358    }
     359
     360    /**
     361     *  @since 0.9.38 split out from renderRouterInfoHTML()
     362     */
     363    private void renderIP16Summary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     364        Map<Integer, List<RouterInfo>> map = analysis.calculateIPGroups16(ris, points);
     365        renderIPGroups16(out, buf, map);
     366    }
     367
     368    /**
     369     *  @since 0.9.38 split out from renderRouterInfoHTML()
     370     */
     371    private void renderPairSummary(Writer out, StringBuilder buf, Analysis analysis, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    271372        // Pairwise distance analysis
    272         renderPairDistance(out, buf, ris, points);
    273 
     373        List<Pair> pairs = new ArrayList<Pair>(PAIRMAX);
     374        double avg = analysis.calculatePairDistance(ris, points, pairs);
     375        renderPairDistance(out, buf, pairs, avg);
     376    }
     377
     378    /**
     379     *  @since 0.9.38 split out from renderRouterInfoHTML()
     380     */
     381    private void renderCloseSummary(Writer out, StringBuilder buf, Analysis analysis, double avgMinDist, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    274382        // Distance to our router analysis
    275383        buf.append("<h3 id=\"ritoday\" class=\"sybils\">Closest Floodfills to Our Routing Key (Where we Store our RI)</h3>");
    276384        buf.append("<p class=\"sybil_info\"><a href=\"/netdb?caps=f&amp;sybil\">See all</a></p>");
    277         renderRouterInfoHTML(out, buf, ourRKey, "our rkey", avgMinDist, ris, points);
     385        Hash ourRKey = _context.router().getRouterInfo().getRoutingKey();
     386        analysis.calculateRouterInfo(ourRKey, "our rkey", ris, points);
     387        renderRouterInfoHTML(out, buf, ourRKey, avgMinDist, ris);
     388    }
     389
     390    /**
     391     *  @since 0.9.38 split out from renderRouterInfoHTML()
     392     */
     393    private void renderCloseTmrwSummary(Writer out, StringBuilder buf, Analysis analysis, Hash us, double avgMinDist, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
     394        // Distance to our router analysis
    278395        RouterKeyGenerator rkgen = _context.routerKeyGenerator();
    279396        Hash nkey = rkgen.getNextRoutingKey(us);
    280397        buf.append("<h3 id=\"ritmrw\" class=\"sybils\">Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)</h3>");
    281398        buf.append("<p class=\"sybil_info\"><a href=\"/netdb?caps=f&amp;sybil\">See all</a></p>");
    282         renderRouterInfoHTML(out, buf, nkey, "our rkey (tomorrow)", avgMinDist, ris, points);
    283 
     399        analysis.calculateRouterInfo(nkey, "our rkey (tomorrow)", ris, points);
     400        renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris);
     401    }
     402
     403    /**
     404     *  @since 0.9.38 split out from renderRouterInfoHTML()
     405     */
     406    private void renderDHTSummary(Writer out, StringBuilder buf, Analysis analysis, Hash us, double avgMinDist, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    284407        buf.append("<h3 id=\"dht\" class=\"sybils\">Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)</h3>");
    285         renderRouterInfoHTML(out, buf, us, "our router", avgMinDist, ris, points);
    286 
     408        analysis.calculateRouterInfo(us, "our router", ris, points);
     409        renderRouterInfoHTML(out, buf, us, avgMinDist, ris);
     410    }
     411
     412    /**
     413     *  @since 0.9.38 split out from renderRouterInfoHTML()
     414     */
     415    private void renderDestSummary(Writer out, StringBuilder buf, Analysis analysis, double avgMinDist, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    287416        // Distance to our published destinations analysis
     417        RouterKeyGenerator rkgen = _context.routerKeyGenerator();
    288418        buf.append("<h3 id=\"dest\" class=\"sybils\">Floodfills Close to Our Destinations</h3>");
    289419        Map<Hash, TunnelPool> clientInboundPools = _context.tunnelManager().getInboundClientPools();
    290420        List<Hash> destinations = new ArrayList<Hash>(clientInboundPools.keySet());
    291         //boolean debug = _context.getBooleanProperty(HelperBase.PROP_ADVANCED);
     421        for (Iterator<Hash> iter = destinations.iterator(); iter.hasNext(); ) {
     422            Hash client = iter.next();
     423            if (!_context.clientManager().isLocal(client) ||
     424                !_context.clientManager().shouldPublishLeaseSet(client) ||
     425                _context.netDb().lookupLeaseSetLocally(client) == null) {
     426                iter.remove();
     427            }
     428        }
     429        if (destinations.isEmpty()) {
     430            buf.append("<p class=\"notfound\">None</p>");
     431            writeBuf(out, buf);
     432            return;
     433        }
    292434        for (Hash client : destinations) {
    293             boolean isLocal = _context.clientManager().isLocal(client);
    294             if (!isLocal)
    295                 continue;
    296             if (! _context.clientManager().shouldPublishLeaseSet(client))
    297                 continue;
    298435            LeaseSet ls = _context.netDb().lookupLeaseSetLocally(client);
    299436            if (ls == null)
     
    304441            buf.append("<h3 class=\"sybils\">Closest floodfills to the Routing Key for " + name + " (where we store our LS)</h3>");
    305442            buf.append("<p class=\"sybil_info\"><a href=\"/netdb?caps=f&amp;sybil=" + ls.getHash().toBase64() + "\">See all</a></p>");
    306             renderRouterInfoHTML(out, buf, rkey, name, avgMinDist, ris, points);
    307             nkey = rkgen.getNextRoutingKey(ls.getHash());
     443            analysis.calculateRouterInfo(rkey, name, ris, points);
     444            renderRouterInfoHTML(out, buf, rkey, avgMinDist, ris);
     445            Hash nkey = rkgen.getNextRoutingKey(ls.getHash());
    308446            buf.append("<h3 class=\"sybils\">Closest floodfills to Tomorrow's Routing Key for " + name + " (where we will store our LS)</h3>");
    309447            buf.append("<p class=\"sybil_info\"><a href=\"/netdb?caps=f&amp;sybil=" + ls.getHash().toBase64() + "\">See all</a></p>");
    310             renderRouterInfoHTML(out, buf, nkey, name + " (tomorrow)", avgMinDist, ris, points);
    311         }
    312 
    313         // Profile analysis
    314         addProfilePoints(ris, points);
    315         addVersionPoints(ris, points);
    316 
     448            analysis.calculateRouterInfo(nkey, name + " (tomorrow)", ris, points);
     449            renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris);
     450        }
     451    }
     452
     453    /**
     454     *  @since 0.9.38 split out from renderRouterInfoHTML()
     455     */
     456    private void renderThreatsHTML(Writer out, StringBuilder buf, long date, Map<Hash, Points> points) throws IOException {
    317457        if (!points.isEmpty()) {
    318458            List<Hash> warns = new ArrayList<Hash>(points.keySet());
    319459            Collections.sort(warns, new PointsComparator(points));
    320             buf.append("<h3 id=\"threats\" class=\"sybils\">Routers with Most Threat Points</h3>");
     460            ReasonComparator rcomp = new ReasonComparator();
     461            DateFormat dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
     462            dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
     463            buf.append("<h3 id=\"threats\" class=\"sybils\">Routers with Most Threat Points as of " + dfmt.format(new Date(date)) + "</h3>");
    321464            for (Hash h : warns) {
    322465                RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h);
     
    324467                    continue;
    325468                Points pp = points.get(h);
    326                 double p = pp.points;
     469                double p = pp.getPoints();
    327470                if (p < MIN_DISPLAY_POINTS)
    328471                    break;  // sorted
    329472                buf.append("<p class=\"threatpoints\"><b>Threat Points: " + fmt.format(p) + "</b></p><ul>");
    330                 if (pp.reasons.size() > 1)
    331                     Collections.sort(pp.reasons, new ReasonComparator());
    332                 for (String s : pp.reasons) {
     473                List<String> reasons = pp.getReasons();
     474                if (reasons.size() > 1)
     475                    Collections.sort(reasons, rcomp);
     476                for (String s : reasons) {
    333477                    int c = s.indexOf(':');
    334478                    if (c <= 0)
    335479                        continue;
    336                     buf.append("<li><b>").append(s.substring(0, c+1)).append("</b>").append(s.substring(c+1)).append("</li>");
     480                    buf.append("<li><b>").append(s, 0, c+1).append("</b>").append(s, c+1, s.length()).append("</li>");
    337481                }
    338482                buf.append("</ul>");
     
    340484            }
    341485        }
    342 
    343         out.write(buf.toString());
    344         out.flush();
    345         buf.setLength(0);
    346     }
    347 
    348     /**
    349      *  Analyze threats. No output.
    350      *  Return separate maps for each cause instead?
    351      *  @since 0.9.38
    352      */
    353     public Map<Hash, Points> backgroundAnalysis() throws IOException {
    354         Hash us = _context.routerHash();
    355         List<RouterInfo> ris = getFloodfills(us);
    356 
    357         double avgMinDist = getAvgMinDist(ris);
    358         Map<Hash, Points> points = new HashMap<Hash, Points>(64);
    359 
    360         // IP analysis
    361         renderIPGroupsFamily(null, null, ris, points);
    362         renderIPGroupsUs(null, null, ris, points);
    363         renderIPGroups32(null, null, ris, points);
    364         renderIPGroups24(null, null, ris, points);
    365         renderIPGroups16(null, null, ris, points);
    366 
    367         // Pairwise distance analysis
    368         renderPairDistance(null, null, ris, points);
    369 
    370         // Distance to our router analysis
    371         // closest to our routing key today
    372         Hash ourRKey = _context.router().getRouterInfo().getRoutingKey();
    373         renderRouterInfoHTML(null, null, ourRKey, "our rkey", avgMinDist, ris, points);
    374         // closest to our routing key tomorrow
    375         RouterKeyGenerator rkgen = _context.routerKeyGenerator();
    376         Hash nkey = rkgen.getNextRoutingKey(us);
    377         renderRouterInfoHTML(null, null, nkey, "our rkey (tomorrow)", avgMinDist, ris, points);
    378         // closest to us
    379         renderRouterInfoHTML(null, null, us, "our router", avgMinDist, ris, points);
    380 
    381         // Distance to our published destinations analysis
    382         Map<Hash, TunnelPool> clientInboundPools = _context.tunnelManager().getInboundClientPools();
    383         List<Hash> destinations = new ArrayList<Hash>(clientInboundPools.keySet());
    384         for (Hash client : destinations) {
    385             boolean isLocal = _context.clientManager().isLocal(client);
    386             if (!isLocal)
    387                 continue;
    388             if (! _context.clientManager().shouldPublishLeaseSet(client))
    389                 continue;
    390             LeaseSet ls = _context.netDb().lookupLeaseSetLocally(client);
    391             if (ls == null)
    392                 continue;
    393             Hash rkey = ls.getRoutingKey();
    394             TunnelPool in = clientInboundPools.get(client);
    395             String name = (in != null) ? DataHelper.escapeHTML(in.getSettings().getDestinationNickname()) : client.toBase64().substring(0,4);
    396             // closest to routing key today
    397             renderRouterInfoHTML(null, null, rkey, name, avgMinDist, ris, points);
    398             // closest to routing key tomorrow
    399             nkey = rkgen.getNextRoutingKey(ls.getHash());
    400             renderRouterInfoHTML(null, null, nkey, name + " (tomorrow)", avgMinDist, ris, points);
    401         }
    402 
    403         // Profile analysis
    404         addProfilePoints(ris, points);
    405         addVersionPoints(ris, points);
    406         return points;
    407     }
    408 
    409     private static class Pair implements Comparable<Pair> {
    410         public final RouterInfo r1, r2;
    411         public final BigInteger dist;
    412         public Pair(RouterInfo ri1, RouterInfo ri2, BigInteger distance) {
    413             r1 = ri1; r2 = ri2; dist = distance;
    414         }
    415         public int compareTo(Pair p) {
    416             return this.dist.compareTo(p.dist);
    417         }
    418     }
    419 
    420     /**
    421      *  @param out null for background analysis
    422      *  @param buf null for background analysis
    423      */
    424     private void renderPairDistance(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    425         int sz = ris.size();
    426         List<Pair> pairs = new ArrayList<Pair>(PAIRMAX);
    427         double total = 0;
    428         for (int i = 0; i < sz; i++) {
    429             RouterInfo info1 = ris.get(i);
    430             for (int j = i + 1; j < sz; j++) {
    431                 RouterInfo info2 = ris.get(j);
    432                 BigInteger dist = HashDistance.getDistance(info1.getHash(), info2.getHash());
    433                 if (pairs.isEmpty()) {
    434                     pairs.add(new Pair(info1, info2, dist));
    435                 } else if (pairs.size() < PAIRMAX) {
    436                     pairs.add(new Pair(info1, info2, dist));
    437                     Collections.sort(pairs);
    438                 } else if (dist.compareTo(pairs.get(PAIRMAX - 1).dist) < 0) {
    439                     pairs.set(PAIRMAX - 1, new Pair(info1, info2, dist));
    440                     Collections.sort(pairs);
    441                 }
    442                 total += biLog2(dist);
    443             }
    444         }
    445 
    446         double avg = total / (sz * sz / 2d);
    447         if (buf != null) {
    448             buf.append("<h3 class=\"sybils\">Average Floodfill Distance is ").append(fmt.format(avg)).append("</h3>" +
    449                        "<h3 id=\"pairs\" class=\"sybils\">Closest Floodfill Pairs by Hash</h3>");
    450         }
     486        writeBuf(out, buf);
     487    }
     488
     489    /**
     490     *  @param pairs sorted
     491     */
     492    private void renderPairDistance(Writer out, StringBuilder buf, List<Pair> pairs, double avg) throws IOException {
     493        buf.append("<h3 class=\"sybils\">Average Floodfill Distance is ").append(fmt.format(avg)).append("</h3>" +
     494                   "<h3 id=\"pairs\" class=\"sybils\">Closest Floodfill Pairs by Hash</h3>");
     495
    451496        for (Pair p : pairs) {
    452497            double distance = biLog2(p.dist);
    453498            double point = MIN_CLOSE - distance;
    454             if (point < 0)
     499            // limit display
     500            if (point < 2)
    455501                break;  // sorted;
    456             if (buf != null && point >= 2) {
    457                 // limit display
    458                 buf.append("<p class=\"hashdist\"><b>Hash Distance: ").append(fmt.format(distance)).append(": </b>" +
    459                            "</p>");
    460                 renderRouterInfo(buf, p.r1, null, false, false);
    461                 renderRouterInfo(buf, p.r2, null, false, false);
    462             }
    463             point *= PAIR_DISTANCE_FACTOR;
    464             String b2 = p.r2.getHash().toBase64();
    465             addPoints(points, p.r1.getHash(), point, "Very close (" + fmt.format(distance) +
    466                           ") to other floodfill <a href=\"netdb?r=" + b2 + "\">" + b2 + "</a>");
    467             String b1 = p.r1.getHash().toBase64();
    468             addPoints(points, p.r2.getHash(), point, "Very close (" + fmt.format(distance) +
    469                           ") to other floodfill <a href=\"netdb?r=" + b1 + "\">" + b1 + "</a>");
    470         }
    471         if (buf != null) {
    472             out.write(buf.toString());
    473             out.flush();
    474             buf.setLength(0);
    475         }
    476     }
    477 
    478     private double closestDistance(Hash h, List<RouterInfo> ris) {
    479         BigInteger min = (new BigInteger("2")).pow(256);
    480         for (RouterInfo info : ris) {
    481             BigInteger dist = HashDistance.getDistance(h, info.getHash());
    482             if (dist.compareTo(min) < 0)
    483                 min = dist;
    484         }
    485         return biLog2(min);
    486     }
    487 
    488     /** v4 only */
    489     private static byte[] getIP(RouterInfo ri) {
    490         for (RouterAddress ra : ri.getAddresses()) {
    491             byte[] rv = ra.getIP();
    492             if (rv != null && rv.length == 4)
    493                 return rv;
    494         }
    495         return null;
     502            buf.append("<p class=\"hashdist\"><b>Hash Distance: ").append(fmt.format(distance)).append("</b>" +
     503                       "</p>");
     504            renderRouterInfo(buf, p.r1, null, false, false);
     505            renderRouterInfo(buf, p.r2, null, false, false);
     506        }
     507        writeBuf(out, buf);
    496508    }
    497509
    498510    private static class FooComparator implements Comparator<Integer>, Serializable {
    499          private final ObjectCounter<Integer> _o;
    500          public FooComparator(ObjectCounter<Integer> o) { _o = o;}
     511         private final Map<Integer, List<RouterInfo>> _o;
     512         public FooComparator(Map<Integer, List<RouterInfo>> o) { _o = o;}
    501513         public int compare(Integer l, Integer r) {
    502514             // reverse by count
    503              int rv = _o.count(r) - _o.count(l);
     515             int rv = _o.get(r).size() - _o.get(l).size();
    504516             if (rv != 0)
    505517                 return rv;
     
    510522
    511523    private static class FoofComparator implements Comparator<String>, Serializable {
    512          private final ObjectCounter<String> _o;
     524         private final Map<String, List<RouterInfo>> _o;
    513525         private final Collator _comp = Collator.getInstance();
    514          public FoofComparator(ObjectCounter<String> o) { _o = o;}
     526         public FoofComparator(Map<String, List<RouterInfo>> o) { _o = o;}
    515527         public int compare(String l, String r) {
    516528             // reverse by count
    517              int rv = _o.count(r) - _o.count(l);
     529             int rv = _o.get(r).size() - _o.get(l).size();
    518530             if (rv != 0)
    519531                 return rv;
     
    524536
    525537    /**
    526      *  @param out null for background analysis
    527      *  @param buf null for background analysis
    528      */
    529     private void renderIPGroupsUs(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    530         RouterInfo us = _context.router().getRouterInfo();
    531         byte[] ourIP = getIP(us);
    532         if (ourIP == null)
    533             return;
    534         if (buf != null)
    535             buf.append("<h3 id=\"ourIP\" class=\"sybils\">Floodfills close to Our IP</h3>");
     538     *
     539     */
     540    private void renderIPGroupsUs(Writer out, StringBuilder buf, List<RouterInfo> ri32,
     541                                  List<RouterInfo> ri24, List<RouterInfo> ri16) throws IOException {
     542        buf.append("<h3 id=\"ourIP\" class=\"sybils\">Floodfills close to Our IP</h3>");
    536543        boolean found = false;
    537         for (RouterInfo info : ris) {
    538             byte[] ip = getIP(info);
    539             if (ip == null)
    540                 continue;
    541             if (ip[0] == ourIP[0] && ip[1] == ourIP[1]) {
    542                 if (buf != null)
    543                     buf.append("<p id=\"sybil_info\"><b>");
    544                 if (ip[2] == ourIP[2]) {
    545                     if (ip[3] == ourIP[3]) {
    546                         if (buf != null)
    547                             buf.append("Same IP as us");
    548                         addPoints(points, info.getHash(), POINTS_US32, "Same IP as us");
    549                     } else {
    550                         if (buf != null)
    551                             buf.append("Same /24 as us");
    552                         addPoints(points, info.getHash(), POINTS_US24, "Same /24 as us");
    553                     }
    554                 } else {
    555                     if (buf != null)
    556                         buf.append("Same /16 as us");
    557                     addPoints(points, info.getHash(), POINTS_US16, "Same /16 as us");
    558                 }
    559                 if (buf != null) {
    560                     buf.append(":</b></p>");
    561                     renderRouterInfo(buf, info, null, false, false);
    562                 }
    563                 found = true;
    564             }
    565         }
    566         if (buf != null) {
    567             if (!found)
    568                 buf.append("<p class=\"notfound\">None</p>");
    569             out.write(buf.toString());
    570             out.flush();
    571             buf.setLength(0);
    572         }
    573     }
    574 
    575     /**
    576      *  @param out null for background analysis
    577      *  @param buf null for background analysis
    578      */
    579     private void renderIPGroups32(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    580         if (buf != null)
    581             buf.append("<h3 id=\"sameIP\" class=\"sybils\">Floodfills with the Same IP</h3>");
    582         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
    583         for (RouterInfo info : ris) {
    584             byte[] ip = getIP(info);
    585             if (ip == null)
    586                 continue;
    587             Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 4));
    588             oc.increment(x);
    589         }
    590         List<Integer> foo = new ArrayList<Integer>();
    591         for (Integer ii : oc.objects()) {
    592             int count = oc.count(ii);
    593             if (count >= 2)
    594                 foo.add(ii);
    595         }
    596         Collections.sort(foo, new FooComparator(oc));
     544        for (RouterInfo info : ri32) {
     545             buf.append("<p id=\"sybil_info\"><b>");
     546             buf.append("Same IP as us");
     547             buf.append(":</b></p>");
     548             renderRouterInfo(buf, info, null, false, false);
     549             found = true;
     550        }
     551        for (RouterInfo info : ri24) {
     552             buf.append("<p id=\"sybil_info\"><b>");
     553             buf.append("Same /24 as us");
     554             buf.append(":</b></p>");
     555             renderRouterInfo(buf, info, null, false, false);
     556             found = true;
     557        }
     558        for (RouterInfo info : ri16) {
     559             buf.append("<p id=\"sybil_info\"><b>");
     560             buf.append("Same /16 as us");
     561             buf.append(":</b></p>");
     562             renderRouterInfo(buf, info, null, false, false);
     563             found = true;
     564        }
     565        if (!found)
     566            buf.append("<p class=\"notfound\">None</p>");
     567        writeBuf(out, buf);
     568    }
     569
     570    /**
     571     *
     572     */
     573    private void renderIPGroups32(Writer out, StringBuilder buf, Map<Integer, List<RouterInfo>> map) throws IOException {
     574        buf.append("<h3 id=\"sameIP\" class=\"sybils\">Floodfills with the Same IP</h3>");
     575        List<Integer> foo = new ArrayList<Integer>(map.keySet());
     576        Collections.sort(foo, new FooComparator(map));
    597577        boolean found = false;
    598578        for (Integer ii : foo) {
    599             int count = oc.count(ii);
     579            List<RouterInfo> ris = map.get(ii);
     580            int count = ris.size();
    600581            int i = ii.intValue();
    601582            int i0 = (i >> 24) & 0xff;
     
    604585            int i3 = i & 0xff;
    605586            String sip = i0 + "." + i1 + '.' + i2 + '.' + i3;
    606             if (buf != null) {
    607                 buf.append("<p class=\"sybil_info\"><b>").append(count).append(" floodfills with IP <a href=\"/netdb?ip=")
    608                    .append(sip).append("&amp;sybil\">").append(sip)
    609                    .append("</a>:</b></p>");
    610             }
     587            buf.append("<p class=\"sybil_info\"><b>").append(count).append(" floodfills with IP <a href=\"/netdb?ip=")
     588               .append(sip).append("&amp;sybil\">").append(sip)
     589               .append("</a>:</b></p>");
    611590            for (RouterInfo info : ris) {
    612                 byte[] ip = getIP(info);
    613                 if (ip == null)
    614                     continue;
    615                 if ((ip[0] & 0xff) != i0)
    616                     continue;
    617                 if ((ip[1] & 0xff) != i1)
    618                     continue;
    619                 if ((ip[2] & 0xff) != i2)
    620                     continue;
    621                 if ((ip[3] & 0xff) != i3)
    622                     continue;
    623591                found = true;
    624                 if (buf != null)
    625                     renderRouterInfo(buf, info, null, false, false);
    626                 double point = POINTS32 * (count - 1);
    627                 addPoints(points, info.getHash(), point, "Same IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    628             }
    629         }
    630         if (buf != null) {
    631             if (!found)
    632                 buf.append("<p class=\"notfound\">None</p>");
    633             out.write(buf.toString());
    634             out.flush();
    635             buf.setLength(0);
    636         }
    637     }
    638 
    639     /**
    640      *  @param out null for background analysis
    641      *  @param buf null for background analysis
    642      */
    643     private void renderIPGroups24(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    644         if (buf != null)
    645             buf.append("<h3 id=\"same24\" class=\"sybils\">Floodfills in the Same /24 (2 minimum)</h3>");
    646         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
    647         for (RouterInfo info : ris) {
    648             byte[] ip = getIP(info);
    649             if (ip == null)
    650                 continue;
    651             Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 3));
    652             oc.increment(x);
    653         }
    654         List<Integer> foo = new ArrayList<Integer>();
    655         for (Integer ii : oc.objects()) {
    656             int count = oc.count(ii);
    657             if (count >= 2)
    658                 foo.add(ii);
    659         }
    660         Collections.sort(foo, new FooComparator(oc));
     592                renderRouterInfo(buf, info, null, false, false);
     593            }
     594        }
     595        if (!found)
     596            buf.append("<p class=\"notfound\">None</p>");
     597        writeBuf(out, buf);
     598    }
     599
     600    /**
     601     *
     602     */
     603    private void renderIPGroups24(Writer out, StringBuilder buf, Map<Integer, List<RouterInfo>> map) throws IOException {
     604        buf.append("<h3 id=\"same24\" class=\"sybils\">Floodfills in the Same /24 (2 minimum)</h3>");
     605        List<Integer> foo = new ArrayList<Integer>(map.keySet());
     606        Collections.sort(foo, new FooComparator(map));
    661607        boolean found = false;
    662608        for (Integer ii : foo) {
    663             int count = oc.count(ii);
     609            List<RouterInfo> ris = map.get(ii);
     610            int count = ris.size();
    664611            int i = ii.intValue();
    665612            int i0 = i >> 16;
     
    667614            int i2 = i & 0xff;
    668615            String sip = i0 + "." + i1 + '.' + i2 + ".0/24";
    669             if (buf != null) {
    670                 buf.append("<p class=\"sybil_info\"><b>").append(count).append(" floodfills with IP <a href=\"/netdb?ip=")
    671                    .append(sip).append("&amp;sybil\">").append(sip)
    672                    .append("</a>:</b></p>");
    673             }
     616            buf.append("<p class=\"sybil_info\"><b>").append(count).append(" floodfills with IP <a href=\"/netdb?ip=")
     617               .append(sip).append("&amp;sybil\">").append(sip)
     618               .append("</a>:</b></p>");
    674619            for (RouterInfo info : ris) {
    675                 byte[] ip = getIP(info);
    676                 if (ip == null)
    677                     continue;
    678                 if ((ip[0] & 0xff) != i0)
    679                     continue;
    680                 if ((ip[1] & 0xff) != i1)
    681                     continue;
    682                 if ((ip[2] & 0xff) != i2)
    683                     continue;
    684620                found = true;
    685                 if (buf != null)
    686                     renderRouterInfo(buf, info, null, false, false);
    687                 double point = POINTS24 * (count - 1);
    688                 addPoints(points, info.getHash(), point, "Same /24 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    689             }
    690         }
    691         if (buf != null) {
    692             if (!found)
    693                 buf.append("<p class=\"notfound\">None</p>");
    694             out.write(buf.toString());
    695             out.flush();
    696             buf.setLength(0);
    697         }
    698     }
    699 
    700     /**
    701      *  @param out null for background analysis
    702      *  @param buf null for background analysis
    703      */
    704     private void renderIPGroups16(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    705         if (buf != null)
    706             buf.append("<h3 id=\"same16\" class=\"sybils\">Floodfills in the Same /16 (4 minimum)</h3>");
    707         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
    708         for (RouterInfo info : ris) {
    709             byte[] ip = getIP(info);
    710             if (ip == null)
    711                 continue;
    712             Integer x = Integer.valueOf((int) DataHelper.fromLong(ip, 0, 2));
    713             oc.increment(x);
    714         }
    715         List<Integer> foo = new ArrayList<Integer>();
    716         for (Integer ii : oc.objects()) {
    717             int count = oc.count(ii);
    718             if (count >= 4)
    719                 foo.add(ii);
    720         }
    721         Collections.sort(foo, new FooComparator(oc));
     621                renderRouterInfo(buf, info, null, false, false);
     622            }
     623        }
     624        if (!found)
     625            buf.append("<p class=\"notfound\">None</p>");
     626        writeBuf(out, buf);
     627    }
     628
     629    /**
     630     *
     631     */
     632    private void renderIPGroups16(Writer out, StringBuilder buf, Map<Integer, List<RouterInfo>> map) throws IOException {
     633        buf.append("<h3 id=\"same16\" class=\"sybils\">Floodfills in the Same /16 (4 minimum)</h3>");
     634        List<Integer> foo = new ArrayList<Integer>(map.keySet());
     635        Collections.sort(foo, new FooComparator(map));
    722636        boolean found = false;
    723637        for (Integer ii : foo) {
    724             int count = oc.count(ii);
     638            List<RouterInfo> ris = map.get(ii);
     639            int count = ris.size();
    725640            int i = ii.intValue();
    726641            int i0 = i >> 8;
     
    733648            }
    734649            for (RouterInfo info : ris) {
    735                 byte[] ip = getIP(info);
    736                 if (ip == null)
    737                     continue;
    738                 if ((ip[0] & 0xff) != i0)
    739                     continue;
    740                 if ((ip[1] & 0xff) != i1)
    741                     continue;
    742650                found = true;
    743                 // limit display
    744                 //renderRouterInfo(buf, info, null, false, false);
    745                 double point = POINTS16 * (count - 1);
    746                 addPoints(points, info.getHash(), point, "Same /16 IP with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    747             }
    748         }
    749         if (buf != null) {
    750             if (!found)
    751                 buf.append("<p class=\"notfound\">None</p>");
    752             out.write(buf.toString());
    753             out.flush();
    754             buf.setLength(0);
    755         }
    756     }
    757 
    758     /**
    759      *  @param out null for background analysis
    760      *  @param buf null for background analysis
    761      */
    762     private void renderIPGroupsFamily(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    763         if (buf != null)
    764             buf.append("<h3 id=\"samefamily\" class=\"sybils\">Floodfills in the same Family</h3><div class=\"sybil_container\">");
    765         ObjectCounter<String> oc = new ObjectCounter<String>();
    766         for (RouterInfo info : ris) {
    767             String fam = info.getOption("family");
    768             if (fam == null)
    769                 continue;
    770             oc.increment(fam);
    771         }
    772         List<String> foo = new ArrayList<String>(oc.objects());
    773         Collections.sort(foo, new FoofComparator(oc));
     651                renderRouterInfo(buf, info, null, false, false);
     652            }
     653        }
     654        if (!found)
     655            buf.append("<p class=\"notfound\">None</p>");
     656        writeBuf(out, buf);
     657    }
     658
     659    /**
     660     *
     661     */
     662    private void renderIPGroupsFamily(Writer out, StringBuilder buf, Map<String, List<RouterInfo>> map) throws IOException {
     663        buf.append("<h3 id=\"samefamily\" class=\"sybils\">Floodfills in the same Family</h3><div class=\"sybil_container\">");
     664        List<String> foo = new ArrayList<String>(map.keySet());
     665        Collections.sort(foo, new FoofComparator(map));
    774666        FamilyKeyCrypto fkc = _context.router().getFamilyKeyCrypto();
    775667        String ourFamily = fkc != null ? fkc.getOurFamilyName() : null;
    776668        boolean found = false;
    777669        for (String s : foo) {
    778             int count = oc.count(s);
     670            List<RouterInfo> list = map.get(s);
     671            int count = list.size();
    779672            String ss = DataHelper.escapeHTML(s);
    780             if (buf != null && count > 1) {
     673            if (count > 1) {
    781674                buf.append("<p class=\"family\"><b>").append(count).append(" floodfills in family: &nbsp;<a href=\"/netdb?fam=")
    782675                   .append(ss).append("&amp;sybil\">").append(ss).append("</a></b></p>");
    783             }
    784             for (RouterInfo info : ris) {
    785                 String fam = info.getOption("family");
    786                 if (fam == null)
    787                     continue;
    788                 if (!fam.equals(s))
    789                     continue;
    790676                found = true;
     677            }
     678            //for (RouterInfo info : ris) {
    791679                // limit display
    792680                //renderRouterInfo(buf, info, null, false, false);
    793                 double point = POINTS_FAMILY;
    794                 if (fkc != null && s.equals(ourFamily)) {
    795                     if (fkc.verifyOurFamily(info))
    796                         addPoints(points, info.getHash(), POINTS_OUR_FAMILY, "Our family \"" + ss + "\" with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    797                     else
    798                         addPoints(points, info.getHash(), POINTS_BAD_OUR_FAMILY, "Spoofed our family \"" + ss + "\" with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    799                 } else if (count > 1) {
    800                     addPoints(points, info.getHash(), point, "In family \"" + ss + "\" with " + (count - 1) + " other" + (( count > 2) ? "s" : ""));
    801                 } else {
    802                     addPoints(points, info.getHash(), point, "In family \"" + ss + '"');
    803                 }
    804             }
    805         }
    806         if (buf != null) {
    807             if (!found)
    808                 buf.append("<p class=\"notfound\">None</p>");
    809             buf.append("</div>");
    810             out.write(buf.toString());
    811             out.flush();
    812             buf.setLength(0);
    813         }
    814     }
    815 
    816     private static final long DAY = 24*60*60*1000L;
    817 
    818     private void addProfilePoints(List<RouterInfo> ris, Map<Hash, Points> points) {
    819         long now = _context.clock().now();
    820         RateAverages ra = RateAverages.getTemp();
    821         for (RouterInfo info : ris) {
    822             Hash h = info.getHash();
    823             if (_context.banlist().isBanlisted(h))
    824                 addPoints(points, h, POINTS_BANLIST, "Banlisted");
    825             PeerProfile prof = _context.profileOrganizer().getProfileNonblocking(h);
    826             if (prof != null) {
    827                 long heard = prof.getFirstHeardAbout();
    828                 if (heard > 0) {
    829                     long age = Math.max(now - heard, 1);
    830                     if (age < 2 * DAY) {
    831                         // (POINTS_NEW / 48) for every hour under 48, max POINTS_NEW
    832                         double point = Math.min(POINTS_NEW, (2 * DAY - age) / (2 * DAY / POINTS_NEW));
    833                         addPoints(points, h, point,
    834                                   "First heard about: " + _t("{0} ago", DataHelper.formatDuration2(age)));
    835                     }
    836                 }
    837                 DBHistory dbh = prof.getDBHistory();
    838                 if (dbh != null) {
    839                     RateStat rs = dbh.getFailedLookupRate();
    840                     if (rs != null) {
    841                         Rate r = rs.getRate(24*60*60*1000);
    842                         if (r != null) {
    843                             r.computeAverages(ra, false);
    844                             if (ra.getTotalEventCount() > 0) {
    845                                 double avg = 100 * ra.getAverage();
    846                                 if (avg > 40)
    847                                     addPoints(points, h, (avg - 40) / 6.0, "Lookup fail rate " + ((int) avg) + '%');
    848                             }
    849                         }
    850                     }
    851                 }
    852             }
    853         }
    854     }
    855 
    856     private void addVersionPoints(List<RouterInfo> ris, Map<Hash, Points> points) {
    857         RouterInfo us = _context.router().getRouterInfo();
    858         if (us == null) return;
    859         String ourVer = us.getVersion();
    860         if (!ourVer.startsWith("0.9.")) return;
    861         ourVer = ourVer.substring(4);
    862         int dot = ourVer.indexOf('.');
    863         if (dot > 0)
    864             ourVer = ourVer.substring(0, dot);
    865         int minor;
    866         try {
    867             minor = Integer.parseInt(ourVer);
    868         } catch (NumberFormatException nfe) { return; }
    869         for (RouterInfo info : ris) {
    870             Hash h = info.getHash();
    871             String caps = info.getCapabilities();
    872             if (!caps.contains("R"))
    873                 addPoints(points, h, POINTS_UNREACHABLE, "Unreachable: " + DataHelper.escapeHTML(caps));
    874             String hisFullVer = info.getVersion();
    875             if (!hisFullVer.startsWith("0.9.")) {
    876                 addPoints(points, h, POINTS_BAD_VERSION, "Strange version " + DataHelper.escapeHTML(hisFullVer));
    877                 continue;
    878             }
    879             String hisVer = hisFullVer.substring(4);
    880             dot = hisVer.indexOf('.');
    881             if (dot > 0)
    882                 hisVer = hisVer.substring(0, dot);
    883             int hisMinor;
    884             try {
    885                 hisMinor = Integer.parseInt(hisVer);
    886             } catch (NumberFormatException nfe) { continue; }
    887             int howOld = minor - hisMinor;
    888             if (howOld < 3)
    889                 continue;
    890             addPoints(points, h, howOld * VERSION_FACTOR, howOld + " versions behind: " + DataHelper.escapeHTML(hisFullVer));
    891         }
    892     }
    893 
    894     /**
    895      *  @param out null for background analysis
    896      *  @param buf null for background analysis
     681            //}
     682        }
     683        if (!found)
     684            buf.append("<p class=\"notfound\">None</p>");
     685        buf.append("</div>");
     686        writeBuf(out, buf);
     687    }
     688
     689    /**
     690     *  Render routers closer than MIN_CLOSE up to MAX routers
     691     *  @param ris sorted, closest first
    897692     *  @param usName HTML escaped
    898693     */
    899     private void renderRouterInfoHTML(Writer out, StringBuilder buf, Hash us, String usName, double avgMinDist,
    900                                       List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
    901         Collections.sort(ris, new RouterInfoRoutingKeyComparator(us));
     694    private void renderRouterInfoHTML(Writer out, StringBuilder buf, Hash us, double avgMinDist,
     695                                      List<RouterInfo> ris) throws IOException {
    902696        double min = 256;
    903697        double max = 0;
     
    909703        for (int i = 0; i < count; i++) {
    910704            RouterInfo ri = ris.get(i);
    911             double dist;
    912             if (buf != null) {
    913                 dist = renderRouterInfo(buf, ri, us, false, false);
    914             } else {
    915                 BigInteger bidist = HashDistance.getDistance(us, ri.getHash());
    916                 dist = biLog2(bidist);
    917             }
    918             if (buf != null && dist < avgMinDist) {
     705            double dist = renderRouterInfo(buf, ri, us, false, false);
     706            if (dist < MIN_CLOSE)
     707                break;
     708            if (dist < avgMinDist) {
    919709                if (i == 0) {
    920710                    //buf.append("<p><b>Not to worry, but above router is closer than average minimum distance " + fmt.format(avgMinDist) + "</b></p>");
     
    937727            else if (i == medIdx + 1 && isEven)
    938728                median = (median + dist) / 2;
    939             double point = MIN_CLOSE - dist;
    940             if (point > 0) {
    941                 point *= OUR_KEY_FACTOR;
    942                 addPoints(points, ri.getHash(), point, "Very close (" + fmt.format(dist) + ") to our key " + usName + ": " + us.toBase64());
    943             }
    944             if (i >= MAX - 1)
    945                 break;
    946         }
    947         if (buf != null) {
    948             double avg = tot / count;
    949             buf.append("<p id=\"sybil_totals\"><b>Totals for " + count + " floodfills: &nbsp;</b><span class=\"netdb_name\">MIN:</span > " + fmt.format(min) + "&nbsp; <span class=\"netdb_name\">AVG:</span> " +
    950                 fmt.format(avg) + "&nbsp; <span class=\"netdb_name\">MEDIAN:</span> " + fmt.format(median) + "&nbsp; <span class=\"netdb_name\">MAX:</span> " + fmt.format(max) + "</p>\n");
    951             out.write(buf.toString());
    952             out.flush();
    953             buf.setLength(0);
    954         }
    955     }
    956 
    957     /**
    958      * For debugging
    959      * http://forums.sun.com/thread.jspa?threadID=597652
    960      * @since 0.7.14
    961      */
    962     private static double biLog2(BigInteger a) {
    963         return NetDbRenderer.biLog2(a);
     729        }
     730        double avg = tot / count;
     731        buf.append("<p id=\"sybil_totals\"><b>Totals for " + count +
     732                   " floodfills: &nbsp;</b><span class=\"netdb_name\">MIN:</span > " + fmt.format(min) +
     733                   "&nbsp; <span class=\"netdb_name\">AVG:</span> " + fmt.format(avg) +
     734                   "&nbsp; <span class=\"netdb_name\">MEDIAN:</span> " + fmt.format(median) +
     735                   "&nbsp; <span class=\"netdb_name\">MAX:</span> " + fmt.format(max) +
     736                   "</p>\n");
     737        writeBuf(out, buf);
     738    }
     739
     740    private static void writeBuf(Writer out, StringBuilder buf) throws IOException {
     741        out.write(buf.toString());
     742        out.flush();
     743        buf.setLength(0);
    964744    }
    965745
     
    984764    private double renderRouterInfo(StringBuilder buf, RouterInfo info, Hash us, boolean isUs, boolean full) {
    985765        String hash = info.getIdentity().getHash().toBase64();
    986         buf.append("<a name=\"").append(hash.substring(0, 6)).append("\"></a><table class=\"sybil_routerinfo\"><tr>");
     766        buf.append("<a name=\"").append(hash, 0, 6).append("\"></a><table class=\"sybil_routerinfo\"><tr>");
    987767        double distance = 0;
    988768        if (isUs) {
     
    1002782            if (!full) {
    1003783                buf.append("<a title=\"View extended router info\" class=\"viewfullentry\" href=\"netdb?r=")
    1004                    .append(hash.substring(0, 6)).append("\" >[").append(_t("Full entry")).append("]</a></th><th>");
     784                   .append(hash, 0, 6).append("\" >[").append(_t("Full entry")).append("]</a>");
     785                buf.append("<a title=\"View profile data\" class=\"viewfullentry\" href=\"viewprofile?peer=")
     786                   .append(hash).append("\" >[").append(_t("profile")).append("]</a>");
     787                buf.append("<a title=\"").append(_t("Configure peer")).append("\" class=\"viewfullentry\" href=\"configpeer?peer=")
     788                   .append(hash).append("\" >+-</a></th><th>");
    1005789            }
    1006790            if (_context.portMapper().isRegistered("imagegen"))
     
    1013797            }
    1014798        }
    1015         buf.append("<p><b>Version:</b> ").append(DataHelper.stripHTML(info.getVersion())).append("</p>\n" +
    1016                    "<p><b>Caps:</b> ").append(DataHelper.stripHTML(info.getCapabilities())).append("</p>\n");
     799        buf.append("<p><b>").append(_t("Version")).append(":</b> ").append(DataHelper.stripHTML(info.getVersion())).append("</p>\n" +
     800                   "<p><b>").append(_t("Caps")).append(":</b> ").append(DataHelper.stripHTML(info.getCapabilities())).append("</p>\n");
    1017801        String kr = info.getOption("netdb.knownRouters");
    1018802;
     
    1024808        String kls = info.getOption("netdb.knownLeaseSets");
    1025809        if (kls != null) {
    1026             buf.append("<p class=\"sybilinfo_leasesets\"><b>Lease Sets:</b> ").append(DataHelper.stripHTML(kls)).append("</p>\n");
     810            buf.append("<p class=\"sybilinfo_leasesets\"><b>").append(_t("LeaseSets")).append(":</b> ").append(DataHelper.stripHTML(kls)).append("</p>\n");
    1027811        } else {
    1028             buf.append("<p class=\"sybilinfo_leasesets filler\"><b>Lease Sets:</b> ").append(_t("n/a")).append("</p>");
     812            buf.append("<p class=\"sybilinfo_leasesets filler\"><b>").append(_t("LeaseSets")).append(":</b> ").append(_t("n/a")).append("</p>");
    1029813        }
    1030814        String fam = info.getOption("family");
    1031815        if (fam != null) {
    1032             buf.append("<p><b>Family:</b> <span class=\"sybilinfo_familyname\">").append(DataHelper.escapeHTML(fam)).append("</span></p>\n");
     816            buf.append("<p><b>").append(_t("Family")).append(":</b> <span class=\"sybilinfo_familyname\">").append(DataHelper.escapeHTML(fam)).append("</span></p>\n");
    1033817        }
    1034818        long now = _context.clock().now();
     
    1046830                if (heard > 0) {
    1047831                    long age = Math.max(now - heard, 1);
    1048                     buf.append("<p><b>Last heard about:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
     832                    buf.append("<p><b>").append(_t("Last Heard About")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
    1049833                } else {
    1050                     buf.append("<p class=\"sybil_filler\"><b>Last heard about:</b> ").append(_t("n/a")).append("</p>");
     834                    buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Heard About")).append(":</b> ").append(_t("n/a")).append("</p>");
    1051835                }
    1052836                heard = prof.getLastHeardFrom();
    1053837                if (heard > 0) {
    1054838                    long age = Math.max(now - heard, 1);
    1055                     buf.append("<p><b>Last heard from:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>\n");
     839                    buf.append("<p><b>").append(_t("Last Heard From")).append("</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>\n");
    1056840                } else {
    1057                     buf.append("<p class=\"sybil_filler\"><b>Last heard from:</b> ").append(_t("n/a")).append("</p>");
     841                    buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Heard From")).append(":</b> ").append(_t("n/a")).append("</p>");
    1058842                }
    1059843                DBHistory dbh = prof.getDBHistory();
     
    1062846                    if (heard > 0) {
    1063847                        long age = Math.max(now - heard, 1);
    1064                         buf.append("<p><b>Last lookup successful:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
     848                        buf.append("<p><b>").append(_t("Last Good Lookup")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
    1065849                    } else {
    1066                         buf.append("<p class=\"sybil_filler\"><b>Last lookup successful:</b> ").append(_t("n/a")).append("</p>");
     850                        buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Good Lookup")).append(":</b> ").append(_t("n/a")).append("</p>");
    1067851                    }
    1068852                    heard = dbh.getLastLookupFailed();
    1069853                    if (heard > 0) {
    1070854                        long age = Math.max(now - heard, 1);
    1071                         buf.append("<p><b>Last lookup failed:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
     855                        buf.append("<p><b>").append(_t("Last Bad Lookup")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
    1072856                    } else {
    1073                         buf.append("<p class=\"sybil_filler\"><b>Last lookup failed:</b> ").append(_t("n/a")).append("</p>");
     857                        buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Bad Lookup")).append(":</b> ").append(_t("n/a")).append("</p>");
    1074858                    }
    1075859                    heard = dbh.getLastStoreSuccessful();
    1076860                    if (heard > 0) {
    1077861                        long age = Math.max(now - heard, 1);
    1078                         buf.append("<p><b>Last store successful:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
     862                        buf.append("<p><b>").append(_t("Last Good Store")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
    1079863                    } else {
    1080                         buf.append("<p class=\"sybil_filler\"><b>Last store successful:</b> ").append(_t("n/a")).append("</p>");
     864                        buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Good Store")).append(":</b> ").append(_t("n/a")).append("</p>");
    1081865                    }
    1082866                    heard = dbh.getLastStoreFailed();
    1083867                    if (heard > 0) {
    1084868                        long age = Math.max(now - heard, 1);
    1085                         buf.append("<p><b>Last store failed:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
     869                        buf.append("<p><b>").append(_t("Last Bad Store")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
    1086870                    } else {
    1087                         buf.append("<p class=\"sybil_filler\"><b>Last store failed:</b> ").append(_t("n/a")).append("</p>");
     871                        buf.append("<p class=\"sybil_filler\"><b>").append(_t("Last Bad Store")).append(":</b> ").append(_t("n/a")).append("</p>");
    1088872                    }
    1089873                }
     
    1169953        prev = null;
    1170954        final int limit = Math.min(10, sybils.size());
     955        DateFormat dfmt = DateFormat.getDateInstance(DateFormat.MEDIUM);
    1171956        for (int i = start; i <= days; i++) {
    1172             out.write("<h3 class=\"tabletitle\">Distance for " + new Date(now) +
     957            out.write("<h3 class=\"tabletitle\">Distance for " + dfmt.format(new Date(now)) +
    1173958                      "</h3><table class=\"sybil_distance\"><tr><th>Hash<th>Distance<th>Distance from previous</tr>\n");
    1174959            Hash rkey = rkgen.getRoutingKey(from, now);
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/WizardHandler.java

    rd4caafb5 r47beb82  
    2929    @Override
    3030    protected void processForm() {
    31         if (_action == null)
    32             return;
    3331        if (getJettyString("cancelbw") != null) {
    3432            cancelNDT();
  • apps/routerconsole/jsp/configi2cp.jsp

    rd4caafb5 r47beb82  
    4444<label><input type="radio" class="optbox" name="mode" value="2" <%=clientshelper.i2cpModeChecked(2) %> >
    4545<%=intl._t("Enabled with SSL required")%></label><br>
    46 <label><input type="radio" class="optbox" name="mode" value="0" <%=clientshelper.i2cpModeChecked(0) %> >
     46<%
     47    // returns nonempty string if disabled
     48    String disableChecked = clientshelper.i2cpModeChecked(0);
     49    boolean isDisabled = disableChecked.length() > 0;
     50%>
     51<label><input type="radio" class="optbox" name="mode" value="0" <%=disableChecked%> >
    4752<%=intl._t("Disabled - Clients outside this Java process may not connect")%></label><br>
    4853</td></tr>
     54<%
     55    if (!isDisabled) {
     56%>
    4957<tr><td>
    5058<b><%=intl._t("I2CP Interface")%>:</b>
     
    7886<input name="nofilter_pw" type="password" value="" />
    7987</td></tr>
     88<%
     89    } // !isDisabled
     90%>
    8091<tr><td class="optionsave" align="right">
    8192<input type="submit" class="default" name="action" value="<%=intl._t("Save Interface Configuration")%>" />
  • apps/routerconsole/jsp/index.jsp

    rd4caafb5 r47beb82  
    3636    } else {
    3737        String version = net.i2p.CoreVersion.VERSION;
    38         if (version.equals("0.9.37")) {
    39             // dev builds, force everyone to run it once for testing
    40             tgt = "welcome";
    41         } else if (version.equals(firstVersion)) {
     38        if (version.equals(firstVersion)) {
    4239            // first install 38 or later, still on same version
    4340            tgt = "welcome";
  • apps/routerconsole/jsp/netdb.jsp

    rd4caafb5 r47beb82  
    1313<h1><%=intl._t("I2P Network Database")%></h1>
    1414<div class="main" id="netdb">
    15  <jsp:useBean class="net.i2p.router.web.helpers.NetDbHelper" id="netdbHelper" scope="request" />
    16  <jsp:setProperty name="netdbHelper" property="contextId" value="<%=i2pcontextId%>" />
     15 <jsp:useBean class="net.i2p.router.web.helpers.NetDbHelper" id="formhandler" scope="request" />
    1716<%
    18     netdbHelper.storeWriter(out);
     17    formhandler.storeWriter(out);
    1918    if (allowIFrame)
    20         netdbHelper.allowGraphical();
     19        formhandler.allowGraphical();
    2120%>
    22  <jsp:setProperty name="netdbHelper" property="full" value="<%=request.getParameter(\"f\")%>" />
    23  <jsp:setProperty name="netdbHelper" property="router" value="<%=request.getParameter(\"r\")%>" />
    24  <jsp:setProperty name="netdbHelper" property="lease" value="<%=request.getParameter(\"l\")%>" />
    25  <jsp:setProperty name="netdbHelper" property="version" value="<%=request.getParameter(\"v\")%>" />
    26  <jsp:setProperty name="netdbHelper" property="country" value="<%=request.getParameter(\"c\")%>" />
    27  <jsp:setProperty name="netdbHelper" property="family" value="<%=request.getParameter(\"fam\")%>" />
    28  <jsp:setProperty name="netdbHelper" property="caps" value="<%=request.getParameter(\"caps\")%>" />
    29  <jsp:setProperty name="netdbHelper" property="ip" value="<%=request.getParameter(\"ip\")%>" />
    30  <jsp:setProperty name="netdbHelper" property="sybil" value="<%=request.getParameter(\"sybil\")%>" />
    31  <jsp:setProperty name="netdbHelper" property="sybil2" value="<%=request.getParameter(\"sybil2\")%>" />
    32  <jsp:setProperty name="netdbHelper" property="port" value="<%=request.getParameter(\"port\")%>" />
    33  <jsp:setProperty name="netdbHelper" property="type" value="<%=request.getParameter(\"type\")%>" />
    34  <jsp:setProperty name="netdbHelper" property="ipv6" value="<%=request.getParameter(\"ipv6\")%>" />
    35  <jsp:setProperty name="netdbHelper" property="cost" value="<%=request.getParameter(\"cost\")%>" />
    36  <jsp:setProperty name="netdbHelper" property="mtu" value="<%=request.getParameter(\"mtu\")%>" />
    37  <jsp:setProperty name="netdbHelper" property="ssucaps" value="<%=request.getParameter(\"ssucaps\")%>" />
    38  <jsp:setProperty name="netdbHelper" property="transport" value="<%=request.getParameter(\"tr\")%>" />
    39  <jsp:setProperty name="netdbHelper" property="limit" value="<%=request.getParameter(\"ps\")%>" />
    40  <jsp:setProperty name="netdbHelper" property="page" value="<%=request.getParameter(\"pg\")%>" />
    41  <jsp:getProperty name="netdbHelper" property="netDbSummary" />
     21 <jsp:setProperty name="formhandler" property="full" value="<%=request.getParameter(\"f\")%>" />
     22 <jsp:setProperty name="formhandler" property="router" value="<%=request.getParameter(\"r\")%>" />
     23 <jsp:setProperty name="formhandler" property="lease" value="<%=request.getParameter(\"l\")%>" />
     24 <jsp:setProperty name="formhandler" property="version" value="<%=request.getParameter(\"v\")%>" />
     25 <jsp:setProperty name="formhandler" property="country" value="<%=request.getParameter(\"c\")%>" />
     26 <jsp:setProperty name="formhandler" property="family" value="<%=request.getParameter(\"fam\")%>" />
     27 <jsp:setProperty name="formhandler" property="caps" value="<%=request.getParameter(\"caps\")%>" />
     28 <jsp:setProperty name="formhandler" property="ip" value="<%=request.getParameter(\"ip\")%>" />
     29 <jsp:setProperty name="formhandler" property="sybil" value="<%=request.getParameter(\"sybil\")%>" />
     30 <jsp:setProperty name="formhandler" property="sybil2" value="<%=request.getParameter(\"sybil2\")%>" />
     31 <jsp:setProperty name="formhandler" property="port" value="<%=request.getParameter(\"port\")%>" />
     32 <jsp:setProperty name="formhandler" property="type" value="<%=request.getParameter(\"type\")%>" />
     33 <jsp:setProperty name="formhandler" property="ipv6" value="<%=request.getParameter(\"ipv6\")%>" />
     34 <jsp:setProperty name="formhandler" property="cost" value="<%=request.getParameter(\"cost\")%>" />
     35 <jsp:setProperty name="formhandler" property="mtu" value="<%=request.getParameter(\"mtu\")%>" />
     36 <jsp:setProperty name="formhandler" property="ssucaps" value="<%=request.getParameter(\"ssucaps\")%>" />
     37 <jsp:setProperty name="formhandler" property="transport" value="<%=request.getParameter(\"tr\")%>" />
     38 <jsp:setProperty name="formhandler" property="limit" value="<%=request.getParameter(\"ps\")%>" />
     39 <jsp:setProperty name="formhandler" property="page" value="<%=request.getParameter(\"pg\")%>" />
     40 <jsp:setProperty name="formhandler" property="mode" value="<%=request.getParameter(\"m\")%>" />
     41 <jsp:setProperty name="formhandler" property="date" value="<%=request.getParameter(\"date\")%>" />
     42<%@include file="formhandler.jsi" %>
     43 <jsp:getProperty name="formhandler" property="netDbSummary" />
    4244</div></body></html>
  • apps/routerconsole/jsp/welcome.jsp

    rd4caafb5 r47beb82  
    124124%>
    125125<h3><%=intl._t("Why I2P?")%></h3>
    126 <p>TODO</p>
     126<table class="configtable"><tr><td>
     127<%=intl._t("I2P is a communication tool for people who value privacy and wish to remain anonymous online.")%>
     128<%=intl._t("I2P is a peer to peer network where you can browse and create hidden services.")%>
     129</td></tr></table>
    127130<%
    128131
     
    131134%>
    132135<h3><%=intl._t("Bandwidth Test")%></h3>
     136<table class="configtable"><tr><td>
    133137<p>
    134138<%=intl._t("I2P will now test your internet connection to identify the optimal speed settings.")%>
    135 <%=intl._t("Applying these settings will maximize your download speed using the third-party M-Lab service.")%>
    136 <%=intl._t("M-Lab collects and publishes the IP address of the client that conducted the measurement.")%>
    137 <%=intl._t("FIXME! This is necessary to understand and describe experimental results, including to identify which Internet service provider the test was conducted from.")%>
     139<%=intl._t("Bandwidth participation improves the anonymity level of all users on the network and maximizes your download speed.")%>
     140<%=intl._t("This is done using the third-party M-Lab service.")%>
     141</p><p>
    138142<%=intl._t("Please review the M-Lab privacy policies linked below.")%>
    139143<%=intl._t("If you do not wish to run the M-Lab bandwidth test, you may skip it by clicking the button below.")%>
     
    142146<br><a href="https://github.com/m-lab/mlab-ns/blob/master/MLAB-NS_PRIVACY_POLICY.md" target="_blank"><%=intl._t("M-Lab Name Server Privacy Policy")%></a>
    143147</p>
    144 
    145 
     148</td></tr></table>
    146149<%
    147150
     
    232235%>
    233236<h3><%=intl._t("Browser Setup")%></h3>
    234 <p>TODO</p>
     237<table class="configtable"><tr><td><p>
     238<%=intl._t("Your browser needs to be configured to work with I2P.")%>
     239<a href="https://geti2p.net/htproxyports" target="_blank"><%=intl._t("If you want to do this yourself, here are instructions.")%></a>
     240<%
     241        if (net.i2p.util.SystemVersion.isWindows()) {
     242%>
     243</p><p>
     244<%=intl._t("Otherwise, the recommended way to browse I2P websites is with a separate profile in the Firefox browser.")%>
     245<ol><li><a href="https://www.mozilla.org/firefox/" target="_blank"><%=intl._t("Install Firefox")%></a>
     246</li><li><a href="https://geti2p.net/download#windows" target="_blank"><%=intl._t("Install the I2P Firefox profile")%></a>
     247</li></ol>
     248<%
     249        } //isWindows()
     250%>
     251</p></td></tr></table>
    235252<%
    236253
     
    238255        // Done
    239256%>
    240 <h3><%=intl._t("Finished")%></h3>
    241 <p>TODO</p>
    242 <%
    243 
    244     } else {
    245 %>
    246 <p>unknown wizard page</p>
     257<h3><%=intl._t("Welcome to I2P!")%></h3>
     258<table class="configtable"><tr><td>
     259<p>
     260<%=intl._t("When you start I2P, it may take a few minutes to bootstrap (integrate) your router into the network and find additional peers, so please be patient.")%>
     261</p><p>
     262<%=intl._t("When I2P starts up, and during normal operation, I2P's tunnel build readiness indicator in the side panel may indicate that I2P is \"Rejecting Tunnels\"; this is normal behavior.")%>
     263<%=intl._t("Once green stars are indicated next to your Local Tunnels, there is a wide variety of things you can do with I2P.")%>
     264</p>
     265</td></tr></table>
     266<%
     267
     268    } else {
     269%>
     270<table class="configtable"><tr><td>unknown wizard page</td></tr></table>
    247271<%
    248272    }
     
    253277    if (ipg != 1) {
    254278%>
    255 <input type="submit" class="go" name="prev" value="<%=intl._t("Previous")%>" >
     279<input type="submit" class="back" name="prev" value="<%=intl._t("Previous")%>" >
    256280<%
    257281    }
     
    274298    } else {
    275299%>
    276 <input type="submit" class="go" name="done" value="<%=intl._t("Finished")%>" >
     300<input type="submit" class="accept" name="done" value="<%=intl._t("Finished")%>" >
    277301<%
    278302    }
  • apps/routerconsole/locale/messages_en.po

    rd4caafb5 r47beb82  
    99"Project-Id-Version: I2P routerconsole\n"
    1010"Report-Msgid-Bugs-To: \n"
    11 "POT-Creation-Date: 2018-08-08 18:48+0000\n"
     11"POT-Creation-Date: 2019-01-09 18:53+0000\n"
    1212"PO-Revision-Date: 2010-06-15 14:09+0100\n"
    1313"Last-Translator: duck <duck@mail.i2p>\n"
     
    2727#. If you want the digit separator in your locale, translate as {0}.
    2828#. alternates: msec, msecs
    29 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1448
    30 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1501
     29#: ../../../core/java/src/net/i2p/data/DataHelper.java:1372
     30#: ../../../core/java/src/net/i2p/data/DataHelper.java:1425
    3131#, java-format
    3232msgid "1 ms"
     
    3737#. seconds
    3838#. alternates: secs, sec. 'seconds' is probably too long.
    39 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1452
    40 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1503
     39#: ../../../core/java/src/net/i2p/data/DataHelper.java:1376
     40#: ../../../core/java/src/net/i2p/data/DataHelper.java:1427
    4141#, java-format
    4242msgid "1 sec"
     
    4747#. minutes
    4848#. alternates: mins, min. 'minutes' is probably too long.
    49 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1456
    50 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1505
     49#: ../../../core/java/src/net/i2p/data/DataHelper.java:1380
     50#: ../../../core/java/src/net/i2p/data/DataHelper.java:1429
    5151#, java-format
    5252msgid "1 min"
     
    5757#. hours
    5858#. alternates: hrs, hr., hrs.
    59 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1460
    60 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1507
     59#: ../../../core/java/src/net/i2p/data/DataHelper.java:1384
     60#: ../../../core/java/src/net/i2p/data/DataHelper.java:1431
    6161#, java-format
    6262msgid "1 hour"
     
    6666
    6767#. days
    68 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1463
    69 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1510
     68#: ../../../core/java/src/net/i2p/data/DataHelper.java:1387
     69#: ../../../core/java/src/net/i2p/data/DataHelper.java:1434
    7070#, java-format
    7171msgid "1 day"
     
    7575
    7676#. years
    77 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1466
    78 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1513
     77#: ../../../core/java/src/net/i2p/data/DataHelper.java:1390
     78#: ../../../core/java/src/net/i2p/data/DataHelper.java:1437
    7979#, java-format
    8080msgid "1 year"
     
    8383msgstr[1] ""
    8484
    85 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1468
    86 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1515
    87 #: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:418
    88 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:833
    89 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:839
    90 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:854
    91 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:861
    92 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:868
    93 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:877
    94 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:884
    95 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:891
    96 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:898
     85#: ../../../core/java/src/net/i2p/data/DataHelper.java:1392
     86#: ../../../core/java/src/net/i2p/data/DataHelper.java:1439
     87#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:416
     88#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:806
     89#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:812
     90#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:827
     91#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:834
     92#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:841
     93#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:850
     94#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:857
     95#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:864
     96#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:871
    9797msgid "n/a"
    9898msgstr ""
    9999
    100 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1497
     100#: ../../../core/java/src/net/i2p/data/DataHelper.java:1421
    101101#, java-format
    102102msgid "1 ns"
     
    105105msgstr[1] ""
    106106
    107 #: ../../../core/java/src/net/i2p/data/DataHelper.java:1499
     107#: ../../../core/java/src/net/i2p/data/DataHelper.java:1423
    108108#, java-format
    109109msgid "1 μs"
     
    145145#: ../java/src/net/i2p/router/web/helpers/CertHelper.java:94
    146146#: ../java/src/net/i2p/router/web/helpers/CertHelper.java:124
    147 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:837
    148 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:1005
     147#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:865
     148#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:146
     149#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:1012
    149150#: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:612
    150151#: ../java/src/net/i2p/router/web/helpers/TunnelRenderer.java:179
     
    168169
    169170#. * IPv4 OK, IPv6 OK or disabled or no address
    170 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:343
     171#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:350
    171172#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:193
    172 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:459
    173 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:458
    174 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:458
    175 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:458
    176 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:484
     173#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:457
     174#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:456
     175#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:456
     176#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:456
     177#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:482
    177178msgid "OK"
    178179msgstr ""
    179180
    180 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:344
     181#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:351
    181182msgid "IPv4: OK; IPv6: Testing"
    182183msgstr ""
    183184
    184 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:345
     185#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:352
    185186msgid "IPv4: OK; IPv6: Firewalled"
    186187msgstr ""
    187188
    188 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:346
     189#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:353
    189190msgid "IPv4: Testing; IPv6: OK"
    190191msgstr ""
    191192
    192 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:347
     193#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:354
    193194msgid "IPv4: Firewalled; IPv6: OK"
    194195msgstr ""
    195196
    196 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:348
     197#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:355
    197198msgid "IPv4: Disabled; IPv6: OK"
    198199msgstr ""
    199200
    200 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:349
     201#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:356
    201202msgid "IPv4: Symmetric NAT; IPv6: OK"
    202203msgstr ""
    203204
    204205#. * IPv4 symmetric NAT, IPv6 firewalled or disabled or no address
    205 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:351
     206#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:358
    206207msgid "Symmetric NAT"
    207208msgstr ""
    208209
    209 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:352
     210#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:359
    210211msgid "IPv4: Symmetric NAT; IPv6: Testing"
    211212msgstr ""
    212213
    213 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:353
     214#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:360
    214215msgid "IPv4: Firewalled; IPv6: Testing"
    215216msgstr ""
    216217
    217218#. * IPv4 firewalled, IPv6 firewalled or disabled or no address
    218 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:355
    219 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:463
    220 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:462
    221 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:462
    222 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:462
    223 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:488
     219#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:362
     220#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:461
     221#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:460
     222#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:460
     223#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:460
     224#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:486
    224225msgid "Firewalled"
    225226msgstr ""
    226227
    227 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:356
     228#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:363
    228229msgid "IPv4: Testing; IPv6: Firewalled"
    229230msgstr ""
    230231
    231 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:357
     232#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:364
    232233msgid "IPv4: Disabled; IPv6: Testing"
    233234msgstr ""
    234235
    235 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:358
     236#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:365
    236237msgid "IPv4: Disabled; IPv6: Firewalled"
    237238msgstr ""
    238239
    239 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:359
     240#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:366
    240241msgid "Disconnected"
    241242msgstr ""
    242243
    243 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:360
     244#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:367
    244245msgid "Port Conflict"
    245246msgstr ""
    246247
    247 #: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:361
     248#: ../../../router/java/src/net/i2p/router/CommSystemFacade.java:368
    248249#: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:237
    249 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:479
    250 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:478
    251 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:478
    252 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:478
    253 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:504
     250#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:477
     251#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:476
     252#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:476
     253#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:476
     254#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:502
    254255msgid "Testing"
    255256msgstr ""
     
    311312msgstr ""
    312313
    313 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:234
     314#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:231
    314315#, java-format
    315316msgid "Reseeding: got router info from file ({0} successful, {1} errors)."
    316317msgstr ""
    317318
    318 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:339
     319#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:336
    319320#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:34
    320321msgid "Reseeding"
    321322msgstr ""
    322323
    323 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:354
     324#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:351
    324325#, java-format
    325326msgid "Reseed successful, fetched {0} router info"
     
    328329msgstr[1] ""
    329330
    330 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:360
     331#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:357
    331332#, java-format
    332333msgid "Reseed fetched only 1 router."
     
    335336msgstr[1] ""
    336337
    337 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:384
     338#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:381
    338339msgid "Reseed failed."
    339340msgstr ""
    340341
    341 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:385
     342#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:382
    342343#, java-format
    343344msgid "See {0} for help."
    344345msgstr ""
    345346
    346 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:386
     347#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:383
    347348msgid "reseed configuration page"
    348349msgstr ""
    349350
    350 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:641
    351 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:775
     351#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:638
     352#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:772
    352353msgid "Reseeding: fetching seed URL."
    353354msgstr ""
    354355
    355 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:700
    356 #: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:814
     356#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:697
     357#: ../../../router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java:811
    357358#, java-format
    358359msgid ""
     
    395396msgstr ""
    396397
    397 #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:547
     398#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:557
    398399#: ../java/src/net/i2p/router/web/helpers/ConfigNetHelper.java:59
    399400#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:150
     
    401402msgstr ""
    402403
    403 #: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:551
     404#: ../../../router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java:561
    404405msgid "NetDb entry"
    405406msgstr ""
     
    410411msgstr ""
    411412
    412 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:729
     413#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:740
    413414msgid "Unsupported signature type"
    414415msgstr ""
    415416
    416 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:747
     417#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:758
    417418msgid "No support for our signature type"
    418419msgstr ""
    419420
    420 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:751
     421#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:762
    421422msgid "Unreachable on any transport"
    422423msgstr ""
    423424
    424 #: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:812
     425#: ../../../router/java/src/net/i2p/router/transport/TransportManager.java:823
    425426#: ../../../router/java/src/net/i2p/router/transport/UPnPManager.java:304
    426427msgid "UPnP is not enabled"
     
    440441#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:739
    441442#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:758
    442 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:72
    443 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:185
    444 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:346
     443#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:105
     444#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:270
     445#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:432
    445446#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:101
    446447msgid "Status"
     
    469470#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:723
    470471#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:741
    471 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:449
    472 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:475
    473 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:509
     472#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:455
     473#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:481
     474#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:515
    474475msgid "Uptime"
    475476msgstr ""
     
    505506
    506507#: ../../../router/java/src/net/i2p/router/transport/UPnP.java:807
    507 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:557
     508#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:39
     509#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:541
    508510msgid "UPnP Status"
    509511msgstr ""
     
    587589#: ../../../router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java:1140
    588590msgid "Dropping tunnel requests: Queue time"
     591msgstr ""
     592
     593#: ../java/src/net/i2p/router/sybil/Analysis.java:652
     594#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:846
     595#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:851
     596#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:825
     597#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:832
     598#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:839
     599#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:848
     600#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:855
     601#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:862
     602#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:869
     603#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:880
     604#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:882
     605#, java-format
     606msgid "{0} ago"
    589607msgstr ""
    590608
     
    632650
    633651#: ../java/src/net/i2p/router/update/ConsoleUpdateManager.java:1400
    634 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:200
    635 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:317
     652#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:201
     653#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:318
    636654#, java-format
    637655msgid "from {0}"
     
    651669#: ../java/src/net/i2p/router/update/DevSU3UpdateRunner.java:40
    652670#: ../java/src/net/i2p/router/update/PluginUpdateChecker.java:55
    653 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:110
     671#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:111
    654672#: ../java/src/net/i2p/router/update/UnsignedUpdateChecker.java:64
    655673#: ../java/src/net/i2p/router/update/UnsignedUpdateRunner.java:41
    656674#: ../java/src/net/i2p/router/update/UpdateRunner.java:155
    657 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:179
    658 #: ../java/src/net/i2p/router/web/PluginStarter.java:178
     675#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:177
     676#: ../java/src/net/i2p/router/web/PluginStarter.java:195
    659677#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:582
    660678msgid "HTTP client proxy tunnel must be running"
     
    701719msgstr ""
    702720
    703 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:89
     721#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:90
    704722#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:524
    705723#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:529
     
    710728msgstr ""
    711729
    712 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:94
     730#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:95
    713731#, java-format
    714732msgid "Attempting to install from file {0}"
    715733msgstr ""
    716734
    717 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:97
     735#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:98
    718736#, java-format
    719737msgid "Failed to install from file {0}, copy failed."
    720738msgstr ""
    721739
    722 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:117
     740#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:118
    723741#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:539
    724742#, java-format
     
    726744msgstr ""
    727745
    728 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:143
     746#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:144
    729747msgid "Downloading plugin"
    730748msgstr ""
    731749
    732 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:150
     750#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:151
    733751msgid "Plugin downloaded"
    734752msgstr ""
    735753
    736 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:155
    737 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:524
     754#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:156
     755#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:534
    738756#, java-format
    739757msgid "Cannot create plugin directory {0}"
     
    741759
    742760#. updateStatus("<b>" + "Plugin contains an invalid key" + ' ' + pubkey + ' ' + signer + "</b>");
    743 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:216
    744 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:225
    745 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:329
     761#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:217
     762#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:226
     763#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:330
    746764#, java-format
    747765msgid "Plugin from {0} contains an invalid key"
    748766msgstr ""
    749767
    750 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:258
    751 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:268
    752 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:282
    753 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:340
     768#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:259
     769#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:269
     770#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:283
     771#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:341
    754772#, java-format
    755773msgid "Plugin signature verification of {0} failed"
     
    757775
    758776#. don't display signer, we're really checking the key not the signer name
    759 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:291
     777#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:292
    760778msgid "Plugin not installed - signer is untrusted"
    761779msgstr ""
    762780
    763 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:356
     781#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:357
    764782#, java-format
    765783msgid "Plugin from {0} is corrupt"
    766784msgstr ""
    767785
    768 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:366
     786#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:367
    769787#, java-format
    770788msgid "Plugin from {0} does not contain the required configuration file"
    771789msgstr ""
    772790
    773 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:388
     791#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:389
    774792#, java-format
    775793msgid "Plugin from {0} has invalid name or version"
    776794msgstr ""
    777795
    778 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:393
     796#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:394
    779797#, java-format
    780798msgid "Plugin {0} has mismatched versions"
    781799msgstr ""
    782800
    783 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:404
    784 #: ../java/src/net/i2p/router/web/PluginStarter.java:329
     801#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:405
     802#: ../java/src/net/i2p/router/web/PluginStarter.java:346
    785803#, java-format
    786804msgid "This plugin requires I2P version {0} or higher"
    787805msgstr ""
    788806
    789 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:412
    790 #: ../java/src/net/i2p/router/web/PluginStarter.java:339
     807#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:413
     808#: ../java/src/net/i2p/router/web/PluginStarter.java:356
    791809#, java-format
    792810msgid "This plugin requires Java version {0} or higher"
    793811msgstr ""
    794812
    795 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:421
     813#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:422
    796814msgid ""
    797815"Downloaded plugin is for new installs only, but the plugin is already "
     
    799817msgstr ""
    800818
    801 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:431
     819#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:432
    802820msgid "Installed plugin does not contain the required configuration file"
    803821msgstr ""
    804822
    805 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:439
     823#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:440
    806824msgid "Signature of downloaded plugin does not match installed plugin"
    807825msgstr ""
    808826
    809 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:446
     827#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:447
    810828#, java-format
    811829msgid "Downloaded plugin version {0} is not newer than installed plugin"
    812830msgstr ""
    813831
    814 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:453
     832#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:454
    815833#, java-format
    816834msgid "Plugin update requires installed plugin version {0} or higher"
    817835msgstr ""
    818836
    819 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:460
     837#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:461
    820838#, java-format
    821839msgid "Plugin update requires installed plugin version {0} or lower"
    822840msgstr ""
    823841
    824 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:468
    825 #: ../java/src/net/i2p/router/web/PluginStarter.java:350
     842#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:469
     843#: ../java/src/net/i2p/router/web/PluginStarter.java:367
    826844#, java-format
    827845msgid "Plugin requires Jetty version {0} or higher"
    828846msgstr ""
    829847
    830 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:475
    831 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:482
    832 #: ../java/src/net/i2p/router/web/PluginStarter.java:361
    833 #: ../java/src/net/i2p/router/web/PluginStarter.java:371
     848#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:476
     849#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:492
     850#: ../java/src/net/i2p/router/web/PluginStarter.java:378
     851#: ../java/src/net/i2p/router/web/PluginStarter.java:400
    834852#, java-format
    835853msgid "Plugin requires Jetty version {0} or lower"
    836854msgstr ""
    837855
    838 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:491
     856#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:484
     857#: ../java/src/net/i2p/router/web/PluginStarter.java:389
     858#, java-format
     859msgid "Plugin requires Java version {0} or lower"
     860msgstr ""
     861
     862#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:501
    839863#, java-format
    840864msgid "Cannot copy plugin to directory {0}"
    841865msgstr ""
    842866
    843 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:501
     867#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:511
    844868msgid "Plugin will be installed on next restart."
    845869msgstr ""
    846870
    847 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:519
     871#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:529
    848872msgid "Plugin is for upgrades only, but the plugin is not installed"
    849873msgstr ""
    850874
    851 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:532
     875#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:542
    852876#, java-format
    853877msgid "Failed to install plugin in {0}"
    854878msgstr ""
    855879
    856 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:539
    857 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:567
     880#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:549
     881#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:577
    858882#, java-format
    859883msgid "Plugin {0} installed"
    860884msgstr ""
    861885
    862 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:558
     886#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:568
    863887#, java-format
    864888msgid "Plugin {0} installed and started"
    865889msgstr ""
    866890
    867 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:561
     891#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:571
    868892#, java-format
    869893msgid "Plugin {0} installed but failed to start, check logs"
    870894msgstr ""
    871895
    872 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:563
     896#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:573
    873897#, java-format
    874898msgid "Plugin {0} installed but failed to start"
    875899msgstr ""
    876900
    877 #: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:575
     901#: ../java/src/net/i2p/router/update/PluginUpdateRunner.java:585
    878902#, java-format
    879903msgid "Failed to download plugin from {0}"
     
    897921
    898922#: ../java/src/net/i2p/router/web/CSSHelper.java:174
    899 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:221
     923#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:222
    900924#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:46
    901925#: ../java/strings/Strings.java:29
     
    942966#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:295
    943967#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:297
    944 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:390
     968#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:388
    945969#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:297
    946970#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:299
     
    968992#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:274
    969993#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:276
    970 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:367
     994#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:355
    971995#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:318
    972996#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:320
     
    9771001#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:299
    9781002#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:301
    979 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:292
    980 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:294
     1003#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:293
     1004#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:295
    9811005#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/news_jsp.java:299
    9821006#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/news_jsp.java:301
     
    10061030msgstr ""
    10071031
    1008 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:233
    1009 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:537
     1032#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:231
     1033#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:521
    10101034msgid "Shutdown gracefully"
    10111035msgstr ""
    10121036
    1013 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:237
     1037#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:235
    10141038msgid "Graceful shutdown initiated"
    10151039msgstr ""
    10161040
    10171041#. Normal browsers send value, IE sends button label
    1018 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:238
    1019 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:242
     1042#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:236
     1043#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:240
    10201044#: ../java/src/net/i2p/router/web/helpers/ConfigRestartBean.java:37
    1021 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:539
     1045#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:523
    10221046msgid "Shutdown immediately"
    10231047msgstr ""
    10241048
     1049#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:241
     1050#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:527
     1051msgid "Cancel graceful shutdown"
     1052msgstr ""
     1053
    10251054#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:243
     1055msgid "Graceful shutdown cancelled"
     1056msgstr ""
     1057
     1058#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:244
    10261059#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:543
    1027 msgid "Cancel graceful shutdown"
    1028 msgstr ""
    1029 
    1030 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:245
    1031 msgid "Graceful shutdown cancelled"
    1032 msgstr ""
    1033 
    1034 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:246
    1035 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:559
    10361060msgid "Graceful restart"
    10371061msgstr ""
    10381062
    1039 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:251
     1063#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:249
    10401064msgid "Graceful restart requested"
    10411065msgstr ""
    10421066
    1043 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:252
    1044 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:561
     1067#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:250
     1068#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:545
    10451069msgid "Hard restart"
    10461070msgstr ""
    10471071
     1072#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:255
     1073msgid "Hard restart requested"
     1074msgstr ""
     1075
     1076#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:256
     1077msgid "Rekey and Restart"
     1078msgstr ""
     1079
    10481080#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:257
    1049 msgid "Hard restart requested"
    1050 msgstr ""
    1051 
    1052 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:258
    1053 msgid "Rekey and Restart"
    1054 msgstr ""
    1055 
    1056 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:259
    10571081msgid "Rekeying after graceful restart"
    10581082msgstr ""
    10591083
    1060 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:262
     1084#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:260
    10611085msgid "Rekey and Shutdown"
    10621086msgstr ""
    10631087
    1064 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:263
     1088#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:261
    10651089msgid "Rekeying after graceful shutdown"
    10661090msgstr ""
    10671091
     1092#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:264
     1093#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:579
     1094msgid "Run I2P on startup"
     1095msgstr ""
     1096
    10681097#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:266
    1069 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:595
    1070 msgid "Run I2P on startup"
     1098#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:581
     1099msgid "Don't run I2P on startup"
    10711100msgstr ""
    10721101
    10731102#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:268
    1074 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:597
    1075 msgid "Don't run I2P on startup"
    1076 msgstr ""
    1077 
    1078 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:270
    1079 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:623
     1103#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:607
    10801104msgid "Dump threads"
    10811105msgstr ""
    10821106
    1083 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:277
     1107#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:275
    10841108#, java-format
    10851109msgid "Threads dumped to {0}"
    10861110msgstr ""
    10871111
     1112#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:276
     1113#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:617
     1114msgid "View console on startup"
     1115msgstr ""
     1116
    10881117#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:278
    1089 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:633
    1090 msgid "View console on startup"
    1091 msgstr ""
    1092 
    1093 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:280
    10941118msgid "Console is to be shown on startup"
    10951119msgstr ""
    10961120
     1121#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:279
     1122#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:619
     1123msgid "Do not view console on startup"
     1124msgstr ""
     1125
    10971126#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:281
    1098 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:635
    1099 msgid "Do not view console on startup"
    1100 msgstr ""
    1101 
    1102 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:283
    11031127msgid "Console is not to be shown on startup"
    11041128msgstr ""
    11051129
     1130#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:282
     1131#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:603
     1132msgid "Force GC"
     1133msgstr ""
     1134
    11061135#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:284
    1107 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:619
    1108 msgid "Force GC"
    1109 msgstr ""
    1110 
    1111 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:286
    11121136msgid "Full garbage collection requested"
    11131137msgstr ""
    11141138
     1139#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:285
     1140#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:558
     1141msgid "Show systray icon"
     1142msgstr ""
     1143
    11151144#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:287
    1116 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:574
    1117 msgid "Show systray icon"
    1118 msgstr ""
    1119 
    1120 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:289
    1121 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:578
     1145#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:562
    11221146msgid "Hide systray icon"
    11231147msgstr ""
    11241148
     1149#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:328
     1150msgid "Service installed"
     1151msgstr ""
     1152
    11251153#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:330
    1126 msgid "Service installed"
    1127 msgstr ""
    1128 
    1129 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:332
    11301154msgid "Warning: unable to install the service"
    11311155msgstr ""
    11321156
     1157#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:337
     1158msgid "Service removed"
     1159msgstr ""
     1160
    11331161#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:339
    1134 msgid "Service removed"
    1135 msgstr ""
    1136 
    1137 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:341
    11381162msgid "Warning: unable to remove the service"
    11391163msgstr ""
    11401164
    1141 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:380
    1142 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:395
     1165#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:378
     1166#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:393
    11431167msgid "Enabled system tray"
    11441168msgstr ""
    11451169
    1146 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:385
     1170#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:383
    11471171msgid "Disabled system tray"
    11481172msgstr ""
    11491173
    1150 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:391
     1174#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:389
    11511175#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:640
    11521176#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:42
     
    11601184msgstr ""
    11611185
     1186#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:398
     1187msgid "Failed to start systray"
     1188msgstr ""
     1189
    11621190#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:400
    1163 msgid "Failed to start systray"
    1164 msgstr ""
    1165 
    1166 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:402
    11671191msgid "Failed to stop systray"
    11681192msgstr ""
    11691193
     1194#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:406
     1195#: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:93
     1196#: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:115
     1197#: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:416
     1198#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:71
     1199msgid "Configuration saved successfully"
     1200msgstr ""
     1201
    11701202#: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:408
    1171 #: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:93
    1172 #: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:116
    1173 #: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:416
    1174 msgid "Configuration saved successfully"
    1175 msgstr ""
    1176 
    1177 #: ../java/src/net/i2p/router/web/ConfigServiceHandler.java:410
    11781203#: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:95
    1179 #: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:118
     1204#: ../java/src/net/i2p/router/web/helpers/ConfigAdvancedHandler.java:117
    11801205#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:642
    11811206#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:44
     
    11851210#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:133
    11861211#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:187
     1212#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:73
    11871213msgid ""
    11881214"Error saving the configuration (applied but not saved) - please see the "
     
    11901216msgstr ""
    11911217
    1192 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:162
    1193 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:386
     1218#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:160
    11941219#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:387
    1195 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:527
     1220#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:388
     1221#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:525
    11961222msgid "Check for updates"
    11971223msgstr ""
    11981224
    1199 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:169
     1225#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:167
    12001226msgid "Update or check already in progress"
    12011227msgstr ""
    12021228
     1229#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:190
     1230msgid "Update available, attempting to download now"
     1231msgstr ""
     1232
    12031233#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:192
    1204 msgid "Update available, attempting to download now"
    1205 msgstr ""
    1206 
    1207 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:194
    12081234msgid "Update available, click button on left to download"
    12091235msgstr ""
    12101236
    1211 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:200
     1237#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:198
    12121238msgid "No update available"
    12131239msgstr ""
    12141240
    1215 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:204
    1216 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:26
    1217 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:29
    1218 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:546
    1219 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:550
    1220 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:609
     1241#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:202
     1242#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:25
     1243#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:28
     1244#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:530
     1245#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:534
     1246#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:607
    12211247msgid "Save"
    12221248msgstr ""
    12231249
    1224 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:218
     1250#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:216
    12251251#, java-format
    12261252msgid "Updating news URL to {0}"
    12271253msgstr ""
    12281254
    1229 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:225
    1230 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:233
     1255#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:223
     1256#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:231
    12311257#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:54
    12321258#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:60
     
    12341260msgstr ""
    12351261
    1236 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:229
     1262#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:227
    12371263#, java-format
    12381264msgid "Updating proxy host to {0}"
    12391265msgstr ""
    12401266
    1241 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:237
     1267#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:235
    12421268#, java-format
    12431269msgid "Updating proxy port to {0}"
    12441270msgstr ""
    12451271
    1246 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:255
     1272#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:253
    12471273#, java-format
    12481274msgid "Updating refresh frequency to {0}"
    12491275msgstr ""
    12501276
    1251 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:256
     1277#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:254
    12521278#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:126
    1253 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:410
     1279#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:405
     1280#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:298
    12541281msgid "Never"
    12551282msgstr ""
    12561283
    1257 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:263
     1284#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:261
    12581285#, java-format
    12591286msgid "Updating update policy to {0}"
    12601287msgstr ""
    12611288
    1262 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:272
     1289#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:270
    12631290msgid "Updating update URLs."
    12641291msgstr ""
    12651292
    1266 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:284
     1293#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:282
    12671294msgid "Updating trusted keys."
    12681295msgstr ""
    12691296
    1270 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:296
     1297#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:294
    12711298#, java-format
    12721299msgid "Updating unsigned update URL to {0}"
    12731300msgstr ""
    12741301
    1275 #: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:308
     1302#: ../java/src/net/i2p/router/web/ConfigUpdateHandler.java:306
    12761303#, java-format
    12771304msgid "Updating signed development build URL to {0}"
     
    12941321msgstr ""
    12951322
    1296 #: ../java/src/net/i2p/router/web/FormHandler.java:253
     1323#: ../java/src/net/i2p/router/web/FormHandler.java:264
    12971324msgid ""
    12981325"Invalid form submission, probably because you used the 'back' or 'reload' "
     
    13001327msgstr ""
    13011328
    1302 #: ../java/src/net/i2p/router/web/FormHandler.java:255
     1329#: ../java/src/net/i2p/router/web/FormHandler.java:266
    13031330msgid ""
    13041331"If the problem persists, verify that you have cookies enabled in your "
     
    13281355msgstr ""
    13291356
    1330 #: ../java/src/net/i2p/router/web/PluginStarter.java:161
     1357#: ../java/src/net/i2p/router/web/PluginStarter.java:178
    13311358msgid "Checking for plugin updates"
    13321359msgstr ""
    13331360
    1334 #: ../java/src/net/i2p/router/web/PluginStarter.java:176
    1335 #: ../java/src/net/i2p/router/web/PluginStarter.java:182
     1361#: ../java/src/net/i2p/router/web/PluginStarter.java:193
     1362#: ../java/src/net/i2p/router/web/PluginStarter.java:199
    13361363msgid "Plugin update check failed"
    13371364msgstr ""
    13381365
    1339 #: ../java/src/net/i2p/router/web/PluginStarter.java:220
     1366#: ../java/src/net/i2p/router/web/PluginStarter.java:237
    13401367#, java-format
    13411368msgid "1 plugin updated"
     
    13441371msgstr[1] ""
    13451372
    1346 #: ../java/src/net/i2p/router/web/PluginStarter.java:222
     1373#: ../java/src/net/i2p/router/web/PluginStarter.java:239
    13471374msgid "Plugin update check complete"
    13481375msgstr ""
    13491376
    1350 #: ../java/src/net/i2p/router/web/StatSummarizer.java:338
    1351 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:250
     1377#: ../java/src/net/i2p/router/web/StatSummarizer.java:399
     1378#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:244
    13521379msgid "Bandwidth usage"
    13531380msgstr ""
     
    14421469#: ../java/src/net/i2p/router/web/helpers/CertHelper.java:76
    14431470#: ../java/src/net/i2p/router/web/helpers/CertHelper.java:81
    1444 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:316
     1471#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:317
    14451472msgid "Website"
    14461473msgstr ""
     
    14511478
    14521479#: ../java/src/net/i2p/router/web/helpers/CertHelper.java:91
    1453 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:333
     1480#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:336
     1481#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:816
    14541482msgid "Family"
    14551483msgstr ""
     
    14601488
    14611489#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:57
    1462 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:573
     1490#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:557
    14631491msgid "Save Client Configuration"
    14641492msgstr ""
    14651493
    14661494#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:61
    1467 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:607
    1468 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:611
     1495#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:605
     1496#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:609
    14691497msgid "Save Interface Configuration"
    14701498msgstr ""
    14711499
    14721500#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:65
    1473 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configwebapps_jsp.java:555
     1501#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configwebapps_jsp.java:539
    14741502msgid "Save WebApp Configuration"
    14751503msgstr ""
    14761504
    14771505#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:70
    1478 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:558
     1506#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:542
    14791507msgid "Save Plugin Configuration"
    14801508msgstr ""
    14811509
    14821510#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:77
    1483 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:575
    1484 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:579
     1511#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:559
     1512#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:563
    14851513msgid "Install Plugin"
    14861514msgstr ""
    14871515
    14881516#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:86
    1489 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:587
     1517#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:571
    14901518msgid "Install Plugin from File"
    14911519msgstr ""
    14921520
    14931521#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:95
    1494 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:598
     1522#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:582
    14951523msgid "Update All Installed Plugins"
    14961524msgstr ""
     
    15241552#. label (IE)
    15251553#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:218
    1526 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:376
    15271554#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:377
     1555#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:378
    15281556msgid "Start"
    15291557msgstr ""
     
    15671595
    15681596#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHandler.java:396
    1569 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:207
     1597#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:208
    15701598msgid "WebApp"
    15711599msgstr ""
     
    16431671
    16441672#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:103
    1645 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:383
    16461673#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:384
     1674#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:385
    16471675msgid "Edit"
    16481676msgstr ""
    16491677
    16501678#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:112
    1651 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:569
     1679#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:553
    16521680msgid "Add Client"
    16531681msgstr ""
    16541682
    16551683#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:121
    1656 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:859
     1684#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:866
    16571685#: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:585
    16581686msgid "Client"
     
    16601688
    16611689#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:122
    1662 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:208
    1663 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:254
    1664 msgid "Run at Startup?"
    1665 msgstr ""
    1666 
    1667 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:123
    16681690#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:209
    16691691#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:255
     1692msgid "Run at Startup?"
     1693msgstr ""
     1694
     1695#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:123
     1696#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:210
     1697#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:256
    16701698msgid "Control"
    16711699msgstr ""
     
    16751703msgstr ""
    16761704
    1677 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:210
    1678 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:256
    1679 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:306
     1705#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:211
     1706#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:257
     1707#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:307
    16801708msgid "Description"
    16811709msgstr ""
    16821710
    1683 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:223
     1711#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:224
    16841712#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:47
    1685 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:229
     1713#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:235
    16861714msgid "Torrents"
    16871715msgstr ""
    16881716
    1689 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:225
    1690 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:298
     1717#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:226
     1718#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:304
    16911719#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:248
    1692 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:413
     1720#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:411
    16931721msgid "Hidden Services Manager"
    16941722msgstr ""
    16951723
    1696 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:227
     1724#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:228
    16971725msgid "Identification Image Generator"
    16981726msgstr ""
    16991727
    1700 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:229
     1728#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:230
    17011729#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:37
    1702 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:276
     1730#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:282
    17031731msgid "Addressbook"
    17041732msgstr ""
    17051733
    1706 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:231
     1734#. FIXME wasn't escaped
     1735#. _x("Configure UI") + S + _x("Select console theme & language & set optional console password").replace("&", "&amp;") + S + "/configui" + S + I + "info/ui.png" + S +
     1736#. _x("Customize Home Page") + S + _x("I2P Home Page Configuration") + S + "/confighome" + S + I + "home_page.png" + S +
     1737#. _x("Customize Sidebar") + S + _x("Customize the sidebar by adding or removing or repositioning elements") + S + "/configsidebar" + S + I + "info/sidebar.png" + S +
     1738#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:232
    17071739#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:43
    1708 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:221
     1740#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:227
    17091741msgid "Email"
    17101742msgstr ""
    17111743
    1712 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:253
     1744#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:254
    17131745msgid "Plugin"
    17141746msgstr ""
    17151747
    1716 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:270
    1717 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:690
    1718 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:193
     1748#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:271
     1749#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:697
     1750#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:278
    17191751#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:97
    1720 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:439
    1721 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:465
    1722 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:499
     1752#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:445
     1753#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:471
     1754#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:505
     1755#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:799
    17231756msgid "Version"
    17241757msgstr ""
    17251758
    1726 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:272
     1759#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:273
    17271760msgid "Signed by"
    17281761msgstr ""
    17291762
    1730 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:289
     1763#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:290
    17311764msgid "Date"
    17321765msgstr ""
    17331766
    1734 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:295
     1767#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:296
    17351768msgid "Author"
    17361769msgstr ""
    17371770
    1738 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:311
     1771#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:312
    17391772msgid "License"
    17401773msgstr ""
    17411774
    1742 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:324
     1775#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:325
    17431776msgid "Update link"
    17441777msgstr ""
    17451778
    1746 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:380
    17471779#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:381
     1780#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:382
    17481781msgid "Stop"
    17491782msgstr ""
    17501783
    1751 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:388
    17521784#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:389
     1785#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:390
    17531786#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:31
    17541787msgid "Update"
    17551788msgstr ""
    17561789
    1757 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:392
    1758 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:396
     1790#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:393
     1791#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:397
    17591792msgid "Delete"
    17601793msgstr ""
    17611794
    1762 #: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:394
     1795#: ../java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java:395
    17631796#, java-format
    17641797msgid "Are you sure you want to delete {0}?"
     
    17661799
    17671800#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:28
    1768 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:567
     1801#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:551
    17691802msgid "Create Family"
    17701803msgstr ""
     
    17771810#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:105
    17781811#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:185
     1812#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:229
    17791813msgid "Configuration saved successfully."
    17801814msgstr ""
    17811815
    17821816#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:46
    1783 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:559
     1817#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:543
    17841818msgid "Join Family"
    17851819msgstr ""
     
    17911825
    17921826#: ../java/src/net/i2p/router/web/helpers/ConfigFamilyHandler.java:99
    1793 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:602
     1827#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:586
    17941828msgid "Leave Family"
     1829msgstr ""
     1830
     1831#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:22
     1832#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:24
     1833#: ../java/src/net/i2p/router/web/helpers/ConfigUIHandler.java:27
     1834#: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:1155
     1835#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:544
     1836#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:564
     1837#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:580
     1838#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:541
     1839msgid "Delete selected"
    17951840msgstr ""
    17961841
    17971842#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:23
    17981843#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:25
    1799 #: ../java/src/net/i2p/router/web/helpers/ConfigUIHandler.java:27
    1800 #: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:1155
    1801 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:560
    1802 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:580
    1803 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:596
    1804 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:543
    1805 msgid "Delete selected"
    1806 msgstr ""
    1807 
    1808 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:24
    1809 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:26
    18101844#: ../java/src/net/i2p/router/web/helpers/SummaryHelper.java:1175
    1811 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:558
    1812 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:566
     1845#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:542
     1846#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:550
     1847#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:562
     1848#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:570
    18131849#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:578
    18141850#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:586
    1815 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:594
    1816 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:602
    18171851msgid "Add item"
    18181852msgstr ""
    18191853
    1820 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:25
    1821 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:564
     1854#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:24
     1855#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:548
     1856#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:568
    18221857#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:584
    1823 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:600
    18241858msgid "Restore defaults"
    18251859msgstr ""
    18261860
    1827 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:31
     1861#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:30
    18281862msgid "Home page changed"
    18291863msgstr ""
    18301864
    1831 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:53
     1865#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:52
    18321866msgid "Restored default settings"
    18331867msgstr ""
    18341868
    1835 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:65
     1869#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:64
    18361870msgid "No name entered"
    18371871msgstr ""
    18381872
    1839 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:70
     1873#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:69
    18401874msgid "No URL entered"
    18411875msgstr ""
    18421876
    1843 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:86
    1844 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:84
     1877#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:85
     1878#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:83
    18451879msgid "Added"
    18461880msgstr ""
    18471881
    1848 #: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:103
     1882#: ../java/src/net/i2p/router/web/helpers/ConfigHomeHandler.java:102
    18491883#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:110
    18501884msgid "Removed"
    18511885msgstr ""
    18521886
     1887#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:18
     1888#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:558
     1889msgid "Add key"
     1890msgstr ""
     1891
    18531892#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:19
    1854 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:574
    1855 msgid "Add key"
    1856 msgstr ""
    1857 
    1858 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:20
    1859 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:572
     1893#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:556
    18601894msgid "Delete key"
    18611895msgstr ""
    18621896
    1863 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:22
     1897#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:21
    18641898msgid "You must enter a destination"
    18651899msgstr ""
    18661900
    1867 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:24
     1901#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:23
    18681902msgid "You must enter a key"
    18691903msgstr ""
    18701904
    1871 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:34
    1872 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:55
     1905#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:33
     1906#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:54
    18731907msgid "Invalid destination"
    18741908msgstr ""
    18751909
    1876 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:39
     1910#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:38
    18771911msgid "Invalid key"
    18781912msgstr ""
    18791913
    1880 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:42
     1914#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:41
    18811915#, java-format
    18821916msgid "Key for {0} added to keyring"
    18831917msgstr ""
    18841918
    1885 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:50
     1919#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:49
    18861920#, java-format
    18871921msgid "Key for {0} removed from keyring"
    18881922msgstr ""
    18891923
    1890 #: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:52
     1924#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHandler.java:51
    18911925#, java-format
    18921926msgid "Key for {0} not found in keyring"
     
    19021936
    19031937#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java:44
    1904 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:440
    1905 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:468
     1938#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:459
     1939#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:487
    19061940msgid "Destination"
    19071941msgstr ""
     
    19141948
    19151949#: ../java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java:46
    1916 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:568
     1950#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:552
    19171951msgid "Encryption Key"
    19181952msgstr ""
     
    19912025
    19922026#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:30
    1993 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:577
     2027#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:583
    19942028msgid "Network"
    19952029msgstr ""
    19962030
    19972031#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:30
    1998 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/certs_jsp.java:361
    1999 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:363
    2000 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:363
    2001 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:389
    2002 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:389
    2003 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:389
    2004 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:389
    2005 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:389
    2006 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:371
    2007 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:389
    2008 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:389
    2009 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:389
    2010 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:389
    2011 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:389
    2012 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:389
    2013 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:363
    2014 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:389
    2015 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:363
    2016 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:363
    2017 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configwebapps_jsp.java:389
    2018 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:364
    2019 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:366
    2020 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:386
    2021 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:384
    2022 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/events_jsp.java:375
    2023 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:408
    2024 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:380
    2025 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:370
    2026 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:370
    2027 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:370
    2028 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:370
    2029 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:373
     2032#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/certs_jsp.java:359
     2033#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:361
     2034#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:361
     2035#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configclients_jsp.java:377
     2036#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configfamily_jsp.java:377
     2037#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:377
     2038#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:377
     2039#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configkeyring_jsp.java:377
     2040#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:369
     2041#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:377
     2042#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:377
     2043#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configplugins_jsp.java:377
     2044#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:377
     2045#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configservice_jsp.java:377
     2046#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:377
     2047#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:361
     2048#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:377
     2049#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:361
     2050#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:361
     2051#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configwebapps_jsp.java:377
     2052#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/console_jsp.java:362
     2053#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/debug_jsp.java:364
     2054#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/dns_jsp.java:384
     2055#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error_jsp.java:382
     2056#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/events_jsp.java:373
     2057#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graph_jsp.java:396
     2058#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/graphs_jsp.java:378
     2059#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005far_jsp.java:368
     2060#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005ffr_jsp.java:368
     2061#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fnl_jsp.java:368
     2062#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_005fru_jsp.java:368
     2063#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/help_jsp.java:371
    20302064#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/home_jsp.java:282
    2031 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:387
    2032 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:387
    2033 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:361
    2034 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:387
    2035 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:361
    2036 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/news_jsp.java:387
    2037 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:391
    2038 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:366
    2039 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:361
    2040 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:361
    2041 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/proof_jsp.java:387
    2042 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:361
    2043 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:387
    2044 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:361
    2045 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:361
    2046 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:387
     2065#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/i2ptunnelmgr_jsp.java:385
     2066#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jars_jsp.java:375
     2067#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/jobs_jsp.java:359
     2068#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/logs_jsp.java:375
     2069#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/netdb_jsp.java:360
     2070#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/news_jsp.java:375
     2071#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/nowebapp_jsp.java:379
     2072#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/oldconsole_jsp.java:364
     2073#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/peers_jsp.java:359
     2074#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/profiles_jsp.java:359
     2075#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/proof_jsp.java:375
     2076#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/stats_jsp.java:359
     2077#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/torrents_jsp.java:385
     2078#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/tunnels_jsp.java:359
     2079#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/viewprofile_jsp.java:359
     2080#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/webmail_jsp.java:385
    20472081msgid "Summary Bar"
    20482082msgstr ""
     
    20542088#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:31
    20552089#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:56
    2056 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:329
    2057 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:842
     2090#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:335
     2091#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:849
    20582092#: ../java/strings/Strings.java:73
    20592093msgid "Tunnels"
     
    20742108#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:32
    20752109#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:51
    2076 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:317
    2077 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:628
    2078 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:692
     2110#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:323
     2111#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:634
     2112#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:698
    20792113#: ../java/strings/Strings.java:68
    20802114msgid "Peers"
     
    20822116
    20832117#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:32
    2084 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:856
    2085 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:411
     2118#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:890
     2119#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:417
    20862120msgid "Stats"
    20872121msgstr ""
     
    20962130
    20972131#: ../java/src/net/i2p/router/web/helpers/ConfigNavHelper.java:34
    2098 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:342
     2132#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:348
    20992133msgid "Advanced"
    21002134msgstr ""
     
    21072141#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:103
    21082142#: ../java/src/net/i2p/router/web/helpers/ConfigTunnelsHandler.java:31
    2109 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:549
    2110 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:542
    2111 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:579
    2112 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:547
    2113 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:705
    2114 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:740
    2115 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:636
    2116 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:577
     2143#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:547
     2144#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:540
     2145#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configadvanced_jsp.java:577
     2146#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configlogging_jsp.java:545
     2147#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confignet_jsp.java:689
     2148#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:724
     2149#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configstats_jsp.java:634
     2150#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configtunnels_jsp.java:561
    21172151msgid "Save changes"
    21182152msgstr ""
     
    22292263
    22302264#: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:494
     2265#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:96
    22312266msgid "Updating bandwidth share percentage"
    22322267msgstr ""
     
    22342269#: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:514
    22352270#: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:529
     2271#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:112
     2272#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:127
    22362273msgid "Invalid bandwidth"
    22372274msgstr ""
    22382275
    22392276#: ../java/src/net/i2p/router/web/helpers/ConfigNetHandler.java:534
     2277#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:131
    22402278msgid "Updated bandwidth limits"
    22412279msgstr ""
     
    22462284
    22472285#: ../java/src/net/i2p/router/web/helpers/ConfigNetHelper.java:283
     2286#: ../java/src/net/i2p/router/web/helpers/WizardHelper.java:218
    22482287msgid "bits per second"
    22492288msgstr ""
    22502289
    22512290#: ../java/src/net/i2p/router/web/helpers/ConfigNetHelper.java:285
     2291#: ../java/src/net/i2p/router/web/helpers/WizardHelper.java:220
    22522292#, java-format
    22532293msgid "{0}Bytes per month maximum"
     
    22552295
    22562296#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:21
    2257 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:558
     2297#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:542
    22582298msgid "Ban peer until restart"
    22592299msgstr ""
     
    22672307#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:34
    22682308#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:36
    2269 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:130
    2270 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:189
    2271 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:350
     2309#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:215
     2310#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:274
     2311#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:436
    22722312#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:94
    22732313#: ../java/src/net/i2p/router/web/helpers/ProfileOrganizerRenderer.java:223
     
    22862326
    22872327#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:29
    2288 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:560
     2328#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:544
    22892329msgid "Unban peer"
    22902330msgstr ""
     
    22992339
    23002340#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:40
    2301 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:586
     2341#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configpeer_jsp.java:570
    23022342msgid "Adjust peer bonuses"
    23032343msgstr ""
     
    23122352
    23132353#: ../java/src/net/i2p/router/web/helpers/ConfigPeerHandler.java:62
     2354#: ../java/src/net/i2p/router/web/helpers/WizardHandler.java:77
    23142355msgid "Unsupported"
    23152356msgstr ""
    23162357
    23172358#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:28
    2318 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:557
    2319 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:738
     2359#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:541
     2360#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:722
    23202361msgid "Save changes and reseed now"
    23212362msgstr ""
     
    23322373
    23332374#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:37
     2375#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:561
     2376#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:571
    23342377#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:577
    2335 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:587
    2336 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:593
    23372378msgid "Reseed from URL"
    23382379msgstr ""
     
    23512392
    23522393#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:77
    2353 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:569
    2354 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:601
     2394#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:553
     2395#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:585
    23552396msgid "Reseed from file"
    23562397msgstr ""
     
    23692410
    23702411#: ../java/src/net/i2p/router/web/helpers/ConfigReseedHandler.java:105
    2371 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:647
     2412#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configreseed_jsp.java:631
    23722413msgid "Reset URL list"
    23732414msgstr ""
     
    24402481msgstr ""
    24412482
    2442 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:27
     2483#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:26
    24432484msgid "Save order"
    24442485msgstr ""
    24452486
    2446 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:34
     2487#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:33
    24472488msgid "Refresh interval changed"
    24482489msgstr ""
    24492490
    2450 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:36
     2491#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:35
    24512492#, java-format
    24522493msgid "Refresh interval must be at least {0} seconds"
    24532494msgstr ""
    24542495
    2455 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:38
     2496#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:37
    24562497msgid "Refresh interval must be a number"
    24572498msgstr ""
    24582499
    2459 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:41
    2460 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:558
     2500#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:40
     2501#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:542
    24612502msgid "Restore full default"
    24622503msgstr ""
    24632504
     2505#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:42
     2506msgid "Full summary bar default restored."
     2507msgstr ""
     2508
    24642509#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:43
    2465 msgid "Full summary bar default restored."
    2466 msgstr ""
    2467 
    2468 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:44
    2469 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:48
     2510#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:47
    24702511#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:140
    24712512msgid "Summary bar will refresh shortly."
    24722513msgstr ""
    24732514
    2474 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:45
    2475 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:560
     2515#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:44
     2516#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configsidebar_jsp.java:544
    24762517msgid "Restore minimal default"
    24772518msgstr ""
    24782519
    2479 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:47
     2520#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:46
    24802521msgid "Minimal summary bar default restored."
    24812522msgstr ""
    24822523
    2483 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:64
    2484 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:86
     2524#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:63
     2525#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:85
    24852526#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:134
    24862527msgid "Order must be an integer"
    24872528msgstr ""
    24882529
    2489 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:71
     2530#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:70
    24902531msgid "No section selected"
    24912532msgstr ""
    24922533
    2493 #: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:76
     2534#: ../java/src/net/i2p/router/web/helpers/ConfigSummaryHandler.java:75
    24942535msgid "No order entered"
    24952536msgstr ""
     
    25642605
    25652606#: ../java/src/net/i2p/router/web/helpers/ConfigTunnelsHelper.java:107
    2566 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:214
    2567 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:409
     2607#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:300
     2608#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:495
    25682609#: ../java/src/net/i2p/router/web/helpers/TunnelRenderer.java:301
    25692610msgid "Inbound"
     
    25712612
    25722613#: ../java/src/net/i2p/router/web/helpers/ConfigTunnelsHelper.java:107
    2573 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:216
    2574 #: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:411
     2614#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:302
     2615#: ../java/src/net/i2p/router/web/helpers/PeerHelper.java:497
    25752616#: ../java/src/net/i2p/router/web/helpers/TunnelRenderer.java:302
    25762617msgid "Outbound"
     
    26032644
    26042645#: ../java/src/net/i2p/router/web/helpers/ConfigUIHandler.java:29
    2605 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:541
    2606 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:547
     2646#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:539
     2647#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configui_jsp.java:545
    26072648msgid "Add user"
    26082649msgstr ""
     
    26762717#: ../java/src/net/i2p/router/web/helpers/ConfigUIHelper.java:230
    26772718#: ../java/src/net/i2p/router/web/helpers/ConfigUIHelper.java:245
    2678 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:603
     2719#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:597
    26792720msgid "Username"
    26802721msgstr ""
    26812722
    26822723#: ../java/src/net/i2p/router/web/helpers/ConfigUIHelper.java:247
    2683 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:605
     2724#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configi2cp_jsp.java:599
    26842725msgid "Password"
    26852726msgstr ""
    26862727
     2728#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:34
     2729msgid "Aborted startup"
     2730msgstr ""
     2731
     2732#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:35
     2733msgid "Enabled floodfill"
     2734msgstr ""
     2735
    26872736#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:36
    2688 msgid "Aborted startup"
     2737msgid "Changed IP"
    26892738msgstr ""
    26902739
    26912740#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:37
    2692 msgid "Enabled floodfill"
     2741msgid "Changed port"
    26932742msgstr ""
    26942743
    26952744#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:38
    2696 msgid "Changed IP"
     2745msgid "Clock shifted"
    26972746msgstr ""
    26982747
    26992748#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:39
    2700 msgid "Changed port"
     2749msgid "Crashed"
    27012750msgstr ""
    27022751
    27032752#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:40
    2704 msgid "Clock shifted"
     2753msgid "Critical error"
    27052754msgstr ""
    27062755
    27072756#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:41
    2708 msgid "Crashed"
     2757msgid "Installed new version"
    27092758msgstr ""
    27102759
    27112760#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:42
    2712 msgid "Critical error"
     2761msgid "Install failed"
    27132762msgstr ""
    27142763
    27152764#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:43
    2716 msgid "Installed new version"
     2765msgid "Network error"
    27172766msgstr ""
    27182767
    27192768#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:44
    2720 msgid "Install failed"
     2769#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:48
     2770msgid "New router identity"
    27212771msgstr ""
    27222772
    27232773#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:45
    2724 msgid "Network error"
     2774msgid "Disabled floodfill"
    27252775msgstr ""
    27262776
    27272777#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:46
     2778msgid "Out of memory error"
     2779msgstr ""
     2780
     2781#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:47
     2782msgid "Reachability change"
     2783msgstr ""
     2784
     2785#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:49
     2786msgid "Reseeded router"
     2787msgstr ""
     2788
    27282789#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:50
    2729 msgid "New router identity"
    2730 msgstr ""
    2731 
    2732 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:47
    2733 msgid "Disabled floodfill"
    2734 msgstr ""
    2735 
    2736 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:48
    2737 msgid "Out of memory error"
    2738 msgstr ""
    2739 
    2740 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:49
    2741 msgid "Reachability change"
     2790msgid "Soft restart"
    27422791msgstr ""
    27432792
    27442793#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:51
    2745 msgid "Reseeded router"
     2794msgid "Started router"
    27462795msgstr ""
    27472796
    27482797#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:52
    2749 msgid "Soft restart"
     2798msgid "Stopped router"
    27502799msgstr ""
    27512800
    27522801#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:53
    2753 msgid "Started router"
     2802msgid "Updated router"
    27542803msgstr ""
    27552804
    27562805#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:54
    2757 msgid "Stopped router"
    2758 msgstr ""
    2759 
    2760 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:55
    2761 msgid "Updated router"
    2762 msgstr ""
    2763 
    2764 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:56
    27652806msgid "Watchdog warning"
    27662807msgstr ""
    27672808
    2768 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:104
     2809#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:102
    27692810msgid "Display Events"
    27702811msgstr ""
    27712812
    2772 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:108
     2813#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:106
    27732814msgid "Events since"
    27742815msgstr ""
    27752816
    2776 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:113
     2817#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:111
    27772818msgid "Event type"
    27782819msgstr ""
    27792820
    2780 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:119
    2781 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:150
     2821#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:117
     2822#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:148
    27822823msgid "All events"
    27832824msgstr ""
    27842825
    2785 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:124
     2826#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:122
    27862827msgid "Filter events"
    27872828msgstr ""
    27882829
    2789 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:172
     2830#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:170
    27902831msgid "No events found"
    27912832msgstr ""
    27922833
    2793 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:173
     2834#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:171
    27942835#, java-format
    27952836msgid "No events found in previous {0}"
    27962837msgstr ""
    27972838
    2798 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:176
     2839#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:174
    27992840#, java-format
    28002841msgid "No \"{0}\" events found"
    28012842msgstr ""
    28022843
    2803 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:177
     2844#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:175
    28042845#, java-format
    28052846msgid "No \"{0}\" events found in previous {1}"
    28062847msgstr ""
    28072848
    2808 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:181
     2849#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:179
    28092850#: ../java/src/net/i2p/router/web/helpers/JobQueueHelper.java:155
    28102851msgid "Time"
    28112852msgstr ""
    28122853
     2854#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:182
     2855msgid "Event"
     2856msgstr ""
     2857
    28132858#: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:184
    2814 msgid "Event"
    2815 msgstr ""
    2816 
    2817 #: ../java/src/net/i2p/router/web/helpers/EventLogHelper.java:186
     2859#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/welcome_jsp.java:522
    28182860msgid "Details"
    28192861msgstr ""
    28202862
    2821 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:180
     2863#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:173
    28222864msgid "Combined bandwidth graph"
    28232865msgstr ""
    28242866
    28252867#. e.g. "statname for 60m"
    2826 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:200
    2827 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:263
     2868#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:193
     2869#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:257
    28282870#, java-format
    28292871msgid "{0} for {1}"
    28302872msgstr ""
    28312873
    2832 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:265
     2874#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:259
    28332875#, java-format
    28342876msgid "ending {0} ago"
    28352877msgstr ""
    28362878
    2837 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:268
     2879#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:262
    28382880msgid "Return to main graphs page"
    28392881msgstr ""
    28402882
     2883#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:277
     2884msgid "Larger"
     2885msgstr ""
     2886
    28412887#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:283
    2842 msgid "Larger"
     2888msgid "Smaller"
    28432889msgstr ""
    28442890
    28452891#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:289
    2846 msgid "Smaller"
     2892msgid "Taller"
    28472893msgstr ""
    28482894
    28492895#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:295
    2850 msgid "Taller"
     2896msgid "Shorter"
    28512897msgstr ""
    28522898
    28532899#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:301
    2854 msgid "Shorter"
     2900msgid "Wider"
    28552901msgstr ""
    28562902
    28572903#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:307
    2858 msgid "Wider"
    2859 msgstr ""
    2860 
    2861 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:313
    28622904msgid "Narrower"
    28632905msgstr ""
    28642906
     2907#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:314
     2908msgid "Larger interval"
     2909msgstr ""
     2910
    28652911#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:320
    2866 msgid "Larger interval"
    2867 msgstr ""
    2868 
    2869 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:326
    28702912msgid "Smaller interval"
    28712913msgstr ""
    28722914
    2873 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:333
     2915#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:327
    28742916msgid "Previous interval"
    28752917msgstr ""
    28762918
    2877 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:344
     2919#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:338
    28782920msgid "Next interval"
    28792921msgstr ""
    28802922
    2881 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:351
     2923#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:345
    28822924msgid "Plot averages"
    28832925msgstr ""
    28842926
    2885 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:351
     2927#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:345
    28862928msgid "plot events"
    28872929msgstr ""
    28882930
    2889 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:354
     2931#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:348
    28902932msgid "All times are UTC."
    28912933msgstr ""
    28922934
    2893 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:386
     2935#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:381
    28942936#: ../java/src/net/i2p/router/web/helpers/TunnelRenderer.java:244
    28952937msgid "Configure Graph Display"
    28962938msgstr ""
    28972939
     2940#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:381
     2941msgid "Select Stats"
     2942msgstr ""
     2943
    28982944#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:386
    2899 msgid "Select Stats"
     2945msgid ""
     2946"Note: Dimensions are for graph only (excludes title, labels and legend)."
     2947msgstr ""
     2948
     2949#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:387
     2950msgid "Graph size"
     2951msgstr ""
     2952
     2953#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:388
     2954msgid "pixels wide"
     2955msgstr ""
     2956
     2957#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:389
     2958msgid "pixels high"
    29002959msgstr ""
    29012960
    29022961#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:391
    2903 msgid ""
    2904 "Note: Dimensions are for graph only (excludes title, labels and legend)."
    2905 msgstr ""
    2906 
    2907 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:392
    2908 msgid "Graph size"
    2909 msgstr ""
    2910 
    2911 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:393
    2912 msgid "pixels wide"
     2962msgid "Display period"
     2963msgstr ""
     2964
     2965#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:391
     2966msgid "minutes"
    29132967msgstr ""
    29142968
    29152969#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:394
    2916 msgid "pixels high"
    2917 msgstr ""
    2918 
    2919 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:396
    2920 msgid "Display period"
    2921 msgstr ""
    2922 
    2923 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:396
    2924 msgid "minutes"
    2925 msgstr ""
    2926 
    2927 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:399
    29282970msgid "Refresh delay"
    29292971msgstr ""
    29302972
    2931 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:415
     2973#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:410
    29322974msgid "Plot type"
    29332975msgstr ""
    29342976
    2935 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:416
     2977#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:411
    29362978msgid "Averages"
    29372979msgstr ""
    29382980
    2939 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:417
    2940 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:369
     2981#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:412
     2982#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:375
    29412983msgid "Events"
    29422984msgstr ""
    29432985
     2986#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:413
     2987msgid "Hide legend"
     2988msgstr ""
     2989
    29442990#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:418
    2945 msgid "Hide legend"
    2946 msgstr ""
    2947 
    2948 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:423
    29492991msgid "Do not show legend on graphs"
    29502992msgstr ""
    29512993
     2994#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:419
     2995msgid "Persistence"
     2996msgstr ""
     2997
    29522998#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:424
    2953 msgid "Persistence"
    2954 msgstr ""
    2955 
    2956 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:429
    29572999msgid "Store graph data on disk"
    29583000msgstr ""
    29593001
    2960 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:430
     3002#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:425
    29613003msgid "Save settings and redraw graphs"
    29623004msgstr ""
    29633005
    2964 #: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:488
     3006#: ../java/src/net/i2p/router/web/helpers/GraphHelper.java:483
    29653007msgid "Graph settings saved"
    29663008msgstr ""
    29673009
    29683010#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:37
    2969 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:274
     3011#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:280
    29703012msgid "Manage your I2P hosts file here (I2P domain name resolution)"
    29713013msgstr ""
     
    29763018
    29773019#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:38
    2978 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:397
     3020#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:395
    29793021msgid "I2P Bandwidth Configuration"
    29803022msgstr ""
    29813023
    2982 #. FIXME wasn't escaped
    2983 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:40
    2984 msgid "Configure UI"
    2985 msgstr ""
    2986 
    2987 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:40
    2988 msgid "Select console theme & language & set optional console password"
    2989 msgstr ""
    2990 
    2991 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:41
    2992 msgid "Customize Home Page"
    2993 msgstr ""
    2994 
    2995 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:41
    2996 #: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/confighome_jsp.java:415
    2997 msgid "I2P Home Page Configuration"
    2998 msgstr ""
    2999 
    3000 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:42
    3001 msgid "Customize Sidebar"
    3002 msgstr ""
    3003 
    3004 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:42
    3005 msgid "Customize the sidebar by adding or removing or repositioning elements"
    3006 msgstr ""
    3007 
    30083024#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:43
    3009 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:219
     3025#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:225
    30103026msgid "Anonymous webmail client"
    30113027msgstr ""
    30123028
    30133029#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:44
    3014 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:291
     3030#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:297
    30153031#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/error500_jsp.java:250
    30163032msgid "Help"
     
    30303046
    30313047#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:47
    3032 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:227
     3048#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:233
    30333049msgid "Built-in anonymous BitTorrent Client"
    30343050msgstr ""
     
    30403056#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:48
    30413057#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:190
    3042 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:251
     3058#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:257
    30433059msgid "Web Server"
    30443060msgstr ""
     
    31083124msgstr ""
    31093125
    3110 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:72
    3111 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:76
    3112 msgid "Encrypted I2P Pastebin"
     3126#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:73
     3127msgid "I2P News"
    31133128msgstr ""
    31143129
     
    31193134#. "killyourtv.i2p" + S + _x("Debian and Tahoe-LAFS repositories") + S + "http://killyourtv.i2p/" + S + I + "television_delete.png" + S +
    31203135#. _x("Open4You") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S +
    3121 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:72
    3122 msgid "Pastebin"
    3123 msgstr ""
    3124 
    3125 #: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:73
    3126 msgid "I2P News"
    3127 msgstr ""
    3128 
     3136#. _x("Pastebin") + S + _x("Encrypted I2P Pastebin") + S + "http://zerobin.i2p/" + S + I + "paste_plain.png" + S +
    31293137#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:73
    31303138msgid "Planet I2P"
     
    31373145#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:74
    31383146msgid "I2P Plugins"
     3147msgstr ""
     3148
     3149#: ../java/src/net/i2p/router/web/helpers/HomeHelper.java:76
     3150msgid "Encrypted I2P Pastebin"
    31393151msgstr ""
    31403152
     
    32623274
    32633275#: ../java/src/net/i2p/router/web/helpers/JobQueueHelper.java:209
    3264 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:27
     3276#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:36
    32653277msgid "Summary"
    32663278msgstr ""
     
    32803292
    32813293#. 0
    3282 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:28
     3294#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:37
    32833295msgid "Local Router"
    32843296msgstr ""
    32853297
    32863298#. 1
    3287 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:29
     3299#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:38
    32883300msgid "Router Lookup"
    32893301msgstr ""
    32903302
    32913303#. 2
    3292 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:30
     3304#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:39
    32933305msgid "All Routers"
    32943306msgstr ""
    32953307
    32963308#. 3
    3297 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:31
     3309#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:40
    32983310msgid "All Routers with Full Stats"
    32993311msgstr ""
     
    33013313#. 4
    33023314#. 5
    3303 #: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:33
    3304 #: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:393
     3315#: ../java/src/net/i2p/router/web/helpers/NetDbHelper.java:42
     3316#: ../java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java:399
     3317#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:810
     3318#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:812
    33053319msgid "LeaseSets"
    3306 msgstr ""
    3307 
    3308 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:139
    3309 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:341
    3310 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:604
    3311 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:660
    3312 msgid "Previous Page"
    33133320msgstr ""
    33143321
    33153322#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:141
    33163323#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:344
    3317 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:607
    3318 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:663
     3324#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:611
     3325#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:667
     3326msgid "Previous Page"
     3327msgstr ""
     3328
     3329#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:143
     3330#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:347
     3331#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:614
     3332#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:670
    33193333msgid "Page"
    33203334msgstr ""
    33213335
    3322 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:325
    3323 #: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:803
     3336#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:328
     3337#: ../java/src/net/i2p/router/web/helpers/SybilRenderer.java:772
    33243338#: ../java/strings/Strings.java:69
    33253339msgid "Router"
    33263340msgstr ""
    33273341
    3328 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:334
     3342#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:337
    33293343msgid "not found in network database"
    33303344msgstr ""
    33313345
    3332 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:348
    3333 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:611
    3334 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:666
     3346#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:351
     3347#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:618
     3348#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:673
    33353349msgid "Next Page"
    33363350msgstr ""
    33373351
    3338 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:395
     3352#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:414
    33393353msgid "Manually Configure Floodfill Participation"
    33403354msgstr ""
    33413355
    3342 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:396
     3356#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:415
    33433357msgid "Configure Floodfill Participation"
    33443358msgstr ""
    33453359
    3346 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:431
     3360#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:450
    33473361msgid "LeaseSet"
    33483362msgstr ""
    33493363
    3350 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:433
     3364#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:452
    33513365msgid "Encrypted"
    33523366msgstr ""
    33533367
    3354 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:436
     3368#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:455
    33553369#: ../java/src/net/i2p/router/web/helpers/TunnelRenderer.java:332
    33563370msgid "Local"
    33573371msgstr ""
    33583372
    3359 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:439
     3373#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:458
    33603374msgid "Unpublished"
    33613375msgstr ""
    33623376
    3363 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:462
    3364 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:480
     3377#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:481
     3378#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:499
    33653379msgid "Add to addressbook"
    33663380msgstr ""
    33673381
    3368 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:464
    3369 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:482
     3382#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:483
     3383#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:501
    33703384msgid "Add to local addressbook"
    33713385msgstr ""
    33723386
    3373 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:489
    3374 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:524
     3387#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:508
     3388#: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:548
    33753389#, java-format
    33763390msgid "Expires in {0}"
    33773391msgstr ""
    33783392
    3379 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:491
    3380 #: ../java/src/net/i2p/router/web/helpers/NetDbRenderer.java:526