@ 2014-06-18T06:40:54Z <?php
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*/
namespace Nette;
use Nette;
/**
* The Nette Framework (http://nette.org)
*
* @author David Grudl
*/
class Framework
{
/** Nette Framework version identification */
const NAME = 'Nette Framework',
VERSION = '2.3-dev',
VERSION_ID = 20300,
REVISION = '$WCREV$ released on $WCDATE$';
/**
* Static class - cannot be instantiated.
*/
final public function __construct()
{
throw new StaticClassException;
}
}
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*/
namespace Nette\Forms;
use Nette;
/**
* Creates, validates and renders HTML forms.
*
* @author David Grudl
*
* @property mixed $action
* @property string $method
* @property-read array $groups
* @property Nette\Localization\ITranslator|NULL $translator
* @property-read bool $anchored
* @property-read ISubmitterControl|FALSE $submitted
* @property-read bool $success
* @property-read array $httpData
* @property-read array $errors
* @property-read Nette\Utils\Html $elementPrototype
* @property IFormRenderer $renderer
*/
class Form extends Container implements Nette\Utils\IHtmlString
{
/** validator */
const EQUAL = ':equal',
IS_IN = self::EQUAL,
NOT_EQUAL = ':notEqual',
FILLED = ':filled',
BLANK = ':blank',
REQUIRED = self::FILLED,
VALID = ':valid';
/** @deprecated CSRF protection */
const PROTECTION = Controls\CsrfProtection::PROTECTION;
// button
const SUBMITTED = ':submitted';
// text
const MIN_LENGTH = ':minLength',
MAX_LENGTH = ':maxLength',
LENGTH = ':length',
EMAIL = ':email',
URL = ':url',
PATTERN = ':pattern',
INTEGER = ':integer',
NUMERIC = ':integer',
FLOAT = ':float',
MIN = ':min',
MAX = ':max',
RANGE = ':range';
// multiselect
const COUNT = self::LENGTH;
// file upload
const MAX_FILE_SIZE = ':fileSize',
MIME_TYPE = ':mimeType',
IMAGE = ':image',
MAX_POST_SIZE = ':maxPostSize';
/** method */
const GET = 'get',
POST = 'post';
/** submitted data types */
const DATA_TEXT = 1;
const DATA_LINE = 2;
const DATA_FILE = 3;
const DATA_KEYS = 8;
/** @internal tracker ID */
const TRACKER_ID = '_form_';
/** @internal protection token ID */
const PROTECTOR_ID = '_token_';
/** @var array of function(Form $sender); Occurs when the form is submitted and successfully validated */
public $onSuccess;
/** @var array of function(Form $sender); Occurs when the form is submitted and is not valid */
public $onError;
/** @var array of function(Form $sender); Occurs when the form is submitted */
public $onSubmit;
/** @var mixed or NULL meaning: not detected yet */
private $submittedBy;
/** @var array */
private $httpData;
/** @var Nette\Utils\Html <form> element */
private $element;
/** @var IFormRenderer */
private $renderer;
/** @var Nette\Localization\ITranslator */
private $translator;
/** @var ControlGroup[] */
private $groups = array();
/** @var array */
private $errors = array();
/** @var Nette\Http\IRequest used only by standalone form */
public $httpRequest;
/**
* Form constructor.
* @param string
*/
public function __construct($name = NULL)
{
if ($name !== NULL) {
$this->getElementPrototype()->id = 'frm-' . $name;
$tracker = new Controls\HiddenField($name);
$tracker->setOmitted();
$this[self::TRACKER_ID] = $tracker;
}
parent::__construct(NULL, $name);
}
/**
* @return void
*/
protected function validateParent(Nette\ComponentModel\IContainer $parent)
{
parent::validateParent($parent);
$this->monitor(__CLASS__);
}
/**
* This method will be called when the component (or component's parent)
* becomes attached to a monitored object. Do not call this method yourself.
* @param Nette\ComponentModel\IComponent
* @return void
*/
protected function attached($obj)
{
if ($obj instanceof self) {
throw new Nette\InvalidStateException('Nested forms are forbidden.');
}
}
/**
* Returns self.
* @return Form
*/
public function getForm($need = TRUE)
{
return $this;
}
/**
* Sets form's action.
* @param mixed URI
* @return self
*/
public function setAction($url)
{
$this->getElementPrototype()->action = $url;
return $this;
}
/**
* Returns form's action.
* @return mixed URI
*/
public function getAction()
{
return $this->getElementPrototype()->action;
}
/**
* Sets form's method.
* @param string get | post
* @return self
*/
public function setMethod($method)
{
if ($this->httpData !== NULL) {
throw new Nette\InvalidStateException(__METHOD__ . '() must be called until the form is empty.');
}
$this->getElementPrototype()->method = strtolower($method);
return $this;
}
/**
* Returns form's method.
* @return string get | post
*/
public function getMethod()
{
return $this->getElementPrototype()->method;
}
/**
* Cross-Site Request Forgery (CSRF) form protection.
* @param string
* @return Controls\CsrfProtection
*/
public function addProtection($message = NULL)
{
return $this[self::PROTECTOR_ID] = new Controls\CsrfProtection($message);
}
/**
* Adds fieldset group to the form.
* @param string caption
* @param bool set this group as current
* @return ControlGroup
*/
public function addGroup($caption = NULL, $setAsCurrent = TRUE)
{
$group = new ControlGroup;
$group->setOption('label', $caption);
$group->setOption('visual', TRUE);
if ($setAsCurrent) {
$this->setCurrentGroup($group);
}
if (!is_scalar($caption) || isset($this->groups[$caption])) {
return $this->groups[] = $group;
} else {
return $this->groups[$caption] = $group;
}
}
/**
* Removes fieldset group from form.
* @param string|ControlGroup
* @return void
*/
public function removeGroup($name)
{
if (is_string($name) && isset($this->groups[$name])) {
$group = $this->groups[$name];
} elseif ($name instanceof ControlGroup && in_array($name, $this->groups, TRUE)) {
$group = $name;
$name = array_search($group, $this->groups, TRUE);
} else {
throw new Nette\InvalidArgumentException("Group not found in form '$this->name'");
}
foreach ($group->getControls() as $control) {
$control->getParent()->removeComponent($control);
}
unset($this->groups[$name]);
}
/**
* Returns all defined groups.
* @return ControlGroup[]
*/
public function getGroups()
{
return $this->groups;
}
/**
* Returns the specified group.
* @param string name
* @return ControlGroup
*/
public function getGroup($name)
{
return isset($this->groups[$name]) ? $this->groups[$name] : NULL;
}
/********************* translator ****************d*g**/
/**
* Sets translate adapter.
* @return self
*/
public function setTranslator(Nette\Localization\ITranslator $translator = NULL)
{
$this->translator = $translator;
return $this;
}
/**
* Returns translate adapter.
* @return Nette\Localization\ITranslator|NULL
*/
public function getTranslator()
{
return $this->translator;
}
/********************* submission ****************d*g**/
/**
* Tells if the form is anchored.
* @return bool
*/
public function isAnchored()
{
return TRUE;
}
/**
* Tells if the form was submitted.
* @return ISubmitterControl|FALSE submittor control
*/
public function isSubmitted()
{
if ($this->submittedBy === NULL) {
$this->getHttpData();
}
return $this->submittedBy;
}
/**
* Tells if the form was submitted and successfully validated.
* @return bool
*/
public function isSuccess()
{
return $this->isSubmitted() && $this->isValid();
}
/**
* Sets the submittor control.
* @return self
*/
public function setSubmittedBy(ISubmitterControl $by = NULL)
{
$this->submittedBy = $by === NULL ? FALSE : $by;
return $this;
}
/**
* Returns submitted HTTP data.
* @return mixed
*/
public function getHttpData($type = NULL, $htmlName = NULL)
{
if ($this->httpData === NULL) {
if (!$this->isAnchored()) {
throw new Nette\InvalidStateException('Form is not anchored and therefore can not determine whether it was submitted.');
}
$data = $this->receiveHttpData();
$this->httpData = (array) $data;
$this->submittedBy = is_array($data);
}
if ($htmlName === NULL) {
return $this->httpData;
}
return Helpers::extractHttpData($this->httpData, $htmlName, $type);
}
/**
* Fires submit/click events.
* @return void
*/
public function fireEvents()
{
if (!$this->isSubmitted()) {
return;
}
$this->validate();
if ($this->submittedBy instanceof ISubmitterControl) {
if ($this->isValid()) {
$this->submittedBy->onClick($this->submittedBy);
} else {
$this->submittedBy->onInvalidClick($this->submittedBy);
}
}
if ($this->onSuccess) {
foreach ($this->onSuccess as $handler) {
if (!$this->isValid()) {
$this->onError($this);
break;
}
$params = Nette\Utils\Callback::toReflection($handler)->getParameters();
$values = isset($params[1]) ? $this->getValues($params[1]->isArray()) : NULL;
Nette\Utils\Callback::invoke($handler, $this, $values);
}
} elseif (!$this->isValid()) {
$this->onError($this);
}
$this->onSubmit($this);
}
/**
* Internal: returns submitted HTTP data or NULL when form was not submitted.
* @return array|NULL
*/
protected function receiveHttpData()
{
$httpRequest = $this->getHttpRequest();
if (strcasecmp($this->getMethod(), $httpRequest->getMethod())) {
return;
}
if ($httpRequest->isMethod('post')) {
$data = Nette\Utils\Arrays::mergeTree($httpRequest->getPost(), $httpRequest->getFiles());
} else {
$data = $httpRequest->getQuery();
if (!$data) {
return;
}
}
if ($tracker = $this->getComponent(self::TRACKER_ID, FALSE)) {
if (!isset($data[self::TRACKER_ID]) || $data[self::TRACKER_ID] !== $tracker->getValue()) {
return;
}
}
return $data;
}
/********************* validation ****************d*g**/
public function validate(array $controls = NULL)
{
$this->cleanErrors();
if ($controls === NULL && $this->submittedBy instanceof ISubmitterControl) {
$controls = $this->submittedBy->getValidationScope();
}
$this->validateMaxPostSize();
parent::validate($controls);
}
public function validateMaxPostSize()
{
if (!$this->submittedBy || strcasecmp($this->getMethod(), 'POST') || empty($_SERVER['CONTENT_LENGTH'])) {
return;
}
$maxSize = ini_get('post_max_size');
$units = array('k' => 10, 'm' => 20, 'g' => 30);
if (isset($units[$ch = strtolower(substr($maxSize, -1))])) {
$maxSize <<= $units[$ch];
}
if ($maxSize > 0 && $maxSize < $_SERVER['CONTENT_LENGTH']) {
$this->addError(sprintf(Validator::$messages[self::MAX_FILE_SIZE], $maxSize));
}
}
/**
* Adds global error message.
* @param string error message
* @return void
*/
public function addError($message)
{
$this->errors[] = $message;
}
/**
* Returns global validation errors.
* @return array
*/
public function getErrors()
{
return array_unique(array_merge($this->errors, parent::getErrors()));
}
/**
* @return bool
*/
public function hasErrors()
{
return (bool) $this->getErrors();
}
/**
* @return void
*/
public function cleanErrors()
{
$this->errors = array();
}
/**
* Returns form's validation errors.
* @return array
*/
public function getOwnErrors()
{
return array_unique($this->errors);
}
/** @deprecated */
public function getAllErrors()
{
trigger_error(__METHOD__ . '() is deprecated; use getErrors() instead.', E_USER_DEPRECATED);
return $this->getErrors();
}
/********************* rendering ****************d*g**/
/**
* Returns form's HTML element template.
* @return Nette\Utils\Html
*/
public function getElementPrototype()
{
if (!$this->element) {
$this->element = Nette\Utils\Html::el('form');
$this->element->action = ''; // RFC 1808 -> empty uri means 'this'
$this->element->method = self::POST;
}
return $this->element;
}
/**
* Sets form renderer.
* @return self
*/
public function setRenderer(IFormRenderer $renderer = NULL)
{
$this->renderer = $renderer;
return $this;
}
/**
* Returns form renderer.
* @return IFormRenderer
*/
public function getRenderer()
{
if ($this->renderer === NULL) {
$this->renderer = new Rendering\DefaultFormRenderer;
}
return $this->renderer;
}
/**
* Renders form.
* @return void
*/
public function render()
{
$args = func_get_args();
array_unshift($args, $this);
echo call_user_func_array(array($this->getRenderer(), 'render'), $args);
}
/**
* Renders form to string.
* @return can throw exceptions? (hidden parameter)
* @return string
*/
public function __toString()
{
try {
return $this->getRenderer()->render($this);
} catch (\Exception $e) {
if (func_num_args()) {
throw $e;
}
trigger_error("Exception in " . __METHOD__ . "(): {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", E_USER_ERROR);
}
}
/********************* backend ****************d*g**/
/**
* @return Nette\Http\IRequest
*/
private function getHttpRequest()
{
if (!$this->httpRequest) {
$factory = new Nette\Http\RequestFactory;
$this->httpRequest = $factory->createHttpRequest();
}
return $this->httpRequest;
}
/**
* @return array
*/
public function getToggles()
{
$toggles = array();
foreach ($this->getControls() as $control) {
$toggles = $control->getRules()->getToggleStates($toggles);
}
return $toggles;
}
}
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.7 0.009 0.006 16.88 8.3.6 0.007 0.017 16.88 8.3.5 0.007 0.008 21.95 8.3.4 0.003 0.016 19.01 8.3.3 0.012 0.009 19.30 8.3.2 0.005 0.003 20.26 8.3.1 0.006 0.003 23.65 8.3.0 0.004 0.004 19.51 8.2.18 0.011 0.007 18.16 8.2.17 0.003 0.012 22.96 8.2.16 0.000 0.014 20.47 8.2.15 0.005 0.003 24.18 8.2.14 0.000 0.008 24.66 8.2.13 0.004 0.004 26.16 8.2.12 0.003 0.006 19.43 8.2.11 0.003 0.007 19.39 8.2.10 0.003 0.009 18.03 8.2.9 0.000 0.009 19.21 8.2.8 0.004 0.004 18.15 8.2.7 0.009 0.000 17.63 8.2.6 0.000 0.009 17.93 8.2.5 0.003 0.006 18.07 8.2.4 0.004 0.004 19.88 8.2.3 0.000 0.008 18.45 8.2.2 0.006 0.003 17.96 8.2.1 0.000 0.008 18.25 8.2.0 0.004 0.004 17.82 8.1.28 0.009 0.006 25.92 8.1.27 0.006 0.009 23.76 8.1.26 0.006 0.003 26.35 8.1.25 0.000 0.008 28.09 8.1.24 0.000 0.010 22.64 8.1.23 0.007 0.004 17.64 8.1.22 0.000 0.008 17.91 8.1.21 0.005 0.005 18.77 8.1.20 0.003 0.006 17.22 8.1.19 0.003 0.006 17.38 8.1.18 0.005 0.005 18.10 8.1.17 0.003 0.006 18.68 8.1.16 0.007 0.000 22.15 8.1.15 0.003 0.006 18.59 8.1.14 0.000 0.008 17.53 8.1.13 0.004 0.004 17.79 8.1.12 0.000 0.008 17.39 8.1.11 0.008 0.000 17.54 8.1.10 0.000 0.007 17.57 8.1.9 0.004 0.004 17.49 8.1.8 0.006 0.003 17.53 8.1.7 0.000 0.008 17.48 8.1.6 0.006 0.003 17.59 8.1.5 0.000 0.008 17.60 8.1.4 0.005 0.003 17.61 8.1.3 0.005 0.008 17.68 8.1.2 0.005 0.003 17.67 8.1.1 0.003 0.006 17.69 8.1.0 0.004 0.004 17.48 8.0.30 0.004 0.004 20.73 8.0.29 0.000 0.008 17.41 8.0.28 0.000 0.007 18.59 8.0.27 0.004 0.004 17.28 8.0.26 0.007 0.000 17.40 8.0.25 0.004 0.004 17.18 8.0.24 0.003 0.006 17.21 8.0.23 0.000 0.008 17.06 8.0.22 0.000 0.008 17.07 8.0.21 0.000 0.007 17.10 8.0.20 0.004 0.004 17.09 8.0.19 0.006 0.003 17.18 8.0.18 0.006 0.003 17.12 8.0.17 0.004 0.004 17.17 8.0.16 0.000 0.008 17.11 8.0.15 0.004 0.004 16.98 8.0.14 0.000 0.007 17.04 8.0.13 0.006 0.000 13.54 8.0.12 0.003 0.006 17.13 8.0.11 0.000 0.008 17.05 8.0.10 0.000 0.008 17.05 8.0.9 0.006 0.003 16.95 8.0.8 0.013 0.003 17.09 8.0.7 0.000 0.009 16.95 8.0.6 0.000 0.009 17.12 8.0.5 0.004 0.004 17.06 8.0.3 0.012 0.008 17.33 8.0.2 0.017 0.006 17.40 8.0.1 0.004 0.004 17.00 8.0.0 0.011 0.009 16.82 7.4.33 0.000 0.006 15.08 7.4.32 0.000 0.007 16.62 7.4.30 0.000 0.008 16.75 7.4.29 0.005 0.003 16.70 7.4.28 0.004 0.004 16.71 7.4.27 0.004 0.004 16.63 7.4.26 0.004 0.004 16.61 7.4.25 0.003 0.005 16.50 7.4.24 0.004 0.004 16.64 7.4.23 0.000 0.008 16.66 7.4.22 0.006 0.013 16.69 7.4.21 0.007 0.013 16.76 7.4.20 0.004 0.004 16.50 7.4.19 0.000 0.008 16.52 7.4.16 0.012 0.006 16.76 7.4.15 0.007 0.011 17.40 7.4.14 0.011 0.013 17.86 7.4.13 0.010 0.010 16.73 7.4.12 0.013 0.007 16.68 7.4.11 0.007 0.010 16.73 7.4.10 0.009 0.016 16.61 7.4.9 0.015 0.003 16.87 7.4.8 0.009 0.016 19.39 7.4.7 0.008 0.011 16.54 7.4.6 0.012 0.006 16.52 7.4.5 0.000 0.006 16.59 7.4.4 0.003 0.014 16.64 7.4.3 0.009 0.008 16.64 7.4.0 0.012 0.007 14.96 7.3.33 0.007 0.000 13.20 7.3.32 0.000 0.006 13.51 7.3.31 0.000 0.008 16.50 7.3.30 0.003 0.003 16.41 7.3.29 0.004 0.011 16.39 7.3.28 0.011 0.008 16.43 7.3.27 0.007 0.013 17.40 7.3.26 0.014 0.003 16.59 7.3.25 0.010 0.011 16.60 7.3.24 0.011 0.007 16.67 7.3.23 0.011 0.006 16.53 7.3.21 0.015 0.009 16.56 7.3.20 0.003 0.015 19.39 7.3.19 0.008 0.008 16.61 7.3.18 0.007 0.013 16.70 7.3.17 0.011 0.007 16.65 7.3.16 0.007 0.010 16.55 7.3.12 0.006 0.011 14.86 7.3.11 0.013 0.003 14.79 7.3.10 0.011 0.007 15.00 7.3.9 0.012 0.003 14.86 7.3.8 0.011 0.003 15.01 7.3.7 0.007 0.003 14.97 7.3.6 0.008 0.008 14.95 7.3.5 0.007 0.004 14.88 7.3.4 0.009 0.006 14.82 7.3.3 0.009 0.006 14.98 7.3.2 0.006 0.009 16.51 7.3.1 0.010 0.007 16.34 7.3.0 0.009 0.003 16.57 7.2.33 0.009 0.009 16.65 7.2.32 0.016 0.011 16.51 7.2.31 0.009 0.009 16.56 7.2.30 0.010 0.007 16.84 7.2.29 0.012 0.006 16.67 7.2.25 0.003 0.016 15.02 7.2.24 0.011 0.011 14.97 7.2.23 0.004 0.015 14.63 7.2.22 0.009 0.003 15.04 7.2.21 0.009 0.006 15.22 7.2.20 0.013 0.000 15.11 7.2.19 0.004 0.012 14.82 7.2.18 0.010 0.007 15.08 7.2.17 0.006 0.009 14.87 7.2.0 0.004 0.008 19.25 7.1.33 0.008 0.008 15.70 7.1.32 0.007 0.007 15.70 7.1.31 0.003 0.010 15.73 7.1.30 0.007 0.007 15.72 7.1.29 0.009 0.000 15.86 7.1.28 0.012 0.003 15.53 7.1.27 0.007 0.007 15.58 7.1.26 0.009 0.006 15.75 7.1.10 0.003 0.010 17.98 7.1.7 0.003 0.006 16.95 7.1.6 0.010 0.010 19.46 7.1.5 0.010 0.014 16.68 7.1.0 0.003 0.077 22.55 7.0.20 0.023 0.007 16.80 7.0.14 0.013 0.067 22.17 7.0.10 0.037 0.073 21.67 7.0.9 0.007 0.080 21.71 7.0.8 0.020 0.080 20.05 7.0.7 0.013 0.070 20.10 7.0.6 0.013 0.047 20.05 7.0.5 0.013 0.077 22.20 7.0.4 0.020 0.067 20.10 7.0.3 0.000 0.047 20.04 7.0.2 0.000 0.047 20.11 7.0.1 0.007 0.037 20.14 7.0.0 0.003 0.043 20.09 5.6.28 0.003 0.070 21.03 5.6.25 0.003 0.053 20.67 5.6.24 0.010 0.073 20.71 5.6.23 0.007 0.077 20.78 5.6.22 0.000 0.053 20.69 5.6.21 0.007 0.077 20.75 5.6.20 0.010 0.057 21.10 5.6.19 0.007 0.050 21.20 5.6.18 0.003 0.050 21.14 5.6.17 0.010 0.037 21.11 5.6.16 0.010 0.037 21.11 5.6.15 0.000 0.043 21.05 5.6.14 0.003 0.040 21.20 5.6.13 0.010 0.037 21.24 5.6.12 0.003 0.093 21.13 5.6.11 0.013 0.080 21.21 5.6.10 0.003 0.070 21.14 5.6.9 0.000 0.047 21.05 5.6.8 0.000 0.043 20.47 5.6.7 0.000 0.043 20.52 5.6.6 0.007 0.037 20.62 5.6.5 0.003 0.040 20.44 5.6.4 0.010 0.033 20.64 5.6.3 0.000 0.040 20.57 5.6.2 0.013 0.037 20.64 5.6.1 0.000 0.043 20.50 5.6.0 0.000 0.047 20.62 5.5.38 0.013 0.077 20.57 5.5.37 0.007 0.070 20.49 5.5.36 0.010 0.077 20.54 5.5.35 0.020 0.037 20.52 5.5.34 0.010 0.083 20.99 5.5.33 0.003 0.080 21.00 5.5.32 0.003 0.040 21.03 5.5.31 0.007 0.060 21.04 5.5.30 0.000 0.050 20.88 5.5.29 0.003 0.043 21.01 5.5.28 0.003 0.053 20.95 5.5.27 0.010 0.037 21.03 5.5.26 0.010 0.037 21.04 5.5.25 0.007 0.080 20.79 5.5.24 0.007 0.040 20.44 5.5.23 0.003 0.040 20.41 5.5.22 0.003 0.050 20.38 5.5.21 0.007 0.037 20.30 5.5.20 0.007 0.037 20.19 5.5.19 0.000 0.047 20.11 5.5.18 0.003 0.050 20.38 5.5.16 0.007 0.037 20.33 5.5.15 0.010 0.033 20.26 5.5.14 0.007 0.037 20.37 5.5.13 0.007 0.043 20.23 5.5.12 0.007 0.037 20.29 5.5.11 0.007 0.037 20.36 5.5.10 0.000 0.043 20.17 5.5.9 0.010 0.033 20.06 5.5.8 0.003 0.040 20.21 5.5.7 0.000 0.043 20.27 5.5.6 0.003 0.033 20.23 5.5.5 0.000 0.040 20.31 5.5.4 0.010 0.040 20.23 5.5.3 0.007 0.043 20.07 5.5.2 0.007 0.030 20.21 5.5.1 0.007 0.037 20.22 5.5.0 0.000 0.057 20.09 5.4.45 0.000 0.043 19.47 5.4.44 0.007 0.080 19.51 5.4.43 0.007 0.073 19.42 5.4.42 0.007 0.067 19.40 5.4.41 0.010 0.030 19.27 5.4.40 0.007 0.033 18.95 5.4.39 0.000 0.040 19.16 5.4.38 0.010 0.030 19.10 5.4.37 0.010 0.030 19.13 5.4.36 0.003 0.040 19.09 5.4.35 0.003 0.040 19.14 5.4.34 0.007 0.037 18.89 5.4.32 0.007 0.037 19.27 5.4.31 0.003 0.040 19.13 5.4.30 0.010 0.040 19.00 5.4.29 0.000 0.040 19.06 5.4.28 0.007 0.037 19.15 5.4.27 0.003 0.037 19.12 5.4.26 0.007 0.037 19.00 5.4.25 0.010 0.033 19.22 5.4.24 0.007 0.027 18.93 5.4.23 0.003 0.030 19.16 5.4.22 0.003 0.040 19.23 5.4.21 0.000 0.043 18.90 5.4.20 0.000 0.037 18.99 5.4.19 0.003 0.040 19.07 5.4.18 0.000 0.053 18.98 5.4.17 0.010 0.073 19.13 5.4.16 0.000 0.070 18.88 5.4.15 0.000 0.053 19.24 5.4.14 0.003 0.067 16.48 5.4.13 0.007 0.033 16.43 5.4.12 0.003 0.063 16.43 5.4.11 0.003 0.077 16.55 5.4.10 0.007 0.047 16.57 5.4.9 0.017 0.063 16.48 5.4.8 0.010 0.057 16.46 5.4.7 0.003 0.033 16.45 5.4.6 0.000 0.063 16.52 5.4.5 0.017 0.033 16.42 5.4.4 0.013 0.070 16.53 5.4.3 0.007 0.057 16.53 5.4.2 0.020 0.060 16.53 5.4.1 0.007 0.037 16.39 5.4.0 0.003 0.043 15.73 5.3.29 0.007 0.037 14.85 5.3.28 0.003 0.030 14.79 5.3.27 0.007 0.077 14.66 5.3.26 0.007 0.073 14.77 5.3.25 0.000 0.043 14.71 5.3.24 0.003 0.070 14.77 5.3.23 0.013 0.070 14.72 5.3.22 0.007 0.067 14.73 5.3.21 0.003 0.060 14.84 5.3.20 0.003 0.053 14.68 5.3.19 0.003 0.047 14.67 5.3.18 0.007 0.077 14.70 5.3.17 0.000 0.040 14.70 5.3.16 0.007 0.037 14.67 5.3.15 0.010 0.070 14.70 5.3.14 0.013 0.067 14.69 5.3.13 0.013 0.067 14.75 5.3.12 0.007 0.037 14.64 5.3.11 0.003 0.040 14.80 5.3.10 0.007 0.060 14.30 5.3.9 0.007 0.063 14.08 5.3.8 0.007 0.073 14.20 5.3.7 0.007 0.060 14.18 5.3.6 0.003 0.073 14.27 5.3.5 0.003 0.067 14.10 5.3.4 0.007 0.057 14.19 5.3.3 0.003 0.080 14.10 5.3.2 0.007 0.070 13.82 5.3.1 0.010 0.073 13.88 5.3.0 0.013 0.063 13.77
preferences:dark mode live preview
32.94 ms | 401 KiB | 5 Q