<?php
/* $Id$ */
namespace Mammut\Info\GeoIP;

(defined('MAMMUT') && (basename(__FILE__) != basename($_SERVER['PHP_SELF']))) or die('ACCESS DENIED');

use \Mammut\Format\Validator\IP;
/**
 * 
 * @author Stefan Daurer <s.daurer@q-spot.org>
 * @package Mammut\Info
 */
class GeoIP extends \Mammut\StrictObject {
	private static $instance = false;
	private $mode = 0;
	const MODE_FILE = 0;
	const MODE_EXT = 1;
	const MODE_SQL = 2;

	public static function getInstance() {
		if(!is_object(self::$instance))
			self::$instance = new GeoIP();
	}

	private function __construct() {
		if(extension_loaded('geoip'))
			$this->mode = self::MODE_EXT;
		else
			$this->mode = self::MODE_FILE;
	}

	public function getCountry($ip) {
		if(!IP::isValidIP($ip))
			throw new \InvalidArgumentException('$ip is not an valid ip string');
		if($this->mode == self::MODE_EXT) {
			return geoip_country_code_by_name($ip);
		}
	}

	public function getRegistry($ip) {
	    if(!\Mammut\Format\Validator\IP::isValidIPv4($ip)) {
			$regex = '/^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/';
			preg_match($regex, $ip, $match);
			// dated may 2008
			switch((int) $match[1]) {
				case 0:
					return 'IANA'; // IANA - Local Identification		RESERVED
				case 1:
					return 'IANA'; // IANA								UNALLOCATED
				case 2:
					return 'IANA'; // IANA								UNALLOCATED
				case 3:
					return 'GEC'; // General Electric Company			LEGACY
				case 4:
					return 'L3C'; // Level 3 Communications, Inc.		LEGACY
				case 5:
					return 'IANA'; // IANA								UNALLOCATED
				case 6:
					return 'AISC'; // Army Information Systems Center	LEGACY
				case 7:
					return 'ARIN'; // Administered by ARIN				LEGACY
				case 8:
					return 'L3C'; // Level 3 Communications, Inc.		LEGACY
				case 9:
					return 'IBM'; // IBM								LEGACY
				case 10:
					return 'PRIV'; // IANA - Private Use				RESERVED
				case 11:
					return 'DIIS'; // DoD Intel Information Systems	LEGACY
				case 12:
					return 'ATNT'; // AT&T Bell Laboratories			LEGACY
				case 13:
					return 'XC'; // Xerox Corporation				LEGACY
				case 14:
					return 'IANA'; // IANA								UNALLOCATED
				case 15:
					return 'HP'; // Hewlett-Packard Company			LEGACY
				case 16:
					return 'DEC'; // Digital Equipment Corporation	LEGACY
				case 17:
					return 'APPL'; // Apple Computer Inc.				LEGACY
				case 18:
					return 'MIT'; // MIT         LEGACY             
				case 19:
					return 'FORD'; // Ford Motor Company           LEGACY             
				case 20:
					return 'CSC'; // Computer Sciences Corporation                               LEGACY             
				case 21:
					return 'DDNRVN'; // DDN-RVN     LEGACY            
				case 22:
					return 'DISA'; // Defense Information Systems Agency                          LEGACY             
				case 23:
					return 'IANA'; // IANA               UNALLOCATED        
				case 24:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 25:
					return 'UKMOD'; // UK Ministry of Defence       LEGACY                 
				case 26:
					return 'DISA'; // Defense Information Systems Agency                          LEGACY             
				case 27:
					return 'IANA'; // IANA               UNALLOCATED        
				case 28:
					return 'DSI-North'; // DSI-North   LEGACY             
				case 29:
					return 'DISA'; // Defense Information Systems Agency                          LEGACY             
				case 30:
					return 'DISA'; // Defense Information Systems Agency                          LEGACY             
				case 31:
					return 'IANA'; // IANA               UNALLOCATED        
				case 32:
					return 'ATNT'; // AT&T Global Network Services LEGACY             
				case 33:
					return 'DLA Systems Automation Center'; // DLA Systems Automation Center                               LEGACY             
				case 34:
					return 'Halliburton Company'; // Halliburton Company          LEGACY             
				case 35:
					return 'MERIT Computer Network'; // MERIT Computer Network       LEGACY             
				case 36:
					return 'IANA'; // IANA               UNALLOCATED        
				case 37:
					return 'IANA'; // IANA               UNALLOCATED        
				case 38:
					return 'Performance Systems International'; // Performance Systems International                           LEGACY             
				case 39:
					return 'IANA'; // IANA               UNALLOCATED        
				case 40:
					return 'Eli Lily & Company'; // Eli Lily & Company           LEGACY             
				case 41:
					return 'AfriNIC'; // AfriNIC  whois.afrinic.net   ALLOCATED          
				case 42:
					return 'IANA'; // IANA               UNALLOCATED        
				case 43:
					return 'Japan Inet'; // Japan Inet  LEGACY              
				case 44:
					return 'Amateur Radio Digital Communications'; // Amateur Radio Digital Communications                        LEGACY             
				case 45:
					return 'Interop Show Network'; // Interop Show Network         LEGACY             
				case 46:
					return 'IANA'; // IANA               UNALLOCATED                
				case 47:
					return 'Bell-Northern Research'; // Bell-Northern Research       LEGACY             
				case 48:
					return 'Prudential Securities Inc.'; // Prudential Securities Inc.   LEGACY             
				case 49:
					return 'IANA'; // IANA               UNALLOCATED              
				case 50:
					return 'IANA'; // IANA               UNALLOCATED              
				case 51:
					return 'Deparment of Social Security of UK'; // Deparment of Social Security of UK                          LEGACY              
				case 52:
					return 'E.I. duPont de Nemours and Co., Inc.'; // E.I. duPont de Nemours and Co., Inc.                        LEGACY             
				case 53:
					return 'Cap Debis CCS'; // Cap Debis CCS                LEGACY             
				case 54:
					return 'Merck and Co., Inc.'; // Merck and Co., Inc.          LEGACY             
				case 55:
					return 'DoD Network Information Center'; // DoD Network Information Center                              LEGACY             
				case 56:
					return 'US Postal Service'; // US Postal Service            LEGACY             
				case 57:
					return 'SITA'; // SITA        LEGACY             
				case 58:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 59:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 60:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 61:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 62:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 63:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 64:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 65:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 66:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 67:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 68:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 69:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 70:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 71:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 72:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 73:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 74:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 75:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 76:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 77:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 78:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 79:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 80:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 81:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 82:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 83:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 84:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 85:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 86:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 87:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 88:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 89:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 90:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 91:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 92:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED        
				case 93:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED        
				case 94:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED        
				case 95:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED        
				case 96:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 97:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 98:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 99:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 100:
					return 'IANA'; // IANA               UNALLOCATED        
				case 101:
					return 'IANA'; // IANA               UNALLOCATED        
				case 102:
					return 'IANA'; // IANA               UNALLOCATED        
				case 103:
					return 'IANA'; // IANA               UNALLOCATED        
				case 104:
					return 'IANA'; // IANA               UNALLOCATED        
				case 105:
					return 'IANA'; // IANA               UNALLOCATED        
				case 106:
					return 'IANA'; // IANA               UNALLOCATED        
				case 107:
					return 'IANA'; // IANA               UNALLOCATED        
				case 108:
					return 'IANA'; // IANA               UNALLOCATED        
				case 109:
					return 'IANA'; // IANA               UNALLOCATED        
				case 110:
					return 'IANA'; // IANA               UNALLOCATED        
				case 111:
					return 'IANA'; // IANA               UNALLOCATED        
				case 112:
					return 'IANA'; // IANA               UNALLOCATED        
				case 113:
					return 'IANA'; // IANA               UNALLOCATED        
				case 114:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 115:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 116:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 117:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 118:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 119:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 120:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED        
				case 121:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 122:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 123:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 124:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 125:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 126:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 127:
					return 'LOOP'; // IANA - Loopback              RESERVED           [5]
				case 128:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 129:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 130:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 131:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 132:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 133:
					return 'APNIC'; // Administered by APNIC                   whois.apnic.net     LEGACY             
				case 134:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 135:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 136:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 137:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 138:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 139:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 140:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 141:
					return 'RIPE'; // Administered by RIPE NCC                whois.ripe.net      LEGACY             
				case 142:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 143:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 144:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 145:
					return 'RIPE'; // Administered by RIPE NCC                whois.ripe.net      LEGACY             
				case 146:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 147:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 148:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 149:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 150:
					return 'APNIC'; // Administered by APNIC                   whois.apnic.net     LEGACY             
				case 151:
					return 'RIPE'; // Administered by RIPE NCC                whois.ripe.net      LEGACY             
				case 152:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 153:
					return 'APNIC'; // Administered by APNIC                   whois.apnic.net     LEGACY             
				case 154:
					return 'AFNIC'; // Administered by AfriNIC                 whois.afrinic.net   LEGACY             
				case 155:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 156:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 157:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 158:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 159:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 160:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 161:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 162:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 163:
					return 'APNIC'; // Administered by APNIC                   whois.apnic.net     LEGACY             
				case 164:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 165:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 166:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 167:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 168:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 169:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             [6]
				case 170:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             
				case 171:
					return 'APNIC'; // Administered by APNIC                   whois.apnic.net     LEGACY             
				case 172:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             [7]
				case 173:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED        
				case 174:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED        
				case 175:
					return 'IANA'; // IANA               UNALLOCATED        
				case 176:
					return 'IANA'; // IANA               UNALLOCATED        
				case 177:
					return 'IANA'; // IANA               UNALLOCATED        
				case 178:
					return 'IANA'; // IANA               UNALLOCATED        
				case 179:
					return 'IANA'; // IANA               UNALLOCATED        
				case 180:
					return 'IANA'; // IANA               UNALLOCATED        
				case 181:
					return 'IANA'; // IANA               UNALLOCATED        
				case 182:
					return 'IANA'; // IANA               UNALLOCATED        
				case 183:
					return 'IANA'; // IANA               UNALLOCATED        
				case 184:
					return 'IANA'; // IANA               UNALLOCATED        
				case 185:
					return 'IANA'; // IANA               UNALLOCATED        
				case 186:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED        
				case 187:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED        
				case 188:
					return 'RIPE'; // Administered by RIPE NCC                whois.ripe.net      LEGACY        
				case 189:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED            
				case 190:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED          
				case 191:
					return 'LACNIC'; // Administered by LACNIC                  whois.lacnic.net    LEGACY             
				case 192:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             [8]
				case 193:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 194:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 195:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 196:
					return 'AFNIC'; // Administered by AfriNIC                 whois.afrinic.net   LEGACY             
				case 197:
					return 'IANA'; // IANA               UNALLOCATED        
				case 198:
					return 'ARIN'; // Administered by ARIN                    whois.arin.net      LEGACY             [9]
				case 199:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 200:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED          
				case 201:
					return 'LACNIC'; // LACNIC   whois.lacnic.net    ALLOCATED          
				case 202:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 203:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 204:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 205:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 206:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 207:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 208:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 209:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 210:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 211:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 212:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 213:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 214:
					return 'USDOD'; // US-DOD      LEGACY             
				case 215:
					return 'USDOD'; // US-DOD      LEGACY             
				case 216:
					return 'ARIN'; // ARIN     whois.arin.net      ALLOCATED          
				case 217:
					return 'RIPE'; // RIPE NCC whois.ripe.net      ALLOCATED          
				case 218:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 219:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 220:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 221:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 222:
					return 'APNIC'; // APNIC    whois.apnic.net     ALLOCATED          
				case 223:
					return 'IANA'; // IANA               UNALLOCATED        
				case 224:
					return 'MULTI'; // Multicast   RESERVED           [10]
				case 225:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 226:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 227:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 228:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 229:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 230:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 231:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 232:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 233:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 234:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 235:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 236:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 237:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 238:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 239:
					return 'MULTI'; // Multicast   RESERVED           [10]           
				case 240:
					return 'RESVD'; // Future use  RESERVED           [11]
				case 241:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 242:
					return 'RESVD'; // Future use  RESERVED           [11]          
				case 243:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 244:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 245:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 246:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 247:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 248:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 249:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 250:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 251:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 252:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 253:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 254:
					return 'RESVD'; // Future use  RESERVED           [11]           
				case 255:
					return 'RESVD'; // Future use  RESERVED           [11]
				default:
					return false; // unknown, should not happen
			}
		}
		elseif(\Mammut\Format\Validator\IP::isValidIPv6($ip)) {
			return false; // not avaible
		}
		else
			throw new \InvalidArgumentException('$ip is not an valid ip string');
	}
}