// Path: src/main/java/org/nanopub/extra/server/ServerInfo.java
// public static class ServerInfoException extends Exception {
// 
// 	private static final long serialVersionUID = 3903673740899289181L;
// 
// 	public ServerInfoException(String serverUrl) {
// 		super(serverUrl);
// 	}
// 
// }


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.nanopub.extra.server.ServerInfo.ServerInfoException;
					String url = serversToGetPeers.remove(0);
					if (serversPeersGot.containsKey(url)) continue;
					serversPeersGot.put(url, true);
					try {
						for (String peerUrl : NanopubServerUtils.loadPeerList(url)) {
							if (serverBlackList.containsKey(peerUrl)) continue;
							if (!serversContacted.containsKey(peerUrl)) {
								serversToContact.add(peerUrl);
							}
							if (!serversPeersGot.containsKey(peerUrl)) {
								serversToGetPeers.add(peerUrl);
							}
						}
					} catch (IOException ex) {
						// ignore
					}
				}
			}
		}
		return null;
	}

	private ServerInfo getServerInfo(String url) {
		if (System.currentTimeMillis() - serverInfoRefreshed > serverInfoRefreshInterval) {
			serverInfos.clear();
			serverInfoRefreshed = System.currentTimeMillis();
		}
		if (!serverInfos.containsKey(url)) {
			try {
				serverInfos.put(url, ServerInfo.load(url));
// Path: src/main/java/org/nanopub/extra/server/ServerInfo.java
// public static class ServerInfoException extends Exception {
// 
// 	private static final long serialVersionUID = 3903673740899289181L;
// 
// 	public ServerInfoException(String serverUrl) {
// 		super(serverUrl);
// 	}
// 
// }


// Path: src/main/java/org/nanopub/extra/server/ServerIterator.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.nanopub.extra.server.ServerInfo.ServerInfoException;

					String url = serversToGetPeers.remove(0);
					if (serversPeersGot.containsKey(url)) continue;
					serversPeersGot.put(url, true);
					try {
						for (String peerUrl : NanopubServerUtils.loadPeerList(url)) {
							if (serverBlackList.containsKey(peerUrl)) continue;
							if (!serversContacted.containsKey(peerUrl)) {
								serversToContact.add(peerUrl);
							}
							if (!serversPeersGot.containsKey(peerUrl)) {
								serversToGetPeers.add(peerUrl);
							}
						}
					} catch (IOException ex) {
						// ignore
					}
				}
			}
		}
		return null;
	}

	private ServerInfo getServerInfo(String url) {
		if (System.currentTimeMillis() - serverInfoRefreshed > serverInfoRefreshInterval) {
			serverInfos.clear();
			serverInfoRefreshed = System.currentTimeMillis();
		}
		if (!serverInfos.containsKey(url)) {
			try {
				serverInfos.put(url, ServerInfo.load(url));
			} catch (ServerInfoException ex) {