private static function install_spider($botname, $ips)
 {
     GWF_Numeric::setInputCharset('0123456789abcdef');
     GWF_Numeric::setOutputCharset('0123456789');
     $botname = '[' . $botname . ']';
     if (false === ($user = GWF_User::getByName($botname))) {
         if (false === ($user = self::insert_bot($botname))) {
             return false;
         }
     }
     $uid = $user->getID();
     $count = count($ips);
     echo "Installing Bot {$botname} (UID:{$uid}) with {$count} IPs...<br/>";
     $ranged = array();
     foreach ($ips as $i => $ip) {
         if (self::is_ip_range($ip)) {
             $ranged[] = self::get_ip_range($ip);
             unset($ips[$i]);
         } else {
             $ip6 = GWF_IP6::getIP(GWF_IP6::HEX_128, $ip);
             //				var_dump($ip6);
             $ips[$i] = GWF_Numeric::baseConvert($ip6, 16, 10);
         }
     }
     //		var_dump($ranged); echo '<br/>';
     $ranged = self::merge_ranges($ranged);
     //		var_dump($ranged); echo '<br/>';
     sort($ips);
     foreach ($ips as $ip) {
         self::merge_into_ranges($ranged, $ip);
     }
     $ranged = self::merge_ranges($ranged);
     echo "Total Ranges: " . count($ranged) . ".<br/>";
     GWF_Numeric::setInputCharset('0123456789');
     GWF_Numeric::setOutputCharset('0123456789abcdef');
     foreach ($ranged as $range) {
         list($min, $max) = $range;
         //			echo "Insert range $min-$max<br/>";
         if (false === GWF_Webspider::insertSpider($uid, self::convertToHex($min), self::convertToHex($max))) {
             echo GWF_HTML::err('ERR_DATABASE', __FILE__, __LINE__);
         }
     }
     //		var_dump($ranged);
 }