diff --git a/.gitignore b/.gitignore index ae63693170..4749dea19d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,10 +19,12 @@ _darcs/* CVS/* .svn/* RCS/* +*.backup* # kdevelop .kdev *.kdev4 +*.kate-swp # Lokalize *lokalize* diff --git a/.tx/config b/.tx/config deleted file mode 100644 index b51860f8b2..0000000000 --- a/.tx/config +++ /dev/null @@ -1,182 +0,0 @@ -[main] -host = https://www.transifex.net - -[owncloud.core] -file_filter = l10n//core.po -host = http://www.transifex.net -source_file = l10n/templates/core.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/core.po -trans.ca = l10n/ca/core.po -trans.cs_CZ = l10n/cs_CZ/core.po -trans.da = l10n/da/core.po -trans.de = l10n/de/core.po -trans.el = l10n/el/core.po -trans.es = l10n/es/core.po -trans.et_EE = l10n/et_EE/core.po -trans.fr = l10n/fr/core.po -trans.id = l10n/id/core.po -trans.it = l10n/it/core.po -trans.lb = l10n/lb/core.po -trans.ms_MY = l10n/ms_MY/core.po -trans.nb_NO = l10n/nb_NO/core.po -trans.nl = l10n/nl/core.po -trans.pl = l10n/pl/core.po -trans.pt_BR = l10n/pt_BR/core.po -trans.pt_PT = l10n/pt_PT/core.po -trans.ro = l10n/ro/core.po -trans.ru = l10n/ru/core.po -trans.sr = l10n/sr/core.po -trans.sr@latin = l10n/sr@latin/core.po -trans.sv = l10n/sv/core.po -trans.zh_CN = l10n/zh_CN/core.po - -[owncloud.settings] -file_filter = l10n//settings.po -host = http://www.transifex.net -source_file = l10n/templates/settings.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/settings.po -trans.ca = l10n/ca/settings.po -trans.cs_CZ = l10n/cs_CZ/settings.po -trans.da = l10n/da/settings.po -trans.de = l10n/de/settings.po -trans.el = l10n/el/settings.po -trans.es = l10n/es/settings.po -trans.et_EE = l10n/et_EE/settings.po -trans.fr = l10n/fr/settings.po -trans.id = l10n/id/settings.po -trans.it = l10n/it/settings.po -trans.lb = l10n/lb/settings.po -trans.ms_MY = l10n/ms_MY/settings.po -trans.nb_NO = l10n/nb_NO/settings.po -trans.nl = l10n/nl/settings.po -trans.pl = l10n/pl/settings.po -trans.pt_BR = l10n/pt_BR/settings.po -trans.pt_PT = l10n/pt_PT/settings.po -trans.ro = l10n/ro/settings.po -trans.ru = l10n/ru/settings.po -trans.sr = l10n/sr/settings.po -trans.sr@latin = l10n/sr@latin/settings.po -trans.sv = l10n/sv/settings.po -trans.zh_CN = l10n/zh_CN/settings.po - -[owncloud.files] -file_filter = translations/owncloud.files/.po -host = http://www.transifex.net -source_file = l10n/templates/files.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/files.po -trans.ca = l10n/ca/files.po -trans.cs_CZ = l10n/cs_CZ/files.po -trans.da = l10n/da/files.po -trans.de = l10n/de/files.po -trans.el = l10n/el/files.po -trans.es = l10n/es/files.po -trans.et_EE = l10n/et_EE/files.po -trans.fr = l10n/fr/files.po -trans.id = l10n/id/files.po -trans.it = l10n/it/files.po -trans.lb = l10n/lb/files.po -trans.ms_MY = l10n/ms_MY/files.po -trans.nb_NO = l10n/nb_NO/files.po -trans.nl = l10n/nl/files.po -trans.pl = l10n/pl/files.po -trans.pt_BR = l10n/pt_BR/files.po -trans.pt_PT = l10n/pt_PT/files.po -trans.ro = l10n/ro/files.po -trans.ru = l10n/ru/files.po -trans.sr = l10n/sr/files.po -trans.sr@latin = l10n/sr@latin/files.po -trans.sv = l10n/sv/files.po -trans.zh_CN = l10n/zh_CN/files.po - -[owncloud.media] -file_filter = translations/owncloud.media/.po -host = http://www.transifex.net -source_file = l10n/templates/media.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/media.po -trans.ca = l10n/ca/media.po -trans.cs_CZ = l10n/cs_CZ/media.po -trans.da = l10n/da/media.po -trans.de = l10n/de/media.po -trans.el = l10n/el/media.po -trans.es = l10n/es/media.po -trans.et_EE = l10n/et_EE/media.po -trans.fr = l10n/fr/media.po -trans.id = l10n/id/media.po -trans.it = l10n/it/media.po -trans.lb = l10n/lb/media.po -trans.ms_MY = l10n/ms_MY/media.po -trans.nb_NO = l10n/nb_NO/media.po -trans.nl = l10n/nl/media.po -trans.pl = l10n/pl/media.po -trans.pt_BR = l10n/pt_BR/media.po -trans.pt_PT = l10n/pt_PT/media.po -trans.ro = l10n/ro/media.po -trans.ru = l10n/ru/media.po -trans.sr = l10n/sr/media.po -trans.sr@latin = l10n/sr@latin/media.po -trans.sv = l10n/sv/media.po -trans.zh_CN = l10n/zh_CN/media.po - -[owncloud.calendar] -file_filter = l10n//calendar.po -host = http://www.transifex.net -source_file = l10n/templates/calendar.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/calendar.po -trans.ca = l10n/ca/calendar.po -trans.cs_CZ = l10n/cs_CZ/calendar.po -trans.da = l10n/da/calendar.po -trans.de = l10n/de/calendar.po -trans.el = l10n/el/calendar.po -trans.es = l10n/es/calendar.po -trans.et_EE = l10n/et_EE/calendar.po -trans.fr = l10n/fr/calendar.po -trans.id = l10n/id/calendar.po -trans.it = l10n/it/calendar.po -trans.lb = l10n/lb/calendar.po -trans.ms_MY = l10n/ms_MY/calendar.po -trans.nb_NO = l10n/nb_NO/calendar.po -trans.nl = l10n/nl/calendar.po -trans.pl = l10n/pl/calendar.po -trans.pt_BR = l10n/pt_BR/calendar.po -trans.pt_PT = l10n/pt_PT/calendar.po -trans.ro = l10n/ro/calendar.po -trans.ru = l10n/ru/calendar.po -trans.sr = l10n/sr/calendar.po -trans.sr@latin = l10n/sr@latin/calendar.po -trans.sv = l10n/sv/calendar.po -trans.zh_CN = l10n/zh_CN/calendar.po - -[owncloud.contacts] -file_filter = translations/owncloud.contacts/.po -host = http://www.transifex.net -source_file = l10n/templates/contacts.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/contacts.po -trans.ca = l10n/ca/contacts.po -trans.cs_CZ = l10n/cs_CZ/contacts.po -trans.da = l10n/da/contacts.po -trans.de = l10n/de/contacts.po -trans.el = l10n/el/contacts.po -trans.es = l10n/es/contacts.po -trans.et_EE = l10n/et_EE/contacts.po -trans.fr = l10n/fr/contacts.po -trans.id = l10n/id/contacts.po -trans.it = l10n/it/contacts.po -trans.lb = l10n/lb/contacts.po -trans.ms_MY = l10n/ms_MY/contacts.po -trans.nb_NO = l10n/nb_NO/contacts.po -trans.nl = l10n/nl/contacts.po -trans.pl = l10n/pl/contacts.po -trans.pt_BR = l10n/pt_BR/contacts.po -trans.pt_PT = l10n/pt_PT/contacts.po -trans.ro = l10n/ro/contacts.po -trans.ru = l10n/ru/contacts.po -trans.sr = l10n/sr/contacts.po -trans.sr@latin = l10n/sr@latin/contacts.po -trans.sv = l10n/sv/contacts.po -trans.zh_CN = l10n/zh_CN/contacts.po diff --git a/3rdparty/MDB2/Driver/Datatype/Common.php b/3rdparty/MDB2/Driver/Datatype/Common.php index 3b02c86acd..dd7f1c7e0a 100644 --- a/3rdparty/MDB2/Driver/Datatype/Common.php +++ b/3rdparty/MDB2/Driver/Datatype/Common.php @@ -1412,7 +1412,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common if (PEAR::isError($db)) { return $db; } - if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { + if (isset($db->function) && is_object($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { return $db->function->now('timestamp'); } return 'CURRENT_TIMESTAMP'; diff --git a/3rdparty/MDB2/Driver/Datatype/oci8.php b/3rdparty/MDB2/Driver/Datatype/oci8.php new file mode 100644 index 0000000000..4d2e792a80 --- /dev/null +++ b/3rdparty/MDB2/Driver/Datatype/oci8.php @@ -0,0 +1,499 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Datatype/Common.php'; + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Datatype_oci8 extends MDB2_Driver_Datatype_Common +{ + // {{{ _baseConvertResult() + + /** + * general type conversion method + * + * @param mixed $value refernce to a value to be converted + * @param string $type specifies which type to convert to + * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text + * @return object a MDB2 error on failure + * @access protected + */ + function _baseConvertResult($value, $type, $rtrim = true) + { + if (null === $value) { + return null; + } + switch ($type) { + case 'text': + if (is_object($value) && is_a($value, 'OCI-Lob')) { + //LOB => fetch into variable + $clob = $this->_baseConvertResult($value, 'clob', $rtrim); + if (!PEAR::isError($clob) && is_resource($clob)) { + $clob_value = ''; + while (!feof($clob)) { + $clob_value .= fread($clob, 8192); + } + $this->destroyLOB($clob); + } + $value = $clob_value; + } + if ($rtrim) { + $value = rtrim($value); + } + return $value; + case 'date': + return substr($value, 0, strlen('YYYY-MM-DD')); + case 'time': + return substr($value, strlen('YYYY-MM-DD '), strlen('HH:MI:SS')); + } + return parent::_baseConvertResult($value, $type, $rtrim); + } + + // }}} + // {{{ getTypeDeclaration() + + /** + * Obtain DBMS specific SQL code portion needed to declare an text type + * field to be used in statements like CREATE TABLE. + * + * @param array $field associative array with the name of the properties + * of the field being declared as array indexes. Currently, the types + * of supported field properties are as follows: + * + * length + * Integer value that determines the maximum length of the text + * field. If this argument is missing the field should be + * declared to have the longest length allowed by the DBMS. + * + * default + * Text value to be used as default for this field. + * + * notnull + * Boolean flag that indicates whether this field is constrained + * to not be set to null. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field. + * @access public + */ + function getTypeDeclaration($field) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + switch ($field['type']) { + case 'text': + $length = !empty($field['length']) + ? $field['length'] : $db->options['default_text_field_length']; + $fixed = !empty($field['fixed']) ? $field['fixed'] : false; + return $fixed ? 'CHAR('.$length.')' : 'VARCHAR2('.$length.')'; + case 'clob': + return 'CLOB'; + case 'blob': + return 'BLOB'; + case 'integer': + if (!empty($field['length'])) { + switch((int)$field['length']) { + case 1: $digit = 3; break; + case 2: $digit = 5; break; + case 3: $digit = 8; break; + case 4: $digit = 10; break; + case 5: $digit = 13; break; + case 6: $digit = 15; break; + case 7: $digit = 17; break; + case 8: $digit = 20; break; + default: $digit = 10; + } + return 'NUMBER('.$digit.')'; + } + return 'INT'; + case 'boolean': + return 'NUMBER(1)'; + case 'date': + case 'time': + case 'timestamp': + return 'DATE'; + case 'float': + return 'NUMBER'; + case 'decimal': + $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; + return 'NUMBER(*,'.$scale.')'; + } + } + + // }}} + // {{{ _quoteCLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteCLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_CLOB()'; + } + + // }}} + // {{{ _quoteBLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteBLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_BLOB()'; + } + + // }}} + // {{{ _quoteDate() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteDate($value, $quote, $escape_wildcards) + { + return $this->_quoteText("$value 00:00:00", $quote, $escape_wildcards); + } + + // }}} + // {{{ _quoteTimestamp() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + //function _quoteTimestamp($value, $quote, $escape_wildcards) + //{ + // return $this->_quoteText($value, $quote, $escape_wildcards); + //} + + // }}} + // {{{ _quoteTime() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteTime($value, $quote, $escape_wildcards) + { + return $this->_quoteText("0001-01-01 $value", $quote, $escape_wildcards); + } + + // }}} + // {{{ writeLOBToFile() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @param string $file name of the file into which the LOb should be fetched + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function writeLOBToFile($lob, $file) + { + if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) { + if ($match[1] == 'file://') { + $file = $match[2]; + } + } + $lob_data = stream_get_meta_data($lob); + $lob_index = $lob_data['wrapper_data']->lob_index; + $result = $this->lobs[$lob_index]['resource']->writetofile($file); + $this->lobs[$lob_index]['resource']->seek(0); + if (!$result) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to write LOB to file', __FUNCTION__); + } + return MDB2_OK; + } + + // }}} + // {{{ _retrieveLOB() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function _retrieveLOB(&$lob) + { + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + if (!$lob['loaded'] +# && !method_exists($lob['resource'], 'read') + ) { + $lob['value'] = $lob['resource']->load(); + $lob['resource']->seek(0); + } + $lob['loaded'] = true; + return MDB2_OK; + } + + // }}} + // {{{ _readLOB() + + /** + * Read data from large object input stream. + * + * @param array $lob array + * @param blob $data reference to a variable that will hold data to be + * read from the large object input stream + * @param int $length integer value that indicates the largest ammount of + * data to be read from the large object input stream. + * @return mixed length on success, a MDB2 error on failure + * @access protected + */ + function _readLOB($lob, $length) + { + if ($lob['loaded']) { + return parent::_readLOB($lob, $length); + } + + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + $data = $lob['resource']->read($length); + if (!is_string($data)) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to read LOB', __FUNCTION__); + } + return $data; + } + + // }}} + // {{{ patternEscapeString() + + /** + * build string to define escape pattern string + * + * @access public + * + * + * @return string define escape pattern + */ + function patternEscapeString() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + return " ESCAPE '". $db->string_quoting['escape_pattern'] ."'"; + } + + // }}} + // {{{ _mapNativeDatatype() + + /** + * Maps a native array description of a field to a MDB2 datatype and length + * + * @param array $field native field description + * @return array containing the various possible types, length, sign, fixed + * @access public + */ + function _mapNativeDatatype($field) + { + $db_type = strtolower($field['type']); + $type = array(); + $length = $unsigned = $fixed = null; + if (!empty($field['length'])) { + $length = $field['length']; + } + switch ($db_type) { + case 'integer': + case 'pls_integer': + case 'binary_integer': + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + break; + case 'varchar': + case 'varchar2': + case 'nvarchar2': + $fixed = false; + case 'char': + case 'nchar': + $type[] = 'text'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + if ($fixed !== false) { + $fixed = true; + } + break; + case 'date': + case 'timestamp': + $type[] = 'timestamp'; + $length = null; + break; + case 'float': + $type[] = 'float'; + break; + case 'number': + if (!empty($field['scale'])) { + $type[] = 'decimal'; + $length = $length.','.$field['scale']; + } else { + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + } + break; + case 'long': + $type[] = 'text'; + case 'clob': + case 'nclob': + $type[] = 'clob'; + break; + case 'blob': + case 'raw': + case 'long raw': + case 'bfile': + $type[] = 'blob'; + $length = null; + break; + case 'rowid': + case 'urowid': + default: + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'unknown database attribute type: '.$db_type, __FUNCTION__); + } + + if ((int)$length <= 0) { + $length = null; + } + + return array($type, $length, $unsigned, $fixed); + } +} + +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/oci8.php b/3rdparty/MDB2/Driver/Function/oci8.php new file mode 100644 index 0000000000..757d17fcb8 --- /dev/null +++ b/3rdparty/MDB2/Driver/Function/oci8.php @@ -0,0 +1,187 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Function/Common.php'; + +/** + * MDB2 oci8 driver for the function modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Function_oci8 extends MDB2_Driver_Function_Common +{ + // {{{ executeStoredProc() + + /** + * Execute a stored procedure and return any results + * + * @param string $name string that identifies the function to execute + * @param mixed $params array that contains the paramaters to pass the stored proc + * @param mixed $types array that contains the types of the columns in + * the result set + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'EXEC '.$name; + $query .= $params ? '('.implode(', ', $params).')' : '()'; + return $db->query($query, $types, $result_class, $result_wrap_class); + } + + // }}} + // {{{ functionTable() + + /** + * return string for internal table used when calling only a function + * + * @return string for internal table used when calling only a function + * @access public + */ + function functionTable() + { + return ' FROM dual'; + } + + // }}} + // {{{ now() + + /** + * Return string to call a variable with the current timestamp inside an SQL statement + * There are three special variables for current date and time: + * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) + * - CURRENT_DATE (date, DATE type) + * - CURRENT_TIME (time, TIME type) + * + * @return string to call a variable with the current timestamp + * @access public + */ + function now($type = 'timestamp') + { + switch ($type) { + case 'date': + case 'time': + case 'timestamp': + default: + return 'TO_CHAR(CURRENT_TIMESTAMP, \'YYYY-MM-DD HH24:MI:SS\')'; + } + } + + // }}} + // {{{ unixtimestamp() + + /** + * return string to call a function to get the unix timestamp from a iso timestamp + * + * @param string $expression + * + * @return string to call a variable with the timestamp + * @access public + */ + function unixtimestamp($expression) + { + $utc_offset = 'CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP) AS DATE) - CAST(SYSTIMESTAMP AS DATE)'; + $epoch_date = 'to_date(\'19700101\', \'YYYYMMDD\')'; + return '(CAST('.$expression.' AS DATE) - '.$epoch_date.' + '.$utc_offset.') * 86400 seconds'; + } + + // }}} + // {{{ substring() + + /** + * return string to call a function to get a substring inside an SQL statement + * + * @return string to call a function to get a substring + * @access public + */ + function substring($value, $position = 1, $length = null) + { + if (null !== $length) { + return "SUBSTR($value, $position, $length)"; + } + return "SUBSTR($value, $position)"; + } + + // }}} + // {{{ random() + + /** + * return string to call a function to get random value inside an SQL statement + * + * @return return string to generate float between 0 and 1 + * @access public + */ + function random() + { + return 'dbms_random.value'; + } + + // }}}} + // {{{ guid() + + /** + * Returns global unique identifier + * + * @return string to get global unique identifier + * @access public + */ + function guid() + { + return 'SYS_GUID()'; + } + + // }}}} +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Manager/oci8.php b/3rdparty/MDB2/Driver/Manager/oci8.php new file mode 100644 index 0000000000..90ae8eb230 --- /dev/null +++ b/3rdparty/MDB2/Driver/Manager/oci8.php @@ -0,0 +1,1340 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Manager/Common.php'; + +/** + * MDB2 oci8 driver for the management modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Manager_oci8 extends MDB2_Driver_Manager_Common +{ + // {{{ createDatabase() + + /** + * create a new database + * + * @param string $name name of the database that should be created + * @param array $options array with charset, collation info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createDatabase($name, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + $password = $db->dsn['password'] ? $db->dsn['password'] : $name; + $tablespace = $db->options['default_tablespace'] + ? ' DEFAULT TABLESPACE '.$db->options['default_tablespace'] : ''; + + $query = 'CREATE USER '.$username.' IDENTIFIED BY '.$password.$tablespace; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + return $result; + } + $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '.$username; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + $query = 'DROP USER '.$username.' CASCADE'; + $result2 = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result2)) { + return $db->raiseError($result2, null, null, + 'could not setup the database user', __FUNCTION__); + } + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ alterDatabase() + + /** + * alter an existing database + * + * IMPORTANT: the safe way to change the db charset is to do a full import/export! + * If - and only if - the new character set is a strict superset of the current + * character set, it is possible to use the ALTER DATABASE CHARACTER SET to + * expedite the change in the database character set. + * + * @param string $name name of the database that is intended to be changed + * @param array $options array with name, charset info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function alterDatabase($name, $options = array()) + { + //disabled + //return parent::alterDatabase($name, $options); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!empty($options['name'])) { + $query = 'ALTER DATABASE ' . $db->quoteIdentifier($name, true) + .' RENAME GLOBAL_NAME TO ' . $db->quoteIdentifier($options['name'], true); + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($options['charset'])) { + $queries = array(); + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP MOUNT'; + $queries[] = 'ALTER SYSTEM ENABLE RESTRICTED SESSION'; + $queries[] = 'ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0'; + $queries[] = 'ALTER DATABASE OPEN'; + $queries[] = 'ALTER DATABASE CHARACTER SET ' . $options['charset']; + $queries[] = 'ALTER DATABASE NATIONAL CHARACTER SET ' . $options['charset']; + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP'; + + foreach ($queries as $query) { + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + return MDB2_OK; + } + + // }}} + // {{{ dropDatabase() + + /** + * drop an existing database + * + * @param object $db database object that is extended by this class + * @param string $name name of the database that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropDatabase($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + return $db->standaloneQuery('DROP USER '.$username.' CASCADE', null, true); + } + + + // }}} + // {{{ _makeAutoincrement() + + /** + * add an autoincrement sequence + trigger + * + * @param string $name name of the PK field + * @param string $table name of the table + * @param string $start start value for the sequence + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _makeAutoincrement($name, $table, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table_uppercase = strtoupper($table); + $index_name = $table_uppercase . '_AI_PK'; + $definition = array( + 'primary' => true, + 'fields' => array($name => true), + ); + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result = $this->createConstraint($table, $index_name, $definition); + $db->setOption('idxname_format', $idxname_format); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'primary key for autoincrement PK could not be created', __FUNCTION__); + } + + if (null === $start) { + $db->beginTransaction(); + $query = 'SELECT MAX(' . $db->quoteIdentifier($name, true) . ') FROM ' . $db->quoteIdentifier($table, true); + $start = $this->db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + ++$start; + $result = $this->createSequence($table, $start); + $db->commit(); + } else { + $result = $this->createSequence($table, $start); + } + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be created', __FUNCTION__); + } + $seq_name = $db->getSequenceName($table); + $trigger_name = $db->quoteIdentifier($table_uppercase . '_AI_PK', true); + $seq_name_quoted = $db->quoteIdentifier($seq_name, true); + $table = $db->quoteIdentifier($table, true); + $name = $db->quoteIdentifier($name, true); + $trigger_sql = ' +CREATE TRIGGER '.$trigger_name.' + BEFORE INSERT + ON '.$table.' + FOR EACH ROW +DECLARE + last_Sequence NUMBER; + last_InsertID NUMBER; +BEGIN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + IF (:NEW.'.$name.' IS NULL OR :NEW.'.$name.' = 0) THEN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + ELSE + SELECT NVL(Last_Number, 0) INTO last_Sequence + FROM User_Sequences + WHERE UPPER(Sequence_Name) = UPPER(\''.$seq_name.'\'); + SELECT :NEW.'.$name.' INTO last_InsertID FROM DUAL; + WHILE (last_InsertID > last_Sequence) LOOP + SELECT '.$seq_name_quoted.'.NEXTVAL INTO last_Sequence FROM DUAL; + END LOOP; + END IF; +END; +'; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ _dropAutoincrement() + + /** + * drop an existing autoincrement sequence + trigger + * + * @param string $table name of the table + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropAutoincrement($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table = strtoupper($table); + $trigger_name = $table . '_AI_PK'; + $trigger_name_quoted = $db->quote($trigger_name, 'text'); + $query = 'SELECT trigger_name FROM user_triggers'; + $query.= ' WHERE trigger_name='.$trigger_name_quoted.' OR trigger_name='.strtoupper($trigger_name_quoted); + $trigger = $db->queryOne($query); + if (PEAR::isError($trigger)) { + return $trigger; + } + + if ($trigger) { + $trigger_name = $db->quoteIdentifier($table . '_AI_PK', true); + $trigger_sql = 'DROP TRIGGER ' . $trigger_name; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'trigger for autoincrement PK could not be dropped', __FUNCTION__); + } + + $result = $this->dropSequence($table); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be dropped', __FUNCTION__); + } + + $index_name = $table . '_AI_PK'; + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result1 = $this->dropConstraint($table, $index_name); + $db->setOption('idxname_format', $idxname_format); + $result2 = $this->dropConstraint($table, $index_name); + if (PEAR::isError($result1) && PEAR::isError($result2)) { + return $db->raiseError($result1, null, null, + 'primary key for autoincrement PK could not be dropped', __FUNCTION__); + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _getTemporaryTableQuery() + + /** + * A method to return the required SQL string that fits between CREATE ... TABLE + * to create the table as a temporary table. + * + * @return string The string required to be placed between "CREATE" and "TABLE" + * to generate a temporary table, if possible. + */ + function _getTemporaryTableQuery() + { + return 'GLOBAL TEMPORARY'; + } + + // }}} + // {{{ _getAdvancedFKOptions() + + /** + * Return the FOREIGN KEY query section dealing with non-standard options + * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... + * + * @param array $definition + * @return string + * @access protected + */ + function _getAdvancedFKOptions($definition) + { + $query = ''; + if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) { + $query .= ' ON DELETE '.$definition['ondelete']; + } + if (!empty($definition['deferrable'])) { + $query .= ' DEFERRABLE'; + } else { + $query .= ' NOT DEFERRABLE'; + } + if (!empty($definition['initiallydeferred'])) { + $query .= ' INITIALLY DEFERRED'; + } else { + $query .= ' INITIALLY IMMEDIATE'; + } + return $query; + } + + // }}} + // {{{ createTable() + + /** + * create a new table + * + * @param string $name Name of the database that should be created + * @param array $fields Associative array that contains the definition of each field of the new table + * The indexes of the array entries are the names of the fields of the table an + * the array entry values are associative arrays like those that are meant to be + * passed with the field definitions to get[Type]Declaration() functions. + * + * Example + * array( + * + * 'id' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * 'notnull' => 1 + * 'default' => 0 + * ), + * 'name' => array( + * 'type' => 'text', + * 'length' => 12 + * ), + * 'password' => array( + * 'type' => 'text', + * 'length' => 12 + * ) + * ); + * @param array $options An associative array of table options: + * array( + * 'comment' => 'Foo', + * 'temporary' => true|false, + * ); + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createTable($name, $fields, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = parent::createTable($name, $fields, $options); + if (!PEAR::isError($result)) { + foreach ($fields as $field_name => $field) { + if (!empty($field['autoincrement'])) { + $result = $this->_makeAutoincrement($field_name, $name); + } + } + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ dropTable() + + /** + * drop an existing table + * + * @param string $name name of the table that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = $this->_dropAutoincrement($name); + if (!PEAR::isError($result)) { + $result = parent::dropTable($name); + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ truncateTable() + + /** + * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, + * it falls back to a DELETE FROM TABLE query) + * + * @param string $name name of the table that should be truncated + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function truncateTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $name = $db->quoteIdentifier($name, true); + return $db->exec("TRUNCATE TABLE $name"); + } + + // }}} + // {{{ vacuum() + + /** + * Optimize (vacuum) all the tables in the db (or only the specified table) + * and optionally run ANALYZE. + * + * @param string $table table name (all the tables if empty) + * @param array $options an array with driver-specific options: + * - timeout [int] (in seconds) [mssql-only] + * - analyze [boolean] [pgsql and mysql] + * - full [boolean] [pgsql-only] + * - freeze [boolean] [pgsql-only] + * + * @return mixed MDB2_OK success, a MDB2 error on failure + * @access public + */ + function vacuum($table = null, $options = array()) + { + // not needed in Oracle + return MDB2_OK; + } + + // }}} + // {{{ alterTable() + + /** + * alter an existing table + * + * @param string $name name of the table that is intended to be changed. + * @param array $changes associative array that contains the details of each type + * of change that is intended to be performed. The types of + * changes that are currently supported are defined as follows: + * + * name + * + * New name for the table. + * + * add + * + * Associative array with the names of fields to be added as + * indexes of the array. The value of each entry of the array + * should be set to another associative array with the properties + * of the fields to be added. The properties of the fields should + * be the same as defined by the MDB2 parser. + * + * + * remove + * + * Associative array with the names of fields to be removed as indexes + * of the array. Currently the values assigned to each entry are ignored. + * An empty array should be used for future compatibility. + * + * rename + * + * Associative array with the names of fields to be renamed as indexes + * of the array. The value of each entry of the array should be set to + * another associative array with the entry named name with the new + * field name and the entry named Declaration that is expected to contain + * the portion of the field declaration already in DBMS specific SQL code + * as it is used in the CREATE TABLE statement. + * + * change + * + * Associative array with the names of the fields to be changed as indexes + * of the array. Keep in mind that if it is intended to change either the + * name of a field and any other properties, the change array entries + * should have the new names of the fields as array indexes. + * + * The value of each entry of the array should be set to another associative + * array with the properties of the fields to that are meant to be changed as + * array entries. These entries should be assigned to the new values of the + * respective properties. The properties of the fields should be the same + * as defined by the MDB2 parser. + * + * Example + * array( + * 'name' => 'userlist', + * 'add' => array( + * 'quota' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * ) + * ), + * 'remove' => array( + * 'file_limit' => array(), + * 'time_limit' => array() + * ), + * 'change' => array( + * 'name' => array( + * 'length' => '20', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 20, + * ), + * ) + * ), + * 'rename' => array( + * 'sex' => array( + * 'name' => 'gender', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 1, + * 'default' => 'M', + * ), + * ) + * ) + * ) + * + * @param boolean $check indicates whether the function should just check if the DBMS driver + * can perform the requested table alterations if the value is true or + * actually perform them otherwise. + * @access public + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + */ + function alterTable($name, $changes, $check) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + foreach ($changes as $change_name => $change) { + switch ($change_name) { + case 'add': + case 'remove': + case 'change': + case 'name': + case 'rename': + break; + default: + return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, + 'change type "'.$change_name.'" not yet supported', __FUNCTION__); + } + } + + if ($check) { + return MDB2_OK; + } + + $name = $db->quoteIdentifier($name, true); + + if (!empty($changes['add']) && is_array($changes['add'])) { + $fields = array(); + foreach ($changes['add'] as $field_name => $field) { + $fields[] = $db->getDeclaration($field['type'], $field_name, $field); + } + $result = $db->exec("ALTER TABLE $name ADD (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['change']) && is_array($changes['change'])) { + $fields = array(); + foreach ($changes['change'] as $field_name => $field) { + //fix error "column to be modified to NOT NULL is already NOT NULL" + if (!array_key_exists('notnull', $field)) { + unset($field['definition']['notnull']); + } + $fields[] = $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']); + } + $result = $db->exec("ALTER TABLE $name MODIFY (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['rename']) && is_array($changes['rename'])) { + foreach ($changes['rename'] as $field_name => $field) { + $field_name = $db->quoteIdentifier($field_name, true); + $query = "ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name']); + $result = $db->exec($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!empty($changes['remove']) && is_array($changes['remove'])) { + $fields = array(); + foreach ($changes['remove'] as $field_name => $field) { + $fields[] = $db->quoteIdentifier($field_name, true); + } + $result = $db->exec("ALTER TABLE $name DROP COLUMN ". implode(', ', $fields)); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['name'])) { + $change_name = $db->quoteIdentifier($changes['name'], true); + $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name); + if (PEAR::isError($result)) { + return $result; + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _fetchCol() + + /** + * Utility method to fetch and format a column from a resultset + * + * @param resource $result + * @param boolean $fixname (used when listing indices or constraints) + * @return mixed array of names on success, a MDB2 error on failure + * @access private + */ + function _fetchCol($result, $fixname = false) + { + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($fixname) { + foreach ($col as $k => $v) { + $col[$k] = $this->_fixIndexName($v); + } + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } + + // }}} + // {{{ listDatabases() + + /** + * list all databases + * + * @return mixed array of database names on success, a MDB2 error on failure + * @access public + */ + function listDatabases() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!$db->options['emulate_database']) { + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'database listing is only supported if the "emulate_database" option is enabled', __FUNCTION__); + } + + if ($db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + $result = $db->standaloneQuery($query, array('text'), false); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listUsers() + + /** + * list all users + * + * @return mixed array of user names on success, a MDB2 error on failure + * @access public + */ + function listUsers() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($db->options['emulate_database'] && $db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username NOT LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + return $db->queryCol($query); + } + + // }}} + // {{{ listViews() + + /** + * list all views in the current database + * + * @param string owner, the current is default + * @return mixed array of view names on success, a MDB2 error on failure + * @access public + */ + function listViews($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT view_name + FROM sys.all_views + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listFunctions() + + /** + * list all functions in the current database + * + * @param string owner, the current is default + * @return mixed array of function names on success, a MDB2 error on failure + * @access public + */ + function listFunctions($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT name + FROM sys.all_source + WHERE line = 1 + AND type = 'FUNCTION' + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableTriggers() + + /** + * list all triggers in the database that reference a given table + * + * @param string table for which all referenced triggers should be found + * @return mixed array of trigger names on success, a MDB2 error on failure + * @access public + */ + function listTableTriggers($table = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT trigger_name + FROM sys.all_triggers + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTables() + + /** + * list all tables in the database + * + * @param string owner, the current is default + * @return mixed array of table names on success, a MDB2 error on failure + * @access public + */ + function listTables($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT table_name + FROM sys.all_tables + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableFields() + + /** + * list all fields in a table in the current database + * + * @param string $table name of table that should be used in method + * @return mixed array of field names on success, a MDB2 error on failure + * @access public + */ + function listTableFields($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableIndexes() + + /** + * list all indexes in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of index names on success, a MDB2 error on failure + * @access public + */ + function listTableIndexes($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT i.index_name name + FROM all_indexes i + LEFT JOIN all_constraints c + ON c.index_name = i.index_name + AND c.owner = i.owner + AND c.table_name = i.table_name + WHERE (i.table_name=? OR i.table_name=?) + AND (i.owner=? OR i.owner=?) + AND c.index_name IS NULL + AND i.generated=' .$db->quote('N', 'text'); + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createConstraint() + + /** + * create a constraint on a table + * + * @param string $table name of the table on which the constraint is to be created + * @param string $name name of the constraint to be created + * @param array $definition associative array that defines properties of the constraint to be created. + * Currently, only one property named FIELDS is supported. This property + * is also an associative with the names of the constraint fields as array + * constraints. Each entry of this array is set to another type of associative + * array that specifies properties of the constraint that are specific to + * each field. + * + * Example + * array( + * 'fields' => array( + * 'user_name' => array(), + * 'last_login' => array() + * ) + * ) + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createConstraint($table, $name, $definition) + { + $result = parent::createConstraint($table, $name, $definition); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($definition['foreign'])) { + return $this->_createFKTriggers($table, array($name => $definition)); + } + return MDB2_OK; + } + + // }}} + // {{{ dropConstraint() + + /** + * drop existing constraint + * + * @param string $table name of table that should be used in method + * @param string $name name of the constraint to be dropped + * @param string $primary hint if the constraint is primary + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropConstraint($table, $name, $primary = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + //is it a FK constraint? If so, also delete the associated triggers + $db->loadModule('Reverse', null, true); + $definition = $db->reverse->getTableConstraintDefinition($table, $name); + if (!PEAR::isError($definition) && !empty($definition['foreign'])) { + //first drop the FK enforcing triggers + $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); + if (PEAR::isError($result)) { + return $result; + } + } + + return parent::dropConstraint($table, $name, $primary); + } + + // }}} + // {{{ _createFKTriggers() + + /** + * Create triggers to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param array $foreign_keys FOREIGN KEY definitions + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _createFKTriggers($table, $foreign_keys) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + // create triggers to enforce FOREIGN KEY constraints + if ($db->supports('triggers') && !empty($foreign_keys)) { + $table = $db->quoteIdentifier($table, true); + foreach ($foreign_keys as $fkname => $fkdef) { + if (empty($fkdef)) { + continue; + } + $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); + if ('RESTRICT' == $fkdef['onupdate'] || 'NO ACTION' == $fkdef['onupdate']) { + // already handled by default + continue; + } + + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $table_fields = array_keys($fkdef['fields']); + $referenced_fields = array_keys($fkdef['references']['fields']); + + //create the ON UPDATE trigger on the primary table + $restrict_action = ' IF (SELECT '; + $aliased_fields = array(); + foreach ($table_fields as $field) { + $aliased_fields[] = $table .'.'.$field .' AS '.$field; + } + $restrict_action .= implode(',', $aliased_fields) + .' FROM '.$table + .' WHERE '; + $conditions = array(); + $new_values = array(); + $null_values = array(); + for ($i=0; $iloadModule('Reverse', null, true); + $default_values = array(); + foreach ($table_fields as $table_field) { + $field_definition = $db->reverse->getTableFieldDefinition($table, $field); + if (PEAR::isError($field_definition)) { + return $field_definition; + } + $default_values[] = $table_field .' = '. $field_definition[0]['default']; + } + $setdefault_action = 'UPDATE '.$table.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; + } + + $query = 'CREATE TRIGGER %s' + .' %s ON '.$fkdef['references']['table'] + .' FOR EACH ROW ' + .' BEGIN '; + + if ('CASCADE' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $cascade_action; + } elseif ('SET NULL' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setnull_action; + } elseif ('SET DEFAULT' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setdefault_action; + } + $sql_update .= ' END;'; + $result = $db->exec($sql_update); + if (PEAR::isError($result)) { + if ($result->getCode() === MDB2_ERROR_ALREADY_EXISTS) { + return MDB2_OK; + } + return $result; + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ _dropFKTriggers() + + /** + * Drop the triggers created to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param string $fkname FOREIGN KEY constraint name + * @param string $referenced_table referenced table name + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropFKTriggers($table, $fkname, $referenced_table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $triggers = $this->listTableTriggers($table); + $triggers2 = $this->listTableTriggers($referenced_table); + if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { + $triggers = array_merge($triggers, $triggers2); + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $pattern = '/^'.$trigger_name.'$/i'; + foreach ($triggers as $trigger) { + if (preg_match($pattern, $trigger)) { + $result = $db->exec('DROP TRIGGER '.$trigger); + if (PEAR::isError($result)) { + return $result; + } + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ listTableConstraints() + + /** + * list all constraints in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of constraint names on success, a MDB2 error on failure + * @access public + */ + function listTableConstraints($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT constraint_name + FROM all_constraints + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createSequence() + + /** + * create sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be created + * @param string $start start value of the sequence; default is 1 + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createSequence($seq_name, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + $query = "CREATE SEQUENCE $sequence_name START WITH $start INCREMENT BY 1 NOCACHE"; + $query.= ($start < 1 ? " MINVALUE $start" : ''); + return $db->exec($query); + } + + // }}} + // {{{ dropSequence() + + /** + * drop existing sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropSequence($seq_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + return $db->exec("DROP SEQUENCE $sequence_name"); + } + + // }}} + // {{{ listSequences() + + /** + * list all sequences in the current database + * + * @param string owner, the current is default + * @return mixed array of sequence names on success, a MDB2 error on failure + * @access public + */ + function listSequences($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT sequence_name + FROM sys.all_sequences + WHERE (sequence_owner=? OR sequence_owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + foreach ($col as $k => $v) { + $col[$k] = $this->_fixSequenceName($v); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/oci8.php b/3rdparty/MDB2/Driver/Native/oci8.php new file mode 100644 index 0000000000..d198f9687a --- /dev/null +++ b/3rdparty/MDB2/Driver/Native/oci8.php @@ -0,0 +1,60 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 215004 2006-06-18 21:59:05Z lsmith $ +// + +require_once 'MDB2/Driver/Native/Common.php'; + +/** + * MDB2 Oracle driver for the native module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Native_oci8 extends MDB2_Driver_Native_Common +{ +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/oci8.php b/3rdparty/MDB2/Driver/Reverse/oci8.php new file mode 100644 index 0000000000..d89ad77137 --- /dev/null +++ b/3rdparty/MDB2/Driver/Reverse/oci8.php @@ -0,0 +1,625 @@ + | +// | Lorenzo Alberton | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ +// + +require_once 'MDB2/Driver/Reverse/Common.php'; + +/** + * MDB2 Oracle driver for the schema reverse engineering module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common +{ + // {{{ getTableFieldDefinition() + + /** + * Get the structure of a field into an array + * + * @param string $table_name name of table that should be used in method + * @param string $field_name name of field that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableFieldDefinition($table_name, $field_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $result = $db->loadModule('Datatype', null, true); + if (PEAR::isError($result)) { + return $result; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name AS "name", + data_type AS "type", + nullable AS "nullable", + data_default AS "default", + COALESCE(data_precision, data_length) AS "length", + data_scale AS "scale" + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + AND (column_name=? OR column_name=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + $field_name, + strtoupper($field_name) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $column = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($column)) { + return $column; + } + $stmt->free(); + $result->free(); + + if (empty($column)) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $field_name . ' is not a column in table ' . $table_name, __FUNCTION__); + } + + $column = array_change_key_case($column, CASE_LOWER); + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column['name'] = strtolower($column['name']); + } else { + $column['name'] = strtoupper($column['name']); + } + } + $mapped_datatype = $db->datatype->mapNativeDatatype($column); + if (PEAR::isError($mapped_datatype)) { + return $mapped_datatype; + } + list($types, $length, $unsigned, $fixed) = $mapped_datatype; + $notnull = false; + if (!empty($column['nullable']) && $column['nullable'] == 'N') { + $notnull = true; + } + $default = false; + if (array_key_exists('default', $column)) { + $default = $column['default']; + if ($default === 'NULL') { + $default = null; + } + //ugly hack, but works for the reverse direction + if ($default == "''") { + $default = ''; + } + if ((null === $default) && $notnull) { + $default = ''; + } + } + + $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); + if (null !== $length) { + $definition[0]['length'] = $length; + } + if (null !== $unsigned) { + $definition[0]['unsigned'] = $unsigned; + } + if (null !== $fixed) { + $definition[0]['fixed'] = $fixed; + } + if ($default !== false) { + $definition[0]['default'] = $default; + } + foreach ($types as $key => $type) { + $definition[$key] = $definition[0]; + if ($type == 'clob' || $type == 'blob') { + unset($definition[$key]['default']); + } + $definition[$key]['type'] = $type; + $definition[$key]['mdb2type'] = $type; + } + if ($type == 'integer') { + $query= "SELECT trigger_body + FROM all_triggers + WHERE table_name=? + AND triggering_event='INSERT' + AND trigger_type='BEFORE EACH ROW'"; + // ^^ pretty reasonable mimic for "auto_increment" in oracle? + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(strtoupper($table)); + if (PEAR::isError($result)) { + return $result; + } + while ($triggerstr = $result->fetchOne()) { + if (preg_match('/.*SELECT\W+(.+)\.nextval +into +\:NEW\.'.$field_name.' +FROM +dual/im', $triggerstr, $matches)) { + $definition[0]['autoincrement'] = $matches[1]; + } + } + $stmt->free(); + $result->free(); + } + return $definition; + } + + // }}} + // {{{ getTableIndexDefinition() + + /** + * Get the structure of an index into an array + * + * @param string $table_name name of table that should be used in method + * @param string $index_name name of index that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableIndexDefinition($table_name, $index_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT aic.column_name AS "column_name", + aic.column_position AS "column_position", + aic.descend AS "descend", + aic.table_owner AS "table_owner", + alc.constraint_type AS "constraint_type" + FROM all_ind_columns aic + LEFT JOIN all_constraints alc + ON aic.index_name = alc.constraint_name + AND aic.table_name = alc.table_name + AND aic.table_owner = alc.owner + WHERE (aic.table_name=? OR aic.table_name=?) + AND (aic.index_name=? OR aic.index_name=?) + AND (aic.table_owner=? OR aic.table_owner=?) + ORDER BY column_position'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $indexnames = array_unique(array($db->getIndexName($index_name), $index_name)); + $i = 0; + $row = null; + while ((null === $row) && array_key_exists($i, $indexnames)) { + $args = array( + $table, + strtoupper($table), + $indexnames[$i], + strtoupper($indexnames[$i]), + $owner, + strtoupper($owner) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $i++; + } + if (null === $row) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + if ($row['constraint_type'] == 'U' || $row['constraint_type'] == 'P') { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is a constraint, not an index on table '. $table_name, __FUNCTION__); + } + + $definition = array(); + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['column_position'], + ); + if (!empty($row['descend'])) { + $definition['fields'][$column_name]['sorting'] = + ($row['descend'] == 'ASC' ? 'ascending' : 'descending'); + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + return $definition; + } + + // }}} + // {{{ getTableConstraintDefinition() + + /** + * Get the structure of a constraint into an array + * + * @param string $table_name name of table that should be used in method + * @param string $constraint_name name of constraint that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableConstraintDefinition($table_name, $constraint_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT alc.constraint_name, + CASE alc.constraint_type WHEN \'P\' THEN 1 ELSE 0 END "primary", + CASE alc.constraint_type WHEN \'R\' THEN 1 ELSE 0 END "foreign", + CASE alc.constraint_type WHEN \'U\' THEN 1 ELSE 0 END "unique", + CASE alc.constraint_type WHEN \'C\' THEN 1 ELSE 0 END "check", + alc.DELETE_RULE "ondelete", + \'NO ACTION\' "onupdate", + \'SIMPLE\' "match", + CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable", + CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred", + alc.search_condition AS "search_condition", + alc.table_name, + cols.column_name AS "column_name", + cols.position, + r_alc.table_name "references_table", + r_cols.column_name "references_field", + r_cols.position "references_field_position" + FROM all_cons_columns cols + LEFT JOIN all_constraints alc + ON alc.constraint_name = cols.constraint_name + AND alc.owner = cols.owner + LEFT JOIN all_constraints r_alc + ON alc.r_constraint_name = r_alc.constraint_name + AND alc.r_owner = r_alc.owner + LEFT JOIN all_cons_columns r_cols + ON r_alc.constraint_name = r_cols.constraint_name + AND r_alc.owner = r_cols.owner + AND cols.position = r_cols.position + WHERE (alc.constraint_name=? OR alc.constraint_name=?) + AND alc.constraint_name = cols.constraint_name + AND (alc.owner=? OR alc.owner=?)'; + $tablenames = array(); + if (!empty($table)) { + $query.= ' AND (alc.table_name=? OR alc.table_name=?)'; + $tablenames = array($table, strtoupper($table)); + } + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + + $constraintnames = array_unique(array($db->getIndexName($constraint_name), $constraint_name)); + $c = 0; + $row = null; + while ((null === $row) && array_key_exists($c, $constraintnames)) { + $args = array( + $constraintnames[$c], + strtoupper($constraintnames[$c]), + $owner, + strtoupper($owner) + ); + if (!empty($table)) { + $args = array_merge($args, $tablenames); + } + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $c++; + } + + $definition = array( + 'primary' => (boolean)$row['primary'], + 'unique' => (boolean)$row['unique'], + 'foreign' => (boolean)$row['foreign'], + 'check' => (boolean)$row['check'], + 'deferrable' => (boolean)$row['deferrable'], + 'initiallydeferred' => (boolean)$row['initiallydeferred'], + 'ondelete' => $row['ondelete'], + 'onupdate' => $row['onupdate'], + 'match' => $row['match'], + ); + + if ($definition['check']) { + // pattern match constraint for check constraint values into enum-style output: + $enumregex = '/'.$row['column_name'].' in \((.+?)\)/i'; + if (preg_match($enumregex, $row['search_condition'], $rangestr)) { + $definition['fields'][$column_name] = array(); + $allowed = explode(',', $rangestr[1]); + foreach ($allowed as $val) { + $val = trim($val); + $val = preg_replace('/^\'/', '', $val); + $val = preg_replace('/\'$/', '', $val); + array_push($definition['fields'][$column_name], $val); + } + } + } + + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['position'] + ); + if ($row['foreign']) { + $ref_column_name = $row['references_field']; + $ref_table_name = $row['references_table']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $ref_column_name = strtolower($ref_column_name); + $ref_table_name = strtolower($ref_table_name); + } else { + $ref_column_name = strtoupper($ref_column_name); + $ref_table_name = strtoupper($ref_table_name); + } + } + $definition['references']['table'] = $ref_table_name; + $definition['references']['fields'][$ref_column_name] = array( + 'position' => (int)$row['references_field_position'] + ); + } + $lastrow = $row; + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $constraint_name . ' is not a constraint on table '. $table_name, __FUNCTION__); + } + + return $definition; + } + + // }}} + // {{{ getSequenceDefinition() + + /** + * Get the structure of a sequence into an array + * + * @param string $sequence name of sequence that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getSequenceDefinition($sequence) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->getSequenceName($sequence); + $query = 'SELECT last_number FROM user_sequences'; + $query.= ' WHERE sequence_name='.$db->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$db->quote(strtoupper($sequence_name), 'text'); + $start = $db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + $definition = array(); + if ($start != 1) { + $definition = array('start' => $start); + } + return $definition; + } + + // }}} + // {{{ getTriggerDefinition() + + /** + * Get the structure of a trigger into an array + * + * EXPERIMENTAL + * + * WARNING: this function is experimental and may change the returned value + * at any time until labelled as non-experimental + * + * @param string $trigger name of trigger that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTriggerDefinition($trigger) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'SELECT trigger_name AS "trigger_name", + table_name AS "table_name", + trigger_body AS "trigger_body", + trigger_type AS "trigger_type", + triggering_event AS "trigger_event", + description AS "trigger_comment", + 1 AS "trigger_enabled", + when_clause AS "when_clause" + FROM user_triggers + WHERE trigger_name = \''. strtoupper($trigger).'\''; + $types = array( + 'trigger_name' => 'text', + 'table_name' => 'text', + 'trigger_body' => 'text', + 'trigger_type' => 'text', + 'trigger_event' => 'text', + 'trigger_comment' => 'text', + 'trigger_enabled' => 'boolean', + 'when_clause' => 'text', + ); + $result = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($result['trigger_type'])) { + //$result['trigger_type'] = array_shift(explode(' ', $result['trigger_type'])); + $result['trigger_type'] = preg_replace('/(\S+).*/', '\\1', $result['trigger_type']); + } + return $result; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * NOTE: flags won't contain index information. + * + * @param object|string $result MDB2_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A MDB2_Error object on failure. + * + * @see MDB2_Driver_Common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + return parent::tableInfo($result, $mode); + } + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; + if (!is_resource($resource)) { + return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'Could not generate result resource', __FUNCTION__); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $case_func = 'strtolower'; + } else { + $case_func = 'strtoupper'; + } + } else { + $case_func = 'strval'; + } + + $count = @OCINumCols($resource); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + $db->loadModule('Datatype', null, true); + for ($i = 0; $i < $count; $i++) { + $column = array( + 'table' => '', + 'name' => $case_func(@OCIColumnName($resource, $i+1)), + 'type' => @OCIColumnType($resource, $i+1), + 'length' => @OCIColumnSize($resource, $i+1), + 'flags' => '', + ); + $res[$i] = $column; + $res[$i]['mdb2type'] = $db->datatype->mapNativeDatatype($res[$i]); + if ($mode & MDB2_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & MDB2_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + return $res; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/mysql.php b/3rdparty/MDB2/Driver/mysql.php index 3008bd04f0..1d22e61f46 100644 --- a/3rdparty/MDB2/Driver/mysql.php +++ b/3rdparty/MDB2/Driver/mysql.php @@ -80,7 +80,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common protected $start_transaction = false; - protected $varchar_max_length = 255; + public $varchar_max_length = 255; // }}} // {{{ constructor diff --git a/3rdparty/MDB2/Driver/oci8.php b/3rdparty/MDB2/Driver/oci8.php new file mode 100644 index 0000000000..a1eefc94d1 --- /dev/null +++ b/3rdparty/MDB2/Driver/oci8.php @@ -0,0 +1,1700 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_oci8 extends MDB2_Driver_Common +{ + // {{{ properties + var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '@'); + + var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); + + var $uncommitedqueries = 0; + // }}} + // {{{ constructor + + /** + * Constructor + */ + function __construct() + { + parent::__construct(); + + $this->phptype = 'oci8'; + $this->dbsyntax = 'oci8'; + + $this->supported['sequences'] = true; + $this->supported['indexes'] = true; + $this->supported['summary_functions'] = true; + $this->supported['order_by_text'] = true; + $this->supported['current_id'] = true; + $this->supported['affected_rows'] = true; + $this->supported['transactions'] = true; + $this->supported['savepoints'] = true; + $this->supported['limit_queries'] = true; + $this->supported['LOBs'] = true; + $this->supported['replace'] = 'emulated'; + $this->supported['sub_selects'] = true; + $this->supported['triggers'] = true; + $this->supported['auto_increment'] = false; // implementation is broken + $this->supported['primary_key'] = true; + $this->supported['result_introspection'] = true; + $this->supported['prepared_statements'] = true; + $this->supported['identifier_quoting'] = true; + $this->supported['pattern_escaping'] = true; + $this->supported['new_link'] = true; + + $this->options['DBA_username'] = false; + $this->options['DBA_password'] = false; + $this->options['database_name_prefix'] = false; + $this->options['emulate_database'] = true; + $this->options['default_tablespace'] = false; + $this->options['default_text_field_length'] = 2000; + $this->options['lob_allow_url_include'] = false; + $this->options['result_prefetching'] = false; + $this->options['max_identifiers_length'] = 30; + } + + // }}} + // {{{ errorInfo() + + /** + * This method is used to collect information about an error + * + * @param integer $error + * @return array + * @access public + */ + function errorInfo($error = null) + { + if (is_resource($error)) { + $error_data = @OCIError($error); + $error = null; + } elseif ($this->connection) { + $error_data = @OCIError($this->connection); + } else { + $error_data = @OCIError(); + } + $native_code = $error_data['code']; + $native_msg = $error_data['message']; + if (null === $error) { + static $ecode_map; + if (empty($ecode_map)) { + $ecode_map = array( + 1 => MDB2_ERROR_CONSTRAINT, + 900 => MDB2_ERROR_SYNTAX, + 904 => MDB2_ERROR_NOSUCHFIELD, + 911 => MDB2_ERROR_SYNTAX, //invalid character + 913 => MDB2_ERROR_VALUE_COUNT_ON_ROW, + 921 => MDB2_ERROR_SYNTAX, + 923 => MDB2_ERROR_SYNTAX, + 942 => MDB2_ERROR_NOSUCHTABLE, + 955 => MDB2_ERROR_ALREADY_EXISTS, + 1400 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1401 => MDB2_ERROR_INVALID, + 1407 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1418 => MDB2_ERROR_NOT_FOUND, + 1435 => MDB2_ERROR_NOT_FOUND, + 1476 => MDB2_ERROR_DIVZERO, + 1722 => MDB2_ERROR_INVALID_NUMBER, + 2289 => MDB2_ERROR_NOSUCHTABLE, + 2291 => MDB2_ERROR_CONSTRAINT, + 2292 => MDB2_ERROR_CONSTRAINT, + 2449 => MDB2_ERROR_CONSTRAINT, + 4081 => MDB2_ERROR_ALREADY_EXISTS, //trigger already exists + 24344 => MDB2_ERROR_SYNTAX, //success with compilation error + ); + } + if (isset($ecode_map[$native_code])) { + $error = $ecode_map[$native_code]; + } + } + return array($error, $native_code, $native_msg); + } + + // }}} + // {{{ beginTransaction() + + /** + * Start a transaction or set a savepoint. + * + * @param string name of a savepoint to set + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function beginTransaction($savepoint = null) + { + $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (null !== $savepoint) { + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'savepoint cannot be released when changes are auto committed', __FUNCTION__); + } + $query = 'SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + if ($this->in_transaction) { + return MDB2_OK; //nothing to do + } + if (!$this->destructor_registered && $this->opened_persistent) { + $this->destructor_registered = true; + register_shutdown_function('MDB2_closeOpenTransactions'); + } + $this->in_transaction = true; + ++$this->uncommitedqueries; + return MDB2_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the database changes done during a transaction that is in + * progress or release a savepoint. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after committing the pending changes. + * + * @param string name of a savepoint to release + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function commit($savepoint = null) + { + $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + return MDB2_OK; + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCICommit($connection)) { + return $this->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ rollback() + + /** + * Cancel any database changes done during a transaction or since a specific + * savepoint that is in progress. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after canceling the pending changes. + * + * @param string name of a savepoint to rollback to + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function rollback($savepoint = null) + { + $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'rollback cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCIRollback($connection)) { + return $this->raiseError(null, null, null, + 'Unable to rollback transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ function setTransactionIsolation() + + /** + * Set the transacton isolation level. + * + * @param string standard isolation level + * READ UNCOMMITTED (allows dirty reads) + * READ COMMITTED (prevents dirty reads) + * REPEATABLE READ (prevents nonrepeatable reads) + * SERIALIZABLE (prevents phantom reads) + * @param array some transaction options: + * 'wait' => 'WAIT' | 'NO WAIT' + * 'rw' => 'READ WRITE' | 'READ ONLY' + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + * @since 2.1.1 + */ + function setTransactionIsolation($isolation, $options = array()) + { + $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); + switch ($isolation) { + case 'READ UNCOMMITTED': + $isolation = 'READ COMMITTED'; + case 'READ COMMITTED': + case 'REPEATABLE READ': + $isolation = 'SERIALIZABLE'; + case 'SERIALIZABLE': + break; + default: + return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'isolation level is not supported: '.$isolation, __FUNCTION__); + } + + $query = "ALTER SESSION ISOLATION LEVEL $isolation"; + return $this->_doQuery($query, true); + } + + // }}} + // {{{ _doConnect() + + /** + * do the grunt work of the connect + * + * @return connection on success or MDB2 Error Object on failure + * @access protected + */ + function _doConnect($username, $password, $persistent = false) + { + if (!PEAR::loadExtension($this->phptype)) { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); + } + + $sid = ''; + + if (!empty($this->dsn['service']) && $this->dsn['hostspec']) { + //oci8://username:password@foo.example.com[:port]/?service=service + // service name is given, it is assumed that hostspec is really a + // hostname, we try to construct an oracle connection string from this + $port = $this->dsn['port'] ? $this->dsn['port'] : 1521; + $sid = sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) + (HOST=%s) (PORT=%s))) + (CONNECT_DATA=(SERVICE_NAME=%s)))", + $this->dsn['hostspec'], + $port, + $this->dsn['service'] + ); + } elseif ($this->dsn['hostspec']) { + // we are given something like 'oci8://username:password@foo/' + // we have hostspec but not a service name, now we assume that + // hostspec is a tnsname defined in tnsnames.ora + $sid = $this->dsn['hostspec']; + if (isset($this->dsn['port']) && $this->dsn['port']) { + $sid = $sid.':'.$this->dsn['port']; + } + } else { + // oci://username:password@ + // if everything fails, we have to rely on environment variables + // not before a check to 'emulate_database' + if (!$this->options['emulate_database'] && $this->database_name) { + $sid = $this->database_name; + } elseif (getenv('ORACLE_SID')) { + $sid = getenv('ORACLE_SID'); + } elseif ($sid = getenv('TWO_TASK')) { + $sid = getenv('TWO_TASK'); + } else { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'not a valid connection string or environment variable [ORACLE_SID|TWO_TASK] not set', + __FUNCTION__); + } + } + + if (function_exists('oci_connect')) { + if ($this->_isNewLinkSet()) { + $connect_function = 'oci_new_connect'; + } else { + $connect_function = $persistent ? 'oci_pconnect' : 'oci_connect'; + } + + $charset = empty($this->dsn['charset']) ? null : $this->dsn['charset']; + $session_mode = empty($this->dsn['session_mode']) ? null : $this->dsn['session_mode']; + $connection = @$connect_function($username, $password, $sid, $charset, $session_mode); + $error = @OCIError(); + if (isset($error['code']) && $error['code'] == 12541) { + // Couldn't find TNS listener. Try direct connection. + $connection = @$connect_function($username, $password, null, $charset); + } + } else { + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + $connection = @$connect_function($username, $password, $sid); + + if (!empty($this->dsn['charset'])) { + $result = $this->setCharset($this->dsn['charset'], $connection); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!$connection) { + return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, + 'unable to establish a connection', __FUNCTION__); + } + + if (empty($this->dsn['disable_iso_date'])) { + $query = "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + } + + $query = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS='. '"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + + return $connection; + } + + // }}} + // {{{ connect() + + /** + * Connect to the database + * + * @return MDB2_OK on success, MDB2 Error Object on failure + * @access public + */ + function connect() + { + if (is_resource($this->connection)) { + //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 + if (MDB2::areEquals($this->connected_dsn, $this->dsn) + && $this->opened_persistent == $this->options['persistent'] + ) { + return MDB2_OK; + } + $this->disconnect(false); + } + + if ($this->database_name && $this->options['emulate_database']) { + $this->dsn['username'] = $this->options['database_name_prefix'].$this->database_name; + } + + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + $this->connection = $connection; + $this->connected_dsn = $this->dsn; + $this->connected_database_name = ''; + $this->opened_persistent = $this->options['persistent']; + $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; + + if ($this->database_name) { + if ($this->database_name != $this->connected_database_name) { + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($this->database_name) .'"'; + $result = $this->_doQuery($query); + if (PEAR::isError($result)) { + $err = $this->raiseError($result, null, null, + 'Could not select the database: '.$this->database_name, __FUNCTION__); + return $err; + } + $this->connected_database_name = $this->database_name; + } + } + + $this->as_keyword = ' '; + $server_info = $this->getServerVersion(); + if (is_array($server_info)) { + if ($server_info['major'] >= '10') { + $this->as_keyword = ' AS '; + } + } + return MDB2_OK; + } + + // }}} + // {{{ databaseExists() + + /** + * check if given database name is exists? + * + * @param string $name name of the database that should be checked + * + * @return mixed true/false on success, a MDB2 error on failure + * @access public + */ + function databaseExists($name) + { + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($name) .'"'; + $result = $this->_doQuery($query, true, $connection, false); + if (PEAR::isError($result)) { + if (!MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { + return $result; + } + return false; + } + return true; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @param boolean $force if the disconnect should be forced even if the + * connection is opened persistently + * @return mixed true on success, false if not connected and error + * object on error + * @access public + */ + function disconnect($force = true) + { + if (is_resource($this->connection)) { + if ($this->in_transaction) { + $dsn = $this->dsn; + $database_name = $this->database_name; + $persistent = $this->options['persistent']; + $this->dsn = $this->connected_dsn; + $this->database_name = $this->connected_database_name; + $this->options['persistent'] = $this->opened_persistent; + $this->rollback(); + $this->dsn = $dsn; + $this->database_name = $database_name; + $this->options['persistent'] = $persistent; + } + + if (!$this->opened_persistent || $force) { + $ok = false; + if (function_exists('oci_close')) { + $ok = @oci_close($this->connection); + } else { + $ok = @OCILogOff($this->connection); + } + if (!$ok) { + return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, + null, null, null, __FUNCTION__); + } + } + $this->uncommitedqueries = 0; + } else { + return false; + } + return parent::disconnect($force); + } + + // }}} + // {{{ standaloneQuery() + + /** + * execute a query as DBA + * + * @param string $query the SQL query + * @param mixed $types array containing the types of the columns in + * the result set + * @param boolean $is_manip if the query is a manipulation query + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function standaloneQuery($query, $types = null, $is_manip = false) + { + $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; + $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; + $connection = $this->_doConnect($user, $pass, $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + + $result = $this->_doQuery($query, $is_manip, $connection, false); + if (!PEAR::isError($result)) { + if ($is_manip) { + $result = $this->_affectedRows($connection, $result); + } else { + $result = $this->_wrapResult($result, $types, true, false, $limit, $offset); + } + } + + @OCILogOff($connection); + return $result; + } + + // }}} + // {{{ _modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * @param string $query query to modify + * @param boolean $is_manip if it is a DML query + * @param integer $limit limit the number of rows + * @param integer $offset start reading from given offset + * @return string modified query + * @access protected + */ + function _modifyQuery($query, $is_manip, $limit, $offset) + { + if (preg_match('/^\s*SELECT/i', $query)) { + if (!preg_match('/\sFROM\s/i', $query)) { + $query.= " FROM dual"; + } + if ($limit > 0) { + // taken from http://svn.ez.no/svn/ezcomponents/packages/Database + $max = $offset + $limit; + if ($offset > 0) { + $min = $offset + 1; + $query = "SELECT * FROM (SELECT a.*, ROWNUM mdb2rn FROM ($query) a WHERE ROWNUM <= $max) WHERE mdb2rn >= $min"; + } else { + $query = "SELECT a.* FROM ($query) a WHERE ROWNUM <= $max"; + } + } + } + return $query; + } + + /** + * Obtain DBMS specific SQL code portion needed to declare a generic type + * field to be used in statement like CREATE TABLE, without the field name + * and type values (ie. just the character set, default value, if the + * field is permitted to be NULL or not, and the collation options). + * + * @param array $field associative array with the name of the properties + * of the field being declared as array indexes. Currently, the types + * of supported field properties are as follows: + * + * default + * Text value to be used as default for this field. + * notnull + * Boolean flag that indicates whether this field is constrained + * to not be set to null. + * charset + * Text value with the default CHARACTER SET for this field. + * collation + * Text value with the default COLLATION for this field. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field's options. + * @access protected + */ + function _getDeclarationOptions($field) + { + $charset = empty($field['charset']) ? '' : + ' '.$this->_getCharsetFieldDeclaration($field['charset']); + + $notnull = empty($field['notnull']) ? ' NULL' : ' NOT NULL'; + $default = ''; + if (array_key_exists('default', $field)) { + if ($field['default'] === '') { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $valid_default_values = $this->getValidTypes(); + $field['default'] = $valid_default_values[$field['type']]; + if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) { + $field['default'] = ' '; + } + } + if (null !== $field['default']) { + $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']); + } + } + + $collation = empty($field['collation']) ? '' : + ' '.$this->_getCollationFieldDeclaration($field['collation']); + + return $charset.$default.$notnull.$collation; + } + + // }}} + // {{{ _doQuery() + + /** + * Execute a query + * @param string $query query + * @param boolean $is_manip if the query is a manipulation query + * @param resource $connection + * @param string $database_name + * @return result or error object + * @access protected + */ + function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) + { + $this->last_query = $query; + $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + if ($this->getOption('disable_query')) { + if ($is_manip) { + return 0; + } + return null; + } + + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + + $query = str_replace("\r\n", "\n", $query); //for fixing end-of-line character in the PL/SQL in windows + $result = @OCIParse($connection, $query); + if (!$result) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $mode = $this->in_transaction ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($result, $mode)) { + $err = $this->raiseError($result, null, null, + 'Could not execute statement', __FUNCTION__); + return $err; + } + + if (is_numeric($this->options['result_prefetching'])) { + @ocisetprefetch($result, $this->options['result_prefetching']); + } + + $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ _affectedRows() + + /** + * Returns the number of rows affected + * + * @param resource $result + * @param resource $connection + * @return mixed MDB2 Error Object or the number of rows affected + * @access private + */ + function _affectedRows($connection, $result = null) + { + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + return @OCIRowCount($result); + } + + // }}} + // {{{ getServerVersion() + + /** + * return version information about the server + * + * @param bool $native determines if the raw version string should be returned + * @return mixed array/string with version information or MDB2 error object + * @access public + */ + function getServerVersion($native = false) + { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if ($this->connected_server_info) { + $server_info = $this->connected_server_info; + } else { + $server_info = @ociserverversion($connection); + } + if (!$server_info) { + return $this->raiseError(null, null, null, + 'Could not get server information', __FUNCTION__); + } + // cache server_info + $this->connected_server_info = $server_info; + if (!$native) { + if (!preg_match('/ (\d+)\.(\d+)\.(\d+)\.([\d\.]+) /', $server_info, $tmp)) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'Could not parse version information:'.$server_info, __FUNCTION__); + } + $server_info = array( + 'major' => $tmp[1], + 'minor' => $tmp[2], + 'patch' => $tmp[3], + 'extra' => $tmp[4], + 'native' => $server_info, + ); + } + return $server_info; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * With some database backends, this is emulated. + * prepare() requires a generic query as string like + * 'INSERT INTO numbers VALUES(?,?)' or + * 'INSERT INTO numbers VALUES(:foo,:bar)'. + * The ? and :name and are placeholders which can be set using + * bindParam() and the query can be sent off using the execute() method. + * The allowed format for :name can be set with the 'bindname_format' option. + * + * @param string $query the query to prepare + * @param mixed $types array that contains the types of the placeholders + * @param mixed $result_types array that contains the types of the columns in + * the result set or MDB2_PREPARE_RESULT, if set to + * MDB2_PREPARE_MANIP the query is handled as a manipulation query + * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders + * @return mixed resource handle for the prepared query on success, a MDB2 + * error on failure + * @access public + * @see bindParam, execute + */ + function prepare($query, $types = null, $result_types = null, $lobs = array()) + { + if ($this->options['emulate_prepared']) { + return parent::prepare($query, $types, $result_types, $lobs); + } + $is_manip = ($result_types === MDB2_PREPARE_MANIP); + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + $placeholder_type_guess = $placeholder_type = null; + $question = '?'; + $colon = ':'; + $positions = array(); + $position = 0; + $parameter = -1; + while ($position < strlen($query)) { + $q_position = strpos($query, $question, $position); + $c_position = strpos($query, $colon, $position); + if ($q_position && $c_position) { + $p_position = min($q_position, $c_position); + } elseif ($q_position) { + $p_position = $q_position; + } elseif ($c_position) { + $p_position = $c_position; + } else { + break; + } + if (null === $placeholder_type) { + $placeholder_type_guess = $query[$p_position]; + } + + $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); + if (PEAR::isError($new_pos)) { + return $new_pos; + } + if ($new_pos != $position) { + $position = $new_pos; + continue; //evaluate again starting from the new position + } + + if ($query[$position] == $placeholder_type_guess) { + if (null === $placeholder_type) { + $placeholder_type = $query[$p_position]; + $question = $colon = $placeholder_type; + if (!empty($types) && is_array($types)) { + if ($placeholder_type == ':') { + if (is_int(key($types))) { + $types_tmp = $types; + $types = array(); + $count = -1; + } + } else { + $types = array_values($types); + } + } + } + if ($placeholder_type == ':') { + $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; + $parameter = preg_replace($regexp, '\\1', $query); + if ($parameter === '') { + $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, + 'named parameter name must match "bindname_format" option', __FUNCTION__); + return $err; + } + // use parameter name in type array + if (isset($count) && isset($types_tmp[++$count])) { + $types[$parameter] = $types_tmp[$count]; + } + $length = strlen($parameter) + 1; + } else { + ++$parameter; + //$length = strlen($parameter); + $length = 1; // strlen('?') + } + if (!in_array($parameter, $positions)) { + $positions[] = $parameter; + } + if (isset($types[$parameter]) + && ($types[$parameter] == 'clob' || $types[$parameter] == 'blob') + ) { + if (!isset($lobs[$parameter])) { + $lobs[$parameter] = $parameter; + } + $value = $this->quote(true, $types[$parameter]); + if (PEAR::isError($value)) { + return $value; + } + $query = substr_replace($query, $value, $p_position, $length); + $position = $p_position + strlen($value) - 1; + } elseif ($placeholder_type == '?') { + $query = substr_replace($query, ':'.$parameter, $p_position, 1); + $position = $p_position + $length; + } else { + $position = $p_position + 1; + } + } else { + $position = $p_position; + } + } + if (is_array($lobs)) { + $columns = $variables = ''; + foreach ($lobs as $parameter => $field) { + $columns.= ($columns ? ', ' : ' RETURNING ').$field; + $variables.= ($variables ? ', ' : ' INTO ').':'.$parameter; + } + $query.= $columns.$variables; + } + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + $statement = @OCIParse($connection, $query); + if (!$statement) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $class_name = 'MDB2_Statement_'.$this->phptype; + $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); + $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); + return $obj; + } + + // }}} + // {{{ nextID() + + /** + * Returns the next free id of a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true the sequence is + * automatic created, if it + * not exists + * @return mixed MDB2 Error Object or id + * @access public + */ + function nextID($seq_name, $ondemand = true) + { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); + $query = "SELECT $sequence_name.nextval FROM DUAL"; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $this->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = $this->queryOne($query, 'integer'); + $this->popExpect(); + $this->popErrorHandling(); + if (PEAR::isError($result)) { + if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { + $this->loadModule('Manager', null, true); + $result = $this->manager->createSequence($seq_name); + if (PEAR::isError($result)) { + return $result; + } + return $this->nextId($seq_name, false); + } + } + return $result; + } + + // }}} + // {{{ lastInsertID() + + /** + * Returns the autoincrement ID if supported or $id or fetches the current + * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) + * + * @param string $table name of the table into which a new row was inserted + * @param string $field name of the field into which a new row was inserted + * @return mixed MDB2 Error Object or id + * @access public + */ + function lastInsertID($table = null, $field = null) + { + $old_seq = $table.(empty($field) ? '' : '_'.$field); + $sequence_name = $this->quoteIdentifier($this->getSequenceName($table), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + if (PEAR::isError($result)) { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($old_seq), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + } + + return $result; + } + + // }}} + // {{{ currId() + + /** + * Returns the current id of a sequence + * + * @param string $seq_name name of the sequence + * @return mixed MDB2_Error or id + * @access public + */ + function currId($seq_name) + { + $sequence_name = $this->getSequenceName($seq_name); + $query = 'SELECT (last_number-1) FROM all_sequences'; + $query.= ' WHERE sequence_name='.$this->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$this->quote(strtoupper($sequence_name), 'text'); + return $this->queryOne($query, 'integer'); + } +} + +/** + * MDB2 OCI8 result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Result_oci8 extends MDB2_Result_Common +{ + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + @OCIFetchInto($this->result, $row, OCI_ASSOC+OCI_RETURN_NULLS); + if (is_array($row) + && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + ) { + $row = array_change_key_case($row, $this->db->options['field_case']); + } + } else { + @OCIFetchInto($this->result, $row, OCI_RETURN_NULLS); + } + if (!$row) { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + return null; + } + // remove additional column at the end + if ($this->offset > 0) { + array_pop($row); + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ _getColumnNames() + + /** + * Retrieve the names of columns returned by the DBMS in a query result. + * + * @return mixed Array variable that holds the names of columns as keys + * or an MDB2 error on failure. + * Some DBMS may not return any columns when the result set + * does not contain any rows. + * @access private + */ + function _getColumnNames() + { + $columns = array(); + $numcols = $this->numCols(); + if (PEAR::isError($numcols)) { + return $numcols; + } + for ($column = 0; $column < $numcols; $column++) { + $column_name = @OCIColumnName($this->result, $column + 1); + $columns[$column_name] = $column; + } + if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + $columns = array_change_key_case($columns, $this->db->options['field_case']); + } + return $columns; + } + + // }}} + // {{{ numCols() + + /** + * Count the number of columns returned by the DBMS in a query result. + * + * @return mixed integer value with the number of columns, a MDB2 error + * on failure + * @access public + */ + function numCols() + { + $cols = @OCINumCols($this->result); + if (null === $cols) { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return count($this->types); + } + return $this->db->raiseError(null, null, null, + 'Could not get column count', __FUNCTION__); + } + if ($this->offset > 0) { + --$cols; + } + return $cols; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + if (is_resource($this->result) && $this->db->connection) { + $free = @OCIFreeCursor($this->result); + if (false === $free) { + return $this->db->raiseError(null, null, null, + 'Could not free result', __FUNCTION__); + } + } + $this->result = false; + return MDB2_OK; + + } +} + +/** + * MDB2 OCI8 buffered result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_BufferedResult_oci8 extends MDB2_Result_oci8 +{ + var $buffer; + var $buffer_rownum = - 1; + + // {{{ _fillBuffer() + + /** + * Fill the row buffer + * + * @param int $rownum row number upto which the buffer should be filled + if the row number is null all rows are ready into the buffer + * @return boolean true on success, false on failure + * @access protected + */ + function _fillBuffer($rownum = null) + { + if (isset($this->buffer) && is_array($this->buffer)) { + if (null === $rownum) { + if (!end($this->buffer)) { + return false; + } + } elseif (isset($this->buffer[$rownum])) { + return (bool)$this->buffer[$rownum]; + } + } + + $row = true; + while (((null === $rownum) || $this->buffer_rownum < $rownum) + && ($row = @OCIFetchInto($this->result, $buffer, OCI_RETURN_NULLS)) + ) { + ++$this->buffer_rownum; + // remove additional column at the end + if ($this->offset > 0) { + array_pop($buffer); + } + if (empty($this->types)) { + foreach (array_keys($buffer) as $key) { + if (is_a($buffer[$key], 'oci-lob')) { + $buffer[$key] = $buffer[$key]->load(); + } + } + } + $this->buffer[$this->buffer_rownum] = $buffer; + } + + if (!$row) { + ++$this->buffer_rownum; + $this->buffer[$this->buffer_rownum] = false; + return false; + } + return true; + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + if (null === $this->result) { + return null; + } + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + $target_rownum = $this->rownum + 1; + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if (!$this->_fillBuffer($target_rownum)) { + return null; + } + $row = $this->buffer[$target_rownum]; + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + $column_names = $this->getColumnNames(); + foreach ($column_names as $name => $i) { + $column_names[$name] = $row[$i]; + } + $row = $column_names; + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ seek() + + /** + * Seek to a specific row in a result set + * + * @param int $rownum number of the row where the data can be found + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function seek($rownum = 0) + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + $this->rownum = $rownum - 1; + return MDB2_OK; + } + + // }}} + // {{{ valid() + + /** + * Check if the end of the result set has been reached + * + * @return mixed true or false on sucess, a MDB2 error on failure + * @access public + */ + function valid() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return true; + } + if ($this->_fillBuffer($this->rownum + 1)) { + return true; + } + return false; + } + + // }}} + // {{{ numRows() + + /** + * Returns the number of rows in a result object + * + * @return mixed MDB2 Error Object or the number of rows + * @access public + */ + function numRows() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return 0; + } + $this->_fillBuffer(); + return $this->buffer_rownum; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + $this->buffer = null; + $this->buffer_rownum = null; + return parent::free(); + } +} + +/** + * MDB2 OCI8 statement driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Statement_oci8 extends MDB2_Statement_Common +{ + // {{{ Variables (Properties) + + var $type_maxlengths = array(); + + // }}} + // {{{ bindParam() + + /** + * Bind a variable to a parameter of a prepared query. + * + * @param int $parameter the order number of the parameter in the query + * statement. The order number of the first parameter is 1. + * @param mixed &$value variable that is meant to be bound to specified + * parameter. The type of the value depends on the $type argument. + * @param string $type specifies the type of the field + * @param int $maxlength specifies the maximum length of the field; if set to -1, the + * current length of $value is used + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function bindParam($parameter, &$value, $type = null, $maxlength = -1) + { + if (!is_numeric($parameter)) { + $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter); + } + if (MDB2_OK === ($ret = parent::bindParam($parameter, $value, $type))) { + $this->type_maxlengths[$parameter] = $maxlength; + } + + return $ret; + } + + // }}} + // {{{ _execute() + + /** + * Execute a prepared query statement helper method. + * + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * + * @return mixed MDB2_Result or integer (affected rows) on success, + * a MDB2 error on failure + * @access private + */ + function _execute($result_class = true, $result_wrap_class = false) + { + if (null === $this->statement) { + return parent::_execute($result_class, $result_wrap_class); + } + $this->db->last_query = $this->query; + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); + if ($this->db->getOption('disable_query')) { + $result = $this->is_manip ? 0 : null; + return $result; + } + + $connection = $this->db->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + + $result = MDB2_OK; + $lobs = $quoted_values = array(); + $i = 0; + foreach ($this->positions as $parameter) { + if (!array_key_exists($parameter, $this->values)) { + return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); + } + $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; + if ($type == 'clob' || $type == 'blob') { + $lobs[$i]['file'] = false; + if (is_resource($this->values[$parameter])) { + $fp = $this->values[$parameter]; + $this->values[$parameter] = ''; + while (!feof($fp)) { + $this->values[$parameter] .= fread($fp, 8192); + } + } elseif (is_a($this->values[$parameter], 'OCI-Lob')) { + //do nothing + } elseif ($this->db->getOption('lob_allow_url_include') + && preg_match('/^(\w+:\/\/)(.*)$/', $this->values[$parameter], $match) + ) { + $lobs[$i]['file'] = true; + if ($match[1] == 'file://') { + $this->values[$parameter] = $match[2]; + } + } + $lobs[$i]['value'] = $this->values[$parameter]; + $lobs[$i]['descriptor'] =& $this->values[$parameter]; + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], 'OCI-Lob')) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_LOB); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for LOB in parameter: '.$parameter, __FUNCTION__); + break; + } + } + $lob_type = ($type == 'blob' ? OCI_B_BLOB : OCI_B_CLOB); + if (!@OCIBindByName($this->statement, ':'.$parameter, $lobs[$i]['descriptor'], -1, $lob_type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind LOB parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_BFILE) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_FILE); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for BFILE in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind BFILE parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_ROWID) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_ROWID); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for ROWID in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind ROWID parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_CURSOR) { + // Test to see if cursor has already been allocated for this + // variable (i.e. if it has been bound more than once): + if (!is_resource($this->values[$parameter]) || !get_resource_type($this->values[$parameter]) == "oci8 statement") { + $this->values[$parameter] = @OCINewCursor($connection); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to allocate cursor for parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind CURSOR parameter', __FUNCTION__); + break; + } + } else { + $maxlength = array_key_exists($parameter, $this->type_maxlengths) ? $this->type_maxlengths[$parameter] : -1; + $this->values[$parameter] = $this->db->quote($this->values[$parameter], $type, false); + $quoted_values[$i] =& $this->values[$parameter]; + if (PEAR::isError($quoted_values[$i])) { + return $quoted_values[$i]; + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $quoted_values[$i], $maxlength)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind non-abstract parameter', __FUNCTION__); + break; + } + } + ++$i; + } + + $lob_keys = array_keys($lobs); + if (!PEAR::isError($result)) { + $mode = (!empty($lobs) || $this->db->in_transaction) ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($this->statement, $mode)) { + $err = $this->db->raiseError($this->statement, null, null, + 'could not execute statement', __FUNCTION__); + return $err; + } + + if (!empty($lobs)) { + foreach ($lob_keys as $i) { + if ((null !== $lobs[$i]['value']) && $lobs[$i]['value'] !== '') { + if (is_object($lobs[$i]['value'])) { + // Probably a NULL LOB + // @see http://bugs.php.net/bug.php?id=27485 + continue; + } + if ($lobs[$i]['file']) { + $result = $lobs[$i]['descriptor']->savefile($lobs[$i]['value']); + } else { + $result = $lobs[$i]['descriptor']->save($lobs[$i]['value']); + } + if (!$result) { + $result = $this->db->raiseError(null, null, null, + 'Unable to save descriptor contents', __FUNCTION__); + break; + } + } + } + + if (!PEAR::isError($result)) { + if (!$this->db->in_transaction) { + if (!@OCICommit($connection)) { + $result = $this->db->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + } else { + ++$this->db->uncommitedqueries; + } + } + } + } + + if (PEAR::isError($result)) { + return $result; + } + + if ($this->is_manip) { + $affected_rows = $this->db->_affectedRows($connection, $this->statement); + return $affected_rows; + } + + $result = $this->db->_wrapResult($this->statement, $this->result_types, + $result_class, $result_wrap_class, $this->limit, $this->offset); + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ free() + + /** + * Release resources allocated for the specified prepared query. + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function free() + { + if (null === $this->positions) { + return $this->db->raiseError(MDB2_ERROR, null, null, + 'Prepared statement has already been freed', __FUNCTION__); + } + $result = MDB2_OK; + + if ((null !== $this->statement) && !@OCIFreeStatement($this->statement)) { + $result = $this->db->raiseError(null, null, null, + 'Could not free statement', __FUNCTION__); + } + + parent::free(); + return $result; + } +} +?> \ No newline at end of file diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php index 4bcd32cdf8..8f674840e8 100755 --- a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php +++ b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php @@ -304,28 +304,29 @@ class Sabre_CalDAV_CalendarQueryValidator { // one is the first to trigger. Based on this, we can // determine if we can 'give up' expanding events. $firstAlarm = null; - foreach($expandedEvent->VALARM as $expandedAlarm) { + if ($expandedEvent->VALARM !== null) { + foreach($expandedEvent->VALARM as $expandedAlarm) { - $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); - if ($expandedAlarm->isInTimeRange($start, $end)) { - return true; - } + $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); + if ($expandedAlarm->isInTimeRange($start, $end)) { + return true; + } - if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { - // This is an alarm with a non-relative trigger - // time, likely created by a buggy client. The - // implication is that every alarm in this - // recurring event trigger at the exact same - // time. It doesn't make sense to traverse - // further. - } else { - // We store the first alarm as a means to - // figure out when we can stop traversing. - if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { - $firstAlarm = $effectiveTrigger; + if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { + // This is an alarm with a non-relative trigger + // time, likely created by a buggy client. The + // implication is that every alarm in this + // recurring event trigger at the exact same + // time. It doesn't make sense to traverse + // further. + } else { + // We store the first alarm as a means to + // figure out when we can stop traversing. + if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { + $firstAlarm = $effectiveTrigger; + } } } - } if (is_null($firstAlarm)) { // No alarm was found. diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php index 5903968c00..c56ab38484 100755 --- a/3rdparty/Sabre/CalDAV/Plugin.php +++ b/3rdparty/Sabre/CalDAV/Plugin.php @@ -49,23 +49,23 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { /** * The email handler for invites and other scheduling messages. - * - * @var Sabre_CalDAV_Schedule_IMip + * + * @var Sabre_CalDAV_Schedule_IMip */ protected $imipHandler; /** * Sets the iMIP handler. * - * iMIP = The email transport of iCalendar scheduling messages. Setting - * this is optional, but if you want the server to allow invites to be sent + * iMIP = The email transport of iCalendar scheduling messages. Setting + * this is optional, but if you want the server to allow invites to be sent * out, you must set a handler. * - * Specifically iCal will plain assume that the server supports this. If - * the server doesn't, iCal will display errors when inviting people to + * Specifically iCal will plain assume that the server supports this. If + * the server doesn't, iCal will display errors when inviting people to * events. * - * @param Sabre_CalDAV_Schedule_IMip $imipHandler + * @param Sabre_CalDAV_Schedule_IMip $imipHandler * @return void */ public function setIMipHandler(Sabre_CalDAV_Schedule_IMip $imipHandler) { @@ -723,12 +723,12 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (!$originator) { throw new Sabre_DAV_Exception_BadRequest('The Originator: header must be specified when making POST requests'); - } + } if (!$recipients) { throw new Sabre_DAV_Exception_BadRequest('The Recipient: header must be specified when making POST requests'); - } + } - if (!preg_match('/^mailto:(.*)@(.*)$/', $originator)) { + if (!preg_match('/^mailto:(.*)@(.*)$/i', $originator)) { throw new Sabre_DAV_Exception_BadRequest('Originator must start with mailto: and must be valid email address'); } $originator = substr($originator,7); @@ -737,14 +737,14 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { foreach($recipients as $k=>$recipient) { $recipient = trim($recipient); - if (!preg_match('/^mailto:(.*)@(.*)$/', $recipient)) { + if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { throw new Sabre_DAV_Exception_BadRequest('Recipients must start with mailto: and must be valid email address'); } $recipient = substr($recipient, 7); $recipients[$k] = $recipient; } - // We need to make sure that 'originator' matches one of the email + // We need to make sure that 'originator' matches one of the email // addresses of the selected principal. $principal = $outboxNode->getOwner(); $props = $this->server->getProperties($principal,array( @@ -760,7 +760,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); } - try { + try { $vObject = Sabre_VObject_Reader::read($this->server->httpRequest->getBody(true)); } catch (Sabre_VObject_ParseException $e) { throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); @@ -785,9 +785,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } if (in_array($method, array('REQUEST','REPLY','ADD','CANCEL')) && $componentType==='VEVENT') { - $this->iMIPMessage($originator, $recipients, $vObject); + $result = $this->iMIPMessage($originator, $recipients, $vObject); $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody('Messages sent'); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); } else { throw new Sabre_DAV_Exception_NotImplemented('This iTIP method is currently not implemented'); } @@ -796,18 +797,83 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { /** * Sends an iMIP message by email. - * - * @param string $originator - * @param array $recipients - * @param Sabre_VObject_Component $vObject - * @return void + * + * This method must return an array with status codes per recipient. + * This should look something like: + * + * array( + * 'user1@example.org' => '2.0;Success' + * ) + * + * Formatting for this status code can be found at: + * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 + * + * A list of valid status codes can be found at: + * https://tools.ietf.org/html/rfc5546#section-3.6 + * + * @param string $originator + * @param array $recipients + * @param Sabre_VObject_Component $vObject + * @return array */ protected function iMIPMessage($originator, array $recipients, Sabre_VObject_Component $vObject) { if (!$this->imipHandler) { - throw new Sabre_DAV_Exception_NotImplemented('No iMIP handler is setup on this server.'); + $resultStatus = '5.2;This server does not support this operation'; + } else { + $this->imipHandler->sendMessage($originator, $recipients, $vObject); + $resultStatus = '2.0;Success'; } - $this->imipHandler->sendMessage($originator, $recipients, $vObject); + + $result = array(); + foreach($recipients as $recipient) { + $result[$recipient] = $resultStatus; + } + + return $result; + + + } + + /** + * Generates a schedule-response XML body + * + * The recipients array is a key->value list, containing email addresses + * and iTip status codes. See the iMIPMessage method for a description of + * the value. + * + * @param array $recipients + * @return string + */ + public function generateScheduleResponse(array $recipients) { + + $dom = new DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $xscheduleResponse = $dom->createElement('cal:schedule-response'); + $dom->appendChild($xscheduleResponse); + + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); + + } + + foreach($recipients as $recipient=>$status) { + $xresponse = $dom->createElement('cal:response'); + + $xrecipient = $dom->createElement('cal:recipient'); + $xrecipient->appendChild($dom->createTextNode($recipient)); + $xresponse->appendChild($xrecipient); + + $xrequestStatus = $dom->createElement('cal:request-status'); + $xrequestStatus->appendChild($dom->createTextNode($status)); + $xresponse->appendChild($xrequestStatus); + + $xscheduleResponse->appendChild($xresponse); + + } + + return $dom->saveXML(); } diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php index 289a0c83a3..ace9901c08 100755 --- a/3rdparty/Sabre/CalDAV/Version.php +++ b/3rdparty/Sabre/CalDAV/Version.php @@ -14,7 +14,7 @@ class Sabre_CalDAV_Version { /** * Full version number */ - const VERSION = '1.6.3'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/CardDAV/Plugin.php b/3rdparty/Sabre/CardDAV/Plugin.php index ca20e46849..96def6dd96 100755 --- a/3rdparty/Sabre/CardDAV/Plugin.php +++ b/3rdparty/Sabre/CardDAV/Plugin.php @@ -154,7 +154,10 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $val = stream_get_contents($val); // Taking out \r to not screw up the xml output - $returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); + //$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); + // The stripping of \r breaks the Mail App in OSX Mountain Lion + // this is fixed in master, but not backported. /Tanghus + $returnedProperties[200][$addressDataProp] = $val; } } diff --git a/3rdparty/Sabre/DAV/Locks/Plugin.php b/3rdparty/Sabre/DAV/Locks/Plugin.php index fd956950b8..035b3a6386 100755 --- a/3rdparty/Sabre/DAV/Locks/Plugin.php +++ b/3rdparty/Sabre/DAV/Locks/Plugin.php @@ -292,7 +292,10 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin { $this->server->tree->getNodeForPath($uri); // We need to call the beforeWriteContent event for RFC3744 - $this->server->broadcastEvent('beforeWriteContent',array($uri)); + // Edit: looks like this is not used, and causing problems now. + // + // See Issue 222 + // $this->server->broadcastEvent('beforeWriteContent',array($uri)); } catch (Sabre_DAV_Exception_NotFound $e) { diff --git a/3rdparty/Sabre/DAV/Version.php b/3rdparty/Sabre/DAV/Version.php index 40cfe81b34..274646240a 100755 --- a/3rdparty/Sabre/DAV/Version.php +++ b/3rdparty/Sabre/DAV/Version.php @@ -14,7 +14,7 @@ class Sabre_DAV_Version { /** * Full version number */ - const VERSION = '1.6.3'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php index a747cc6a31..f90ed24f5d 100755 --- a/3rdparty/Sabre/HTTP/BasicAuth.php +++ b/3rdparty/Sabre/HTTP/BasicAuth.php @@ -46,7 +46,7 @@ class Sabre_HTTP_BasicAuth extends Sabre_HTTP_AbstractAuth { if (strpos(strtolower($auth),'basic')!==0) return false; - return explode(':', base64_decode(substr($auth, 6))); + return explode(':', base64_decode(substr($auth, 6)),2); } diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php index 23dc7f8a7a..e6b4f7e535 100755 --- a/3rdparty/Sabre/HTTP/Version.php +++ b/3rdparty/Sabre/HTTP/Version.php @@ -14,7 +14,7 @@ class Sabre_HTTP_Version { /** * Full version number */ - const VERSION = '1.6.2'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/VObject/Component/VEvent.php b/3rdparty/Sabre/VObject/Component/VEvent.php index 4cc1e36d7d..d6b910874d 100755 --- a/3rdparty/Sabre/VObject/Component/VEvent.php +++ b/3rdparty/Sabre/VObject/Component/VEvent.php @@ -42,14 +42,15 @@ class Sabre_VObject_Component_VEvent extends Sabre_VObject_Component { $effectiveStart = $this->DTSTART->getDateTime(); if (isset($this->DTEND)) { + + // The DTEND property is considered non inclusive. So for a 3 day + // event in july, dtstart and dtend would have to be July 1st and + // July 4th respectively. + // + // See: + // http://tools.ietf.org/html/rfc5545#page-54 $effectiveEnd = $this->DTEND->getDateTime(); - // If this was an all-day event, we should just increase the - // end-date by 1. Otherwise the event will last until the second - // the date changed, by increasing this by 1 day the event lasts - // all of the last day as well. - if ($this->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE) { - $effectiveEnd->modify('+1 day'); - } + } elseif (isset($this->DURATION)) { $effectiveEnd = clone $effectiveStart; $effectiveEnd->add( Sabre_VObject_DateTimeParser::parseDuration($this->DURATION) ); diff --git a/3rdparty/Sabre/VObject/RecurrenceIterator.php b/3rdparty/Sabre/VObject/RecurrenceIterator.php index 833aa091ab..740270dd8f 100755 --- a/3rdparty/Sabre/VObject/RecurrenceIterator.php +++ b/3rdparty/Sabre/VObject/RecurrenceIterator.php @@ -337,6 +337,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { $this->endDate = clone $this->startDate; if (isset($this->baseEvent->DURATION)) { $this->endDate->add(Sabre_VObject_DateTimeParser::parse($this->baseEvent->DURATION->value)); + } elseif ($this->baseEvent->DTSTART->getDateType()===Sabre_VObject_Property_DateTime::DATE) { + $this->endDate->modify('+1 day'); } } $this->currentDate = clone $this->startDate; @@ -561,7 +563,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { */ public function fastForward(DateTime $dt) { - while($this->valid() && $this->getDTEnd() < $dt) { + while($this->valid() && $this->getDTEnd() <= $dt) { $this->next(); } @@ -823,9 +825,40 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { */ protected function nextYearly() { + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + // No sub-rules, so we just advance by year if (!$this->byMonth) { + + // Unless it was a leap day! + if ($currentMonth==2 && $currentDayOfMonth==29) { + + $counter = 0; + do { + $counter++; + // Here we increase the year count by the interval, until + // we hit a date that's also in a leap year. + // + // We could just find the next interval that's dividable by + // 4, but that would ignore the rule that there's no leap + // year every year that's dividable by a 100, but not by + // 400. (1800, 1900, 2100). So we just rely on the datetime + // functions instead. + $nextDate = clone $this->currentDate; + $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); + } while ($nextDate->format('n')!=2); + $this->currentDate = $nextDate; + + return; + + } + + // The easiest form $this->currentDate->modify('+' . $this->interval . ' years'); return; + } $currentMonth = $this->currentDate->format('n'); @@ -877,8 +910,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } else { - // no byDay or byMonthDay, so we can just loop through the - // months. + // These are the 'byMonth' rules, if there are no byDay or + // byMonthDay sub-rules. do { $currentMonth++; @@ -888,6 +921,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + return; } diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php index 2617c7b129..9ee03d8711 100755 --- a/3rdparty/Sabre/VObject/Version.php +++ b/3rdparty/Sabre/VObject/Version.php @@ -14,7 +14,7 @@ class Sabre_VObject_Version { /** * Full version number */ - const VERSION = '1.3.3'; + const VERSION = '1.3.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/simpletest/extensions/coverage/autocoverage.php b/3rdparty/simpletest/extensions/coverage/autocoverage.php new file mode 100644 index 0000000000..9fc961bf43 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/autocoverage.php @@ -0,0 +1,29 @@ +startCoverage(); + register_shutdown_function("stop_coverage"); +} + +function stop_coverage() { + # hack until i can think of a way to run tests first and w/o exiting + $autorun = function_exists("run_local_tests"); + if ($autorun) { + $result = run_local_tests(); + } + CodeCoverage::getInstance()->stopCoverage(); + if ($autorun) { + exit($result ? 0 : 1); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/bin/php-coverage-close.php b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-close.php new file mode 100755 index 0000000000..9a5a52ba13 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-close.php @@ -0,0 +1,14 @@ +readSettings(); +$cc->writeUntouched(); +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/bin/php-coverage-open.php b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-open.php new file mode 100755 index 0000000000..c04e1fb512 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-open.php @@ -0,0 +1,31 @@ + these files should be included coverage report +# --exclude= these files should not be included in coverage report +# --maxdepth=2 when considering which file were not touched, scan directories +# +# Example: +# php-coverage-open.php --include='.*\.php$' --include='.*\.inc$' --exclude='.*/tests/.*' +/**#@+ + * include coverage files + */ +require_once(dirname(__FILE__) . '/../coverage_utils.php'); +CoverageUtils::requireSqlite(); +require_once(dirname(__FILE__) . '/../coverage.php'); +/**#@-*/ +$cc = new CodeCoverage(); +$cc->log = 'coverage.sqlite'; +$args = CoverageUtils::parseArguments($_SERVER['argv'], TRUE); +$cc->includes = CoverageUtils::issetOr($args['include[]'], array('.*\.php$')); +$cc->excludes = CoverageUtils::issetOr($args['exclude[]']); +$cc->maxDirectoryDepth = (int)CoverageUtils::issetOr($args['maxdepth'], '1'); +$cc->resetLog(); +$cc->writeSettings(); +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/bin/php-coverage-report.php b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-report.php new file mode 100755 index 0000000000..d61c822d99 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/bin/php-coverage-report.php @@ -0,0 +1,29 @@ +readSettings(); +$handler = new CoverageDataHandler($cc->log); +$report = new CoverageReporter(); +$args = CoverageUtils::parseArguments($_SERVER['argv']); +$report->reportDir = CoverageUtils::issetOr($args['reportDir'], 'coverage-report'); +$report->title = CoverageUtils::issetOr($args['title'], "Simpletest Coverage"); +$report->coverage = $handler->read(); +$report->untouched = $handler->readUntouchedFiles(); +$report->generate(); +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/coverage.php b/3rdparty/simpletest/extensions/coverage/coverage.php new file mode 100644 index 0000000000..44e5b679b8 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage.php @@ -0,0 +1,196 @@ +getTouchedFiles()); + $untouched = array(); + $this->getUntouchedFiles($untouched, $touched, '.', '.'); + $this->includeUntouchedFiles($untouched); + } + + function &getTouchedFiles() { + $handler = new CoverageDataHandler($this->log); + $touched = $handler->getFilenames(); + return $touched; + } + + function includeUntouchedFiles($untouched) { + $handler = new CoverageDataHandler($this->log); + foreach ($untouched as $file) { + $handler->writeUntouchedFile($file); + } + } + + function getUntouchedFiles(&$untouched, $touched, $parentPath, $rootPath, $directoryDepth = 1) { + $parent = opendir($parentPath); + while ($file = readdir($parent)) { + $path = "$parentPath/$file"; + if (is_dir($path)) { + if ($file != '.' && $file != '..') { + if ($this->isDirectoryIncluded($path, $directoryDepth)) { + $this->getUntouchedFiles($untouched, $touched, $path, $rootPath, $directoryDepth + 1); + } + } + } + else if ($this->isFileIncluded($path)) { + $relativePath = CoverageDataHandler::ltrim($rootPath .'/', $path); + if (!array_key_exists($relativePath, $touched)) { + $untouched[] = $relativePath; + } + } + } + closedir($parent); + } + + function resetLog() { + error_log('reseting log'); + $new_file = fopen($this->log, "w"); + if (!$new_file) { + throw new Exception("Could not create ". $this->log); + } + fclose($new_file); + if (!chmod($this->log, 0666)) { + throw new Exception("Could not change ownership on file ". $this->log); + } + $handler = new CoverageDataHandler($this->log); + $handler->createSchema(); + } + + function startCoverage() { + $this->root = getcwd(); + if(!extension_loaded("xdebug")) { + throw new Exception("Could not load xdebug extension"); + }; + xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); + } + + function stopCoverage() { + $cov = xdebug_get_code_coverage(); + $this->filter($cov); + $data = new CoverageDataHandler($this->log); + chdir($this->root); + $data->write($cov); + unset($data); // release sqlite connection + xdebug_stop_code_coverage(); + // make sure we wind up on same current working directory, otherwise + // coverage handler writer doesn't know what directory to chop off + chdir($this->root); + } + + function readSettings() { + if (file_exists($this->settingsFile)) { + $this->setSettings(file_get_contents($this->settingsFile)); + } else { + error_log("could not find file ". $this->settingsFile); + } + } + + function writeSettings() { + file_put_contents($this->settingsFile, $this->getSettings()); + } + + function getSettings() { + $data = array( + 'log' => realpath($this->log), + 'includes' => $this->includes, + 'excludes' => $this->excludes); + return serialize($data); + } + + function setSettings($settings) { + $data = unserialize($settings); + $this->log = $data['log']; + $this->includes = $data['includes']; + $this->excludes = $data['excludes']; + } + + function filter(&$coverage) { + foreach ($coverage as $file => $line) { + if (!$this->isFileIncluded($file)) { + unset($coverage[$file]); + } + } + } + + function isFileIncluded($file) { + if (!empty($this->excludes)) { + foreach ($this->excludes as $path) { + if (preg_match('|' . $path . '|', $file)) { + return False; + } + } + } + + if (!empty($this->includes)) { + foreach ($this->includes as $path) { + if (preg_match('|' . $path . '|', $file)) { + return True; + } + } + return False; + } + + return True; + } + + function isDirectoryIncluded($dir, $directoryDepth) { + if ($directoryDepth >= $this->maxDirectoryDepth) { + return false; + } + if (isset($this->excludes)) { + foreach ($this->excludes as $path) { + if (preg_match('|' . $path . '|', $dir)) { + return False; + } + } + } + + return True; + } + + static function isCoverageOn() { + $coverage = self::getInstance(); + $coverage->readSettings(); + if (empty($coverage->log) || !file_exists($coverage->log)) { + trigger_error('No coverage log'); + return False; + } + return True; + } + + static function getInstance() { + if (self::$instance == NULL) { + self::$instance = new CodeCoverage(); + self::$instance->readSettings(); + } + return self::$instance; + } +} +?> diff --git a/3rdparty/simpletest/extensions/coverage/coverage_calculator.php b/3rdparty/simpletest/extensions/coverage/coverage_calculator.php new file mode 100644 index 0000000000..f1aa57bbab --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_calculator.php @@ -0,0 +1,98 @@ +lineCoverageCodeToStyleClass($coverage, $i); + $lines[$i] = array('lineCoverage' => $lineCoverage, 'code' => $line); + } + + fclose($hnd); + + $var = compact('file', 'lines', 'coverage'); + return $var; + } + + function lineCoverageCodeToStyleClass($coverage, $line) { + if (!array_key_exists($line, $coverage)) { + return "comment"; + } + $code = $coverage[$line]; + if (empty($code)) { + return "comment"; + } + switch ($code) { + case -1: + return "missed"; + case -2: + return "dead"; + } + + return "covered"; + } + + function totalLoc($total, $coverage) { + return $total + sizeof($coverage); + } + + function lineCoverage($total, $line) { + # NOTE: counting dead code as covered, as it's almost always an executable line + # strange artifact of xdebug or underlying system + return $total + ($line > 0 || $line == -2 ? 1 : 0); + } + + function totalCoverage($total, $coverage) { + return $total + array_reduce($coverage, array(&$this, "lineCoverage")); + } + + static function reportFilename($filename) { + return preg_replace('|[/\\\\]|', '_', $filename) . '.html'; + } + + function percentCoverageByFile($coverage, $file, &$results) { + $byFileReport = self::reportFilename($file); + + $loc = sizeof($coverage); + if ($loc == 0) + return 0; + $lineCoverage = array_reduce($coverage, array(&$this, "lineCoverage")); + $percentage = 100 * ($lineCoverage / $loc); + $results[0][$file] = array('byFileReport' => $byFileReport, 'percentage' => $percentage); + } + + function variables($coverage, $untouched) { + $coverageByFile = array(); + array_walk($coverage, array(&$this, "percentCoverageByFile"), array(&$coverageByFile)); + + $totalLoc = array_reduce($coverage, array(&$this, "totalLoc")); + + if ($totalLoc > 0) { + $totalLinesOfCoverage = array_reduce($coverage, array(&$this, "totalCoverage")); + $totalPercentCoverage = 100 * ($totalLinesOfCoverage / $totalLoc); + } + + $untouchedPercentageDenominator = sizeof($coverage) + sizeof($untouched); + if ($untouchedPercentageDenominator > 0) { + $filesTouchedPercentage = 100 * sizeof($coverage) / $untouchedPercentageDenominator; + } + + $var = compact('coverageByFile', 'totalPercentCoverage', 'totalLoc', 'totalLinesOfCoverage', 'filesTouchedPercentage'); + $var['untouched'] = $untouched; + return $var; + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/coverage_data_handler.php b/3rdparty/simpletest/extensions/coverage/coverage_data_handler.php new file mode 100644 index 0000000000..bbf81106fc --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_data_handler.php @@ -0,0 +1,125 @@ +filename = $filename; + $this->db = new SQLiteDatabase($filename); + if (empty($this->db)) { + throw new Exception("Could not create sqlite db ". $filename); + } + } + + function createSchema() { + $this->db->queryExec("create table untouched (filename text)"); + $this->db->queryExec("create table coverage (name text, coverage text)"); + } + + function &getFilenames() { + $filenames = array(); + $cursor = $this->db->unbufferedQuery("select distinct name from coverage"); + while ($row = $cursor->fetch()) { + $filenames[] = $row[0]; + } + + return $filenames; + } + + function write($coverage) { + foreach ($coverage as $file => $lines) { + $coverageStr = serialize($lines); + $relativeFilename = self::ltrim(getcwd() . '/', $file); + $sql = "insert into coverage (name, coverage) values ('$relativeFilename', '$coverageStr')"; + # if this fails, check you have write permission + $this->db->queryExec($sql); + } + } + + function read() { + $coverage = array_flip($this->getFilenames()); + foreach($coverage as $file => $garbage) { + $coverage[$file] = $this->readFile($file); + } + return $coverage; + } + + function &readFile($file) { + $sql = "select coverage from coverage where name = '$file'"; + $aggregate = array(); + $result = $this->db->query($sql); + while ($result->valid()) { + $row = $result->current(); + $this->aggregateCoverage($aggregate, unserialize($row[0])); + $result->next(); + } + + return $aggregate; + } + + function aggregateCoverage(&$total, $next) { + foreach ($next as $lineno => $code) { + if (!isset($total[$lineno])) { + $total[$lineno] = $code; + } else { + $total[$lineno] = $this->aggregateCoverageCode($total[$lineno], $code); + } + } + } + + function aggregateCoverageCode($code1, $code2) { + switch($code1) { + case -2: return -2; + case -1: return $code2; + default: + switch ($code2) { + case -2: return -2; + case -1: return $code1; + } + } + return $code1 + $code2; + } + + static function ltrim($cruft, $pristine) { + if(stripos($pristine, $cruft) === 0) { + return substr($pristine, strlen($cruft)); + } + return $pristine; + } + + function writeUntouchedFile($file) { + $relativeFile = CoverageDataHandler::ltrim('./', $file); + $sql = "insert into untouched values ('$relativeFile')"; + $this->db->queryExec($sql); + } + + function &readUntouchedFiles() { + $untouched = array(); + $result = $this->db->query("select filename from untouched order by filename"); + while ($result->valid()) { + $row = $result->current(); + $untouched[] = $row[0]; + $result->next(); + } + + return $untouched; + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/coverage_reporter.php b/3rdparty/simpletest/extensions/coverage/coverage_reporter.php new file mode 100644 index 0000000000..ba4e7161c2 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_reporter.php @@ -0,0 +1,68 @@ +writer = new SimpleCoverageWriter(); + $this->calculator = new CoverageCalculator(); + } + + function generateSummaryReport($out) { + $variables = $this->calculator->variables($this->coverage, $this->untouched); + $variables['title'] = $this->title; + $report = $this->writer->writeSummary($out, $variables); + fwrite($out, $report); + } + + function generate() { + CoverageUtils::mkdir($this->reportDir); + + $index = $this->reportDir .'/index.html'; + $hnd = fopen($index, 'w'); + $this->generateSummaryReport($hnd); + fclose($hnd); + + foreach ($this->coverage as $file => $cov) { + $byFile = $this->reportDir .'/'. self::reportFilename($file); + $byFileHnd = fopen($byFile, 'w'); + $this->generateCoverageByFile($byFileHnd, $file, $cov); + fclose($byFileHnd); + } + + echo "generated report $index\n"; + } + + function generateCoverageByFile($out, $file, $cov) { + $variables = $this->calculator->coverageByFileVariables($file, $cov); + $variables['title'] = $this->title .' - '. $file; + $this->writer->writeByFile($out, $variables); + } + + static function reportFilename($filename) { + return preg_replace('|[/\\\\]|', '_', $filename) . '.html'; + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/coverage_utils.php b/3rdparty/simpletest/extensions/coverage/coverage_utils.php new file mode 100644 index 0000000000..d2c3a635f4 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_utils.php @@ -0,0 +1,114 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/coverage_writer.php b/3rdparty/simpletest/extensions/coverage/coverage_writer.php new file mode 100644 index 0000000000..0a8519cb50 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_writer.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/simple_coverage_writer.php b/3rdparty/simpletest/extensions/coverage/simple_coverage_writer.php new file mode 100644 index 0000000000..7eb73fc8ab --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/simple_coverage_writer.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/templates/file.php b/3rdparty/simpletest/extensions/coverage/templates/file.php new file mode 100644 index 0000000000..70f6903068 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/templates/file.php @@ -0,0 +1,60 @@ + + +<?php echo $title ?> + + + +

+ + + $line) { ?> + + + + + + +
+

Legend

+
+
Missed
+
lines code that were not excersized during program execution.
+
Covered
+
lines code were excersized during program execution.
+
Comment/non executable
+
Comment or non-executable line of code.
+
Dead
+
lines of code that according to xdebug could not be executed. This is counted as coverage code because + in almost all cases it is code that runnable.
+
+ + diff --git a/3rdparty/simpletest/extensions/coverage/templates/index.php b/3rdparty/simpletest/extensions/coverage/templates/index.php new file mode 100644 index 0000000000..e4374e2380 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/templates/index.php @@ -0,0 +1,106 @@ + + +<?php echo $title ?> + + + +

+ + + + + + + + + + + + + + + + +
Summary
Total Coverage (?) :%
Total Files Covered (?) :%
Report Generation Date :
+ + + + + + + + + + $coverage) { ?> + + + + + + +
Coverage (?)
FileCoverage
%
+ + + + $file) { ?> + + + + + +
Files Not Covered (?)
+ +

Glossary

+
+
Total Coverage
+
Ratio of all the lines of executable code that were executed to the + lines of code that were not executed. This does not include the files + that were not covered at all.
+
Total Files Covered
+
This is the ratio of the number of files tested, to the number of + files not tested at all.
+
Coverage
+
These files were parsed and loaded by the php interpreter while + running the tests. Percentage is determined by the ratio of number of + lines of code executed to the number of possible executable lines of + code. "dead" lines of code, or code that could not be executed + according to xdebug, are counted as covered because in almost all cases + it is the end of a logical loop.
+
Files Not Covered
+
These files were not loaded by the php interpreter at anytime + during a unit test. You could consider these files having 0% coverage, + but because it is difficult to determine the total coverage unless you + could count the lines for executable code, this is not reflected in the + Total Coverage calculation.
+
+ +

Code coverage generated by SimpleTest

+ + + diff --git a/3rdparty/simpletest/extensions/coverage/test/coverage_calculator_test.php b/3rdparty/simpletest/extensions/coverage/test/coverage_calculator_test.php new file mode 100644 index 0000000000..64bd8d463f --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/coverage_calculator_test.php @@ -0,0 +1,65 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../coverage_calculator.php'; + $this->calc = new CoverageCalculator(); + } + + function testVariables() { + $coverage = array('file' => array(1,1,1,1)); + $untouched = array('missed-file'); + $variables = $this->calc->variables($coverage, $untouched); + $this->assertEqual(4, $variables['totalLoc']); + $this->assertEqual(100, $variables['totalPercentCoverage']); + $this->assertEqual(4, $variables['totalLinesOfCoverage']); + $expected = array('file' => array('byFileReport' => 'file.html', 'percentage' => 100)); + $this->assertEqual($expected, $variables['coverageByFile']); + $this->assertEqual(50, $variables['filesTouchedPercentage']); + $this->assertEqual($untouched, $variables['untouched']); + } + + function testPercentageCoverageByFile() { + $coverage = array(0,0,0,1,1,1); + $results = array(); + $this->calc->percentCoverageByFile($coverage, 'file', $results); + $pct = $results[0]; + $this->assertEqual(50, $pct['file']['percentage']); + $this->assertEqual('file.html', $pct['file']['byFileReport']); + } + + function testTotalLoc() { + $this->assertEqual(13, $this->calc->totalLoc(10, array(1,2,3))); + } + + function testLineCoverage() { + $this->assertEqual(10, $this->calc->lineCoverage(10, -1)); + $this->assertEqual(10, $this->calc->lineCoverage(10, 0)); + $this->assertEqual(11, $this->calc->lineCoverage(10, 1)); + } + + function testTotalCoverage() { + $this->assertEqual(11, $this->calc->totalCoverage(10, array(-1,1))); + } + + static function getAttribute($element, $attribute) { + $a = $element->attributes(); + return $a[$attribute]; + } + + static function dom($stream) { + rewind($stream); + $actual = stream_get_contents($stream); + $html = DOMDocument::loadHTML($actual); + return simplexml_import_dom($html); + } +} + +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/coverage_data_handler_test.php b/3rdparty/simpletest/extensions/coverage/test/coverage_data_handler_test.php new file mode 100644 index 0000000000..54c67a4a7b --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/coverage_data_handler_test.php @@ -0,0 +1,83 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../coverage_data_handler.php'; + } + + function testAggregateCoverageCode() { + $handler = new CoverageDataHandler($this->tempdb()); + $this->assertEqual(-2, $handler->aggregateCoverageCode(-2, -2)); + $this->assertEqual(-2, $handler->aggregateCoverageCode(-2, 10)); + $this->assertEqual(-2, $handler->aggregateCoverageCode(10, -2)); + $this->assertEqual(-1, $handler->aggregateCoverageCode(-1, -1)); + $this->assertEqual(10, $handler->aggregateCoverageCode(-1, 10)); + $this->assertEqual(10, $handler->aggregateCoverageCode(10, -1)); + $this->assertEqual(20, $handler->aggregateCoverageCode(10, 10)); + } + + function testSimpleWriteRead() { + $handler = new CoverageDataHandler($this->tempdb()); + $handler->createSchema(); + $coverage = array(10 => -2, 20 => -1, 30 => 0, 40 => 1); + $handler->write(array('file' => $coverage)); + + $actual = $handler->readFile('file'); + $expected = array(10 => -2, 20 => -1, 30 => 0, 40 => 1); + $this->assertEqual($expected, $actual); + } + + function testMultiFileWriteRead() { + $handler = new CoverageDataHandler($this->tempdb()); + $handler->createSchema(); + $handler->write(array( + 'file1' => array(-2, -1, 1), + 'file2' => array(-2, -1, 1) + )); + $handler->write(array( + 'file1' => array(-2, -1, 1) + )); + + $expected = array( + 'file1' => array(-2, -1, 2), + 'file2' => array(-2, -1, 1) + ); + $actual = $handler->read(); + $this->assertEqual($expected, $actual); + } + + function testGetfilenames() { + $handler = new CoverageDataHandler($this->tempdb()); + $handler->createSchema(); + $rawCoverage = array('file0' => array(), 'file1' => array()); + $handler->write($rawCoverage); + $actual = $handler->getFilenames(); + $this->assertEqual(array('file0', 'file1'), $actual); + } + + function testWriteUntouchedFiles() { + $handler = new CoverageDataHandler($this->tempdb()); + $handler->createSchema(); + $handler->writeUntouchedFile('bluejay'); + $handler->writeUntouchedFile('robin'); + $this->assertEqual(array('bluejay', 'robin'), $handler->readUntouchedFiles()); + } + + function testLtrim() { + $this->assertEqual('ber', CoverageDataHandler::ltrim('goo', 'goober')); + $this->assertEqual('some/file', CoverageDataHandler::ltrim('./', './some/file')); + $this->assertEqual('/x/y/z/a/b/c', CoverageDataHandler::ltrim('/a/b/', '/x/y/z/a/b/c')); + } + + function tempdb() { + return tempnam(NULL, 'coverage.test.db'); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/coverage_reporter_test.php b/3rdparty/simpletest/extensions/coverage/test/coverage_reporter_test.php new file mode 100644 index 0000000000..a8b09962a0 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/coverage_reporter_test.php @@ -0,0 +1,22 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../coverage_reporter.php'; + new CoverageReporter(); + } + + function testreportFilename() { + $this->assertEqual("parula.php.html", CoverageReporter::reportFilename("parula.php")); + $this->assertEqual("warbler_parula.php.html", CoverageReporter::reportFilename("warbler/parula.php")); + $this->assertEqual("warbler_parula.php.html", CoverageReporter::reportFilename("warbler\\parula.php")); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/coverage_test.php b/3rdparty/simpletest/extensions/coverage/test/coverage_test.php new file mode 100644 index 0000000000..f09d03f78a --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/coverage_test.php @@ -0,0 +1,109 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../coverage.php'; + } + + function testIsFileIncluded() { + $coverage = new CodeCoverage(); + $this->assertTrue($coverage->isFileIncluded('aaa')); + $coverage->includes = array('a'); + $this->assertTrue($coverage->isFileIncluded('aaa')); + $coverage->includes = array('x'); + $this->assertFalse($coverage->isFileIncluded('aaa')); + $coverage->excludes = array('aa'); + $this->assertFalse($coverage->isFileIncluded('aaa')); + } + + function testIsFileIncludedRegexp() { + $coverage = new CodeCoverage(); + $coverage->includes = array('modules/.*\.php$'); + $coverage->excludes = array('bad-bunny.php'); + $this->assertFalse($coverage->isFileIncluded('modules/a.test')); + $this->assertFalse($coverage->isFileIncluded('modules/bad-bunny.test')); + $this->assertTrue($coverage->isFileIncluded('modules/test.php')); + $this->assertFalse($coverage->isFileIncluded('module-bad/good-bunny.php')); + $this->assertTrue($coverage->isFileIncluded('modules/good-bunny.php')); + } + + function testIsDirectoryIncludedPastMaxDepth() { + $coverage = new CodeCoverage(); + $coverage->maxDirectoryDepth = 5; + $this->assertTrue($coverage->isDirectoryIncluded('aaa', 1)); + $this->assertFalse($coverage->isDirectoryIncluded('aaa', 5)); + } + + function testIsDirectoryIncluded() { + $coverage = new CodeCoverage(); + $this->assertTrue($coverage->isDirectoryIncluded('aaa', 0)); + $coverage->excludes = array('b$'); + $this->assertTrue($coverage->isDirectoryIncluded('aaa', 0)); + $coverage->includes = array('a$'); // includes are ignore, all dirs are included unless excluded + $this->assertTrue($coverage->isDirectoryIncluded('aaa', 0)); + $coverage->excludes = array('.*a$'); + $this->assertFalse($coverage->isDirectoryIncluded('aaa', 0)); + } + + function testFilter() { + $coverage = new CodeCoverage(); + $data = array('a' => 0, 'b' => 0, 'c' => 0); + $coverage->includes = array('b'); + $coverage->filter($data); + $this->assertEqual(array('b' => 0), $data); + } + + function testUntouchedFiles() { + $coverage = new CodeCoverage(); + $touched = array_flip(array("test/coverage_test.php")); + $actual = array(); + $coverage->includes = array('coverage_test\.php$'); + $parentDir = realpath(dirname(__FILE__)); + $coverage->getUntouchedFiles($actual, $touched, $parentDir, $parentDir); + $this->assertEqual(array("coverage_test.php"), $actual); + } + + function testResetLog() { + $coverage = new CodeCoverage(); + $coverage->log = tempnam(NULL, 'php.xdebug.coverage.test.'); + $coverage->resetLog(); + $this->assertTrue(file_exists($coverage->log)); + } + + function testSettingsSerialization() { + $coverage = new CodeCoverage(); + $coverage->log = '/banana/boat'; + $coverage->includes = array('apple', 'orange'); + $coverage->excludes = array('tomato', 'pea'); + $data = $coverage->getSettings(); + $this->assertNotNull($data); + + $actual = new CodeCoverage(); + $actual->setSettings($data); + $this->assertEqual('/banana/boat', $actual->log); + $this->assertEqual(array('apple', 'orange'), $actual->includes); + $this->assertEqual(array('tomato', 'pea'), $actual->excludes); + } + + function testSettingsCanBeReadWrittenToDisk() { + $settings_file = 'banana-boat-coverage-settings-test.dat'; + $coverage = new CodeCoverage(); + $coverage->log = '/banana/boat'; + $coverage->settingsFile = $settings_file; + $coverage->writeSettings(); + + $actual = new CodeCoverage(); + $actual->settingsFile = $settings_file; + $actual->readSettings(); + $this->assertEqual('/banana/boat', $actual->log); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/coverage_utils_test.php b/3rdparty/simpletest/extensions/coverage/test/coverage_utils_test.php new file mode 100644 index 0000000000..b900c5d2c4 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/coverage_utils_test.php @@ -0,0 +1,70 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../coverage_utils.php'; + } + + function testMkdir() { + CoverageUtils::mkdir(dirname(__FILE__)); + try { + CoverageUtils::mkdir(__FILE__); + $this->fail("Should give error about cannot create dir of a file"); + } catch (Exception $expected) { + } + } + + function testIsPackageClassAvailable() { + $coverageSource = dirname(__FILE__) .'/../coverage_calculator.php'; + $this->assertTrue(CoverageUtils::isPackageClassAvailable($coverageSource, 'CoverageCalculator')); + $this->assertFalse(CoverageUtils::isPackageClassAvailable($coverageSource, 'BogusCoverage')); + $this->assertFalse(CoverageUtils::isPackageClassAvailable('bogus-file', 'BogusCoverage')); + $this->assertTrue(CoverageUtils::isPackageClassAvailable('bogus-file', 'CoverageUtils')); + } + + function testParseArgumentsMultiValue() { + $actual = CoverageUtils::parseArguments(array('scriptname', '--a=b', '--a=c'), True); + $expected = array('extraArguments' => array(), 'a' => 'c', 'a[]' => array('b', 'c')); + $this->assertEqual($expected, $actual); + } + + function testParseArguments() { + $actual = CoverageUtils::parseArguments(array('scriptname', '--a=b', '-c', 'xxx')); + $expected = array('a' => 'b', 'c' => '', 'extraArguments' => array('xxx')); + $this->assertEqual($expected, $actual); + } + + function testParseDoubleDashNoArguments() { + $actual = CoverageUtils::parseArguments(array('scriptname', '--aa')); + $this->assertTrue(isset($actual['aa'])); + } + + function testParseHyphenedExtraArguments() { + $actual = CoverageUtils::parseArguments(array('scriptname', '--alpha-beta=b', 'gamma-lambda')); + $expected = array('alpha-beta' => 'b', 'extraArguments' => array('gamma-lambda')); + $this->assertEqual($expected, $actual); + } + + function testAddItemAsArray() { + $actual = array(); + CoverageUtils::addItemAsArray($actual, 'bird', 'duck'); + $this->assertEqual(array('bird[]' => array('duck')), $actual); + + CoverageUtils::addItemAsArray(&$actual, 'bird', 'pigeon'); + $this->assertEqual(array('bird[]' => array('duck', 'pigeon')), $actual); + } + + function testIssetOr() { + $data = array('bird' => 'gull'); + $this->assertEqual('lab', CoverageUtils::issetOr($data['dog'], 'lab')); + $this->assertEqual('gull', CoverageUtils::issetOr($data['bird'], 'sparrow')); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/sample/code.php b/3rdparty/simpletest/extensions/coverage/test/sample/code.php new file mode 100644 index 0000000000..a2438f4bee --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/sample/code.php @@ -0,0 +1,4 @@ +skipIf( + !file_exists('DB/sqlite.php'), + 'The Coverage extension needs to have PEAR installed'); + } + + function setUp() { + require_once dirname(__FILE__) .'/../simple_coverage_writer.php'; + require_once dirname(__FILE__) .'/../coverage_calculator.php'; + + } + + function testGenerateSummaryReport() { + $writer = new SimpleCoverageWriter(); + $coverage = array('file' => array(0, 1)); + $untouched = array('missed-file'); + $calc = new CoverageCalculator(); + $variables = $calc->variables($coverage, $untouched); + $variables['title'] = 'coverage'; + $out = fopen("php://memory", 'w'); + $writer->writeSummary($out, $variables); + $dom = self::dom($out); + $totalPercentCoverage = $dom->elements->xpath("//span[@class='totalPercentCoverage']"); + $this->assertEqual('50%', (string)$totalPercentCoverage[0]); + + $fileLinks = $dom->elements->xpath("//a[@class='byFileReportLink']"); + $fileLinkAttr = $fileLinks[0]->attributes(); + $this->assertEqual('file.html', $fileLinkAttr['href']); + $this->assertEqual('file', (string)($fileLinks[0])); + + $untouchedFile = $dom->elements->xpath("//span[@class='untouchedFile']"); + $this->assertEqual('missed-file', (string)$untouchedFile[0]); + } + + function testGenerateCoverageByFile() { + $writer = new SimpleCoverageWriter(); + $cov = array(3 => 1, 4 => -2); // 2 comments, 1 code, 1 dead (1-based indexes) + $out = fopen("php://memory", 'w'); + $file = dirname(__FILE__) .'/sample/code.php'; + $calc = new CoverageCalculator(); + $variables = $calc->coverageByFileVariables($file, $cov); + $variables['title'] = 'coverage'; + $writer->writeByFile($out, $variables); + $dom = self::dom($out); + + $cells = $dom->elements->xpath("//table[@id='code']/tbody/tr/td/span"); + $this->assertEqual("comment code", self::getAttribute($cells[1], 'class')); + $this->assertEqual("comment code", self::getAttribute($cells[3], 'class')); + $this->assertEqual("covered code", self::getAttribute($cells[5], 'class')); + $this->assertEqual("dead code", self::getAttribute($cells[7], 'class')); + } + + static function getAttribute($element, $attribute) { + $a = $element->attributes(); + return $a[$attribute]; + } + + static function dom($stream) { + rewind($stream); + $actual = stream_get_contents($stream); + $html = DOMDocument::loadHTML($actual); + return simplexml_import_dom($html); + } +} +?> \ No newline at end of file diff --git a/3rdparty/simpletest/extensions/coverage/test/test.php b/3rdparty/simpletest/extensions/coverage/test/test.php new file mode 100644 index 0000000000..0af4dbf3e7 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/test/test.php @@ -0,0 +1,14 @@ +TestSuite('Coverage Unit tests'); + $path = dirname(__FILE__) . '/*_test.php'; + foreach(glob($path) as $test) { + $this->addFile($test); + } + } +} +?> \ No newline at end of file diff --git a/3rdparty/smb4php/smb.php b/3rdparty/smb4php/smb.php index 12c5890723..c50b26b935 100644 --- a/3rdparty/smb4php/smb.php +++ b/3rdparty/smb4php/smb.php @@ -166,6 +166,8 @@ class smb { return false; }elseif(substr($regs[0],0,31)=='NT_STATUS_OBJECT_PATH_NOT_FOUND'){ return false; + }elseif(substr($regs[0],0,29)=='NT_STATUS_FILE_IS_A_DIRECTORY'){ + return false; } trigger_error($regs[0].' params('.$params.')', E_USER_ERROR); } diff --git a/AUTHORS b/AUTHORS index f618df9311..f79733c250 100644 --- a/AUTHORS +++ b/AUTHORS @@ -19,3 +19,6 @@ With help from many libraries and frameworks including: SabreDAV jQuery … + +"Lock” symbol from thenounproject.com collection +"Clock” symbol by Brandon Hopkins, from thenounproject.com collection \ No newline at end of file diff --git a/README b/README index 77379a4645..7c60e81a7b 100644 --- a/README +++ b/README @@ -5,9 +5,9 @@ http://ownCloud.org Installation instructions: http://owncloud.org/support -Source code: http://gitorious.org/owncloud -Mailing list: http://mail.kde.org/mailman/listinfo/owncloud -IRC channel: http://webchat.freenode.net/?channels=owncloud +Source code: https://github.com/owncloud +Mailing list: https://mail.kde.org/mailman/listinfo/owncloud +IRC channel: https://webchat.freenode.net/?channels=owncloud Diaspora: https://joindiaspora.com/u/owncloud -Identi.ca: http://identi.ca/owncloud +Identi.ca: https://identi.ca/owncloud diff --git a/apps/admin_audit/appinfo/app.php b/apps/admin_audit/appinfo/app.php deleted file mode 100644 index e52f633cf1..0000000000 --- a/apps/admin_audit/appinfo/app.php +++ /dev/null @@ -1,18 +0,0 @@ - - - admin_audit - Log audit info - 0.1 - AGPL - Bart Visscher - 2 - Audit user actions in Owncloud - diff --git a/apps/admin_audit/lib/hooks_handlers.php b/apps/admin_audit/lib/hooks_handlers.php deleted file mode 100644 index c5aec97d93..0000000000 --- a/apps/admin_audit/lib/hooks_handlers.php +++ /dev/null @@ -1,72 +0,0 @@ - - - admin_dependencies_chk - ownCloud dependencies info - AGPL - Brice Maron (eMerzh) - 4 - true - Display OwnCloud's dependencies informations (missings modules, ...) - diff --git a/apps/admin_dependencies_chk/appinfo/version b/apps/admin_dependencies_chk/appinfo/version deleted file mode 100644 index d1c6331b31..0000000000 --- a/apps/admin_dependencies_chk/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.01 \ No newline at end of file diff --git a/apps/admin_dependencies_chk/css/style.css b/apps/admin_dependencies_chk/css/style.css deleted file mode 100644 index 30f204be7b..0000000000 --- a/apps/admin_dependencies_chk/css/style.css +++ /dev/null @@ -1,9 +0,0 @@ -#status_list legend { font-weight: bold; color: #888888; } -.state > li { margin-bottom: 3px; padding-left: 0.5em; list-style-type: circle; } -.state .state_module { font-weight:bold; text-shadow: 0 1px 0 #DDD; cursor:help;} - -.state_used ul, .state_used li { display:inline; } - -.state_ok .state_module { color: #009700; } -.state_warning .state_module { color: #FF9B29; } -.state_error .state_module { color: #FF3B3B; } diff --git a/apps/admin_dependencies_chk/settings.php b/apps/admin_dependencies_chk/settings.php deleted file mode 100644 index 4e0803f791..0000000000 --- a/apps/admin_dependencies_chk/settings.php +++ /dev/null @@ -1,102 +0,0 @@ -. - * - */ -$l=OC_L10N::get('admin_dependencies_chk'); -$tmpl = new OCP\Template( 'admin_dependencies_chk', 'settings'); - -$modules = array(); - -//Possible status are : ok, error, warning -$modules[] =array( - 'status' => function_exists('json_encode') ? 'ok' : 'error', - 'part'=> 'php-json', - 'modules'=> array('core'), - 'message'=> $l->t('The php-json module is needed by the many applications for inter communications')); - -$modules[] =array( - 'status' => function_exists('curl_init') ? 'ok' : 'error', - 'part'=> 'php-curl', - 'modules'=> array('bookmarks'), - 'message'=> $l->t('The php-curl modude is needed to fetch the page title when adding a bookmarks')); - -$modules[] =array( - 'status' => function_exists('imagepng') ? 'ok' : 'error', - 'part'=> 'php-gd', - 'modules'=> array('gallery'), - 'message'=> $l->t('The php-gd module is needed to create thumbnails of your images')); - -$modules[] =array( - 'status' => function_exists("ldap_bind") ? 'ok' : 'error', - 'part'=> 'php-ldap', - 'modules'=> array('user_ldap'), - 'message'=> $l->t('The php-ldap module is needed connect to your ldap server')); - -$modules[] =array( - 'status' => class_exists('ZipArchive') ? 'ok' : 'warning', - 'part'=> 'php-zip', - 'modules'=> array('admin_export','core'), - 'message'=> $l->t('The php-zip module is needed download multiple files at once')); - -$modules[] =array( - 'status' => function_exists('mb_detect_encoding') ? 'ok' : 'error', - 'part'=> 'php-mb_multibyte ', - 'modules'=> array('core'), - 'message'=> $l->t('The php-mb_multibyte module is needed to manage correctly the encoding.')); - -$modules[] =array( - 'status' => function_exists('ctype_digit') ? 'ok' : 'error', - 'part'=> 'php-ctype', - 'modules'=> array('core'), - 'message'=> $l->t('The php-ctype module is needed validate data.')); - -$modules[] =array( - 'status' => class_exists('DOMDocument') ? 'ok' : 'error', - 'part'=> 'php-xml', - 'modules'=> array('core'), - 'message'=> $l->t('The php-xml module is needed to share files with webdav.')); - -$modules[] =array( - 'status' => ini_get('allow_url_fopen') == '1' ? 'ok' : 'error', - 'part'=> 'allow_url_fopen', - 'modules'=> array('core'), - 'message'=> $l->t('The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers')); - -$modules[] =array( - 'status' => class_exists('PDO') ? 'ok' : 'warning', - 'part'=> 'php-pdo', - 'modules'=> array('core'), - 'message'=> $l->t('The php-pdo module is needed to store owncloud data into a database.')); - -foreach($modules as $key => $module) { - $enabled = false ; - foreach($module['modules'] as $app) { - if(OCP\App::isEnabled($app) || $app=='core'){ - $enabled = true; - } - } - if($enabled == false) unset($modules[$key]); -} - -OCP\UTIL::addStyle('admin_dependencies_chk', 'style'); -$tmpl->assign( 'items', $modules ); - -return $tmpl->fetchPage(); diff --git a/apps/admin_dependencies_chk/templates/settings.php b/apps/admin_dependencies_chk/templates/settings.php deleted file mode 100644 index 8ff27ebb18..0000000000 --- a/apps/admin_dependencies_chk/templates/settings.php +++ /dev/null @@ -1,16 +0,0 @@ -
- t('Dependencies status');?> -
    - -
  • - -
    t('Used by :');?> -
      - -
    • - -
    -
  • - -
-
\ No newline at end of file diff --git a/apps/admin_migrate/appinfo/info.xml b/apps/admin_migrate/appinfo/info.xml deleted file mode 100644 index f48c666ffe..0000000000 --- a/apps/admin_migrate/appinfo/info.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - admin_migrate - ownCloud Instance Migration - Import/Export your owncloud instance - AGPL - Thomas Schmidt and Tom Needham - 4 - true - - diff --git a/apps/admin_migrate/appinfo/version b/apps/admin_migrate/appinfo/version deleted file mode 100644 index ceab6e11ec..0000000000 --- a/apps/admin_migrate/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/apps/admin_migrate/settings.php b/apps/admin_migrate/settings.php deleted file mode 100644 index daa56390af..0000000000 --- a/apps/admin_migrate/settings.php +++ /dev/null @@ -1,57 +0,0 @@ -. - * - */ -OCP\User::checkAdminUser(); -OCP\App::checkAppEnabled('admin_migrate'); - -// Export? -if (isset($_POST['admin_export'])) { - // Create the export zip - $response = json_decode( OC_Migrate::export( null, $_POST['export_type'] ) ); - if( !$response->success ){ - // Error - die('error'); - } else { - $path = $response->data; - // Download it - header("Content-Type: application/zip"); - header("Content-Disposition: attachment; filename=" . basename($path)); - header("Content-Length: " . filesize($path)); - @ob_end_clean(); - readfile( $path ); - unlink( $path ); - } -// Import? -} else if( isset($_POST['admin_import']) ){ - $from = $_FILES['owncloud_import']['tmp_name']; - - if( !OC_Migrate::import( $from, 'instance' ) ){ - die('failed'); - } - -} else { -// fill template - $tmpl = new OCP\Template('admin_migrate', 'settings'); - return $tmpl->fetchPage(); -} \ No newline at end of file diff --git a/apps/admin_migrate/templates/settings.php b/apps/admin_migrate/templates/settings.php deleted file mode 100644 index f81c9199ec..0000000000 --- a/apps/admin_migrate/templates/settings.php +++ /dev/null @@ -1,31 +0,0 @@ -
-
- t('Export this ownCloud instance');?> -

t('This will create a compressed file that contains the data of this owncloud instance. - Please choose the export type:');?> -

-

What would you like to export?

-

- ownCloud instance (suitable for import )
- ownCloud system files
- Just user files
- -

-
- -
-
- t('Import an ownCloud instance. THIS WILL DELETE ALL CURRENT OWNCLOUD DATA');?> -

t('All current ownCloud data will be replaced by the ownCloud instance that is uploaded.');?> -

-

-

- -
-
- diff --git a/apps/bookmarks/addBm.php b/apps/bookmarks/addBm.php deleted file mode 100644 index 4df93c8b05..0000000000 --- a/apps/bookmarks/addBm.php +++ /dev/null @@ -1,33 +0,0 @@ -. -* -*/ - - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('bookmarks'); - -require_once('bookmarksHelper.php'); -addBookmark($_GET['url'], '', 'Read-Later'); - -include 'templates/addBm.php'; diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php deleted file mode 100644 index 483716405a..0000000000 --- a/apps/bookmarks/ajax/addBookmark.php +++ /dev/null @@ -1,37 +0,0 @@ -. -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); - -require_once(OC_App::getAppPath('bookmarks').'/bookmarksHelper.php'); -$id = addBookmark($_POST['url'], $_POST['title'], $_POST['tags']); -OCP\JSON::success(array('data' => $id)); \ No newline at end of file diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php deleted file mode 100644 index f40f02ebab..0000000000 --- a/apps/bookmarks/ajax/delBookmark.php +++ /dev/null @@ -1,41 +0,0 @@ -. -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); - -$id = $_POST['id']; -if (!OC_Bookmarks_Bookmarks::deleteUrl($id)){ - OC_JSON::error(); - exit(); -} - -OCP\JSON::success(); diff --git a/apps/bookmarks/ajax/editBookmark.php b/apps/bookmarks/ajax/editBookmark.php deleted file mode 100644 index 0b37d161af..0000000000 --- a/apps/bookmarks/ajax/editBookmark.php +++ /dev/null @@ -1,88 +0,0 @@ - -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see . -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -OCP\JSON::checkAppEnabled('bookmarks'); - -$CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); -if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_ut = "strftime('%s','now')"; -} elseif($CONFIG_DBTYPE == 'pgsql') { - $_ut = 'date_part(\'epoch\',now())::integer'; -} else { - $_ut = "UNIX_TIMESTAMP()"; -} - -$bookmark_id = (int)$_POST["id"]; -$user_id = OCP\USER::getUser(); - -$query = OCP\DB::prepare(" - UPDATE *PREFIX*bookmarks - SET url = ?, title =?, lastmodified = $_ut - WHERE id = ? - AND user_id = ? - "); - -$params=array( - htmlspecialchars_decode($_POST["url"]), - htmlspecialchars_decode($_POST["title"]), - $bookmark_id, - $user_id, - ); - -$result = $query->execute($params); - -# Abort the operation if bookmark couldn't be set (probably because the user is not allowed to edit this bookmark) -if ($result->numRows() == 0) exit(); - -# Remove old tags and insert new ones. -$query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks_tags - WHERE bookmark_id = $bookmark_id - "); - -$query->execute(); - -$query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks_tags - (bookmark_id, tag) - VALUES (?, ?) - "); - -$tags = explode(' ', urldecode($_POST["tags"])); -foreach ($tags as $tag) { - if(empty($tag)) { - //avoid saving blankspaces - continue; - } - $params = array($bookmark_id, trim($tag)); - $query->execute($params); -} diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php deleted file mode 100644 index 1eee1718d1..0000000000 --- a/apps/bookmarks/ajax/recordClick.php +++ /dev/null @@ -1,44 +0,0 @@ -. -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('bookmarks'); - -$query = OCP\DB::prepare(" - UPDATE *PREFIX*bookmarks - SET clickcount = clickcount + 1 - WHERE user_id = ? - AND url LIKE ? - "); - -$params=array(OCP\USER::getUser(), htmlspecialchars_decode($_POST["url"])); -$bookmarks = $query->execute($params); - -header( "HTTP/1.1 204 No Content" ); - diff --git a/apps/bookmarks/ajax/updateList.php b/apps/bookmarks/ajax/updateList.php deleted file mode 100644 index 4de2475d06..0000000000 --- a/apps/bookmarks/ajax/updateList.php +++ /dev/null @@ -1,50 +0,0 @@ - -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see . -* -*/ - -//no apps or filesystem -$RUNTIME_NOSETUPFS=true; - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('bookmarks'); - - -//Filter for tag? -$filterTag = isset($_POST['tag']) ? htmlspecialchars_decode($_POST['tag']) : false; - -$offset = isset($_POST['page']) ? intval($_POST['page']) * 10 : 0; - -$sort = isset($_POST['sort']) ? ($_POST['sort']) : 'bookmarks_sorting_recent'; -if($sort == 'bookmarks_sorting_clicks') { - $sqlSortColumn = 'clickcount'; -} else { - $sqlSortColumn = 'id'; -} - - -$bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $filterTag, true); - -OCP\JSON::success(array('data' => $bookmarks)); diff --git a/apps/bookmarks/appinfo/app.php b/apps/bookmarks/appinfo/app.php deleted file mode 100644 index f4bca9df70..0000000000 --- a/apps/bookmarks/appinfo/app.php +++ /dev/null @@ -1,19 +0,0 @@ - -* Copyright (c) 2011 Arthur Schiwon -* This file is licensed under the Affero General Public License version 3 or -* later. -* See the COPYING-README file. -*/ - -OC::$CLASSPATH['OC_Bookmarks_Bookmarks'] = 'apps/bookmarks/lib/bookmarks.php'; -OC::$CLASSPATH['OC_Search_Provider_Bookmarks'] = 'apps/bookmarks/lib/search.php'; - -$l = new OC_l10n('bookmarks'); -OCP\App::addNavigationEntry( array( 'id' => 'bookmarks_index', 'order' => 70, 'href' => OCP\Util::linkTo( 'bookmarks', 'index.php' ), 'icon' => OCP\Util::imagePath( 'bookmarks', 'bookmarks.png' ), 'name' => $l->t('Bookmarks'))); - -OCP\App::registerPersonal('bookmarks', 'settings'); -OCP\Util::addscript('bookmarks','bookmarksearch'); - -OC_Search::registerProvider('OC_Search_Provider_Bookmarks'); diff --git a/apps/bookmarks/appinfo/database.xml b/apps/bookmarks/appinfo/database.xml deleted file mode 100644 index b03c1fb2c8..0000000000 --- a/apps/bookmarks/appinfo/database.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - *dbname* - true - false - utf8 - - *dbprefix*bookmarks - - - id - integer - 1 - 0 - true - 4 - - - url - text - - true - 4096 - - - title - text - - true - 140 - - - user_id - text - - true - 64 - - - public - integer - 0 - 1 - - - added - integer - - false - true - 4 - - - lastmodified - integer - - false - true - 4 - - - clickcount - integer - 0 - true - true - 4 - - - - id - true - - id - descending - - - -
- - - *dbprefix*bookmarks_tags - - - bookmark_id - integer - 64 - - - - tag - text - - true - 255 - - - bookmark_tag - true - - bookmark_id - ascending - - - tag - ascending - - - -
-
- \ No newline at end of file diff --git a/apps/bookmarks/appinfo/info.xml b/apps/bookmarks/appinfo/info.xml deleted file mode 100644 index 93510815f5..0000000000 --- a/apps/bookmarks/appinfo/info.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - bookmarks - Bookmarks - Bookmark manager for ownCloud - AGPL - Arthur Schiwon, Marvin Thomas Rabe - - 4 - true - diff --git a/apps/bookmarks/appinfo/migrate.php b/apps/bookmarks/appinfo/migrate.php deleted file mode 100644 index f1353f1887..0000000000 --- a/apps/bookmarks/appinfo/migrate.php +++ /dev/null @@ -1,68 +0,0 @@ -'bookmarks', - 'matchcol'=>'user_id', - 'matchval'=>$this->uid, - 'idcol'=>'id' - ); - $ids = $this->content->copyRows( $options ); - - $options = array( - 'table'=>'bookmarks_tags', - 'matchcol'=>'bookmark_id', - 'matchval'=>$ids - ); - - // Export tags - $ids2 = $this->content->copyRows( $options ); - - // If both returned some ids then they worked - if( is_array( $ids ) && is_array( $ids2 ) ) - { - return true; - } else { - return false; - } - - } - - // Import function for bookmarks - function import( ){ - switch( $this->appinfo->version ){ - default: - // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM bookmarks WHERE user_id LIKE ?" ); - $results = $query->execute( array( $this->olduid ) ); - $idmap = array(); - while( $row = $results->fetchRow() ){ - // Import each bookmark, saving its id into the map - $bookmarkquery = OCP\DB::prepare( "INSERT INTO *PREFIX*bookmarks(url, title, user_id, public, added, lastmodified) VALUES (?, ?, ?, ?, ?, ?)" ); - $bookmarkquery->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); - // Map the id - $idmap[$row['id']] = OCP\DB::insertid(); - } - // Now tags - foreach($idmap as $oldid => $newid){ - $query = $this->content->prepare( "SELECT * FROM bookmarks_tags WHERE bookmark_id LIKE ?" ); - $results = $query->execute( array( $oldid ) ); - while( $row = $results->fetchRow() ){ - // Import the tags for this bookmark, using the new bookmark id - $tagquery = OCP\DB::prepare( "INSERT INTO *PREFIX*bookmarks_tags(bookmark_id, tag) VALUES (?, ?)" ); - $tagquery->execute( array( $newid, $row['tag'] ) ); - } - } - // All done! - break; - } - - return true; - } - -} - -// Load the provider -new OC_Migration_Provider_Bookmarks( 'bookmarks' ); \ No newline at end of file diff --git a/apps/bookmarks/appinfo/version b/apps/bookmarks/appinfo/version deleted file mode 100644 index 2f4536184b..0000000000 --- a/apps/bookmarks/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2 \ No newline at end of file diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php deleted file mode 100644 index 92baac2f51..0000000000 --- a/apps/bookmarks/bookmarksHelper.php +++ /dev/null @@ -1,130 +0,0 @@ - 0); - curl_setopt($ch, CURLOPT_MAXREDIRS, $mr); - } else { - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); - if ($mr > 0) { - $newurl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); - - $rch = curl_copy_handle($ch); - curl_setopt($rch, CURLOPT_HEADER, true); - curl_setopt($rch, CURLOPT_NOBODY, true); - curl_setopt($rch, CURLOPT_FORBID_REUSE, false); - curl_setopt($rch, CURLOPT_RETURNTRANSFER, true); - do { - curl_setopt($rch, CURLOPT_URL, $newurl); - $header = curl_exec($rch); - if (curl_errno($rch)) { - $code = 0; - } else { - $code = curl_getinfo($rch, CURLINFO_HTTP_CODE); - if ($code == 301 || $code == 302) { - preg_match('/Location:(.*?)\n/', $header, $matches); - $newurl = trim(array_pop($matches)); - } else { - $code = 0; - } - } - } while ($code && --$mr); - curl_close($rch); - if (!$mr) { - if ($maxredirect === null) { - trigger_error('Too many redirects. When following redirects, libcurl hit the maximum amount.', E_USER_WARNING); - } else { - $maxredirect = 0; - } - return false; - } - curl_setopt($ch, CURLOPT_URL, $newurl); - } - } - return curl_exec($ch); -} - -function getURLMetadata($url) { - //allow only http(s) and (s)ftp - $protocols = '/^[hs]{0,1}[tf]{0,1}tp[s]{0,1}\:\/\//i'; - //if not (allowed) protocol is given, assume http - if(preg_match($protocols, $url) == 0) { - $url = 'http://' . $url; - } - $metadata['url'] = $url; - - if (!function_exists('curl_init')){ - return $metadata; - } - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $page = curl_exec_follow($ch); - curl_close($ch); - - @preg_match( "/(.*)<\/title>/si", $page, $match ); - $metadata['title'] = htmlspecialchars_decode(@$match[1]); - - return $metadata; -} - -function addBookmark($url, $title, $tags='') { - $CONFIG_DBTYPE = OCP\Config::getSystemValue( "dbtype", "sqlite" ); - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_ut = "strftime('%s','now')"; - } elseif($CONFIG_DBTYPE == 'pgsql') { - $_ut = 'date_part(\'epoch\',now())::integer'; - } else { - $_ut = "UNIX_TIMESTAMP()"; - } - - //FIXME: Detect when user adds a known URL - $query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks - (url, title, user_id, public, added, lastmodified) - VALUES (?, ?, ?, 0, $_ut, $_ut) - "); - - if(empty($title)) { - $metadata = getURLMetadata($url); - if(isset($metadata['title'])) // Check for problems fetching the title - $title = $metadata['title']; - } - - if(empty($title)) { - $l = OC_L10N::get('bookmarks'); - $title = $l->t('unnamed'); - } - - $params=array( - htmlspecialchars_decode($url), - htmlspecialchars_decode($title), - OCP\USER::getUser() - ); - $query->execute($params); - - $b_id = OCP\DB::insertid('*PREFIX*bookmarks'); - - if($b_id !== false) { - $query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks_tags - (bookmark_id, tag) - VALUES (?, ?) - "); - - $tags = explode(' ', urldecode($tags)); - foreach ($tags as $tag) { - if(empty($tag)) { - //avoid saving blankspaces - continue; - } - $params = array($b_id, trim($tag)); - $query->execute($params); - } - - return $b_id; - } -} \ No newline at end of file diff --git a/apps/bookmarks/css/bookmarks.css b/apps/bookmarks/css/bookmarks.css deleted file mode 100644 index a67afcd44f..0000000000 --- a/apps/bookmarks/css/bookmarks.css +++ /dev/null @@ -1,87 +0,0 @@ -#content { overflow: auto; height: 100%; } -#firstrun { width: 80%; margin: 5em auto auto auto; text-align: center; font-weight:bold; font-size:1.5em; color:#777; position: relative;} -#firstrun small { display: block; font-weight: normal; font-size: 0.5em; margin-bottom: 1.5em; } -#firstrun .button { font-size: 0.7em; } -#firstrun #selections { font-size:0.8em; font-weight: normal; width: 100%; margin: 2em auto auto auto; clear: both; } - -.bookmarks_headline { - font-size: large; - font-weight: bold; - margin-left: 2em; - padding: 2.5ex 0.5ex; -} - -.bookmarks_menu { - margin-left: 1.5em; - padding: 0.5ex; -} - -.bookmarks_list { - overflow: auto; - position: fixed; - top: 6.5em; -} - -.bookmarks_addBml { - text-decoration: underline; -} - -.bookmarks_label { - width: 7em; - display: inline-block; - text-align: right; -} - -.bookmarks_input { - width: 8em; -} - -.bookmark_actions { - position: absolute; - right: 1em; - top: 0.7em; - display: none; -} -.bookmark_actions span { margin: 0 0.4em; } -.bookmark_actions img { opacity: 0.3; } -.bookmark_actions img:hover { opacity: 1; cursor: pointer; } - -.bookmark_single { - position: relative; - padding: 0.5em 1em; - border-bottom: 1px solid #DDD; - -webkit-transition:background-color 500ms; -moz-transition:background-color 500ms; -o-transition:background-color 500ms; transition:background-color 500ms; -} - -.bookmark_single:hover { - background-color:#f8f8f8 -} - -.bookmark_single:hover .bookmark_actions { - display: block; -} - -.bookmark_title { font-weight: bold; display: inline-block; margin-right: 0.8em; } -.bookmark_url { display: none; color: #999; } -.bookmark_single:hover .bookmark_url { display: inline; } -.bookmark_tags { - position: absolute; - top: 0.5em; - right: 6em; - text-align: right; -} -.bookmark_tag { - display: inline-block; - color: white; - margin: 0 0.2em; - padding: 0 0.4em; - background-color: #1D2D44; - border-radius: 0.4em; - opacity: 0.2; -} -.bookmark_tag:hover { opacity: 0.5; } - -.loading_meta { - display: none; - margin-left: 5px; -} diff --git a/apps/bookmarks/img/bookmarks.png b/apps/bookmarks/img/bookmarks.png deleted file mode 100644 index b92e4f50a4..0000000000 Binary files a/apps/bookmarks/img/bookmarks.png and /dev/null differ diff --git a/apps/bookmarks/index.php b/apps/bookmarks/index.php deleted file mode 100644 index a4ce022987..0000000000 --- a/apps/bookmarks/index.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -/** -* ownCloud - bookmarks plugin -* -* @author Arthur Schiwon -* @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Lesser General Public -* License along with this library. If not, see <http://www.gnu.org/licenses/>. -* -*/ - - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('bookmarks'); - -OCP\App::setActiveNavigationEntry( 'bookmarks_index' ); - -OCP\Util::addscript('bookmarks','bookmarks'); -OCP\Util::addStyle('bookmarks', 'bookmarks'); - -$tmpl = new OCP\Template( 'bookmarks', 'list', 'user' ); - -$tmpl->printPage(); diff --git a/apps/bookmarks/js/addBm.js b/apps/bookmarks/js/addBm.js deleted file mode 100644 index 625ac8420a..0000000000 --- a/apps/bookmarks/js/addBm.js +++ /dev/null @@ -1,16 +0,0 @@ -$(document).ready(function() { - $('#bookmark_add_submit').click(addBookmark); -}); - -function addBookmark(event) { - var url = $('#bookmark_add_url').val(); - var tags = $('#bookmark_add_tags').val(); - $.ajax({ - type: 'POST', - url: 'ajax/addBookmark.php', - data: 'url=' + encodeURI(url) + '&tags=' + encodeURI(tags), - success: function(data){ - window.close(); - } - }); -} \ No newline at end of file diff --git a/apps/bookmarks/js/bookmarks.js b/apps/bookmarks/js/bookmarks.js deleted file mode 100644 index 7f3104e812..0000000000 --- a/apps/bookmarks/js/bookmarks.js +++ /dev/null @@ -1,201 +0,0 @@ -var bookmarks_page = 0; -var bookmarks_loading = false; - -var bookmarks_sorting = 'bookmarks_sorting_recent'; - -$(document).ready(function() { - $('#bookmark_add_submit').click(addOrEditBookmark); - $(window).resize(function () { - fillWindow($('.bookmarks_list')); - }); - $(window).resize(); - $('.bookmarks_list').scroll(updateOnBottom).empty().width($('#content').width()); - getBookmarks(); -}); - -function getBookmarks() { - if(bookmarks_loading) { - //have patience :) - return; - } - - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'updateList.php'), - data: 'tag=' + encodeURIComponent($('#bookmarkFilterTag').val()) + '&page=' + bookmarks_page + '&sort=' + bookmarks_sorting, - success: function(bookmarks){ - if (bookmarks.data.length) { - bookmarks_page += 1; - } - $('.bookmark_link').unbind('click', recordClick); - $('.bookmark_delete').unbind('click', delBookmark); - $('.bookmark_edit').unbind('click', showBookmark); - - for(var i in bookmarks.data) { - updateBookmarksList(bookmarks.data[i]); - $("#firstrun").hide(); - } - if($('.bookmarks_list').is(':empty')) { - $("#firstrun").show(); - } - - $('.bookmark_link').click(recordClick); - $('.bookmark_delete').click(delBookmark); - $('.bookmark_edit').click(showBookmark); - - bookmarks_loading = false; - if (bookmarks.data.length) { - updateOnBottom() - } - } - }); -} - -// function addBookmark() { -// Instead of creating editBookmark() function, Converted the one above to -// addOrEditBookmark() to make .js file more compact. - -function addOrEditBookmark(event) { - var id = $('#bookmark_add_id').val(); - var url = encodeEntities($('#bookmark_add_url').val()); - var title = encodeEntities($('#bookmark_add_title').val()); - var tags = encodeEntities($('#bookmark_add_tags').val()); - $("#firstrun").hide(); - if($.trim(url) == '') { - OC.dialogs.alert('A valid bookmark url must be provided', 'Error creating bookmark'); - return false; - } - if($.trim(title) == '') { - OC.dialogs.alert('A valid bookmark title must be provided', 'Error creating bookmark'); - return false; - } - if (id == 0) { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'addBookmark.php'), - data: 'url=' + encodeURIComponent(url) + '&title=' + encodeURIComponent(title) + '&tags=' + encodeURIComponent(tags), - success: function(response){ - $('.bookmarks_input').val(''); - $('.bookmarks_list').empty(); - bookmarks_page = 0; - getBookmarks(); - } - }); - } - else { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'editBookmark.php'), - data: 'id=' + id + '&url=' + encodeURIComponent(url) + '&title=' + encodeURIComponent(title) + '&tags=' + encodeURIComponent(tags), - success: function(){ - $('.bookmarks_input').val(''); - $('#bookmark_add_id').val('0'); - $('.bookmarks_list').empty(); - bookmarks_page = 0; - getBookmarks(); - } - }); - } - -} - -function delBookmark(event) { - var record = $(this).parent().parent(); - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'delBookmark.php'), - data: 'id=' + record.data('id'), - success: function(data){ - if (data.status == 'success') { - record.remove(); - if($('.bookmarks_list').is(':empty')) { - $("#firstrun").show(); - } - } - } - }); -} - -function showBookmark(event) { - var record = $(this).parent().parent(); - $('#bookmark_add_id').val(record.attr('data-id')); - $('#bookmark_add_url').val(record.children('.bookmark_url:first').text()); - $('#bookmark_add_title').val(record.children('.bookmark_title:first').text()); - $('#bookmark_add_tags').val(record.children('.bookmark_tags:first').text()); - - if ($('.bookmarks_add').css('display') == 'none') { - $('.bookmarks_add').slideToggle(); - } -} - -function replaceQueryString(url,param,value) { - var re = new RegExp("([?|&])" + param + "=.*?(&|$)","i"); - if (url.match(re)) - return url.replace(re,'$1' + param + "=" + value + '$2'); - else - return url + '&' + param + "=" + value; -} - -function updateBookmarksList(bookmark) { - var tags = encodeEntities(bookmark.tags).split(' '); - var taglist = ''; - for ( var i=0, len=tags.length; i<len; ++i ){ - if(tags[i] != '') - taglist = taglist + '<a class="bookmark_tag" href="'+replaceQueryString( String(window.location), 'tag', encodeURIComponent(tags[i])) + '">' + tags[i] + '</a> '; - } - if(!hasProtocol(bookmark.url)) { - bookmark.url = 'http://' + bookmark.url; - } - if(bookmark.title == '') bookmark.title = bookmark.url; - $('.bookmarks_list').append( - '<div class="bookmark_single" data-id="' + bookmark.id +'" >' + - '<p class="bookmark_actions">' + - '<span class="bookmark_edit">' + - '<img class="svg" src="'+OC.imagePath('core', 'actions/rename')+'" title="Edit">' + - '</span>' + - '<span class="bookmark_delete">' + - '<img class="svg" src="'+OC.imagePath('core', 'actions/delete')+'" title="Delete">' + - '</span> ' + - '</p>' + - '<p class="bookmark_title">'+ - '<a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.title) + '</a>' + - '</p>' + - '<p class="bookmark_url"><a href="' + encodeEntities(bookmark.url) + '" target="_blank" class="bookmark_link">' + encodeEntities(bookmark.url) + '</a></p>' + - '</div>' - ); - if(taglist != '') { - $('div[data-id="'+ bookmark.id +'"]').append('<p class="bookmark_tags">' + taglist + '</p>'); - } -} - -function updateOnBottom() { - //check wether user is on bottom of the page - var top = $('.bookmarks_list>:last-child').position().top; - var height = $('.bookmarks_list').height(); - // use a bit of margin to begin loading before we are really at the - // bottom - if (top < height * 1.2) { - getBookmarks(); - } -} - -function recordClick(event) { - $.ajax({ - type: 'POST', - url: OC.filePath('bookmarks', 'ajax', 'recordClick.php'), - data: 'url=' + encodeURIComponent($(this).attr('href')), - }); -} - -function encodeEntities(s){ - try { - return $('<div/>').text(s).html(); - } catch (ex) { - return ""; - } -} - -function hasProtocol(url) { - var regexp = /(ftp|http|https|sftp)/; - return regexp.test(url); -} diff --git a/apps/bookmarks/js/bookmarksearch.js b/apps/bookmarks/js/bookmarksearch.js deleted file mode 100644 index e8f5363c93..0000000000 --- a/apps/bookmarks/js/bookmarksearch.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2012 David Iwanowitsch <david at unclouded dot de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$(document).ready(function(){ - OC.search.customResults['Bookm.'] = function(row,item){ - var a=row.find('a'); - a.attr('target','_blank'); - a.click(recordClick); - } -}); - -function recordClick(event) { - var jsFileLocation = $('script[src*=bookmarksearch]').attr('src'); - jsFileLocation = jsFileLocation.replace('js/bookmarksearch.js', ''); - $.ajax({ - type: 'POST', - url: jsFileLocation + 'ajax/recordClick.php', - data: 'url=' + encodeURI($(this).attr('href')), - }); -} diff --git a/apps/bookmarks/l10n/xgettextfiles b/apps/bookmarks/l10n/xgettextfiles deleted file mode 100644 index cd55543239..0000000000 --- a/apps/bookmarks/l10n/xgettextfiles +++ /dev/null @@ -1,5 +0,0 @@ -../appinfo/app.php -../lib/search.php -../templates/settings.php -../templates/addBm.php -../templates/list.php diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php deleted file mode 100644 index 86fba45a50..0000000000 --- a/apps/bookmarks/lib/bookmarks.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -/** - * ownCloud - bookmarks plugin - * - * @author Arthur Schiwon - * @copyright 2011 Arthur Schiwon blizzz@arthur-schiwon.de - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -/** - * This class manages bookmarks - */ -class OC_Bookmarks_Bookmarks{ - - /** - * @brief Finds all bookmarks, matching the filter - * @param offset result offset - * @param sqlSortColumn sort result with this column - * @param filter can be: empty -> no filter, a string -> filter this, a string array -> filter for all strings - * @param filterTagOnly if true, filter affacts only tags, else filter affects url, title and tags - * @return void - */ - public static function findBookmarks($offset, $sqlSortColumn, $filter, $filterTagOnly){ - //OCP\Util::writeLog('bookmarks', 'findBookmarks ' .$offset. ' '.$sqlSortColumn.' '. $filter.' '. $filterTagOnly ,OCP\Util::DEBUG); - $CONFIG_DBTYPE = OCP\Config::getSystemValue( 'dbtype', 'sqlite' ); - - $params=array(OCP\USER::getUser()); - - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ - $_gc_separator = ', \' \''; - } else { - $_gc_separator = 'SEPARATOR \' \''; - } - - if($filter){ - if($CONFIG_DBTYPE == 'pgsql' ) - $tagString = 'array_to_string(array_agg(tag), \' \')'; - else - $tagString = 'tags'; - - $sqlFilterTag = 'HAVING '; - if(is_array($filter)){ - $first = true; - $filterstring = ''; - foreach ($filter as $singleFilter){ - $filterstring = $filterstring . ($first?'':' AND ') . $tagString.' LIKE ? '; - $params[] = '%'.$singleFilter.'%'; - $first=false; - } - $sqlFilterTag = $sqlFilterTag . $filterstring; - } else{ - $sqlFilterTag = $sqlFilterTag .$tagString.' LIKE ? '; - $params[] = '%'.$filter.'%'; - } - } else { - $sqlFilterTag = ''; - } - - if($CONFIG_DBTYPE == 'pgsql' ){ - $query = OCP\DB::prepare(' - SELECT id, url, title, '.($filterTagOnly?'':'url || title ||').' array_to_string(array_agg(tag), \' \') as tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - WHERE - *PREFIX*bookmarks.user_id = ? - GROUP BY id, url, title - '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC - LIMIT 10 - OFFSET '. $offset); - } else { - if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ) - $concatFunction = '(url || title || '; - else - $concatFunction = 'Concat(Concat( url, title), '; - - $query = OCP\DB::prepare(' - SELECT id, url, title, ' - .($filterTagOnly?'':$concatFunction). - 'CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) - ELSE \' \' - END ' - .($filterTagOnly?'':')').' - AS tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 - WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - OR *PREFIX*bookmarks.id NOT IN ( - SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags - ) - ) - AND *PREFIX*bookmarks.user_id = ? - GROUP BY url - '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC - LIMIT '.$offset.', 10'); - } - - $bookmarks = $query->execute($params)->fetchAll(); - return $bookmarks; - } - - public static function deleteUrl($id) - { - $user = OCP\USER::getUser(); - - $query = OCP\DB::prepare(" - SELECT id FROM *PREFIX*bookmarks - WHERE id = ? - AND user_id = ? - "); - - $result = $query->execute(array($id, $user)); - $id = $result->fetchOne(); - if ($id === false) { - return false; - } - - $query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks - WHERE id = $id - "); - - $result = $query->execute(); - - $query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks_tags - WHERE bookmark_id = $id - "); - - $result = $query->execute(); - return true; - } -} \ No newline at end of file diff --git a/apps/bookmarks/lib/search.php b/apps/bookmarks/lib/search.php deleted file mode 100644 index 1e6a3ce910..0000000000 --- a/apps/bookmarks/lib/search.php +++ /dev/null @@ -1,47 +0,0 @@ -<?php -/** - * ownCloud - bookmarks plugin - * - * @author David Iwanowitsch - * @copyright 2012 David Iwanowitsch <david at unclouded dot de> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -class OC_Search_Provider_Bookmarks extends OC_Search_Provider{ - function search($query){ - $results=array(); - - $offset = 0; - $sqlSortColumn = 'id'; - - $searchquery=array(); - if(substr_count($query, ' ') > 0){ - $searchquery = explode(' ', $query); - }else{ - $searchquery = $query; - } - -// OCP\Util::writeLog('bookmarks', 'search ' .$query ,OCP\Util::DEBUG); - $bookmarks = OC_Bookmarks_Bookmarks::findBookmarks($offset, $sqlSortColumn, $searchquery, false); -// OCP\Util::writeLog('bookmarks', 'found ' .count($bookmarks) ,OCP\Util::DEBUG); - //$l = new OC_l10n('bookmarks'); //resulttype can't be localized, javascript relies on that type - foreach($bookmarks as $bookmark){ - $results[]=new OC_Search_Result($bookmark['title'],'', $bookmark['url'],'Bookm.'); - } - - return $results; - } -} diff --git a/apps/bookmarks/settings.php b/apps/bookmarks/settings.php deleted file mode 100644 index 6db3617633..0000000000 --- a/apps/bookmarks/settings.php +++ /dev/null @@ -1,11 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Marvin Thomas Rabe <mrabe@marvinrabe.de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$tmpl = new OCP\Template( 'bookmarks', 'settings'); - -return $tmpl->fetchPage(); diff --git a/apps/bookmarks/templates/addBm.php b/apps/bookmarks/templates/addBm.php deleted file mode 100644 index 357e0a18f2..0000000000 --- a/apps/bookmarks/templates/addBm.php +++ /dev/null @@ -1,11 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>Read later - ownCloud - - -

Saved!

- Close the window - - \ No newline at end of file diff --git a/apps/bookmarks/templates/bookmarklet.php b/apps/bookmarks/templates/bookmarklet.php deleted file mode 100644 index 1802814d4b..0000000000 --- a/apps/bookmarks/templates/bookmarklet.php +++ /dev/null @@ -1,8 +0,0 @@ -' . $l->t('Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:') . '' - . '' - . $l->t('Read later') . ''; -} diff --git a/apps/bookmarks/templates/list.php b/apps/bookmarks/templates/list.php deleted file mode 100644 index 4b84b43890..0000000000 --- a/apps/bookmarks/templates/list.php +++ /dev/null @@ -1,26 +0,0 @@ - - * Copyright (c) 2011 Arthur Schiwon - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> - -
- - - - - -
-
-
- diff --git a/apps/bookmarks/templates/settings.php b/apps/bookmarks/templates/settings.php deleted file mode 100644 index 31edf7478b..0000000000 --- a/apps/bookmarks/templates/settings.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -
-
- t('Bookmarklet
');?>
- -
-
diff --git a/apps/calendar/ajax/cache/rescan.php b/apps/calendar/ajax/cache/rescan.php deleted file mode 100644 index 3417f1ae4b..0000000000 --- a/apps/calendar/ajax/cache/rescan.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $calendar){ - OC_Calendar_Repeat::cleancalendar($calendar['id']); - OC_Calendar_Repeat::generatecalendar($calendar['id']); -} -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/cache/status.php b/apps/calendar/ajax/cache/status.php deleted file mode 100644 index d2806d4789..0000000000 --- a/apps/calendar/ajax/cache/status.php +++ /dev/null @@ -1,22 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$allcached = true; -foreach($calendars as $calendar){ - if(!OC_Calendar_Repeat::is_calendar_cached($calendar['id'])){ - $allcached = false; - } -} -$l = new OC_L10N('calendar'); -if(!$allcached){ - OCP\JSON::error(array('message'=>'Not all calendars are completely cached', 'l10n'=>$l->t('Not all calendars are completely cached'))); -}else{ - OCP\JSON::success(array('message'=>'Everything seems to be completely cached', 'l10n'=>$l->t('Everything seems to be completely cached'))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/activation.php b/apps/calendar/ajax/calendar/activation.php deleted file mode 100644 index f4aadc5b01..0000000000 --- a/apps/calendar/ajax/calendar/activation.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$calendarid = $_POST['calendarid']; -$calendar = OC_Calendar_App::getCalendar($calendarid, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); -$calendar = OC_Calendar_App::getCalendar($calendarid); -OCP\JSON::success(array( - 'active' => $calendar['active'], - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/delete.php b/apps/calendar/ajax/calendar/delete.php deleted file mode 100644 index 089255cae3..0000000000 --- a/apps/calendar/ajax/calendar/delete.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$cal = $_POST["calendarid"]; -$calendar = OC_Calendar_App::getCalendar($cal, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$del = OC_Calendar_Calendar::deleteCalendar($cal); -if($del == true){ - OCP\JSON::success(); -}else{ - OCP\JSON::error(array('error'=>'dberror')); -} \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/edit.form.php b/apps/calendar/ajax/calendar/edit.form.php deleted file mode 100644 index 3916c52763..0000000000 --- a/apps/calendar/ajax/calendar/edit.form.php +++ /dev/null @@ -1,19 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); - -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = OC_Calendar_App::getCalendar($_POST['calendarid']); -$tmpl = new OCP\Template("calendar", "part.editcalendar"); -$tmpl->assign('new', false); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/edit.php b/apps/calendar/ajax/calendar/edit.php deleted file mode 100644 index 82f18fe7f4..0000000000 --- a/apps/calendar/ajax/calendar/edit.php +++ /dev/null @@ -1,23 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); - -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = OC_Calendar_App::getCalendar($_GET['calendarid'], true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$tmpl = new OCP\Template("calendar", "part.editcalendar"); -$tmpl->assign('new', false); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/new.form.php b/apps/calendar/ajax/calendar/new.form.php deleted file mode 100644 index 0783b6168f..0000000000 --- a/apps/calendar/ajax/calendar/new.form.php +++ /dev/null @@ -1,22 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); -$calendar = array( - 'id' => 'new', - 'displayname' => '', - 'calendarcolor' => '', -); -$tmpl = new OCP\Template('calendar', 'part.editcalendar'); -$tmpl->assign('new', true); -$tmpl->assign('calendarcolor_options', $calendarcolor_options); -$tmpl->assign('calendar', $calendar); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/new.php b/apps/calendar/ajax/calendar/new.php deleted file mode 100644 index 67d1282237..0000000000 --- a/apps/calendar/ajax/calendar/new.php +++ /dev/null @@ -1,42 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -if(trim($_POST['name']) == ''){ - OCP\JSON::error(array('message'=>'empty')); - exit; -} -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $cal){ - if($cal['displayname'] == $_POST['name']){ - OCP\JSON::error(array('message'=>'namenotavailable')); - exit; - } -} - -$userid = OCP\USER::getUser(); -$calendarid = OC_Calendar_Calendar::addCalendar($userid, strip_tags($_POST['name']), 'VEVENT,VTODO,VJOURNAL', null, 0, $_POST['color']); -OC_Calendar_Calendar::setCalendarActive($calendarid, 1); - -$calendar = OC_Calendar_Calendar::find($calendarid); -$tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); -$tmpl->assign('calendar', $calendar); -if(OC_Calendar_Share::allUsersSharedwith($calendarid, OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; -}else{ - $shared = true; -} -$tmpl->assign('shared', $shared); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); diff --git a/apps/calendar/ajax/calendar/overview.php b/apps/calendar/ajax/calendar/overview.php deleted file mode 100644 index 9d43364ffb..0000000000 --- a/apps/calendar/ajax/calendar/overview.php +++ /dev/null @@ -1,14 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -$l10n = OC_L10N::get('calendar'); -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$output = new OCP\Template("calendar", "part.choosecalendar"); -$output -> printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/calendar/update.php b/apps/calendar/ajax/calendar/update.php deleted file mode 100644 index c09b1008c9..0000000000 --- a/apps/calendar/ajax/calendar/update.php +++ /dev/null @@ -1,49 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -if(trim($_POST['name']) == ''){ - OCP\JSON::error(array('message'=>'empty')); - exit; -} -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -foreach($calendars as $cal){ - if($cal['displayname'] == $_POST['name'] && $cal['id'] != $_POST['id']){ - OCP\JSON::error(array('message'=>'namenotavailable')); - exit; - } -} - -$calendarid = $_POST['id']; -$calendar = OC_Calendar_App::getCalendar($calendarid, true); -if(!$calendar){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -OC_Calendar_Calendar::editCalendar($calendarid, strip_tags($_POST['name']), null, null, null, $_POST['color']); -OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); - -$calendar = OC_Calendar_App::getCalendar($calendarid); -$tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); -$tmpl->assign('calendar', $calendar); -if(OC_Calendar_Share::allUsersSharedwith($calendarid, OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; -}else{ - $shared = true; -} -$tmpl->assign('shared', $shared); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), -)); diff --git a/apps/calendar/ajax/categories/rescan.php b/apps/calendar/ajax/categories/rescan.php deleted file mode 100644 index 08c32865b6..0000000000 --- a/apps/calendar/ajax/categories/rescan.php +++ /dev/null @@ -1,43 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -foreach ($_POST as $key=>$element) { - debug('_POST: '.$key.'=>'.print_r($element, true)); -} - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('calendar','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('calendar','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); -} - -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -if(count($calendars) == 0) { - bailOut(OC_Calendar_App::$l10n->t('No calendars found.')); -} -$events = array(); -foreach($calendars as $calendar) { - $calendar_events = OC_Calendar_Object::all($calendar['id']); - $events = $events + $calendar_events; -} -if(count($events) == 0) { - bailOut(OC_Calendar_App::$l10n->t('No events found.')); -} - -OC_Calendar_App::scanCategories($events); -$categories = OC_Calendar_App::getCategoryOptions(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); \ No newline at end of file diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php deleted file mode 100644 index 47e690f329..0000000000 --- a/apps/calendar/ajax/changeview.php +++ /dev/null @@ -1,21 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -$view = $_POST['v']; -switch($view){ - case 'agendaWeek': - case 'month'; - case 'list': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter: ' . $view)); - exit; -} -OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'currentview', $view); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/delete.php b/apps/calendar/ajax/event/delete.php deleted file mode 100644 index 17e45c001e..0000000000 --- a/apps/calendar/ajax/event/delete.php +++ /dev/null @@ -1,21 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$result = OC_Calendar_Object::delete($id); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/edit.form.php b/apps/calendar/ajax/event/edit.form.php deleted file mode 100644 index 86dff7b75a..0000000000 --- a/apps/calendar/ajax/event/edit.form.php +++ /dev/null @@ -1,272 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -if(!OCP\User::isLoggedIn()) { - die(''); -} -OCP\JSON::checkAppEnabled('calendar'); - -$id = $_POST['id']; -$data = OC_Calendar_App::getEventObject($id, true, true); - -if(!$data){ - OCP\JSON::error(array('data' => array('message' => self::$l10n->t('Wrong calendar')))); - exit; -} -$access = OC_Calendar_App::getaccess($id, OC_Calendar_Share::EVENT); -$object = OC_VObject::parse($data['calendardata']); -$vevent = $object->VEVENT; - -$dtstart = $vevent->DTSTART; -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -switch($dtstart->getDateType()) { - case Sabre_VObject_Property_DateTime::UTC: - $timeOffset = $_SESSION['timezone']*60; - $newDT = $dtstart->getDateTime(); - $newDT->add(new DateInterval("PT" . $timeOffset . "M")); - $dtstart->setDateTime($newDT); - $newDT = $dtend->getDateTime(); - $newDT->add(new DateInterval("PT" . $timeOffset . "M")); - $dtend->setDateTime($newDT); - case Sabre_VObject_Property_DateTime::LOCALTZ: - case Sabre_VObject_Property_DateTime::LOCAL: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = $dtstart->getDateTime()->format('H:i'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = $dtend->getDateTime()->format('H:i'); - $allday = false; - break; - case Sabre_VObject_Property_DateTime::DATE: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = ''; - $dtend->getDateTime()->modify('-1 day'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = ''; - $allday = true; - break; -} - -$summary = $vevent->getAsString('SUMMARY'); -$location = $vevent->getAsString('LOCATION'); -$categories = $vevent->getAsString('CATEGORIES'); -$description = $vevent->getAsString('DESCRIPTION'); -$last_modified = $vevent->__get('LAST-MODIFIED'); -if ($last_modified){ - $lastmodified = $last_modified->getDateTime()->format('U'); -}else{ - $lastmodified = 0; -} -if($data['repeating'] == 1){ - $rrule = explode(';', $vevent->getAsString('RRULE')); - $rrulearr = array(); - foreach($rrule as $rule){ - list($attr, $val) = explode('=', $rule); - $rrulearr[$attr] = $val; - } - if(!isset($rrulearr['INTERVAL']) || $rrulearr['INTERVAL'] == ''){ - $rrulearr['INTERVAL'] = 1; - } - if(array_key_exists('BYDAY', $rrulearr)){ - if(substr_count($rrulearr['BYDAY'], ',') == 0){ - if(strlen($rrulearr['BYDAY']) == 2){ - $repeat['weekdays'] = array($rrulearr['BYDAY']); - }elseif(strlen($rrulearr['BYDAY']) == 3){ - $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 1); - $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 1, 2)); - }elseif(strlen($rrulearr['BYDAY']) == 4){ - $repeat['weekofmonth'] = substr($rrulearr['BYDAY'], 0, 2); - $repeat['weekdays'] = array(substr($rrulearr['BYDAY'], 2, 2)); - } - }else{ - $byday_days = explode(',', $rrulearr['BYDAY']); - foreach($byday_days as $byday_day){ - if(strlen($byday_day) == 2){ - $repeat['weekdays'][] = $byday_day; - }elseif(strlen($byday_day) == 3){ - $repeat['weekofmonth'] = substr($byday_day , 0, 1); - $repeat['weekdays'][] = substr($byday_day , 1, 2); - }elseif(strlen($byday_day) == 4){ - $repeat['weekofmonth'] = substr($byday_day , 0, 2); - $repeat['weekdays'][] = substr($byday_day , 2, 2); - } - } - } - } - if(array_key_exists('BYMONTHDAY', $rrulearr)){ - if(substr_count($rrulearr['BYMONTHDAY'], ',') == 0){ - $repeat['bymonthday'][] = $rrulearr['BYMONTHDAY']; - }else{ - $bymonthdays = explode(',', $rrulearr['BYMONTHDAY']); - foreach($bymonthdays as $bymonthday){ - $repeat['bymonthday'][] = $bymonthday; - } - } - } - if(array_key_exists('BYYEARDAY', $rrulearr)){ - if(substr_count($rrulearr['BYYEARDAY'], ',') == 0){ - $repeat['byyearday'][] = $rrulearr['BYYEARDAY']; - }else{ - $byyeardays = explode(',', $rrulearr['BYYEARDAY']); - foreach($byyeardays as $yearday){ - $repeat['byyearday'][] = $yearday; - } - } - } - if(array_key_exists('BYWEEKNO', $rrulearr)){ - if(substr_count($rrulearr['BYWEEKNO'], ',') == 0){ - $repeat['byweekno'][] = (string) $rrulearr['BYWEEKNO']; - }else{ - $byweekno = explode(',', $rrulearr['BYWEEKNO']); - foreach($byweekno as $weekno){ - $repeat['byweekno'][] = (string) $weekno; - } - } - } - if(array_key_exists('BYMONTH', $rrulearr)){ - $months = OC_Calendar_App::getByMonthOptions(); - if(substr_count($rrulearr['BYMONTH'], ',') == 0){ - $repeat['bymonth'][] = $months[$month]; - }else{ - $bymonth = explode(',', $rrulearr['BYMONTH']); - foreach($bymonth as $month){ - $repeat['bymonth'][] = $months[$month]; - } - } - } - switch($rrulearr['FREQ']){ - case 'DAILY': - $repeat['repeat'] = 'daily'; - break; - case 'WEEKLY': - if($rrulearr['INTERVAL'] % 2 == 0){ - $repeat['repeat'] = 'biweekly'; - $rrulearr['INTERVAL'] = $rrulearr['INTERVAL'] / 2; - }elseif($rrulearr['BYDAY'] == 'MO,TU,WE,TH,FR'){ - $repeat['repeat'] = 'weekday'; - }else{ - $repeat['repeat'] = 'weekly'; - } - break; - case 'MONTHLY': - $repeat['repeat'] = 'monthly'; - if(array_key_exists('BYDAY', $rrulearr)){ - $repeat['month'] = 'weekday'; - }else{ - $repeat['month'] = 'monthday'; - } - break; - case 'YEARLY': - $repeat['repeat'] = 'yearly'; - if(array_key_exists('BYMONTH', $rrulearr)){ - $repeat['year'] = 'bydaymonth'; - }elseif(array_key_exists('BYWEEKNO', $rrulearr)){ - $repeat['year'] = 'byweekno'; - }else{ - $repeat['year'] = 'byyearday'; - } - } - $repeat['interval'] = $rrulearr['INTERVAL']; - if(array_key_exists('COUNT', $rrulearr)){ - $repeat['end'] = 'count'; - $repeat['count'] = $rrulearr['COUNT']; - }elseif(array_key_exists('UNTIL', $rrulearr)){ - $repeat['end'] = 'date'; - $endbydate_day = substr($rrulearr['UNTIL'], 6, 2); - $endbydate_month = substr($rrulearr['UNTIL'], 4, 2); - $endbydate_year = substr($rrulearr['UNTIL'], 0, 4); - $repeat['date'] = $endbydate_day . '-' . $endbydate_month . '-' . $endbydate_year; - }else{ - $repeat['end'] = 'never'; - } - if(array_key_exists('weekdays', $repeat)){ - $repeat_weekdays_ = array(); - $days = OC_Calendar_App::getWeeklyOptions(); - foreach($repeat['weekdays'] as $weekday){ - $repeat_weekdays_[] = $days[$weekday]; - } - $repeat['weekdays'] = $repeat_weekdays_; - } -}else{ - $repeat['repeat'] = 'doesnotrepeat'; -} -if($access == 'owner'){ - $calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -}else{ - $calendar_options = array(OC_Calendar_App::getCalendar($data['calendarid'], false)); -} -$category_options = OC_Calendar_App::getCategoryOptions(); -$repeat_options = OC_Calendar_App::getRepeatOptions(); -$repeat_end_options = OC_Calendar_App::getEndOptions(); -$repeat_month_options = OC_Calendar_App::getMonthOptions(); -$repeat_year_options = OC_Calendar_App::getYearOptions(); -$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions(); -$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth(); -$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions(); -$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions(); -$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions(); -$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions(); - -if($access == 'owner' || $access == 'rw'){ - $tmpl = new OCP\Template('calendar', 'part.editevent'); -}elseif($access == 'r'){ - $tmpl = new OCP\Template('calendar', 'part.showevent'); -} - -$tmpl->assign('eventid', $id); -$tmpl->assign('access', $access); -$tmpl->assign('lastmodified', $lastmodified); -$tmpl->assign('calendar_options', $calendar_options); -$tmpl->assign('repeat_options', $repeat_options); -$tmpl->assign('repeat_month_options', $repeat_month_options); -$tmpl->assign('repeat_weekly_options', $repeat_weekly_options); -$tmpl->assign('repeat_end_options', $repeat_end_options); -$tmpl->assign('repeat_year_options', $repeat_year_options); -$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options); -$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options); -$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options); -$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options); -$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options); - -$tmpl->assign('title', $summary); -$tmpl->assign('location', $location); -$tmpl->assign('categories', $categories); -$tmpl->assign('calendar', $data['calendarid']); -$tmpl->assign('allday', $allday); -$tmpl->assign('startdate', $startdate); -$tmpl->assign('starttime', $starttime); -$tmpl->assign('enddate', $enddate); -$tmpl->assign('endtime', $endtime); -$tmpl->assign('description', $description); - -$tmpl->assign('repeat', $repeat['repeat']); -if($repeat['repeat'] != 'doesnotrepeat'){ - $tmpl->assign('repeat_month', $repeat['month']); - $tmpl->assign('repeat_weekdays', $repeat['weekdays']); - $tmpl->assign('repeat_interval', $repeat['interval']); - $tmpl->assign('repeat_end', $repeat['end']); - $tmpl->assign('repeat_count', $repeat['count']); - $tmpl->assign('repeat_weekofmonth', $repeat['weekofmonth']); - $tmpl->assign('repeat_date', $repeat['date']); - $tmpl->assign('repeat_year', $repeat['year']); - $tmpl->assign('repeat_byyearday', $repeat['byyearday']); - $tmpl->assign('repeat_bymonthday', $repeat['bymonthday']); - $tmpl->assign('repeat_bymonth', $repeat['bymonth']); - $tmpl->assign('repeat_byweekno', $repeat['byweekno']); -} else { - $tmpl->assign('repeat_month', 'monthday'); - $tmpl->assign('repeat_weekdays', array()); - $tmpl->assign('repeat_interval', 1); - $tmpl->assign('repeat_end', 'never'); - $tmpl->assign('repeat_count', '10'); - $tmpl->assign('repeat_weekofmonth', 'auto'); - $tmpl->assign('repeat_date', ''); - $tmpl->assign('repeat_year', 'bydate'); -} -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/edit.php b/apps/calendar/ajax/event/edit.php deleted file mode 100644 index db78bf6e5e..0000000000 --- a/apps/calendar/ajax/event/edit.php +++ /dev/null @@ -1,46 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$id = $_POST['id']; - -if(!array_key_exists('calendar', $_POST)){ - $cal = OC_Calendar_Object::getCalendarid($id); - $_POST['calendar'] = $cal; -}else{ - $cal = $_POST['calendar']; -} - -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} - -$errarr = OC_Calendar_Object::validateRequest($_POST); -if($errarr){ - //show validate errors - OCP\JSON::error($errarr); - exit; -}else{ - $data = OC_Calendar_App::getEventObject($id, false, false); - $vcalendar = OC_VObject::parse($data['calendardata']); - - OC_Calendar_App::isNotModified($vcalendar->VEVENT, $_POST['lastmodified']); - OC_Calendar_Object::updateVCalendarFromRequest($_POST, $vcalendar); - - OC_Calendar_Object::edit($id, $vcalendar->serialize()); - if ($data['calendarid'] != $cal) { - OC_Calendar_Object::moveToCalendar($id, $cal); - } - OCP\JSON::success(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/event/move.php b/apps/calendar/ajax/event/move.php deleted file mode 100644 index f4e2b36376..0000000000 --- a/apps/calendar/ajax/event/move.php +++ /dev/null @@ -1,47 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -$id = $_POST['id']; -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$vcalendar = OC_Calendar_App::getVCalendar($id, false, false); -$vevent = $vcalendar->VEVENT; - -$allday = $_POST['allDay']; -$delta = new DateInterval('P0D'); -$delta->d = $_POST['dayDelta']; -$delta->i = $_POST['minuteDelta']; -OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']); - -$dtstart = $vevent->DTSTART; -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -$start_type = $dtstart->getDateType(); -$end_type = $dtend->getDateType(); -if ($allday && $start_type != Sabre_VObject_Property_DateTime::DATE){ - $start_type = $end_type = Sabre_VObject_Property_DateTime::DATE; - $dtend->setDateTime($dtend->getDateTime()->modify('+1 day'), $end_type); -} -if (!$allday && $start_type == Sabre_VObject_Property_DateTime::DATE){ - $start_type = $end_type = Sabre_VObject_Property_DateTime::LOCALTZ; -} -$dtstart->setDateTime($dtstart->getDateTime()->add($delta), $start_type); -$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); -unset($vevent->DURATION); - -$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); -$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - -$result = OC_Calendar_Object::edit($id, $vcalendar->serialize()); -$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime(); -OCP\JSON::success(array('lastmodified'=>(int)$lastmodified->format('U'))); \ No newline at end of file diff --git a/apps/calendar/ajax/event/new.form.php b/apps/calendar/ajax/event/new.form.php deleted file mode 100644 index db04cdf2d4..0000000000 --- a/apps/calendar/ajax/event/new.form.php +++ /dev/null @@ -1,75 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -if(!OCP\User::isLoggedIn()) { - die(''); -} -OCP\JSON::checkAppEnabled('calendar'); - -if (!isset($_POST['start'])){ - OCP\JSON::error(); - die; -} -$start = $_POST['start']; -$end = $_POST['end']; -$allday = $_POST['allday']; - -if (!$end){ - $duration = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'duration', '60'); - $end = $start + ($duration * 60); -} -$start = new DateTime('@'.$start); -$end = new DateTime('@'.$end); -$timezone = OC_Calendar_App::getTimezone(); -$start->setTimezone(new DateTimeZone($timezone)); -$end->setTimezone(new DateTimeZone($timezone)); - -$calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$repeat_options = OC_Calendar_App::getRepeatOptions(); -$repeat_end_options = OC_Calendar_App::getEndOptions(); -$repeat_month_options = OC_Calendar_App::getMonthOptions(); -$repeat_year_options = OC_Calendar_App::getYearOptions(); -$repeat_weekly_options = OC_Calendar_App::getWeeklyOptions(); -$repeat_weekofmonth_options = OC_Calendar_App::getWeekofMonth(); -$repeat_byyearday_options = OC_Calendar_App::getByYearDayOptions(); -$repeat_bymonth_options = OC_Calendar_App::getByMonthOptions(); -$repeat_byweekno_options = OC_Calendar_App::getByWeekNoOptions(); -$repeat_bymonthday_options = OC_Calendar_App::getByMonthDayOptions(); - -$tmpl = new OCP\Template('calendar', 'part.newevent'); -$tmpl->assign('access', 'owner'); -$tmpl->assign('calendar_options', $calendar_options); -$tmpl->assign('repeat_options', $repeat_options); -$tmpl->assign('repeat_month_options', $repeat_month_options); -$tmpl->assign('repeat_weekly_options', $repeat_weekly_options); -$tmpl->assign('repeat_end_options', $repeat_end_options); -$tmpl->assign('repeat_year_options', $repeat_year_options); -$tmpl->assign('repeat_byyearday_options', $repeat_byyearday_options); -$tmpl->assign('repeat_bymonth_options', $repeat_bymonth_options); -$tmpl->assign('repeat_byweekno_options', $repeat_byweekno_options); -$tmpl->assign('repeat_bymonthday_options', $repeat_bymonthday_options); -$tmpl->assign('repeat_weekofmonth_options', $repeat_weekofmonth_options); - -$tmpl->assign('eventid', 'new'); -$tmpl->assign('startdate', $start->format('d-m-Y')); -$tmpl->assign('starttime', $start->format('H:i')); -$tmpl->assign('enddate', $end->format('d-m-Y')); -$tmpl->assign('endtime', $end->format('H:i')); -$tmpl->assign('allday', $allday); -$tmpl->assign('repeat', 'doesnotrepeat'); -$tmpl->assign('repeat_month', 'monthday'); -$tmpl->assign('repeat_weekdays', array()); -$tmpl->assign('repeat_interval', 1); -$tmpl->assign('repeat_end', 'never'); -$tmpl->assign('repeat_count', '10'); -$tmpl->assign('repeat_weekofmonth', 'auto'); -$tmpl->assign('repeat_date', ''); -$tmpl->assign('repeat_year', 'bydate'); -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/event/new.php b/apps/calendar/ajax/event/new.php deleted file mode 100644 index bc0439cc31..0000000000 --- a/apps/calendar/ajax/event/new.php +++ /dev/null @@ -1,25 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -$errarr = OC_Calendar_Object::validateRequest($_POST); -if($errarr){ - //show validate errors - OCP\JSON::error($errarr); - exit; -}else{ - $cal = $_POST['calendar']; - $vcalendar = OC_Calendar_Object::createVCalendarFromRequest($_POST); - $result = OC_Calendar_Object::add($cal, $vcalendar->serialize()); - OCP\JSON::success(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/event/resize.php b/apps/calendar/ajax/event/resize.php deleted file mode 100644 index 15b687b55d..0000000000 --- a/apps/calendar/ajax/event/resize.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); - -$id = $_POST['id']; - -$access = OC_Calendar_App::getaccess($id, OC_Calendar_App::EVENT); -if($access != 'owner' && $access != 'rw'){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} - -$vcalendar = OC_Calendar_App::getVCalendar($id, false, false); -$vevent = $vcalendar->VEVENT; - -$delta = new DateInterval('P0D'); -$delta->d = $_POST['dayDelta']; -$delta->i = $_POST['minuteDelta']; - -OC_Calendar_App::isNotModified($vevent, $_POST['lastmodified']); - -$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -$end_type = $dtend->getDateType(); -$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); -unset($vevent->DURATION); - -$vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); -$vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - -OC_Calendar_Object::edit($id, $vcalendar->serialize()); -$lastmodified = $vevent->__get('LAST-MODIFIED')->getDateTime(); -OCP\JSON::success(array('lastmodified'=>(int)$lastmodified->format('U'))); \ No newline at end of file diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php deleted file mode 100644 index ae55cbc02d..0000000000 --- a/apps/calendar/ajax/events.php +++ /dev/null @@ -1,30 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -session_write_close(); - -// Look for the calendar id -$calendar_id = null; -if (strval(intval($_GET['calendar_id'])) == strval($_GET['calendar_id'])) { // integer for sure. - $id = intval($_GET['calendar_id']); - $calendarrow = OC_Calendar_App::getCalendar($id, true, false); // Let's at least security check otherwise we might as well use OC_Calendar_Calendar::find() - if($calendarrow !== false && is_int($calendar_id['userid']) && $id == $calendar_id['userid']) { - $calendar_id = $id; - } -} -$calendar_id = (is_null($calendar_id)?strip_tags($_GET['calendar_id']):$calendar_id); - -$start = (version_compare(PHP_VERSION, '5.3.0', '>='))?DateTime::createFromFormat('U', $_GET['start']):new DateTime('@' . $_GET['start']); -$end = (version_compare(PHP_VERSION, '5.3.0', '>='))?DateTime::createFromFormat('U', $_GET['end']):new DateTime('@' . $_GET['end']); -$events = OC_Calendar_App::getrequestedEvents($_GET['calendar_id'], $start, $end); -$output = array(); -foreach($events as $event){ - $output = array_merge($output, OC_Calendar_App::generateEventOutput($event, $start, $end)); -} -OCP\JSON::encodedPrint(OCP\Util::sanitizeHTML($output)); diff --git a/apps/calendar/ajax/import/calendarcheck.php b/apps/calendar/ajax/import/calendarcheck.php deleted file mode 100644 index a91bab7057..0000000000 --- a/apps/calendar/ajax/import/calendarcheck.php +++ /dev/null @@ -1,18 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$calname = strip_tags($_POST['calname']); -$calendars = OC_Calendar_Calendar::allCalendars(OCP\User::getUser()); -foreach($calendars as $calendar){ - if($calendar['displayname'] == $calname){ - OCP\JSON::success(array('message'=>'exists')); - exit; - } -} -OCP\JSON::error(); \ No newline at end of file diff --git a/apps/calendar/ajax/import/dialog.php b/apps/calendar/ajax/import/dialog.php deleted file mode 100644 index 18fe226172..0000000000 --- a/apps/calendar/ajax/import/dialog.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$tmpl = new OCP\Template('calendar', 'part.import'); -$tmpl->assign('path', $_POST['path']); -$tmpl->assign('filename', $_POST['filename']); -$tmpl->printpage(); \ No newline at end of file diff --git a/apps/calendar/ajax/import/dropimport.php b/apps/calendar/ajax/import/dropimport.php deleted file mode 100644 index f46e731409..0000000000 --- a/apps/calendar/ajax/import/dropimport.php +++ /dev/null @@ -1,32 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$data = $_POST['data']; -$data = explode(',', $data); -$data = end($data); -$data = base64_decode($data); -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$import = new OC_Calendar_Import($data); -$import->setUserID(OCP\User::getUser()); -$import->setTimeZone(OC_Calendar_App::$tz); -$import->disableProgressCache(); -if(!$import->isValid()){ - OCP\JSON::error(); - exit; -} -$newcalendarname = strip_tags($import->createCalendarName()); -$newid = OC_Calendar_Calendar::addCalendar(OCP\User::getUser(),$newcalendarname,'VEVENT,VTODO,VJOURNAL',null,0,$import->createCalendarColor()); -$import->setCalendarID($newid); -$import->import(); -$count = $import->getCount(); -if($count == 0){ - OC_Calendar_Calendar::deleteCalendar($newid); - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('The file contained either no events or all events are already saved in your calendar.'))); -}else{ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in the new calendar') . ' ' . $newcalendarname, 'eventSource'=>OC_Calendar_Calendar::getEventSourceInfo(OC_Calendar_Calendar::find($newid)))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/import/import.php b/apps/calendar/ajax/import/import.php deleted file mode 100644 index b1dfc464d0..0000000000 --- a/apps/calendar/ajax/import/import.php +++ /dev/null @@ -1,151 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); -session_write_close(); -if (isset($_POST['progresskey']) && isset($_POST['getprogress'])) { - echo OCP\JSON::success(array('percent'=>OC_Cache::get($_POST['progresskey']))); - exit; -} -$file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); -if(!$file){ - OCP\JSON::error(array('error'=>'404')); -} -$import = new OC_Calendar_Import($file); -$import->setUserID(OCP\User::getUser()); -$import->setTimeZone(OC_Calendar_App::$tz); -$import->enableProgressCache(); -$import->setProgresskey($_POST['progresskey']); -if(!$import->isValid()){ - OCP\JSON::error(array('error'=>'notvalid')); - exit; -} -$newcal = false; -if($_POST['method'] == 'new'){ - $calendars = OC_Calendar_Calendar::allCalendars(OCP\User::getUser()); - foreach($calendars as $calendar){ - if($calendar['displayname'] == $_POST['calname']){ - $id = $calendar['id']; - $newcal = false; - break; - } - $newcal = true; - } - if($newcal){ - $id = OC_Calendar_Calendar::addCalendar(OCP\USER::getUser(), strip_tags($_POST['calname']),'VEVENT,VTODO,VJOURNAL',null,0,strip_tags($_POST['calcolor'])); - OC_Calendar_Calendar::setCalendarActive($id, 1); - } -}else{ - $calendar = OC_Calendar_App::getCalendar($_POST['id']); - if($calendar['userid'] != OCP\USER::getUser()){ - OCP\JSON::error(array('error'=>'missingcalendarrights')); - exit(); - } - $id = $_POST['id']; -} -$import->setCalendarID($id); -try{ - $import->import(); -}catch (Exception $e) { - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('Import failed'), 'debug'=>$e->getMessage())); - //write some log -} -$count = $import->getCount(); -if($count == 0){ - if($newcal){ - OC_Calendar_Calendar::deleteCalendar($id); - } - OCP\JSON::error(array('message'=>OC_Calendar_App::$l10n->t('The file contained either no events or all events are already saved in your calendar.'))); -}else{ - if($newcal){ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in the new calendar') . ' ' . strip_tags($_POST['calname']))); - }else{ - OCP\JSON::success(array('message'=>$count . ' ' . OC_Calendar_App::$l10n->t('events has been saved in your calendar'))); - } -} -/* //////////////////////////// Attention: following code is quite painfull !!! /////////////////////// -writeProgress('20'); -// normalize the newlines -$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file); -$lines = explode("\n", $file); -unset($file); -writeProgress('30'); -// analyze the file, group components by uid, and keep refs to originating calendar object -// $cals is array calendar objects, keys are 1st line# $cal, ie array( $cal => $caldata ) -// $caldata is array( 'first' => 1st component line#, 'last' => last comp line#, 'end' => end line# ) -// $caldata is used to create prefix/suffix strings when building import text -// $uids is array of component arrays, keys are $uid, ie array( $uid => array( $beginlineno => $component ) ) -// $component is array( 'end' => end line#, 'cal'=> $cal ) -$comp=$uid=$cal=false; -$cals=$uids=array(); -$i = 0; -foreach($lines as $line) { - - if(strpos($line, ':')!==false) { - list($attr, $val) = explode(':', strtoupper($line)); - if ($attr == 'BEGIN' && $val == 'VCALENDAR') { - $cal = $i; - $cals[$cal] = array('first'=>$i,'last'=>$i,'end'=>$i); - } elseif ($attr =='BEGIN' && $cal!==false && isset($comps[$val])) { - $comp = $val; - $beginNo = $i; - } elseif ($attr == 'END' && $cal!==false && $val == 'VCALENDAR') { - if($comp!==false) { - unset($cals[$cal]); // corrupt calendar, unset it - } else { - $cals[$cal]['end'] = $i; - } - $comp=$uid=$cal=false; // reset calendar - } elseif ($attr == 'END' && $comp!==false && $val == $comp) { - if(! $uid) { - $uid = OC_Calendar_Object::createUID(); - } - $uids[$uid][$beginNo] = array('end'=>$i, 'cal'=>$cal); - if ($cals[$cal]['first'] == $cal) { - $cals[$cal]['first'] = $beginNo; - } - $cals[$cal]['last'] = $i; - $comp=$uid=false; // reset component - } elseif ($attr =="UID" && $comp!==false) { - list($attr, $uid) = explode(':', $line); - } - } - $i++; -} -// import the calendar -writeProgress('60'); -foreach($uids as $uid) { - $prefix=$suffix=$content=array(); - foreach($uid as $begin=>$details) { - - $cal = $details['cal']; - if(!isset($cals[$cal])) { - continue; // from corrupt/incomplete calendar - } - $cdata = $cals[$cal]; - // if we have multiple components from different calendar objects, - // we should really merge their elements (enhancement?) -- 1st one wins for now. - if(! count($prefix)) { - $prefix = array_slice($lines, $cal, $cdata['first'] - $cal); - } - if(! count($suffix)) { - $suffix = array_slice($lines, $cdata['last']+1, $cdata['end'] - $cdata['last']); - } - $content = array_merge($content, array_slice($lines, $begin, $details['end'] - $begin + 1)); - } - if(count($content)) { - $import = join($nl, array_merge($prefix, $content, $suffix)) . $nl; - OC_Calendar_Object::add($id, $import); - } -} -// finished import -writeProgress('100'); -sleep(3); -OC_Cache::remove($progresskey); -OCP\JSON::success();*/ diff --git a/apps/calendar/ajax/settings/getfirstday.php b/apps/calendar/ajax/settings/getfirstday.php deleted file mode 100644 index bc995f7d6e..0000000000 --- a/apps/calendar/ajax/settings/getfirstday.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -$firstday = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'firstday', 'mo'); -OCP\JSON::encodedPrint(array('firstday' => $firstday)); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/gettimezonedetection.php b/apps/calendar/ajax/settings/gettimezonedetection.php deleted file mode 100644 index 6bc9a07a1e..0000000000 --- a/apps/calendar/ajax/settings/gettimezonedetection.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::success(array('detection' => OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection'))); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/guesstimezone.php b/apps/calendar/ajax/settings/guesstimezone.php deleted file mode 100644 index 6b6b8bef9c..0000000000 --- a/apps/calendar/ajax/settings/guesstimezone.php +++ /dev/null @@ -1,26 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); - -$l = OC_L10N::get('calendar'); - -$lat = $_POST['lat']; -$lng = $_POST['lng']; - -$timezone = OC_Geo::timezone($lat, $lng); - -if($timezone == OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezone')){ - OCP\JSON::success(); - exit; -} -OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezone', $timezone); -$message = array('message'=> $l->t('New Timezone:') . $timezone); -OCP\JSON::success($message); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/setfirstday.php b/apps/calendar/ajax/settings/setfirstday.php deleted file mode 100644 index 73cf0c19b7..0000000000 --- a/apps/calendar/ajax/settings/setfirstday.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -if(isset($_POST["firstday"])){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'firstday', $_POST["firstday"]); - OCP\JSON::success(); -}else{ - OCP\JSON::error(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/settimeformat.php b/apps/calendar/ajax/settings/settimeformat.php deleted file mode 100644 index 6136857e2f..0000000000 --- a/apps/calendar/ajax/settings/settimeformat.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -if(isset($_POST["timeformat"])){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timeformat', $_POST["timeformat"]); - OCP\JSON::success(); -}else{ - OCP\JSON::error(); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/settimezone.php b/apps/calendar/ajax/settings/settimezone.php deleted file mode 100644 index 06db66d578..0000000000 --- a/apps/calendar/ajax/settings/settimezone.php +++ /dev/null @@ -1,26 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Init owncloud - - -$l=OC_L10N::get('calendar'); - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -OCP\JSON::callCheck(); - -// Get data -if( isset( $_POST['timezone'] ) ){ - $timezone=$_POST['timezone']; - OCP\Config::setUserValue( OCP\USER::getUser(), 'calendar', 'timezone', $timezone ); - OCP\JSON::success(array('data' => array( 'message' => $l->t('Timezone changed') ))); -}else{ - OCP\JSON::error(array('data' => array( 'message' => $l->t('Invalid request') ))); -} \ No newline at end of file diff --git a/apps/calendar/ajax/settings/timeformat.php b/apps/calendar/ajax/settings/timeformat.php deleted file mode 100644 index eebb687dfa..0000000000 --- a/apps/calendar/ajax/settings/timeformat.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -$timeformat = OCP\Config::getUserValue( OCP\USER::getUser(), 'calendar', 'timeformat', "24"); -OCP\JSON::encodedPrint(array("timeformat" => $timeformat)); \ No newline at end of file diff --git a/apps/calendar/ajax/settings/timezonedetection.php b/apps/calendar/ajax/settings/timezonedetection.php deleted file mode 100644 index 5f03f647b3..0000000000 --- a/apps/calendar/ajax/settings/timezonedetection.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('calendar'); -if(array_key_exists('timezonedetection', $_POST) && $_POST['timezonedetection'] == 'on'){ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection', 'true'); -}else{ - OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection', 'false'); -} -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/activation.php b/apps/calendar/ajax/share/activation.php deleted file mode 100644 index bce8693577..0000000000 --- a/apps/calendar/ajax/share/activation.php +++ /dev/null @@ -1,11 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$id = strip_tags($_POST['id']); -$activation = strip_tags($_POST['activation']); -OC_Calendar_Share::set_active(OCP\USER::getUser(), $id, $activation); -OCP\JSON::success(); diff --git a/apps/calendar/ajax/share/changepermission.php b/apps/calendar/ajax/share/changepermission.php deleted file mode 100644 index 5aff7666f7..0000000000 --- a/apps/calendar/ajax/share/changepermission.php +++ /dev/null @@ -1,50 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -$permission = (int) strip_tags($_POST['permission']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -} -if($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -$success = OC_Calendar_Share::changepermission($sharewith, $sharetype, $id, $permission, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -OCP\JSON::success(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/dropdown.php b/apps/calendar/ajax/share/dropdown.php deleted file mode 100644 index 86cf4ac090..0000000000 --- a/apps/calendar/ajax/share/dropdown.php +++ /dev/null @@ -1,18 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$user = OCP\USER::getUser(); -$calid = $_POST['calid']; -$calendar = OC_Calendar_Calendar::find($calid); -if($calendar['userid'] != $user){ - OCP\JSON::error(); - exit; -} -$tmpl = new OCP\Template('calendar', 'share.dropdown'); -$tmpl->assign('calid', $calid); -$tmpl->printPage(); \ No newline at end of file diff --git a/apps/calendar/ajax/share/share.php b/apps/calendar/ajax/share/share.php deleted file mode 100644 index 77e1ab9d65..0000000000 --- a/apps/calendar/ajax/share/share.php +++ /dev/null @@ -1,61 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexpected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexpected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -} -if($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -if($sharetype == 'user' && OCP\USER::getUser() == $sharewith){ - OCP\JSON::error(array('message'=>'you can not share with yourself')); -} -$success = OC_Calendar_Share::share(OCP\USER::getUser(), $sharewith, $sharetype, $id, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -if($success){ - if($sharetype == 'public'){ - OCP\JSON::success(array('message'=>$success)); - }else{ - OCP\JSON::success(array('message'=>'shared')); - } -}else{ - OCP\JSON::error(array('message'=>'can not share')); - exit; -} \ No newline at end of file diff --git a/apps/calendar/ajax/share/unshare.php b/apps/calendar/ajax/share/unshare.php deleted file mode 100644 index c7c0611318..0000000000 --- a/apps/calendar/ajax/share/unshare.php +++ /dev/null @@ -1,53 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::callCheck(); - -$id = strip_tags($_POST['id']); -$idtype = strip_tags($_POST['idtype']); -switch($idtype){ - case 'calendar': - case 'event': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($idtype == 'calendar' && !OC_Calendar_App::getCalendar($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -if($idtype == 'event' && !OC_Calendar_App::getEventObject($id)){ - OCP\JSON::error(array('message'=>'permission denied')); - exit; -} -$sharewith = $_POST['sharewith']; -$sharetype = strip_tags($_POST['sharetype']); -switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - OCP\JSON::error(array('message'=>'unexspected parameter')); - exit; -} -if($sharetype == 'user' && !OCP\User::userExists($sharewith)){ - OCP\JSON::error(array('message'=>'user not found')); - exit; -}elseif($sharetype == 'group' && !OC_Group::groupExists($sharewith)){ - OCP\JSON::error(array('message'=>'group not found')); - exit; -} -$success = OC_Calendar_Share::unshare(OCP\USER::getUser(), $sharewith, $sharetype, $id, (($idtype=='calendar') ? OC_Calendar_Share::CALENDAR : OC_Calendar_Share::EVENT)); -if($success){ - OCP\JSON::success(); -}else{ - OCP\JSON::error(array('message'=>'can not unshare')); - exit; -} \ No newline at end of file diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php deleted file mode 100644 index 4fdba29126..0000000000 --- a/apps/calendar/appinfo/app.php +++ /dev/null @@ -1,37 +0,0 @@ - 'calendar_index', - 'order' => 10, - 'href' => OCP\Util::linkTo( 'calendar', 'index.php' ), - 'icon' => OCP\Util::imagePath( 'calendar', 'icon.svg' ), - 'name' => $l->t('Calendar'))); -OCP\App::registerPersonal('calendar', 'settings'); -OC_Search::registerProvider('OC_Search_Provider_Calendar'); diff --git a/apps/calendar/appinfo/database.xml b/apps/calendar/appinfo/database.xml deleted file mode 100644 index 73457e6c6c..0000000000 --- a/apps/calendar/appinfo/database.xml +++ /dev/null @@ -1,345 +0,0 @@ - - - - *dbname* - true - false - - utf8 - - - - *dbprefix*calendar_objects - - - - - id - integer - 0 - true - 1 - true - 4 - - - - calendarid - integer - - true - true - 4 - - - - objecttype - text - - true - 40 - - - - startdate - timestamp - 0000-00-00 00:00:00 - false - - - - enddate - timestamp - 0000-00-00 00:00:00 - false - - - - repeating - integer - - false - 4 - - - - summary - text - - false - 255 - - - - calendardata - clob - false - - - - uri - text - - false - 255 - - - - lastmodified - integer - - false - 4 - - - - -
- - - - *dbprefix*calendar_calendars - - - - - id - integer - 0 - true - 1 - true - 4 - - - - userid - text - - false - 255 - - - - displayname - text - - false - 100 - - - - uri - text - - false - 255 - - - - active - integer - 1 - true - 4 - - - - ctag - integer - 0 - true - true - 4 - - - - calendarorder - integer - 0 - true - true - 4 - - - - calendarcolor - text - - false - 10 - - - - timezone - clob - false - - - - components - text - - false - 100 - - - - -
- - - - *dbprefix*calendar_share_event - - - - - owner - text - true - 255 - - - - share - text - true - 255 - - - - sharetype - text - true - 6 - - - - eventid - integer - - true - true - 11 - - - - permissions - integer - true - 1 - - - - -
- - - - *dbprefix*calendar_share_calendar - - - - - owner - text - true - 255 - - - - share - text - true - 255 - - - - sharetype - text - true - 6 - - - - calendarid - integer - - true - true - 11 - - - - permissions - integer - true - 1 - - - - active - integer - 1 - true - 4 - - - - -
- - - - *dbprefix*calendar_repeat - - - - - id - integer - 0 - true - 1 - true - 4 - - - - eventid - integer - 0 - true - true - 4 - - - - calid - integer - 0 - true - true - 4 - - - - startdate - timestamp - 0000-00-00 00:00:00 - false - - - - enddate - timestamp - 0000-00-00 00:00:00 - false - - - - -
- -
diff --git a/apps/calendar/appinfo/info.xml b/apps/calendar/appinfo/info.xml deleted file mode 100644 index dde0260f07..0000000000 --- a/apps/calendar/appinfo/info.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - calendar - Calendar - AGPL - Georg Ehrke, Bart Visscher, Jakob Sack - 4 - true - Calendar with CalDAV support - - - appinfo/remote.php - appinfo/remote.php - - - share.php - share.php - - diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php deleted file mode 100644 index e8f9e80c7a..0000000000 --- a/apps/calendar/appinfo/remote.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\App::checkAppEnabled('calendar'); - -if(substr($_SERVER["REQUEST_URI"],0,strlen(OC_App::getAppWebPath('calendar').'/caldav.php')) == OC_App::getAppWebPath('calendar'). '/caldav.php'){ - $baseuri = OC_App::getAppWebPath('calendar').'/caldav.php'; -} - -// only need authentication apps -$RUNTIME_APPTYPES=array('authentication'); -OC_App::loadApps($RUNTIME_APPTYPES); - -// Backends -$authBackend = new OC_Connector_Sabre_Auth(); -$principalBackend = new OC_Connector_Sabre_Principal(); -$caldavBackend = new OC_Connector_Sabre_CalDAV(); - -// Root nodes -$nodes = array( - new Sabre_CalDAV_Principal_Collection($principalBackend), - new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend), -); - -// Fire up server -$server = new Sabre_DAV_Server($nodes); -$server->setBaseUri($baseuri); -// Add plugins -$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); -$server->addPlugin(new Sabre_CalDAV_Plugin()); -$server->addPlugin(new Sabre_DAVACL_Plugin()); -$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new Sabre_CalDAV_ICSExportPlugin()); -// And off we go! -$server->exec(); diff --git a/apps/calendar/appinfo/update.php b/apps/calendar/appinfo/update.php deleted file mode 100644 index 98159c3383..0000000000 --- a/apps/calendar/appinfo/update.php +++ /dev/null @@ -1,24 +0,0 @@ -execute(); - while( $row = $result->fetchRow()) { - $id = $row['id']; - $color = $row['calendarcolor']; - if ($color[0] == '#' || strlen($color) < 6) { - continue; - } - $color = '#' .$color; - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET calendarcolor=? WHERE id=?' ); - $r = $stmt->execute(array($color,$id)); - } -} -if (version_compare($installedVersion, '0.5', '<')) { - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); - foreach($calendars as $calendar){ - OC_Calendar_Repeat::cleanCalendar($calendar['id']); - OC_Calendar_Repeat::generateCalendar($calendar['id']); - } -} \ No newline at end of file diff --git a/apps/calendar/appinfo/version b/apps/calendar/appinfo/version deleted file mode 100644 index cb0c939a93..0000000000 --- a/apps/calendar/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.5.2 diff --git a/apps/calendar/caldav.php b/apps/calendar/caldav.php deleted file mode 100644 index 7b811d3cdf..0000000000 --- a/apps/calendar/caldav.php +++ /dev/null @@ -1,6 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -#calendar_import_newcalform, #calendar_import_mergewarning, #calendar_import_process, #calendar_import_done{display:none;} -#calendar_import_process_message, #calendar_import_status, #calendar_import_form_message, #calendar_import_mergewarning{text-align:center;} -#calendar_import_form_message{font-weight: bold;} -#calendar_import_newcalendar{width:415px;float:right;} -#calendar_import_mergewarning{clear: both;} -#calendar_import_defaultcolors{clear:both;margin: 0 auto;text-align: center;} -.calendar_import_warning{border-color: #fc3333;} -.calendar-colorpicker-color{display:inline-block;width:20px;height:5px;margin: 0 auto;cursor:pointer;border:2px solid transparent;} \ No newline at end of file diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css deleted file mode 100644 index 373a456563..0000000000 --- a/apps/calendar/css/style.css +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Copyright (c) 2011 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -#view { float: left; font-size: 12px; height: 100%;} -#datecontrol {text-align: center;} -#datecontrol_left{font-size: 12px;} -#datecontrol_right{font-size: 12px;} -#datecontrol_date_label {margin: 0; padding: 0; font-size: 12px;} -#choosecalendar {margin-right: 170px; float: right; font-size: 12px;} - -#choosecalendar_dialog {display: none;} -#newentry_dialog {display: none;} -#editentry_dialog {display: none;} -#parsingfail_dialog{display: none;} - -#loading { display: none;margin: 0;padding:0;margin-top:5px;} - -#calendar_holder {position: relative;bottom: 0; right: 0; left: 0; top: 3em;} -.fc-content{padding:2px 4px;} -#listview {margin: 0; padding: 10px; background: #EEEEEE;} -#listview #more_before, #listview #more_after {border: 1px solid #1a1a1a; width:25em;padding: 3px;text-align: center;} -#listview #events {width:25em;padding: 4px;} -#listview #events .day {width:auto;padding-left:10px;border-bottom: 2px solid #EEEEEE;text-align:left;} - -.actions {height: 33px; min-width: 800px;} -.controls {min-width: 800px;} -.center {text-align: center;} -.dateinfo {height: 20px;width: 100%; overflow: hidden; margin-top: 0; padding: 0; font-size: 12px;background: #F7F7F7;} -.events {width: 100%; margin: 0; padding: 0;min-height: 100px;} -.calendar_row {height: 20px; text-align: center;background: #ffffff;} -#oneweekview .calendar_row {width: 13.5%;} -.calendar_time {height: 20px; width: 50px; text-align:right;background: #ffffff;} -.day {text-align: center; background: #ffffff; margin: 0; padding: 0; vertical-align: top; width: 14%; height: 22%;} -.weekend {background: #F3F3F3; } -.weekend_thead, .weekend_row{height: 20px;text-align: center;text-align: center;background: #F3F3F3;} -.thisday{background: #FFFABC;} -.event {position:relative;} -.event.colored {border-bottom: 1px solid white;} -.popup {display: none; position: absolute; z-index: 1000; background: #eeeeee; color: #000000; border: 1px solid #1a1a1a; font-size: 90%;} -.event_popup {width: 280px; height: 40px; padding: 10px;} - -input[type="button"].active {color: #6193CF} -#fromtime, #totime { -color:#333; -} -#fromtime.disabled, #totime.disabled { -color:#A9A9A9; -} -select#category{width:140px;} -button.category{margin:0 3px;} - -.calendar-colorpicker-color{display:inline-block;width:20px;height:20px;margin-right:2px;cursor:pointer;border:2px solid transparent;} -.calendar-colorpicker-color.active{border:2px solid black;} - -#event {padding: 0;margin: 0;margin-top:-5px} - -.calendar_share_dropdown{ display:block; position:absolute; z-index:100; width:16em; right:0; margin-right:7em; background:#F8F8F8; padding:1em; --moz-box-shadow:0 1px 1px #777; -webkit-box-shadow:0 1px 1px #777; box-shadow:0 1px 1px #777; --moz-border-radius:0 0 1em 1em; -webkit-border-radius:0 0 1em 1em; border-radius:0 0 1em 1em;} - -.fc-list-table -{ - margin: 10px; - border-style: hidden; - border-width: 10px; - padding: 10px; - vertical-align: top; - width: 100%; -} -.fc-list-table tr:hover -{ - color: #0000FF; - background-color: #CCFFCC; -} - - -.fc-list-date -{ - margin: 16px; - white-space: nowrap; - text-align: left; - width: 100%; - background-color: #808080; - color: #FFFFFF; - font-weight: bold; - font-family: Arial, Helvetica, sans-serif; -} -.fc-list-time -{ - text-align: center; - white-space: nowrap; - width: 1%; -} - -.fc-list-event -{ - text-align: left; -} - -.fc-list-event .fc-event-title -{ - cursor: pointer; -} -.tipsy-event .tipsy-inner{ -background-color:#0098E4; -border:2px solid #1d2d44; -max-width:400px; -padding:0; -} -.tipsy-event .tipsy-arrow-s{ -border-top-color:#1d2d44; -} -.tipsy-event .tipsy-arrow-n{ -border-bottom-color:#1d2d44; -} -.tipsy-event .summary, -.tipsy-event .timespan, -.tipsy-event .description{ -padding:0 8px; -} -.tipsy-event .summary{ -background-color:#1d2d44; -font-size:1.2em; -font-weight:bold; -text-align:left; -padding:0 8px 2px; -} -.tipsy-event .description{ -line-height:1.2; -margin-bottom:4px; -} diff --git a/apps/calendar/export.php b/apps/calendar/export.php deleted file mode 100644 index 1374c49cc0..0000000000 --- a/apps/calendar/export.php +++ /dev/null @@ -1,30 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); -$cal = isset($_GET['calid']) ? $_GET['calid'] : NULL; -$event = isset($_GET['eventid']) ? $_GET['eventid'] : NULL; -if(isset($cal)){ - $calendar = OC_Calendar_App::getCalendar($cal, true); - if(!$calendar){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $calendar['displayname']) . '.ics'); - echo OC_Calendar_Export::export($cal, OC_Calendar_Export::CALENDAR); -}elseif(isset($event)){ - $data = OC_Calendar_App::getEventObject($_GET['eventid'], true); - if(!$data){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $data['summary']) . '.ics'); - echo OC_Calendar_Export::export($event, OC_Calendar_Export::EVENT); -} \ No newline at end of file diff --git a/apps/calendar/img/Icon License b/apps/calendar/img/Icon License deleted file mode 100644 index b1b292ace6..0000000000 --- a/apps/calendar/img/Icon License +++ /dev/null @@ -1,2 +0,0 @@ -http://thenounproject.com/noun/calendar/#icon-No404 -Creative Commons BY 3.0 \ No newline at end of file diff --git a/apps/calendar/img/icon.png b/apps/calendar/img/icon.png deleted file mode 100644 index eb9e07cbb1..0000000000 Binary files a/apps/calendar/img/icon.png and /dev/null differ diff --git a/apps/calendar/img/icon.svg b/apps/calendar/img/icon.svg deleted file mode 100644 index 211f74df06..0000000000 --- a/apps/calendar/img/icon.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - -image/svg+xml - - - \ No newline at end of file diff --git a/apps/calendar/index.php b/apps/calendar/index.php deleted file mode 100644 index 4b87119592..0000000000 --- a/apps/calendar/index.php +++ /dev/null @@ -1,64 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('calendar'); - -// Create default calendar ... -$calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser(), false); -if( count($calendars) == 0){ - OC_Calendar_Calendar::addCalendar(OCP\USER::getUser(),'Default calendar'); - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser(), true); -} - -$eventSources = array(); -foreach($calendars as $calendar){ - if($calendar['active'] == 1) { - $eventSources[] = OC_Calendar_Calendar::getEventSourceInfo($calendar); - } -} - -$eventSources[] = array('url' => '?app=calendar&getfile=ajax/events.php?calendar_id=shared_rw', 'backgroundColor' => '#1D2D44', 'borderColor' => '#888', 'textColor' => 'white', 'editable'=>'true'); -$eventSources[] = array('url' => '?app=calendar&getfile=ajax/events.php?calendar_id=shared_r', 'backgroundColor' => '#1D2D44', 'borderColor' => '#888', 'textColor' => 'white', 'editable' => 'false'); - -OCP\Util::emitHook('OC_Calendar', 'getSources', array('sources' => &$eventSources)); -$categories = OC_Calendar_App::getCategoryOptions(); - -//Fix currentview for fullcalendar -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "oneweekview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "agendaWeek"); -} -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "onemonthview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "month"); -} -if(OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'currentview', 'month') == "listview"){ - OCP\Config::setUserValue(OCP\USER::getUser(), "calendar", "currentview", "list"); -} - -OCP\Util::addscript('3rdparty/fullcalendar', 'fullcalendar'); -OCP\Util::addStyle('3rdparty/fullcalendar', 'fullcalendar'); -OCP\Util::addscript('3rdparty/timepicker', 'jquery.ui.timepicker'); -OCP\Util::addStyle('3rdparty/timepicker', 'jquery.ui.timepicker'); -if(OCP\Config::getUserValue(OCP\USER::getUser(), "calendar", "timezone") == null || OCP\Config::getUserValue(OCP\USER::getUser(), 'calendar', 'timezonedetection') == 'true'){ - OCP\Util::addscript('calendar', 'geo'); -} -OCP\Util::addscript('calendar', 'calendar'); -OCP\Util::addStyle('calendar', 'style'); -OCP\Util::addscript('', 'jquery.multiselect'); -OCP\Util::addStyle('', 'jquery.multiselect'); -OCP\Util::addscript('contacts','jquery.multi-autocomplete'); -OCP\Util::addscript('','oc-vcategories'); -OCP\App::setActiveNavigationEntry('calendar_index'); -$tmpl = new OCP\Template('calendar', 'calendar', 'user'); -$tmpl->assign('eventSources', $eventSources,false); -$tmpl->assign('categories', $categories); -if(array_key_exists('showevent', $_GET)){ - $tmpl->assign('showevent', $_GET['showevent'], false); -} -$tmpl->printPage(); diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js deleted file mode 100644 index 25311fa0df..0000000000 --- a/apps/calendar/js/calendar.js +++ /dev/null @@ -1,925 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -Calendar={ - UI:{ - loading: function(isLoading){ - if (isLoading){ - $('#loading').show(); - }else{ - $('#loading').hide(); - } - }, - startEventDialog:function(){ - Calendar.UI.loading(false); - $('.tipsy').remove(); - $('#calendar_holder').fullCalendar('unselect'); - Calendar.UI.lockTime(); - $( "#from" ).datepicker({ - dateFormat : 'dd-mm-yy' - }); - $( "#to" ).datepicker({ - dateFormat : 'dd-mm-yy' - }); - $('#fromtime').timepicker({ - showPeriodLabels: false - }); - $('#totime').timepicker({ - showPeriodLabels: false - }); - $('#category').multiple_autocomplete({source: categories}); - Calendar.UI.repeat('init'); - $('#end').change(function(){ - Calendar.UI.repeat('end'); - }); - $('#repeat').change(function(){ - Calendar.UI.repeat('repeat'); - }); - $('#advanced_year').change(function(){ - Calendar.UI.repeat('year'); - }); - $('#advanced_month').change(function(){ - Calendar.UI.repeat('month'); - }); - $( "#event" ).tabs({ selected: 0}); - $('#event').dialog({ - width : 500, - height: 600, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - } - }); - }, - newEvent:function(start, end, allday){ - start = Math.round(start.getTime()/1000); - if (end){ - end = Math.round(end.getTime()/1000); - } - if($('#event').dialog('isOpen') == true){ - // TODO: save event - $('#event').dialog('destroy').remove(); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/event', 'new.form.php'), {start:start, end:end, allday:allday?1:0}, Calendar.UI.startEventDialog); - } - }, - editEvent:function(calEvent, jsEvent, view){ - if (calEvent.editable == false || calEvent.source.editable == false) { - return; - } - var id = calEvent.id; - if($('#event').dialog('isOpen') == true){ - // TODO: save event - $('#event').dialog('destroy').remove(); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/event', 'edit.form.php'), {id: id}, Calendar.UI.startEventDialog); - } - }, - submitDeleteEventForm:function(url){ - var post = $( '#event_form' ).serialize(); - $('#errorbox').empty(); - Calendar.UI.loading(true); - $.post(url, post, function(data){ - Calendar.UI.loading(false); - if(data.status == 'success'){ - $('#calendar_holder').fullCalendar('removeEvents', $('#event_form input[name=id]').val()); - $('#event').dialog('destroy').remove(); - } else { - $('#errorbox').html(t('calendar', 'Deletion failed')); - } - - }, "json"); - }, - validateEventForm:function(url){ - var post = $( "#event_form" ).serialize(); - $("#errorbox").empty(); - Calendar.UI.loading(true); - $.post(url, post, - function(data){ - Calendar.UI.loading(false); - if(data.status == "error"){ - var output = missing_field + ":
"; - if(data.title == "true"){ - output = output + missing_field_title + "
"; - } - if(data.cal == "true"){ - output = output + missing_field_calendar + "
"; - } - if(data.from == "true"){ - output = output + missing_field_fromdate + "
"; - } - if(data.fromtime == "true"){ - output = output + missing_field_fromtime + "
"; - } - if(data.to == "true"){ - output = output + missing_field_todate + "
"; - } - if(data.totime == "true"){ - output = output + missing_field_totime + "
"; - } - if(data.endbeforestart == "true"){ - output = output + missing_field_startsbeforeends + "!
"; - } - if(data.dberror == "true"){ - output = "There was a database fail!"; - } - $("#errorbox").html(output); - } else - if(data.status == 'success'){ - $('#event').dialog('destroy').remove(); - $('#calendar_holder').fullCalendar('refetchEvents'); - } - },"json"); - }, - moveEvent:function(event, dayDelta, minuteDelta, allDay, revertFunc){ - $('.tipsy').remove(); - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/event', 'move.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, allDay: allDay?1:0, lastmodified: event.lastmodified}, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - event.lastmodified = data.lastmodified; - console.log("Event moved successfully"); - }else{ - revertFunc(); - $('#calendar_holder').fullCalendar('refetchEvents'); - } - }); - }, - resizeEvent:function(event, dayDelta, minuteDelta, revertFunc){ - $('.tipsy').remove(); - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/event', 'resize.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, lastmodified: event.lastmodified}, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - event.lastmodified = data.lastmodified; - console.log("Event resized successfully"); - }else{ - revertFunc(); - $('#calendar_holder').fullCalendar('refetchEvents'); - } - }); - }, - showadvancedoptions:function(){ - $("#advanced_options").slideDown('slow'); - $("#advanced_options_button").css("display", "none"); - }, - showadvancedoptionsforrepeating:function(){ - if($("#advanced_options_repeating").is(":hidden")){ - $('#advanced_options_repeating').slideDown('slow'); - }else{ - $('#advanced_options_repeating').slideUp('slow'); - } - }, - getEventPopupText:function(event){ - if (event.allDay){ - var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}") - }else{ - var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy] ' + defaulttime + '{ -[ ddd d MMMM yyyy]' + defaulttime + '}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy] HH:mm{ -[ ddd d MMMM yyyy] HH:mm}") - // Tue 18 October 2011 08:00 - 16:00 - } - var html = - '
' + event.title + '
' + - '
' + timespan + '
'; - if (event.description){ - html += '
' + event.description + '
'; - } - return html; - }, - lockTime:function(){ - if($('#allday_checkbox').is(':checked')) { - $("#fromtime").attr('disabled', true) - .addClass('disabled'); - $("#totime").attr('disabled', true) - .addClass('disabled'); - } else { - $("#fromtime").attr('disabled', false) - .removeClass('disabled'); - $("#totime").attr('disabled', false) - .removeClass('disabled'); - } - }, - showCalDAVUrl:function(username, calname){ - $('#caldav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(calname)); - $('#caldav_url').show(); - $("#caldav_url_close").show(); - }, - initScroll:function(){ - if(window.addEventListener) - document.addEventListener('DOMMouseScroll', Calendar.UI.scrollCalendar, false); - //}else{ - document.onmousewheel = Calendar.UI.scrollCalendar; - //} - }, - scrollCalendar:function(event){ - $('.tipsy').remove(); - var direction; - if(event.detail){ - if(event.detail < 0){ - direction = 'top'; - }else{ - direction = 'down'; - } - } - if (event.wheelDelta){ - if(event.wheelDelta > 0){ - direction = 'top'; - }else{ - direction = 'down'; - } - } - var scroll = $(document).scrollTop(), - doc_height = $(document).height(), - win_height = $(window).height(); - if(direction == 'down' && win_height == (doc_height - scroll)){ - $('#calendar_holder').fullCalendar('next'); - $(document).scrollTop(0); - event.preventDefault(); - }else if (direction == 'top' && scroll == 0) { - $('#calendar_holder').fullCalendar('prev'); - $(document).scrollTop(win_height); - event.preventDefault(); - } - }, - repeat:function(task){ - if(task=='init'){ - $('#byweekno').multiselect({ - header: false, - noneSelectedText: $('#advanced_byweekno').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#weeklyoptions').multiselect({ - header: false, - noneSelectedText: $('#weeklyoptions').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('input[name="bydate"]').datepicker({ - dateFormat : 'dd-mm-yy' - }); - $('#byyearday').multiselect({ - header: false, - noneSelectedText: $('#byyearday').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#bymonth').multiselect({ - header: false, - noneSelectedText: $('#bymonth').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - $('#bymonthday').multiselect({ - header: false, - noneSelectedText: $('#bymonthday').attr('title'), - selectedList: 2, - minWidth:'auto' - }); - Calendar.UI.repeat('end'); - Calendar.UI.repeat('month'); - Calendar.UI.repeat('year'); - Calendar.UI.repeat('repeat'); - } - if(task == 'end'){ - $('#byoccurrences').css('display', 'none'); - $('#bydate').css('display', 'none'); - if($('#end option:selected').val() == 'count'){ - $('#byoccurrences').css('display', 'block'); - } - if($('#end option:selected').val() == 'date'){ - $('#bydate').css('display', 'block'); - } - } - if(task == 'repeat'){ - $('#advanced_month').css('display', 'none'); - $('#advanced_weekday').css('display', 'none'); - $('#advanced_weekofmonth').css('display', 'none'); - $('#advanced_byyearday').css('display', 'none'); - $('#advanced_bymonth').css('display', 'none'); - $('#advanced_byweekno').css('display', 'none'); - $('#advanced_year').css('display', 'none'); - $('#advanced_bymonthday').css('display', 'none'); - if($('#repeat option:selected').val() == 'monthly'){ - $('#advanced_month').css('display', 'block'); - Calendar.UI.repeat('month'); - } - if($('#repeat option:selected').val() == 'weekly'){ - $('#advanced_weekday').css('display', 'block'); - } - if($('#repeat option:selected').val() == 'yearly'){ - $('#advanced_year').css('display', 'block'); - Calendar.UI.repeat('year'); - } - if($('#repeat option:selected').val() == 'doesnotrepeat'){ - $('#advanced_options_repeating').slideUp('slow'); - } - } - if(task == 'month'){ - $('#advanced_weekday').css('display', 'none'); - $('#advanced_weekofmonth').css('display', 'none'); - if($('#advanced_month_select option:selected').val() == 'weekday'){ - $('#advanced_weekday').css('display', 'block'); - $('#advanced_weekofmonth').css('display', 'block'); - } - } - if(task == 'year'){ - $('#advanced_weekday').css('display', 'none'); - $('#advanced_byyearday').css('display', 'none'); - $('#advanced_bymonth').css('display', 'none'); - $('#advanced_byweekno').css('display', 'none'); - $('#advanced_bymonthday').css('display', 'none'); - if($('#advanced_year_select option:selected').val() == 'byyearday'){ - //$('#advanced_byyearday').css('display', 'block'); - } - if($('#advanced_year_select option:selected').val() == 'byweekno'){ - $('#advanced_byweekno').css('display', 'block'); - } - if($('#advanced_year_select option:selected').val() == 'bydaymonth'){ - $('#advanced_bymonth').css('display', 'block'); - $('#advanced_bymonthday').css('display', 'block'); - $('#advanced_weekday').css('display', 'block'); - } - } - - }, - setViewActive: function(view){ - $('#view input[type="button"]').removeClass('active'); - var id; - switch (view) { - case 'agendaWeek': - id = 'oneweekview_radio'; - break; - case 'month': - id = 'onemonthview_radio'; - break; - case 'list': - id = 'listview_radio'; - break; - } - $('#'+id).addClass('active'); - }, - categoriesChanged:function(newcategories){ - categories = $.map(newcategories, function(v) {return v;}); - console.log('Calendar categories changed to: ' + categories); - $('#category').multiple_autocomplete('option', 'source', categories); - }, - Calendar:{ - overview:function(){ - if($('#choosecalendar_dialog').dialog('isOpen') == true){ - $('#choosecalendar_dialog').dialog('moveToTop'); - }else{ - Calendar.UI.loading(true); - $('#dialog_holder').load(OC.filePath('calendar', 'ajax/calendar', 'overview.php'), function(){ - $('#choosecalendar_dialog').dialog({ - width : 600, - height: 400, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - } - }); - Calendar.UI.loading(false); - }); - } - }, - activation:function(checkbox, calendarid) - { - Calendar.UI.loading(true); - $.post(OC.filePath('calendar', 'ajax/calendar', 'activation.php'), { calendarid: calendarid, active: checkbox.checked?1:0 }, - function(data) { - Calendar.UI.loading(false); - if (data.status == 'success'){ - checkbox.checked = data.active == 1; - if (data.active == 1){ - $('#calendar_holder').fullCalendar('addEventSource', data.eventSource); - }else{ - $('#calendar_holder').fullCalendar('removeEventSource', data.eventSource.url); - } - } - }); - }, - newCalendar:function(object){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('calendar', 'ajax/calendar', 'new.form.php'), - function(){Calendar.UI.Calendar.colorPicker(this)}); - $(object).closest('tr').after(tr).hide(); - }, - edit:function(object, calendarid){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('calendar', 'ajax/calendar', 'edit.form.php'), {calendarid: calendarid}, - function(){Calendar.UI.Calendar.colorPicker(this)}); - $(object).closest('tr').after(tr).hide(); - }, - deleteCalendar:function(calid){ - var check = confirm("Do you really want to delete this calendar?"); - if(check == false){ - return false; - }else{ - $.post(OC.filePath('calendar', 'ajax/calendar', 'delete.php'), { calendarid: calid}, - function(data) { - if (data.status == 'success'){ - var url = 'ajax/events.php?calendar_id='+calid; - $('#calendar_holder').fullCalendar('removeEventSource', url); - $('#choosecalendar_dialog').dialog('destroy').remove(); - Calendar.UI.Calendar.overview(); - $('#calendar_holder').fullCalendar('refetchEvents'); - } - }); - } - }, - submit:function(button, calendarid){ - var displayname = $.trim($("#displayname_"+calendarid).val()); - var active = $("#edit_active_"+calendarid+":checked").length; - var description = $("#description_"+calendarid).val(); - var calendarcolor = $("#calendarcolor_"+calendarid).val(); - if(displayname == ''){ - $("#displayname_"+calendarid).css('background-color', '#FF2626'); - $("#displayname_"+calendarid).focus(function(){ - $("#displayname_"+calendarid).css('background-color', '#F8F8F8'); - }); - } - - var url; - if (calendarid == 'new'){ - url = OC.filePath('calendar', 'ajax/calendar', 'new.php'); - }else{ - url = OC.filePath('calendar', 'ajax/calendar', 'update.php'); - } - $.post(url, { id: calendarid, name: displayname, active: active, description: description, color: calendarcolor }, - function(data){ - if(data.status == 'success'){ - $(button).closest('tr').prev().html(data.page).show().next().remove(); - $('#calendar_holder').fullCalendar('removeEventSource', data.eventSource.url); - $('#calendar_holder').fullCalendar('addEventSource', data.eventSource); - if (calendarid == 'new'){ - $('#choosecalendar_dialog > table:first').append(''); - } - }else{ - $("#displayname_"+calendarid).css('background-color', '#FF2626'); - $("#displayname_"+calendarid).focus(function(){ - $("#displayname_"+calendarid).css('background-color', '#F8F8F8'); - }); - } - }, 'json'); - }, - cancel:function(button, calendarid){ - $(button).closest('tr').prev().show().next().remove(); - }, - colorPicker:function(container){ - // based on jquery-colorpicker at jquery.webspirited.com - var obj = $('.colorpicker', container); - var picker = $('
'); - //build an array of colors - var colors = {}; - $(obj).children('option').each(function(i, elm) { - colors[i] = {}; - colors[i].color = $(elm).val(); - colors[i].label = $(elm).text(); - }); - for (var i in colors) { - picker.append(''); - } - picker.delegate(".calendar-colorpicker-color", "click", function() { - $(obj).val($(this).attr('rel')); - $(obj).change(); - picker.children('.calendar-colorpicker-color.active').removeClass('active'); - $(this).addClass('active'); - }); - $(obj).after(picker); - $(obj).css({ - position: 'absolute', - left: -10000 - }); - } - }, - Share:{ - currentid: 'false', - idtype: '', - activation:function(object,owner,id){ - $.post(OC.filePath('calendar', 'ajax/share', 'activation.php'),{id:id, idtype:'calendar', activation:object.checked?1:0}); - $('#calendar_holder').fullCalendar('refetchEvents'); - }, - dropdown:function(userid, calid){ - $('.calendar_share_dropdown').remove(); - var element = document.getElementById(userid+'_'+calid); - $('
').appendTo(element); - $.post(OC.filePath('calendar', 'ajax/share', 'dropdown.php'), {calid: calid}, function(data){ - $('.calendar_share_dropdown').html(data); - $('.calendar_share_dropdown').show('blind'); - $('#share_user').chosen(); - $('#share_group').chosen(); - }); - Calendar.UI.Share.currentid = calid; - Calendar.UI.Share.idtype = 'calendar'; - }, - share:function(id, idtype, sharewith, sharetype){ - $.post(OC.filePath('calendar', 'ajax/share', 'share.php'),{id:id, idtype:idtype, sharewith:sharewith, sharetype:sharetype}, function(data){ - if(sharetype == 'public'){ - $('#public_token').val(parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=calendar&t='+data.message); - $('#public_token').css('display', 'block'); - } - }); - }, - unshare:function(id, idtype, sharewith, sharetype){ - $.post(OC.filePath('calendar', 'ajax/share', 'unshare.php'),{id:id, idtype:idtype, sharewith:sharewith, sharetype:sharetype}, function(){ - if(sharetype == 'public'){ - $('#public_token').val(''); - $('#public_token').css('display', 'none'); - } - }); - }, - changepermission:function(id, idtype, sharewith, sharetype, permission){ - $.post(OC.filePath('calendar', 'ajax/share', 'changepermission.php'),{id:id, idtype:idtype, sharewith: sharewith, sharetype:sharetype, permission: (permission?1:0)}); - }, - init:function(){ - $('.calendar_share_dropdown').live('mouseleave', function(){ - $('.calendar_share_dropdown').hide('blind', function(){ - $('.calendar_share_dropdown').remove(); - }); - }); - $('#share_user').live('change', function(){ - if($('#sharewithuser_' + $('#share_user option:selected').text()).length == 0){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_user option:selected').text(), 'user'); - var newitem = '
  • ' + $('#share_user option:selected').text() + '
  • '; - $('#sharewithuser_list').append(newitem); - $('#sharewithuser_' + $('#share_user option:selected').text() + ' > img').click(function(){ - $('#share_user option[value="' + $(this).parent().text() + '"]').removeAttr('disabled'); - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'user' ); - $("#share_user").trigger("liszt:updated"); - $(this).parent().remove(); - }); - $('#share_user option:selected').attr('disabled', 'disabled'); - $("#share_user").trigger("liszt:updated"); - } - }); - $('#share_group').live('change', function(){ - if($('#sharewithgroup_' + $('#share_group option:selected').text()).length == 0){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $('#share_group option:selected').text(), 'group'); - var newitem = '
  • ' + $('#share_group option:selected').text() + '
  • '; - $('#sharewithgroup_list').append(newitem); - $('#sharewithgroup_' + $('#share_group option:selected').text() + ' > img').click(function(){ - $('#share_group option[value="' + $(this).parent().text() + '"]').removeAttr('disabled'); - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'group'); - $("#share_group").trigger("liszt:updated"); - $(this).parent().remove(); - }); - $('#share_group option:selected').attr('disabled', 'disabled'); - $("#share_group").trigger("liszt:updated"); - } - }); - $('#sharewithuser_list > li > input:checkbox').live('change', function(){ - Calendar.UI.Share.changepermission(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'user', this.checked); - }); - $('#sharewithgroup_list > li > input:checkbox').live('change', function(){ - Calendar.UI.Share.changepermission(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, $(this).parent().text(), 'group', this.checked); - }); - $('#publish').live('change', function(){ - if(this.checked == 1){ - Calendar.UI.Share.share(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, '', 'public'); - }else{ - Calendar.UI.Share.unshare(Calendar.UI.Share.currentid, Calendar.UI.Share.idtype, '', 'public'); - } - }); - $('#sharewithuser_list').live('mouseenter', function(){ - $('#sharewithuser_list > li > img').css('display', 'block'); - $('#sharewithuser_list > li > input').css('visibility', 'visible'); - }); - $('#sharewithuser_list').live('mouseleave', function(){ - $('#sharewithuser_list > li > img').css('display', 'none'); - $('#sharewithuser_list > li > input').css('visibility', 'hidden'); - }); - $('#sharewithgroup_list').live('mouseenter', function(){ - $('#sharewithgroup_list > li > img').css('display', 'block'); - $('#sharewithgroup_list > li > input').css('visibility', 'visible'); - }); - $('#sharewithgroup_list').live('mouseleave', function(){ - $('#sharewithgroup_list > li > img').css('display', 'none'); - $('#sharewithgroup_list > li > input').css('visibility', 'hidden'); - }); - /*var permissions = (this.checked) ? 1 : 0;*/ - } - }, - Drop:{ - init:function(){ - if (typeof window.FileReader === 'undefined') { - console.log('The drop-import feature is not supported in your browser :('); - return false; - } - droparea = document.getElementById('calendar_holder'); - droparea.ondrop = function(e){ - e.preventDefault(); - Calendar.UI.Drop.drop(e); - } - console.log('Drop initialized successfully'); - }, - drop:function(e){ - var files = e.dataTransfer.files; - for(var i = 0;i < files.length;i++){ - var file = files[i]; - reader = new FileReader(); - reader.onload = function(event){ - Calendar.UI.Drop.import(event.target.result); - $('#calendar_holder').fullCalendar('refetchEvents'); - } - reader.readAsDataURL(file); - } - }, - import:function(data){ - $.post(OC.filePath('calendar', 'ajax/import', 'dropimport.php'), {'data':data},function(result) { - if(result.status == 'success'){ - $('#calendar_holder').fullCalendar('addEventSource', result.eventSource); - $('#notification').html(result.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - return true; - }else{ - $('#notification').html(result.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - } - }); - } - } - } -} -$.fullCalendar.views.list = ListView; -function ListView(element, calendar) { - var t = this; - - // imports - jQuery.fullCalendar.views.month.call(t, element, calendar); - var opt = t.opt; - var trigger = t.trigger; - var eventElementHandlers = t.eventElementHandlers; - var reportEventElement = t.reportEventElement; - var formatDate = calendar.formatDate; - var formatDates = calendar.formatDates; - var addDays = $.fullCalendar.addDays; - var cloneDate = $.fullCalendar.cloneDate; - function skipWeekend(date, inc, excl) { - inc = inc || 1; - while (!date.getDay() || (excl && date.getDay()==1 || !excl && date.getDay()==6)) { - addDays(date, inc); - } - return date; - } - - // overrides - t.name='list'; - t.render=render; - t.renderEvents=renderEvents; - t.setHeight=setHeight; - t.setWidth=setWidth; - t.clearEvents=clearEvents; - - function setHeight(height, dateChanged) { - } - - function setWidth(width) { - } - - function clearEvents() { - this.reportEventClear(); - } - - // main - function sortEvent(a, b) { - return a.start - b.start; - } - - function render(date, delta) { - if (!t.start){ - t.start = addDays(cloneDate(date, true), -7); - t.end = addDays(cloneDate(date, true), 7); - } - if (delta) { - if (delta < 0){ - addDays(t.start, -7); - addDays(t.end, -7); - if (!opt('weekends')) { - skipWeekend(t.start, delta < 0 ? -1 : 1); - } - }else{ - addDays(t.start, 7); - addDays(t.end, 7); - if (!opt('weekends')) { - skipWeekend(t.end, delta < 0 ? -1 : 1); - } - } - } - t.title = formatDates( - t.start, - t.end, - opt('titleFormat', 'week') - ); - t.visStart = cloneDate(t.start); - t.visEnd = cloneDate(t.end); - } - - function eventsOfThisDay(events, theDate) { - var start = cloneDate(theDate, true); - var end = addDays(cloneDate(start), 1); - var retArr = new Array(); - for (i in events) { - var event_end = t.eventEnd(events[i]); - if (events[i].start < end && event_end >= start) { - retArr.push(events[i]); - } - } - return retArr; - } - - function renderEvent(event) { - if (event.allDay) { //all day event - var time = opt('allDayText'); - } - else { - var time = formatDates(event.start, event.end, opt('timeFormat', 'agenda')); - } - var classes = ['fc-event', 'fc-list-event']; - classes = classes.concat(event.className); - if (event.source) { - classes = classes.concat(event.source.className || []); - } - var html = '' + - ' ' + - '' + - time + - '' + - ' ' + - '' + - '' + - '' + - event.title + - '' + - '' + - '' + - ''; - return html; - } - - function renderDay(date, events) { - var dayRows = $('' + - '' + - '' + - formatDate(date, opt('titleFormat', 'day')) + - '' + - '' + - ''); - for (i in events) { - var event = events[i]; - var eventElement = $(renderEvent(event)); - triggerRes = trigger('eventRender', event, event, eventElement); - if (triggerRes === false) { - eventElement.remove(); - }else{ - if (triggerRes && triggerRes !== true) { - eventElement.remove(); - eventElement = $(triggerRes); - } - $.merge(dayRows, eventElement); - eventElementHandlers(event, eventElement); - reportEventElement(event, eventElement); - } - } - return dayRows; - } - - function renderEvents(events, modifiedEventId) { - events = events.sort(sortEvent); - - var table = $('
    '); - var total = events.length; - if (total > 0) { - var date = cloneDate(t.visStart); - while (date <= t.visEnd) { - var dayEvents = eventsOfThisDay(events, date); - if (dayEvents.length > 0) { - table.append(renderDay(date, dayEvents)); - } - date=addDays(date, 1); - } - } - - this.element.html(table); - } -} -$(document).ready(function(){ - Calendar.UI.initScroll(); - $('#calendar_holder').fullCalendar({ - header: false, - firstDay: firstDay, - editable: true, - defaultView: defaultView, - timeFormat: { - agenda: agendatime, - '': defaulttime - }, - columnFormat: { - month: t('calendar', 'ddd'), // Mon - week: t('calendar', 'ddd M/d'), // Mon 9/7 - day: t('calendar', 'dddd M/d') // Monday 9/7 - }, - titleFormat: { - month: t('calendar', 'MMMM yyyy'), - // September 2009 - week: t('calendar', "MMM d[ yyyy]{ '—'[ MMM] d yyyy}"), - // Sep 7 - 13 2009 - day: t('calendar', 'dddd, MMM d, yyyy'), - // Tuesday, Sep 8, 2009 - }, - axisFormat: defaulttime, - monthNames: monthNames, - monthNamesShort: monthNamesShort, - dayNames: dayNames, - dayNamesShort: dayNamesShort, - allDayText: allDayText, - viewDisplay: function(view) { - $('#datecontrol_date').val($('

    ').html(view.title).text()); - if (view.name != defaultView) { - $.post(OC.filePath('calendar', 'ajax', 'changeview.php'), {v:view.name}); - defaultView = view.name; - } - Calendar.UI.setViewActive(view.name); - if (view.name == 'agendaWeek') { - $('#calendar_holder').fullCalendar('option', 'aspectRatio', 0.1); - } - else { - $('#calendar_holder').fullCalendar('option', 'aspectRatio', 1.35); - } - }, - columnFormat: { - week: 'ddd d. MMM' - }, - selectable: true, - selectHelper: true, - select: Calendar.UI.newEvent, - eventClick: Calendar.UI.editEvent, - eventDrop: Calendar.UI.moveEvent, - eventResize: Calendar.UI.resizeEvent, - eventRender: function(event, element) { - element.find('.fc-event-title').html(element.find('.fc-event-title').text()); - element.tipsy({ - className: 'tipsy-event', - opacity: 0.9, - gravity:$.fn.tipsy.autoBounds(150, 's'), - fade:true, - delayIn: 400, - html:true, - title:function() { - return Calendar.UI.getEventPopupText(event); - } - }); - }, - loading: Calendar.UI.loading, - eventSources: eventSources - }); - $('#datecontrol_date').datepicker({ - changeMonth: true, - changeYear: true, - showButtonPanel: true, - beforeShow: function(input, inst) { - var calendar_holder = $('#calendar_holder'); - var date = calendar_holder.fullCalendar('getDate'); - inst.input.datepicker('setDate', date); - inst.input.val(calendar_holder.fullCalendar('getView').title); - return inst; - }, - onSelect: function(value, inst) { - var date = inst.input.datepicker('getDate'); - $('#calendar_holder').fullCalendar('gotoDate', date); - } - }); - fillWindow($('#content')); - OCCategories.changed = Calendar.UI.categoriesChanged; - OCCategories.app = 'calendar'; - $('#oneweekview_radio').click(function(){ - $('#calendar_holder').fullCalendar('changeView', 'agendaWeek'); - }); - $('#onemonthview_radio').click(function(){ - $('#calendar_holder').fullCalendar('changeView', 'month'); - }); - $('#listview_radio').click(function(){ - $('#calendar_holder').fullCalendar('changeView', 'list'); - }); - $('#today_input').click(function(){ - $('#calendar_holder').fullCalendar('today'); - }); - $('#datecontrol_left').click(function(){ - $('#calendar_holder').fullCalendar('prev'); - }); - $('#datecontrol_right').click(function(){ - $('#calendar_holder').fullCalendar('next'); - }); - Calendar.UI.Share.init(); - Calendar.UI.Drop.init(); -}); diff --git a/apps/calendar/js/geo.js b/apps/calendar/js/geo.js deleted file mode 100644 index 99290d940e..0000000000 --- a/apps/calendar/js/geo.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2011 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -if (navigator.geolocation) { - navigator.geolocation.getCurrentPosition(function(position) { - $.post(OC.filePath('calendar', 'ajax/settings', 'guesstimezone.php'), {lat: position.coords.latitude, lng: position.coords.longitude}, - function(data){ - if (data.status == 'success' && typeof(data.message) != 'undefined'){ - $('#notification').html(data.message); - $('#notification').slideDown(); - window.setTimeout(function(){$('#notification').slideUp();}, 5000); - }else{ - console.log('Can\'t set new timezone.'); - } - }); - }); -} \ No newline at end of file diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js deleted file mode 100644 index b28d19ab00..0000000000 --- a/apps/calendar/js/loader.js +++ /dev/null @@ -1,179 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -Calendar_Import={ - Store:{ - file: '', - path: '', - id: 0, - method: '', - calname: '', - calcolor: '', - progresskey: '', - percentage: 0 - }, - Dialog:{ - open: function(filename){ - OC.addStyle('calendar', 'import'); - Calendar_Import.Store.file = filename; - Calendar_Import.Store.path = $('#dir').val(); - $('body').append('

    '); - $('#calendar_import').load(OC.filePath('calendar', 'ajax/import', 'dialog.php'), {filename:Calendar_Import.Store.file, path:Calendar_Import.Store.path},function(){ - Calendar_Import.Dialog.init(); - }); - }, - close: function(){ - Calendar_Import.reset(); - $(this).dialog('destroy').remove(); - $('#calendar_import_dialog').remove(); - }, - init: function(){ - //init dialog - $('#calendar_import_dialog').dialog({ - width : 500, - resizable: false, - close : function() { - Calendar_Import.Dialog.close(); - } - }); - //init buttons - $('#calendar_import_done').click(function(){ - Calendar_Import.Dialog.close(); - }); - $('#calendar_import_submit').click(function(){ - Calendar_Import.Core.process(); - }); - $('#calendar_import_mergewarning').click(function(){ - $('#calendar_import_newcalendar').attr('value', $('#calendar_import_availablename').val()); - Calendar_Import.Dialog.mergewarning($('#calendar_import_newcalendar').val()); - }); - $('#calendar_import_calendar').change(function(){ - if($('#calendar_import_calendar option:selected').val() == 'newcal'){ - $('#calendar_import_newcalform').slideDown('slow'); - Calendar_Import.Dialog.mergewarning($('#calendar_import_newcalendar').val()); - }else{ - $('#calendar_import_newcalform').slideUp('slow'); - $('#calendar_import_mergewarning').slideUp('slow'); - } - }); - $('#calendar_import_newcalendar').keyup(function(){ - Calendar_Import.Dialog.mergewarning($.trim($('#calendar_import_newcalendar').val())); - }); - $('#calendar_import_newcalendar_color').miniColors({ - letterCase: 'uppercase' - }); - $('.calendar-colorpicker-color').click(function(){ - var str = $(this).attr('rel'); - str = str.substr(1); - $('#calendar_import_newcalendar_color').attr('value', str); - $(".color-picker").miniColors('value', '#' + str); - }); - //init progressbar - $('#calendar_import_progressbar').progressbar({value: Calendar_Import.Store.percentage}); - Calendar_Import.Store.progresskey = $('#calendar_import_progresskey').val(); - }, - mergewarning: function(newcalname){ - $.post(OC.filePath('calendar', 'ajax/import', 'calendarcheck.php'), {calname: newcalname}, function(data){ - if(data.message == 'exists'){ - $('#calendar_import_mergewarning').slideDown('slow'); - }else{ - $('#calendar_import_mergewarning').slideUp('slow'); - } - }); - }, - update: function(){ - if(Calendar_Import.Store.percentage == 100){ - return false; - } - $.post(OC.filePath('calendar', 'ajax/import', 'import.php'), {progresskey: Calendar_Import.Store.progresskey, getprogress: true}, function(data){ - if(data.status == 'success'){ - if(data.percent == null){ - return false; - } - Calendar_Import.Store.percentage = parseInt(data.percent); - $('#calendar_import_progressbar').progressbar('option', 'value', parseInt(data.percent)); - if(data.percent < 100 ){ - window.setTimeout('Calendar_Import.Dialog.update()', 250); - }else{ - $('#calendar_import_done').css('display', 'block'); - } - }else{ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - $('#calendar_import_progressbar > div').css('background-color', '#FF2626'); - $('#calendar_import_status').html(data.message); - } - }); - return 0; - }, - warning: function(selector){ - $(selector).addClass('calendar_import_warning'); - $(selector).focus(function(){ - $(selector).removeClass('calendar_import_warning'); - }); - } - }, - Core:{ - process: function(){ - var validation = Calendar_Import.Core.prepare(); - if(validation){ - $('#calendar_import_form').css('display', 'none'); - $('#calendar_import_process').css('display', 'block'); - $('#calendar_import_newcalendar').attr('readonly', 'readonly'); - $('#calendar_import_calendar').attr('disabled', 'disabled'); - Calendar_Import.Core.send(); - window.setTimeout('Calendar_Import.Dialog.update()', 250); - } - }, - send: function(){ - $.post(OC.filePath('calendar', 'ajax/import', 'import.php'), - {progresskey: Calendar_Import.Store.progresskey, method: String (Calendar_Import.Store.method), calname: String (Calendar_Import.Store.calname), path: String (Calendar_Import.Store.path), file: String (Calendar_Import.Store.file), id: String (Calendar_Import.Store.id), calcolor: String (Calendar_Import.Store.calcolor)}, function(data){ - if(data.status == 'success'){ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - Calendar_Import.Store.percentage = 100; - $('#calendar_import_done').css('display', 'block'); - $('#calendar_import_status').html(data.message); - }else{ - $('#calendar_import_progressbar').progressbar('option', 'value', 100); - $('#calendar_import_progressbar > div').css('background-color', '#FF2626'); - $('#calendar_import_status').html(data.message); - } - }); - }, - prepare: function(){ - Calendar_Import.Store.id = $('#calendar_import_calendar option:selected').val(); - if($('#calendar_import_calendar option:selected').val() == 'newcal'){ - Calendar_Import.Store.method = 'new'; - Calendar_Import.Store.calname = $.trim($('#calendar_import_newcalendar').val()); - if(Calendar_Import.Store.calname == ''){ - Calendar_Import.Dialog.warning('#calendar_import_newcalendar'); - return false; - } - Calendar_Import.Store.calcolor = $.trim($('#calendar_import_newcalendar_color').val()); - if(Calendar_Import.Store.calcolor == ''){ - Calendar_Import.Store.calcolor = $('.calendar-colorpicker-color:first').attr('rel'); - } - }else{ - Calendar_Import.Store.method = 'old'; - } - return true; - } - }, - reset: function(){ - Calendar_Import.Store.file = ''; - Calendar_Import.Store.path = ''; - Calendar_Import.Store.id = 0; - Calendar_Import.Store.method = ''; - Calendar_Import.Store.calname = ''; - Calendar_Import.Store.progresskey = ''; - Calendar_Import.Store.percentage = 0; - } -} -$(document).ready(function(){ - if(typeof FileActions !== 'undefined'){ - FileActions.register('text/calendar','importCalendar', '', Calendar_Import.Dialog.open); - FileActions.setDefault('text/calendar','importCalendar'); - }; -}); diff --git a/apps/calendar/js/settings.js b/apps/calendar/js/settings.js deleted file mode 100644 index 60741f2b6f..0000000000 --- a/apps/calendar/js/settings.js +++ /dev/null @@ -1,69 +0,0 @@ -$(document).ready(function(){ - $('#timezone').change( function(){ - OC.msg.startSaving('#calendar .msg') - // Serialize the data - var post = $( '#timezone' ).serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'settimezone.php'), post, function(data){ - //OC.msg.finishedSaving('#calendar .msg', data); - }); - return false; - }); - $('#timezone').chosen(); - $('#timeformat').change( function(){ - var data = $('#timeformat').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'settimeformat.php'), data, function(data){ - if(data == 'error'){ - console.log('saving timeformat failed'); - } - }); - }); - $('#firstday').change( function(){ - var data = $('#firstday').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'setfirstday.php'), data, function(data){ - if(data == 'error'){ - console.log('saving firstday failed'); - } - }); - }); - $('#timezonedetection').change( function(){ - var post = $('#timezonedetection').serialize(); - $.post( OC.filePath('calendar', 'ajax/settings', 'timezonedetection.php'), post, function(data){ - - }); - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'timeformat.php'), function(jsondata, status) { - $('#' + jsondata.timeformat).attr('selected',true); - $('#timeformat').chosen(); - $('#timeformat_chzn').css('width', '100px'); - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'gettimezonedetection.php'), function(jsondata, status){ - if(jsondata.detection == 'true'){ - $('#timezonedetection').attr('checked', 'checked'); - } - }); - $.getJSON(OC.filePath('calendar', 'ajax/settings', 'getfirstday.php'), function(jsondata, status) { - $('#' + jsondata.firstday).attr('selected',true); - $('#firstday').chosen(); - $('#firstday_chzn').css('width', '100px'); - }); - $('#cleancalendarcache').click(function(){ - $.getJSON(OC.filePath('calendar', 'ajax/cache', 'rescan.php'), function(){ - calendarcachecheck(); - }); - }); - calendarcachecheck(); -}); -function calendarcachecheck(){ - $.getJSON(OC.filePath('calendar', 'ajax/cache', 'status.php'), function(jsondata, status) { - $('#cleancalendarcache').attr('title', jsondata.l10n.text); - if(jsondata.status == 'success'){ - $('#cleancalendarcache').css('background', '#F8F8F8'); - $('#cleancalendarcache').css('color', '#333'); - $('#cleancalendarcache').css('text-shadow', '#fff 0 1px 0'); - }else{ - $('#cleancalendarcache').css('background', '#DC143C'); - $('#cleancalendarcache').css('color', '#FFFFFF'); - $('#cleancalendarcache').css('text-shadow', '0px 0px 0px #fff, 0px 0px #fff'); - } - }); -} \ No newline at end of file diff --git a/apps/calendar/l10n/ar.php b/apps/calendar/l10n/ar.php deleted file mode 100644 index 679f110285..0000000000 --- a/apps/calendar/l10n/ar.php +++ /dev/null @@ -1,135 +0,0 @@ - "جدول زمني خاطئ", -"New Timezone:" => "التوقيت الجديد", -"Timezone changed" => "تم تغيير المنطقة الزمنية", -"Invalid request" => "طلب غير مفهوم", -"Calendar" => "الجدول الزمني", -"Birthday" => "عيد ميلاد", -"Business" => "عمل", -"Call" => "إتصال", -"Clients" => "الزبائن", -"Deliverer" => "المرسل", -"Holidays" => "عطلة", -"Ideas" => "أفكار", -"Journey" => "رحلة", -"Jubilee" => "يوبيل", -"Meeting" => "إجتماع", -"Other" => "شيء آخر", -"Personal" => "شخصي", -"Projects" => "مشاريع", -"Questions" => "اسئلة", -"Work" => "العمل", -"Does not repeat" => "لا يعاد", -"Daily" => "يومي", -"Weekly" => "أسبوعي", -"Every Weekday" => "كل نهاية الأسبوع", -"Bi-Weekly" => "كل اسبوعين", -"Monthly" => "شهري", -"Yearly" => "سنوي", -"never" => "بتاتا", -"by occurrences" => "حسب تسلسل الحدوث", -"by date" => "حسب التاريخ", -"by monthday" => "حسب يوم الشهر", -"by weekday" => "حسب يوم الاسبوع", -"Monday" => "الأثنين", -"Tuesday" => "الثلاثاء", -"Wednesday" => "الاربعاء", -"Thursday" => "الخميس", -"Friday" => "الجمعه", -"Saturday" => "السبت", -"Sunday" => "الاحد", -"events week of month" => "الاحداث باسبوع الشهر", -"first" => "أول", -"second" => "ثاني", -"third" => "ثالث", -"fourth" => "رابع", -"fifth" => "خامس", -"last" => "أخير", -"January" => "كانون الثاني", -"February" => "شباط", -"March" => "آذار", -"April" => "نيسان", -"May" => "أيار", -"June" => "حزيران", -"July" => "تموز", -"August" => "آب", -"September" => "أيلول", -"October" => "تشرين الاول", -"November" => "تشرين الثاني", -"December" => "كانون الاول", -"by events date" => "حسب تاريخ الحدث", -"by yearday(s)" => "حسب يوم السنه", -"by weeknumber(s)" => "حسب رقم الاسبوع", -"by day and month" => "حسب اليوم و الشهر", -"Date" => "تاريخ", -"Cal." => "تقويم", -"All day" => "كل النهار", -"New Calendar" => "جدول زمني جديد", -"Missing fields" => "خانات خالية من المعلومات", -"Title" => "عنوان", -"From Date" => "من تاريخ", -"From Time" => "إلى تاريخ", -"To Date" => "إلى يوم", -"To Time" => "إلى وقت", -"The event ends before it starts" => "هذا الحدث ينتهي قبل أن يبدأ", -"There was a database fail" => "خطأ في قاعدة البيانات", -"Week" => "إسبوع", -"Month" => "شهر", -"List" => "قائمة", -"Today" => "اليوم", -"Calendars" => "الجداول الزمنية", -"There was a fail, while parsing the file." => "لم يتم قراءة الملف بنجاح.", -"Choose active calendars" => "إختر الجدول الزمني الرئيسي", -"CalDav Link" => "وصلة CalDav", -"Download" => "تحميل", -"Edit" => "تعديل", -"Delete" => "حذف", -"New calendar" => "جدول زمني جديد", -"Edit calendar" => "عادل الجدول الزمني", -"Displayname" => "الاسم المرئي", -"Active" => "حالي", -"Calendar color" => "لون الجدول الزمني", -"Save" => "إحفظ", -"Submit" => "أرسل", -"Cancel" => "إلغاء", -"Edit an event" => "عادل حدث", -"Export" => "تصدير المعلومات", -"Title of the Event" => "عنوان الحدث", -"Category" => "فئة", -"All Day Event" => "حدث في يوم كامل", -"From" => "من", -"To" => "إلى", -"Advanced options" => "خيارات متقدمة", -"Location" => "مكان", -"Location of the Event" => "مكان الحدث", -"Description" => "مواصفات", -"Description of the Event" => "وصف الحدث", -"Repeat" => "إعادة", -"Advanced" => "تعديلات متقدمه", -"Select weekdays" => "اختر ايام الاسبوع", -"Select days" => "اختر الايام", -"and the events day of year." => "و التواريخ حسب يوم السنه.", -"and the events day of month." => "و الاحداث حسب يوم الشهر.", -"Select months" => "اختر الاشهر", -"Select weeks" => "اختر الاسابيع", -"and the events week of year." => "و الاحداث حسب اسبوع السنه", -"Interval" => "المده الفاصله", -"End" => "نهايه", -"occurrences" => "الاحداث", -"Import a calendar file" => "أدخل ملف التقويم", -"Please choose the calendar" => "الرجاء إختر الجدول الزمني", -"create a new calendar" => "انشاء جدول زمني جديد", -"Name of new calendar" => "أسم الجدول الزمني الجديد", -"Import" => "إدخال", -"Importing calendar" => "يتم ادخال الجدول الزمني", -"Calendar imported successfully" => "تم ادخال الجدول الزمني بنجاح", -"Close Dialog" => "أغلق الحوار", -"Create a new event" => "إضافة حدث جديد", -"Select category" => "اختر الفئة", -"Timezone" => "المنطقة الزمنية", -"Check always for changes of the timezone" => "راقب دائما تغير التقويم الزمني", -"Timeformat" => "شكل الوقت", -"24h" => "24 ساعة", -"12h" => "12 ساعة", -"Calendar CalDAV syncing address:" => "عنوان لتحديث ال CalDAV الجدول الزمني" -); diff --git a/apps/calendar/l10n/bg_BG.php b/apps/calendar/l10n/bg_BG.php deleted file mode 100644 index e4f73d24a9..0000000000 --- a/apps/calendar/l10n/bg_BG.php +++ /dev/null @@ -1,40 +0,0 @@ - "Часовата зона е сменена", -"Invalid request" => "Невалидна заявка", -"Calendar" => "Календар", -"Does not repeat" => "Не се повтаря", -"Daily" => "Дневно", -"Weekly" => "Седмично", -"Every Weekday" => "Всеки делничен ден", -"Bi-Weekly" => "Двуседмично", -"Monthly" => "Месечно", -"Yearly" => "Годишно", -"All day" => "Всички дни", -"Title" => "Заглавие", -"Week" => "Седмица", -"Month" => "Месец", -"Today" => "Днес", -"Calendars" => "Календари", -"There was a fail, while parsing the file." => "Възникна проблем с разлистването на файла.", -"Choose active calendars" => "Изберете активен календар", -"Download" => "Изтегляне", -"Edit" => "Промяна", -"Edit calendar" => "Промени календар", -"Displayname" => "Екранно име", -"Active" => "Активен", -"Calendar color" => "Цвят на календара", -"Submit" => "Продължи", -"Edit an event" => "Промяна на събитие", -"Title of the Event" => "Наименование", -"Category" => "Категория", -"All Day Event" => "Целодневно събитие", -"From" => "От", -"To" => "До", -"Location" => "Локация", -"Location of the Event" => "Локация", -"Description" => "Описание", -"Description of the Event" => "Описание", -"Repeat" => "Повтори", -"Create a new event" => "Ново събитие", -"Timezone" => "Часова зона" -); diff --git a/apps/calendar/l10n/ca.php b/apps/calendar/l10n/ca.php deleted file mode 100644 index afb1c799d9..0000000000 --- a/apps/calendar/l10n/ca.php +++ /dev/null @@ -1,162 +0,0 @@ - "No s'han trobat calendaris.", -"No events found." => "No s'han trobat events.", -"Wrong calendar" => "Calendari erroni", -"New Timezone:" => "Nova zona horària:", -"Timezone changed" => "La zona horària ha canviat", -"Invalid request" => "Sol.licitud no vàlida", -"Calendar" => "Calendari", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Aniversari", -"Business" => "Feina", -"Call" => "Trucada", -"Clients" => "Clients", -"Deliverer" => "Remitent", -"Holidays" => "Vacances", -"Ideas" => "Idees", -"Journey" => "Viatge", -"Jubilee" => "Sant", -"Meeting" => "Reunió", -"Other" => "Altres", -"Personal" => "Personal", -"Projects" => "Projectes", -"Questions" => "Preguntes", -"Work" => "Feina", -"unnamed" => "sense nom", -"Does not repeat" => "No es repeteix", -"Daily" => "Diari", -"Weekly" => "Mensual", -"Every Weekday" => "Cada setmana", -"Bi-Weekly" => "Bisetmanalment", -"Monthly" => "Mensualment", -"Yearly" => "Cada any", -"never" => "mai", -"by occurrences" => "per aparicions", -"by date" => "per data", -"by monthday" => "per dia del mes", -"by weekday" => "per dia de la setmana", -"Monday" => "Dilluns", -"Tuesday" => "Dimarts", -"Wednesday" => "Dimecres", -"Thursday" => "Dijous", -"Friday" => "Divendres", -"Saturday" => "Dissabte", -"Sunday" => "Diumenge", -"events week of month" => "esdeveniments la setmana del mes", -"first" => "primer", -"second" => "segon", -"third" => "tercer", -"fourth" => "quart", -"fifth" => "cinquè", -"last" => "últim", -"January" => "Gener", -"February" => "Febrer", -"March" => "Març", -"April" => "Abril", -"May" => "Maig", -"June" => "Juny", -"July" => "Juliol", -"August" => "Agost", -"September" => "Setembre", -"October" => "Octubre", -"November" => "Novembre", -"December" => "Desembre", -"by events date" => "per data d'esdeveniments", -"by yearday(s)" => "per ahir(s)", -"by weeknumber(s)" => "per número(s) de la setmana", -"by day and month" => "per dia del mes", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Tot el dia", -"New Calendar" => "Calendari nou", -"Missing fields" => "Els camps que falten", -"Title" => "Títol", -"From Date" => "Des de la data", -"From Time" => "Des de l'hora", -"To Date" => "Fins a la data", -"To Time" => "Fins a l'hora", -"The event ends before it starts" => "L'esdeveniment acaba abans que comenci", -"There was a database fail" => "Hi ha un error de base de dades", -"Week" => "Setmana", -"Month" => "Mes", -"List" => "Llista", -"Today" => "Avui", -"Calendars" => "Calendaris", -"There was a fail, while parsing the file." => "S'ha produït un error en analitzar el fitxer.", -"Choose active calendars" => "Seleccioneu calendaris actius", -"Your calendars" => "Els vostres calendaris", -"CalDav Link" => "Enllaç CalDav", -"Shared calendars" => "Calendaris compartits", -"No shared calendars" => "No hi ha calendaris compartits", -"Share Calendar" => "Comparteix el calendari", -"Download" => "Baixa", -"Edit" => "Edita", -"Delete" => "Suprimeix", -"shared with you by" => "compartit amb vós", -"New calendar" => "Calendari nou", -"Edit calendar" => "Edita el calendari", -"Displayname" => "Mostra el nom", -"Active" => "Actiu", -"Calendar color" => "Color del calendari", -"Save" => "Desa", -"Submit" => "Envia", -"Cancel" => "Cancel·la", -"Edit an event" => "Edició d'un esdeveniment", -"Export" => "Exporta", -"Eventinfo" => "Eventinfo", -"Repeating" => "Repetició", -"Alarm" => "Alarma", -"Attendees" => "Assistents", -"Share" => "Comparteix", -"Title of the Event" => "Títol de l'esdeveniment", -"Category" => "Categoria", -"Separate categories with commas" => "Separeu les categories amb comes", -"Edit categories" => "Edita categories", -"All Day Event" => "Esdeveniment de tot el dia", -"From" => "Des de", -"To" => "Fins a", -"Advanced options" => "Opcions avançades", -"Location" => "Ubicació", -"Location of the Event" => "Ubicació de l'esdeveniment", -"Description" => "Descripció", -"Description of the Event" => "Descripció de l'esdeveniment", -"Repeat" => "Repetició", -"Advanced" => "Avançat", -"Select weekdays" => "Dies de la setmana seleccionats", -"Select days" => "Seleccionar dies", -"and the events day of year." => "i dies d'esdeveniment de l'any.", -"and the events day of month." => "i dies d'esdeveniment del mes.", -"Select months" => "Seleccionar mesos", -"Select weeks" => "Seleccionar setmanes", -"and the events week of year." => "i setmanes d'esdeveniment de l'any.", -"Interval" => "Interval", -"End" => "Final", -"occurrences" => "aparicions", -"Import a calendar file" => "Importa un fitxer de calendari", -"Please choose the calendar" => "Escolliu el calendari", -"create a new calendar" => "crea un nou calendari", -"Name of new calendar" => "Nom del nou calendari", -"Import" => "Importa", -"Importing calendar" => "S'està important el calendari", -"Calendar imported successfully" => "El calendari s'ha importat amb èxit", -"Close Dialog" => "Tanca el diàleg", -"Create a new event" => "Crea un nou esdeveniment", -"View an event" => "Mostra un event", -"No categories selected" => "No hi ha categories seleccionades", -"Select category" => "Seleccioneu categoria", -"of" => "de", -"at" => "a", -"Timezone" => "Zona horària", -"Check always for changes of the timezone" => "Comprova sempre en els canvis de zona horària", -"Timeformat" => "Format de temps", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primer dia de la setmana", -"Calendar CalDAV syncing address:" => "Adreça de sincronització del calendari CalDAV:", -"Users" => "Usuaris", -"select users" => "seleccioneu usuaris", -"Editable" => "Editable", -"Groups" => "Grups", -"select groups" => "seleccioneu grups", -"make public" => "fes-ho public" -); diff --git a/apps/calendar/l10n/cs_CZ.php b/apps/calendar/l10n/cs_CZ.php deleted file mode 100644 index 05d286d82c..0000000000 --- a/apps/calendar/l10n/cs_CZ.php +++ /dev/null @@ -1,162 +0,0 @@ - "Žádné kalendáře nenalezeny.", -"No events found." => "Žádné události nenalezeny.", -"Wrong calendar" => "Nesprávný kalendář", -"New Timezone:" => "Nová časová zóna:", -"Timezone changed" => "Časová zóna byla změněna", -"Invalid request" => "Chybný požadavek", -"Calendar" => "Kalendář", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '—' d.[ MMM] yyyy}", -"Birthday" => "Narozeniny", -"Business" => "Obchodní", -"Call" => "Hovor", -"Clients" => "Klienti", -"Deliverer" => "Doručovatel", -"Holidays" => "Prázdniny", -"Ideas" => "Nápady", -"Journey" => "Cesta", -"Jubilee" => "Výročí", -"Meeting" => "Schůzka", -"Other" => "Další", -"Personal" => "Osobní", -"Projects" => "Projekty", -"Questions" => "Dotazy", -"Work" => "Pracovní", -"unnamed" => "nepojmenováno", -"Does not repeat" => "Neopakuje se", -"Daily" => "Denně", -"Weekly" => "Týdně", -"Every Weekday" => "Každý všední den", -"Bi-Weekly" => "Jednou za dva týdny", -"Monthly" => "Měsíčně", -"Yearly" => "Ročně", -"never" => "nikdy", -"by occurrences" => "podle výskytu", -"by date" => "podle data", -"by monthday" => "podle dne v měsíci", -"by weekday" => "podle dne v týdnu", -"Monday" => "Pondělí", -"Tuesday" => "Úterý", -"Wednesday" => "Středa", -"Thursday" => "Čtvrtek", -"Friday" => "Pátek", -"Saturday" => "Sobota", -"Sunday" => "Neděle", -"events week of month" => "týdenní události v měsíci", -"first" => "první", -"second" => "druhý", -"third" => "třetí", -"fourth" => "čtvrtý", -"fifth" => "pátý", -"last" => "poslední", -"January" => "Leden", -"February" => "Únor", -"March" => "Březen", -"April" => "Duben", -"May" => "Květen", -"June" => "Červen", -"July" => "Červenec", -"August" => "Srpen", -"September" => "Září", -"October" => "Říjen", -"November" => "Listopad", -"December" => "Prosinec", -"by events date" => "podle data události", -"by yearday(s)" => "po dni (dnech)", -"by weeknumber(s)" => "podle čísel týdnů", -"by day and month" => "podle dne a měsíce", -"Date" => "Datum", -"Cal." => "Kal.", -"All day" => "Celý den", -"New Calendar" => "Nový kalendář", -"Missing fields" => "Chybějící pole", -"Title" => "Název", -"From Date" => "Od data", -"From Time" => "Od", -"To Date" => "Do data", -"To Time" => "Do", -"The event ends before it starts" => "Akce končí před zahájením", -"There was a database fail" => "Chyba v databázi", -"Week" => "týden", -"Month" => "měsíc", -"List" => "Seznam", -"Today" => "dnes", -"Calendars" => "Kalendáře", -"There was a fail, while parsing the file." => "Chyba při převodu souboru", -"Choose active calendars" => "Vybrat aktivní kalendář", -"Your calendars" => "Vaše kalendáře", -"CalDav Link" => "CalDav odkaz", -"Shared calendars" => "Sdílené kalendáře", -"No shared calendars" => "Žádné sdílené kalendáře", -"Share Calendar" => "Sdílet kalendář", -"Download" => "Stáhnout", -"Edit" => "Editovat", -"Delete" => "Odstranit", -"shared with you by" => "sdíleno s vámi uživatelem", -"New calendar" => "Nový kalendář", -"Edit calendar" => "Editovat kalendář", -"Displayname" => "Zobrazované jméno", -"Active" => "Aktivní", -"Calendar color" => "Barva kalendáře", -"Save" => "Uložit", -"Submit" => "Potvrdit", -"Cancel" => "Storno", -"Edit an event" => "Editovat událost", -"Export" => "Export", -"Eventinfo" => "Informace o události", -"Repeating" => "Opakující se", -"Alarm" => "Alarm", -"Attendees" => "Účastníci", -"Share" => "Sdílet", -"Title of the Event" => "Název události", -"Category" => "Kategorie", -"Separate categories with commas" => "Kategorie oddělené čárkami", -"Edit categories" => "Upravit kategorie", -"All Day Event" => "Celodenní událost", -"From" => "od", -"To" => "do", -"Advanced options" => "Pokročilé volby", -"Location" => "Umístění", -"Location of the Event" => "Místo konání události", -"Description" => "Popis", -"Description of the Event" => "Popis události", -"Repeat" => "Opakování", -"Advanced" => "Pokročilé", -"Select weekdays" => "Vybrat dny v týdnu", -"Select days" => "Vybrat dny", -"and the events day of year." => "a denní události v roce", -"and the events day of month." => "a denní události v měsíci", -"Select months" => "Vybrat měsíce", -"Select weeks" => "Vybrat týdny", -"and the events week of year." => "a týden s událostmi v roce", -"Interval" => "Interval", -"End" => "Konec", -"occurrences" => "výskyty", -"Import a calendar file" => "Importovat soubor kalendáře", -"Please choose the calendar" => "Zvolte prosím kalendář", -"create a new calendar" => "vytvořit nový kalendář", -"Name of new calendar" => "Název nového kalendáře", -"Import" => "Import", -"Importing calendar" => "Kalendář se importuje", -"Calendar imported successfully" => "Kalendář byl úspěšně importován", -"Close Dialog" => "Zavřít dialog", -"Create a new event" => "Vytvořit novou událost", -"View an event" => "Zobrazit událost", -"No categories selected" => "Žádné kategorie nevybrány", -"Select category" => "Vyberte kategorii", -"of" => "z", -"at" => "v", -"Timezone" => "Časové pásmo", -"Check always for changes of the timezone" => "Vždy kontrolavat, zda nedošlo ke změně časového pásma", -"Timeformat" => "Formát času", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Týden začína v", -"Calendar CalDAV syncing address:" => "Adresa pro synchronizaci kalendáře pomocí CalDAV:", -"Users" => "Uživatelé", -"select users" => "vybrat uživatele", -"Editable" => "Upravovatelné", -"Groups" => "Skupiny", -"select groups" => "vybrat skupiny", -"make public" => "zveřejnit" -); diff --git a/apps/calendar/l10n/da.php b/apps/calendar/l10n/da.php deleted file mode 100644 index 36551a2a93..0000000000 --- a/apps/calendar/l10n/da.php +++ /dev/null @@ -1,162 +0,0 @@ - "Der blev ikke fundet nogen kalendere.", -"No events found." => "Der blev ikke fundet nogen begivenheder.", -"Wrong calendar" => "Forkert kalender", -"New Timezone:" => "Ny tidszone:", -"Timezone changed" => "Tidszone ændret", -"Invalid request" => "Ugyldig forespørgsel", -"Calendar" => "Kalender", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ åååå]{ '—'[ MMM] d åååå}", -"Birthday" => "Fødselsdag", -"Business" => "Forretning", -"Call" => "Ring", -"Clients" => "Kunder", -"Deliverer" => "Leverance", -"Holidays" => "Helligdage", -"Ideas" => "Ideér", -"Journey" => "Rejse", -"Jubilee" => "Jubilæum", -"Meeting" => "Møde", -"Other" => "Andet", -"Personal" => "Privat", -"Projects" => "Projekter", -"Questions" => "Spørgsmål", -"Work" => "Arbejde", -"unnamed" => "unavngivet", -"Does not repeat" => "Gentages ikke", -"Daily" => "Daglig", -"Weekly" => "Ugentlig", -"Every Weekday" => "Alle hverdage", -"Bi-Weekly" => "Hver anden uge", -"Monthly" => "Månedlig", -"Yearly" => "Årlig", -"never" => "aldrig", -"by occurrences" => "efter forekomster", -"by date" => "efter dato", -"by monthday" => "efter dag i måneden", -"by weekday" => "efter ugedag", -"Monday" => "Mandag", -"Tuesday" => "Tirsdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lørdag", -"Sunday" => "øndag", -"events week of month" => "begivenhedens uge i måneden", -"first" => "første", -"second" => "anden", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "sidste", -"January" => "Januar", -"February" => "Februar", -"March" => "Marts", -"April" => "April", -"May" => "Maj", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "efter begivenheders dato", -"by yearday(s)" => "efter dag(e) i året", -"by weeknumber(s)" => "efter ugenummer/-numre", -"by day and month" => "efter dag og måned", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "Hele dagen", -"New Calendar" => "Ny Kalender", -"Missing fields" => "Manglende felter", -"Title" => "Titel", -"From Date" => "Fra dato", -"From Time" => "Fra tidspunkt", -"To Date" => "Til dato", -"To Time" => "Til tidspunkt", -"The event ends before it starts" => "Begivenheden slutter, inden den begynder", -"There was a database fail" => "Der var en fejl i databasen", -"Week" => "Uge", -"Month" => "Måned", -"List" => "Liste", -"Today" => "I dag", -"Calendars" => "Kalendere", -"There was a fail, while parsing the file." => "Der opstod en fejl under gennemlæsning af filen.", -"Choose active calendars" => "Vælg aktive kalendere", -"Your calendars" => "Dine kalendere", -"CalDav Link" => "CalDav-link", -"Shared calendars" => "Delte kalendere", -"No shared calendars" => "Ingen delte kalendere", -"Share Calendar" => "Del kalender", -"Download" => "Hent", -"Edit" => "Rediger", -"Delete" => "Slet", -"shared with you by" => "delt af dig", -"New calendar" => "Ny kalender", -"Edit calendar" => "Rediger kalender", -"Displayname" => "Vist navn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarve", -"Save" => "Gem", -"Submit" => "Send", -"Cancel" => "Annuller", -"Edit an event" => "Redigér en begivenhed", -"Export" => "Eksporter", -"Eventinfo" => "Begivenhedsinfo", -"Repeating" => "Gentagende", -"Alarm" => "Alarm", -"Attendees" => "Deltagere", -"Share" => "Del", -"Title of the Event" => "Titel på begivenheden", -"Category" => "Kategori", -"Separate categories with commas" => "Opdel kategorier med kommaer", -"Edit categories" => "Rediger kategorier", -"All Day Event" => "Heldagsarrangement", -"From" => "Fra", -"To" => "Til", -"Advanced options" => "Avancerede indstillinger", -"Location" => "Sted", -"Location of the Event" => "Placering af begivenheden", -"Description" => "Beskrivelse", -"Description of the Event" => "Beskrivelse af begivenheden", -"Repeat" => "Gentag", -"Advanced" => "Avanceret", -"Select weekdays" => "Vælg ugedage", -"Select days" => "Vælg dage", -"and the events day of year." => "og begivenhedens dag i året.", -"and the events day of month." => "og begivenhedens sag på måneden", -"Select months" => "Vælg måneder", -"Select weeks" => "Vælg uger", -"and the events week of year." => "og begivenhedens uge i året.", -"Interval" => "Interval", -"End" => "Afslutning", -"occurrences" => "forekomster", -"Import a calendar file" => "Importer en kalenderfil", -"Please choose the calendar" => "Vælg venligst kalender", -"create a new calendar" => "opret en ny kalender", -"Name of new calendar" => "Navn på ny kalender", -"Import" => "Importer", -"Importing calendar" => "Importerer kalender", -"Calendar imported successfully" => "Kalender importeret korrekt", -"Close Dialog" => "Luk dialog", -"Create a new event" => "Opret en ny begivenhed", -"View an event" => "Vis en begivenhed", -"No categories selected" => "Ingen categorier valgt", -"Select category" => "Vælg kategori", -"of" => "fra", -"at" => "kl.", -"Timezone" => "Tidszone", -"Check always for changes of the timezone" => "Check altid efter ændringer i tidszone", -"Timeformat" => "Tidsformat", -"24h" => "24T", -"12h" => "12T", -"First day of the week" => "Ugens første dag", -"Calendar CalDAV syncing address:" => "Synkroniseringsadresse til CalDAV:", -"Users" => "Brugere", -"select users" => "Vælg brugere", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "Vælg grupper", -"make public" => "Offentliggør" -); diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php deleted file mode 100644 index f12a18baad..0000000000 --- a/apps/calendar/l10n/de.php +++ /dev/null @@ -1,162 +0,0 @@ - "Keine Kalender gefunden", -"No events found." => "Keine Termine gefunden", -"Wrong calendar" => "Falscher Kalender", -"New Timezone:" => "Neue Zeitzone:", -"Timezone changed" => "Zeitzone geändert", -"Invalid request" => "Fehlerhafte Anfrage", -"Calendar" => "Kalender", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}", -"Birthday" => "Geburtstag", -"Business" => "Geschäftlich", -"Call" => "Anruf", -"Clients" => "Kunden", -"Deliverer" => "Lieferant", -"Holidays" => "Urlaub", -"Ideas" => "Ideen", -"Journey" => "Reise", -"Jubilee" => "Jubiläum", -"Meeting" => "Treffen", -"Other" => "Anderes", -"Personal" => "Persönlich", -"Projects" => "Projekte", -"Questions" => "Fragen", -"Work" => "Arbeit", -"unnamed" => "unbenannt", -"Does not repeat" => "einmalig", -"Daily" => "täglich", -"Weekly" => "wöchentlich", -"Every Weekday" => "jeden Wochentag", -"Bi-Weekly" => "jede zweite Woche", -"Monthly" => "monatlich", -"Yearly" => "jährlich", -"never" => "niemals", -"by occurrences" => "nach Terminen", -"by date" => "nach Datum", -"by monthday" => "an einem Monatstag", -"by weekday" => "an einem Wochentag", -"Monday" => "Montag", -"Tuesday" => "Dienstag", -"Wednesday" => "Mittwoch", -"Thursday" => "Donnerstag", -"Friday" => "Freitag", -"Saturday" => "Samstag", -"Sunday" => "Sonntag", -"events week of month" => "Woche des Monats vom Termin", -"first" => "erste", -"second" => "zweite", -"third" => "dritte", -"fourth" => "vierte", -"fifth" => "fünfte", -"last" => "letzte", -"January" => "Januar", -"February" => "Februar", -"March" => "März", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Dezember", -"by events date" => "nach Tag des Termins", -"by yearday(s)" => "nach Tag des Jahres", -"by weeknumber(s)" => "nach Wochennummer", -"by day and month" => "nach Tag und Monat", -"Date" => "Datum", -"Cal." => "Kal.", -"All day" => "Ganztags", -"New Calendar" => "Neuer Kalender", -"Missing fields" => "fehlende Felder", -"Title" => "Titel", -"From Date" => "Startdatum", -"From Time" => "Startzeit", -"To Date" => "Enddatum", -"To Time" => "Endzeit", -"The event ends before it starts" => "Der Termin hört auf, bevor er angefangen hat.", -"There was a database fail" => "Datenbankfehler", -"Week" => "Woche", -"Month" => "Monat", -"List" => "Liste", -"Today" => "Heute", -"Calendars" => "Kalender", -"There was a fail, while parsing the file." => "Fehler beim Einlesen der Datei.", -"Choose active calendars" => "Aktive Kalender wählen", -"Your calendars" => "Deine Kalender", -"CalDav Link" => "CalDAV-Link", -"Shared calendars" => "geteilte Kalender", -"No shared calendars" => "Keine geteilten Kalender", -"Share Calendar" => "Kalender teilen", -"Download" => "Herunterladen", -"Edit" => "Bearbeiten", -"Delete" => "Löschen", -"shared with you by" => "Geteilt mit dir von", -"New calendar" => "Neuer Kalender", -"Edit calendar" => "Kalender bearbeiten", -"Displayname" => "Anzeigename", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarbe", -"Save" => "Speichern", -"Submit" => "Bestätigen", -"Cancel" => "Abbrechen", -"Edit an event" => "Ereignis bearbeiten", -"Export" => "Exportieren", -"Eventinfo" => "Termininfo", -"Repeating" => "Wiederholen", -"Alarm" => "Alarm", -"Attendees" => "Teilnehmer", -"Share" => "Teilen", -"Title of the Event" => "Name", -"Category" => "Kategorie", -"Separate categories with commas" => "Kategorien mit Kommas trennen", -"Edit categories" => "Kategorien ändern", -"All Day Event" => "Ganztägiges Ereignis", -"From" => "von", -"To" => "bis", -"Advanced options" => "Erweiterte Optionen", -"Location" => "Ort", -"Location of the Event" => "Ort", -"Description" => "Beschreibung", -"Description of the Event" => "Beschreibung", -"Repeat" => "wiederholen", -"Advanced" => "Erweitert", -"Select weekdays" => "Wochentage auswählen", -"Select days" => "Tage auswählen", -"and the events day of year." => "und den Tag des Jahres vom Termin", -"and the events day of month." => "und den Tag des Monats vom Termin", -"Select months" => "Monate auswählen", -"Select weeks" => "Wochen auswählen", -"and the events week of year." => "und den Tag des Jahres vom Termin", -"Interval" => "Intervall", -"End" => "Ende", -"occurrences" => "Termine", -"Import a calendar file" => "Kalenderdatei Importieren", -"Please choose the calendar" => "Bitte wählen Sie den Kalender.", -"create a new calendar" => "Neuen Kalender anlegen", -"Name of new calendar" => "Kalendername", -"Import" => "Importieren", -"Importing calendar" => "Kalender wird importiert.", -"Calendar imported successfully" => "Kalender erfolgreich importiert", -"Close Dialog" => "Dialog schließen", -"Create a new event" => "Neues Ereignis", -"View an event" => "Termin öffnen", -"No categories selected" => "Keine Kategorie ausgewählt", -"Select category" => "Kategorie auswählen", -"of" => "von", -"at" => "um", -"Timezone" => "Zeitzone", -"Check always for changes of the timezone" => "immer die Zeitzone überprüfen", -"Timeformat" => "Zeitformat", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "erster Wochentag", -"Calendar CalDAV syncing address:" => "Kalender CalDAV Synchronisationsadresse:", -"Users" => "Nutzer", -"select users" => "Nutzer auswählen", -"Editable" => "editierbar", -"Groups" => "Gruppen", -"select groups" => "Gruppen auswählen", -"make public" => "Veröffentlichen" -); diff --git a/apps/calendar/l10n/el.php b/apps/calendar/l10n/el.php deleted file mode 100644 index 0b289fbcf6..0000000000 --- a/apps/calendar/l10n/el.php +++ /dev/null @@ -1,162 +0,0 @@ - "Δε βρέθηκαν ημερολόγια.", -"No events found." => "Δε βρέθηκαν γεγονότα.", -"Wrong calendar" => "Λάθος ημερολόγιο", -"New Timezone:" => "Νέα ζώνη ώρας:", -"Timezone changed" => "Η ζώνη ώρας άλλαξε", -"Invalid request" => "Μη έγκυρο αίτημα", -"Calendar" => "Ημερολόγιο", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Γενέθλια", -"Business" => "Επιχείρηση", -"Call" => "Κλήση", -"Clients" => "Πελάτες", -"Deliverer" => "Παραδώσας", -"Holidays" => "Διακοπές", -"Ideas" => "Ιδέες", -"Journey" => "Ταξίδι", -"Jubilee" => "Γιορτή", -"Meeting" => "Συνάντηση", -"Other" => "Άλλο", -"Personal" => "Προσωπικό", -"Projects" => "Έργα", -"Questions" => "Ερωτήσεις", -"Work" => "Εργασία", -"unnamed" => "ανώνυμο", -"Does not repeat" => "Μη επαναλαμβανόμενο", -"Daily" => "Καθημερινά", -"Weekly" => "Εβδομαδιαία", -"Every Weekday" => "Κάθε μέρα", -"Bi-Weekly" => "Δύο φορές την εβδομάδα", -"Monthly" => "Μηνιαία", -"Yearly" => "Ετήσια", -"never" => "ποτέ", -"by occurrences" => "κατά συχνότητα πρόσβασης", -"by date" => "κατά ημερομηνία", -"by monthday" => "κατά ημέρα", -"by weekday" => "κατά εβδομάδα", -"Monday" => "Δευτέρα", -"Tuesday" => "Τρίτη", -"Wednesday" => "Τετάρτη", -"Thursday" => "Πέμπτη", -"Friday" => "Παρασκευή", -"Saturday" => "Σάββατο", -"Sunday" => "Κυριακή", -"events week of month" => "συμβάντα της εβδομάδας του μήνα", -"first" => "πρώτο", -"second" => "δεύτερο", -"third" => "τρίτο", -"fourth" => "τέταρτο", -"fifth" => "πέμπτο", -"last" => "τελευταίο", -"January" => "Ιανουάριος", -"February" => "Φεβρουάριος", -"March" => "Μάρτιος", -"April" => "Απρίλιος", -"May" => "Μάϊος", -"June" => "Ιούνιος", -"July" => "Ιούλιος", -"August" => "Αύγουστος", -"September" => "Σεπτέμβριος", -"October" => "Οκτώβριος", -"November" => "Νοέμβριος", -"December" => "Δεκέμβριος", -"by events date" => "κατά ημερομηνία συμβάντων", -"by yearday(s)" => "κατά ημέρα(ες) του έτους", -"by weeknumber(s)" => "κατά εβδομάδα(ες)", -"by day and month" => "κατά ημέρα και μήνα", -"Date" => "Ημερομηνία", -"Cal." => "Ημερ.", -"All day" => "Ολοήμερο", -"New Calendar" => "Νέα Ημερολόγιο", -"Missing fields" => "Πεδία που λείπουν", -"Title" => "Τίτλος", -"From Date" => "Από Ημερομηνία", -"From Time" => "Από Ώρα", -"To Date" => "Έως Ημερομηνία", -"To Time" => "Έως Ώρα", -"The event ends before it starts" => "Το συμβάν ολοκληρώνεται πριν από την έναρξή του", -"There was a database fail" => "Υπήρξε σφάλμα στη βάση δεδομένων", -"Week" => "Εβδομάδα", -"Month" => "Μήνας", -"List" => "Λίστα", -"Today" => "Σήμερα", -"Calendars" => "Ημερολόγια", -"There was a fail, while parsing the file." => "Υπήρξε μια αποτυχία, κατά την σάρωση του αρχείου.", -"Choose active calendars" => "Επιλέξτε τα ενεργά ημερολόγια", -"Your calendars" => "Τα ημερολόγια σου", -"CalDav Link" => "Σύνδεση CalDAV", -"Shared calendars" => "Κοινόχρηστα ημερολόγια", -"No shared calendars" => "Δεν υπάρχουν κοινόχρηστα ημερολόγια", -"Share Calendar" => "Διαμοίρασε ένα ημερολόγιο", -"Download" => "Λήψη", -"Edit" => "Επεξεργασία", -"Delete" => "Διαγραφή", -"shared with you by" => "μοιράστηκε μαζί σας από ", -"New calendar" => "Νέο ημερολόγιο", -"Edit calendar" => "Επεξεργασία ημερολογίου", -"Displayname" => "Προβολή ονόματος", -"Active" => "Ενεργό", -"Calendar color" => "Χρώμα ημερολογίου", -"Save" => "Αποθήκευση", -"Submit" => "Υποβολή", -"Cancel" => "Ακύρωση", -"Edit an event" => "Επεξεργασία ενός γεγονότος", -"Export" => "Εξαγωγή", -"Eventinfo" => "Πληροφορίες γεγονότος", -"Repeating" => "Επαναλαμβανόμενο", -"Alarm" => "Ειδοποίηση", -"Attendees" => "Συμμετέχοντες", -"Share" => "Διαμοίρασε", -"Title of the Event" => "Τίτλος συμβάντος", -"Category" => "Κατηγορία", -"Separate categories with commas" => "Διαχώρισε τις κατηγορίες με κόμμα", -"Edit categories" => "Επεξεργασία κατηγοριών", -"All Day Event" => "Ολοήμερο συμβάν", -"From" => "Από", -"To" => "Έως", -"Advanced options" => "Επιλογές για προχωρημένους", -"Location" => "Τοποθεσία", -"Location of the Event" => "Τοποθεσία συμβάντος", -"Description" => "Περιγραφή", -"Description of the Event" => "Περιγραφή του συμβάντος", -"Repeat" => "Επαναλαμβανόμενο", -"Advanced" => "Για προχωρημένους", -"Select weekdays" => "Επιλογή ημερών εβδομάδας", -"Select days" => "Επιλογή ημερών", -"and the events day of year." => "και των ημερών του χρόνου που υπάρχουν συμβάντα.", -"and the events day of month." => "και των ημερών του μήνα που υπάρχουν συμβάντα.", -"Select months" => "Επιλογή μηνών", -"Select weeks" => "Επιλογή εβδομάδων", -"and the events week of year." => "και των εβδομάδων του χρόνου που υπάρουν συμβάντα.", -"Interval" => "Διάστημα", -"End" => "Τέλος", -"occurrences" => "περιστατικά", -"Import a calendar file" => "Εισαγωγή αρχείου ημερολογίου", -"Please choose the calendar" => "Παρακαλώ επιλέξτε το ημερολόγιο", -"create a new calendar" => "δημιουργία νέου ημερολογίου", -"Name of new calendar" => "Όνομα νέου ημερολογίου", -"Import" => "Εισαγωγή", -"Importing calendar" => "Εισαγωγή ημερολογίου", -"Calendar imported successfully" => "Το ημερολόγιο εισήχθει επιτυχώς", -"Close Dialog" => "Κλείσιμο Διαλόγου", -"Create a new event" => "Δημιουργήστε ένα νέο συμβάν", -"View an event" => "Εμφάνισε ένα γεγονός", -"No categories selected" => "Δεν επελέγησαν κατηγορίες", -"Select category" => "Επιλέξτε κατηγορία", -"of" => "του", -"at" => "στο", -"Timezone" => "Ζώνη ώρας", -"Check always for changes of the timezone" => "Έλεγχος πάντα για τις αλλαγές της ζώνης ώρας", -"Timeformat" => "Μορφή ώρας", -"24h" => "24ω", -"12h" => "12ω", -"First day of the week" => "Πρώτη μέρα της εβδομάδας", -"Calendar CalDAV syncing address:" => "Διεύθυνση για το συγχρονισμού του ημερολογίου CalDAV:", -"Users" => "Χρήστες", -"select users" => "επέλεξε χρήστες", -"Editable" => "Επεξεργάσιμο", -"Groups" => "Ομάδες", -"select groups" => "Επέλεξε ομάδες", -"make public" => "κάνε το δημόσιο" -); diff --git a/apps/calendar/l10n/eo.php b/apps/calendar/l10n/eo.php deleted file mode 100644 index b1127d59ca..0000000000 --- a/apps/calendar/l10n/eo.php +++ /dev/null @@ -1,162 +0,0 @@ - "Neniu kalendaro troviĝis.", -"No events found." => "Neniu okazaĵo troviĝis.", -"Wrong calendar" => "Malĝusta kalendaro", -"New Timezone:" => "Nova horzono:", -"Timezone changed" => "La horozono estas ŝanĝita", -"Invalid request" => "Nevalida peto", -"Calendar" => "Kalendaro", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—'d[ MMM] yyyy}", -"Birthday" => "Naskiĝotago", -"Business" => "Negoco", -"Call" => "Voko", -"Clients" => "Klientoj", -"Deliverer" => "Livero", -"Holidays" => "Ferioj", -"Ideas" => "Ideoj", -"Journey" => "Vojaĝo", -"Jubilee" => "Jubileo", -"Meeting" => "Rendevuo", -"Other" => "Alia", -"Personal" => "Persona", -"Projects" => "Projektoj", -"Questions" => "Demandoj", -"Work" => "Laboro", -"unnamed" => "nenomita", -"Does not repeat" => "Ĉi tio ne ripetiĝas", -"Daily" => "Tage", -"Weekly" => "Semajne", -"Every Weekday" => "Labortage", -"Bi-Weekly" => "Semajnduope", -"Monthly" => "Monate", -"Yearly" => "Jare", -"never" => "neniam", -"by occurrences" => "laŭ aperoj", -"by date" => "laŭ dato", -"by monthday" => "laŭ monattago", -"by weekday" => "laŭ semajntago", -"Monday" => "lundo", -"Tuesday" => "mardo", -"Wednesday" => "merkredo", -"Thursday" => "ĵaŭdo", -"Friday" => "vendredo", -"Saturday" => "sabato", -"Sunday" => "dimanĉo", -"events week of month" => "la monatsemajno de la okazaĵo", -"first" => "unua", -"second" => "dua", -"third" => "tria", -"fourth" => "kvara", -"fifth" => "kvina", -"last" => "lasta", -"January" => "Januaro", -"February" => "Februaro", -"March" => "Marto", -"April" => "Aprilo", -"May" => "Majo", -"June" => "Junio", -"July" => "Julio", -"August" => "Aŭgusto", -"September" => "Septembro", -"October" => "Oktobro", -"November" => "Novembro", -"December" => "Decembro", -"by events date" => "laŭ okazaĵdato", -"by yearday(s)" => "laŭ jartago(j)", -"by weeknumber(s)" => "laŭ semajnnumero(j)", -"by day and month" => "laŭ tago kaj monato", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "La tuta tago", -"New Calendar" => "Nova kalendaro", -"Missing fields" => "Mankas iuj kampoj", -"Title" => "Titolo", -"From Date" => "ekde la dato", -"From Time" => "ekde la horo", -"To Date" => "ĝis la dato", -"To Time" => "ĝis la horo", -"The event ends before it starts" => "La okazaĵo finas antaŭ komenci", -"There was a database fail" => "Datumbaza malsukceso okazis", -"Week" => "Semajno", -"Month" => "Monato", -"List" => "Listo", -"Today" => "Hodiaŭ", -"Calendars" => "Kalendaroj", -"There was a fail, while parsing the file." => "Malsukceso okazis dum analizo de la dosiero.", -"Choose active calendars" => "Elektu aktivajn kalendarojn", -"Your calendars" => "Viaj kalendaroj", -"CalDav Link" => "CalDav-a ligilo", -"Shared calendars" => "Kunhavigitaj kalendaroj", -"No shared calendars" => "Neniu kunhavigita kalendaro", -"Share Calendar" => "Kunhavigi kalendaron", -"Download" => "Elŝuti", -"Edit" => "Redakti", -"Delete" => "Forigi", -"shared with you by" => "kunhavigita kun vi fare de", -"New calendar" => "Nova kalendaro", -"Edit calendar" => "Redakti la kalendaron", -"Displayname" => "Montrota nomo", -"Active" => "Aktiva", -"Calendar color" => "Kalendarokoloro", -"Save" => "Konservi", -"Submit" => "Sendi", -"Cancel" => "Nuligi", -"Edit an event" => "Redakti okazaĵon", -"Export" => "Elporti", -"Eventinfo" => "Informo de okazaĵo", -"Repeating" => "Ripetata", -"Alarm" => "Alarmo", -"Attendees" => "Ĉeestontoj", -"Share" => "Kunhavigi", -"Title of the Event" => "Okazaĵotitolo", -"Category" => "Kategorio", -"Separate categories with commas" => "Disigi kategoriojn per komoj", -"Edit categories" => "Redakti kategoriojn", -"All Day Event" => "La tuta tago", -"From" => "Ekde", -"To" => "Ĝis", -"Advanced options" => "Altnivela agordo", -"Location" => "Loko", -"Location of the Event" => "Loko de okazaĵo", -"Description" => "Priskribo", -"Description of the Event" => "Okazaĵopriskribo", -"Repeat" => "Ripeti", -"Advanced" => "Altnivelo", -"Select weekdays" => "Elekti semajntagojn", -"Select days" => "Elekti tagojn", -"and the events day of year." => "kaj la jartago de la okazaĵo.", -"and the events day of month." => "kaj la monattago de la okazaĵo.", -"Select months" => "Elekti monatojn", -"Select weeks" => "Elekti semajnojn", -"and the events week of year." => "kaj la jarsemajno de la okazaĵo.", -"Interval" => "Intervalo", -"End" => "Fino", -"occurrences" => "aperoj", -"Import a calendar file" => "Enporti kalendarodosieron", -"Please choose the calendar" => "Bonvolu elekti kalendaron", -"create a new calendar" => "Krei novan kalendaron", -"Name of new calendar" => "Nomo de la nova kalendaro", -"Import" => "Enporti", -"Importing calendar" => "Kalendaro estas enportata", -"Calendar imported successfully" => "La kalendaro enportiĝis sukcese", -"Close Dialog" => "Fermi la dialogon", -"Create a new event" => "Krei okazaĵon", -"View an event" => "Vidi okazaĵon", -"No categories selected" => "Neniu kategorio elektita", -"Select category" => "Elekti kategorion", -"of" => "de", -"at" => "ĉe", -"Timezone" => "Horozono", -"Check always for changes of the timezone" => "Ĉiam kontroli ĉu la horzono ŝanĝiĝis", -"Timeformat" => "Tempoformo", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Unua tago de la semajno", -"Calendar CalDAV syncing address:" => "Adreso de kalendarosinkronigo per CalDAV:", -"Users" => "Uzantoj", -"select users" => "elekti uzantojn", -"Editable" => "Redaktebla", -"Groups" => "Grupoj", -"select groups" => "elekti grupojn", -"make public" => "publikigi" -); diff --git a/apps/calendar/l10n/es.php b/apps/calendar/l10n/es.php deleted file mode 100644 index 4cd9e3202b..0000000000 --- a/apps/calendar/l10n/es.php +++ /dev/null @@ -1,162 +0,0 @@ - "No se encontraron calendarios.", -"No events found." => "No se encontraron eventos.", -"Wrong calendar" => "Calendario incorrecto", -"New Timezone:" => "Nueva zona horaria:", -"Timezone changed" => "Zona horaria cambiada", -"Invalid request" => "Petición no válida", -"Calendar" => "Calendario", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Cumpleaños", -"Business" => "Negocios", -"Call" => "Llamada", -"Clients" => "Clientes", -"Deliverer" => "Entrega", -"Holidays" => "Festivos", -"Ideas" => "Ideas", -"Journey" => "Viaje", -"Jubilee" => "Aniversario", -"Meeting" => "Reunión", -"Other" => "Otro", -"Personal" => "Personal", -"Projects" => "Proyectos", -"Questions" => "Preguntas", -"Work" => "Trabajo", -"unnamed" => "Sin nombre", -"Does not repeat" => "No se repite", -"Daily" => "Diariamente", -"Weekly" => "Semanalmente", -"Every Weekday" => "Días de semana laboral", -"Bi-Weekly" => "Cada 2 semanas", -"Monthly" => "Mensualmente", -"Yearly" => "Anualmente", -"never" => "nunca", -"by occurrences" => "por ocurrencias", -"by date" => "por fecha", -"by monthday" => "por día del mes", -"by weekday" => "por día de la semana", -"Monday" => "Lunes", -"Tuesday" => "Martes", -"Wednesday" => "Miércoles", -"Thursday" => "Jueves", -"Friday" => "Viernes", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "eventos de la semana del mes", -"first" => "primer", -"second" => "segundo", -"third" => "tercer", -"fourth" => "cuarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Enero", -"February" => "Febrero", -"March" => "Marzo", -"April" => "Abril", -"May" => "Mayo", -"June" => "Junio", -"July" => "Julio", -"August" => "Agosto", -"September" => "Septiembre", -"October" => "Octubre", -"November" => "Noviembre", -"December" => "Diciembre", -"by events date" => "por fecha de los eventos", -"by yearday(s)" => "por día(s) del año", -"by weeknumber(s)" => "por número(s) de semana", -"by day and month" => "por día y mes", -"Date" => "Fecha", -"Cal." => "Cal.", -"All day" => "Todo el día", -"New Calendar" => "Nuevo calendario", -"Missing fields" => "Los campos que faltan", -"Title" => "Título", -"From Date" => "Desde la fecha", -"From Time" => "Desde la hora", -"To Date" => "Hasta la fecha", -"To Time" => "Hasta la hora", -"The event ends before it starts" => "El evento termina antes de que comience", -"There was a database fail" => "Se ha producido un error en la base de datos", -"Week" => "Semana", -"Month" => "Mes", -"List" => "Lista", -"Today" => "Hoy", -"Calendars" => "Calendarios", -"There was a fail, while parsing the file." => "Se ha producido un fallo al analizar el archivo.", -"Choose active calendars" => "Elige los calendarios activos", -"Your calendars" => "Tus calendarios", -"CalDav Link" => "Enlace a CalDav", -"Shared calendars" => "Calendarios compartidos", -"No shared calendars" => "Calendarios no compartidos", -"Share Calendar" => "Compartir calendario", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Eliminar", -"shared with you by" => "compartido contigo por", -"New calendar" => "Nuevo calendario", -"Edit calendar" => "Editar calendario", -"Displayname" => "Nombre", -"Active" => "Activo", -"Calendar color" => "Color del calendario", -"Save" => "Guardar", -"Submit" => "Guardar", -"Cancel" => "Cancelar", -"Edit an event" => "Editar un evento", -"Export" => "Exportar", -"Eventinfo" => "Información del evento", -"Repeating" => "Repetición", -"Alarm" => "Alarma", -"Attendees" => "Asistentes", -"Share" => "Compartir", -"Title of the Event" => "Título del evento", -"Category" => "Categoría", -"Separate categories with commas" => "Separar categorías con comas", -"Edit categories" => "Editar categorías", -"All Day Event" => "Todo el día", -"From" => "Desde", -"To" => "Hasta", -"Advanced options" => "Opciones avanzadas", -"Location" => "Lugar", -"Location of the Event" => "Lugar del evento", -"Description" => "Descripción", -"Description of the Event" => "Descripción del evento", -"Repeat" => "Repetir", -"Advanced" => "Avanzado", -"Select weekdays" => "Seleccionar días de la semana", -"Select days" => "Seleccionar días", -"and the events day of year." => "y el día del año de los eventos.", -"and the events day of month." => "y el día del mes de los eventos.", -"Select months" => "Seleccionar meses", -"Select weeks" => "Seleccionar semanas", -"and the events week of year." => "y la semana del año de los eventos.", -"Interval" => "Intervalo", -"End" => "Fin", -"occurrences" => "ocurrencias", -"Import a calendar file" => "Importar un archivo de calendario", -"Please choose the calendar" => "Por favor elige el calendario", -"create a new calendar" => "Crear un nuevo calendario", -"Name of new calendar" => "Nombre del nuevo calendario", -"Import" => "Importar", -"Importing calendar" => "Importando calendario", -"Calendar imported successfully" => "Calendario importado exitosamente", -"Close Dialog" => "Cerrar diálogo", -"Create a new event" => "Crear un nuevo evento", -"View an event" => "Ver un evento", -"No categories selected" => "Ninguna categoría seleccionada", -"Select category" => "Seleccionar categoría", -"of" => "de", -"at" => "a las", -"Timezone" => "Zona horaria", -"Check always for changes of the timezone" => "Comprobar siempre por cambios en la zona horaria", -"Timeformat" => "Formato de hora", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primer día de la semana", -"Calendar CalDAV syncing address:" => "Dirección de sincronización de calendario CalDAV:", -"Users" => "Usuarios", -"select users" => "seleccionar usuarios", -"Editable" => "Editable", -"Groups" => "Grupos", -"select groups" => "seleccionar grupos", -"make public" => "hacerlo público" -); diff --git a/apps/calendar/l10n/et_EE.php b/apps/calendar/l10n/et_EE.php deleted file mode 100644 index 931ca56f5f..0000000000 --- a/apps/calendar/l10n/et_EE.php +++ /dev/null @@ -1,162 +0,0 @@ - "Kalendreid ei leitud.", -"No events found." => "Üritusi ei leitud.", -"Wrong calendar" => "Vale kalender", -"New Timezone:" => "Uus ajavöönd:", -"Timezone changed" => "Ajavöönd on muudetud", -"Invalid request" => "Vigane päring", -"Calendar" => "Kalender", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Sünnipäev", -"Business" => "Äri", -"Call" => "Helista", -"Clients" => "Kliendid", -"Deliverer" => "Kohaletoimetaja", -"Holidays" => "Pühad", -"Ideas" => "Ideed", -"Journey" => "Reis", -"Jubilee" => "Juubel", -"Meeting" => "Kohtumine", -"Other" => "Muu", -"Personal" => "Isiklik", -"Projects" => "Projektid", -"Questions" => "Küsimused", -"Work" => "Töö", -"unnamed" => "nimetu", -"Does not repeat" => "Ei kordu", -"Daily" => "Iga päev", -"Weekly" => "Iga nädal", -"Every Weekday" => "Igal nädalapäeval", -"Bi-Weekly" => "Üle nädala", -"Monthly" => "Igal kuul", -"Yearly" => "Igal aastal", -"never" => "mitte kunagi", -"by occurrences" => "toimumiskordade järgi", -"by date" => "kuupäeva järgi", -"by monthday" => "kuu päeva järgi", -"by weekday" => "nädalapäeva järgi", -"Monday" => "Esmaspäev", -"Tuesday" => "Teisipäev", -"Wednesday" => "Kolmapäev", -"Thursday" => "Neljapäev", -"Friday" => "Reede", -"Saturday" => "Laupäev", -"Sunday" => "Pühapäev", -"events week of month" => "ürituse kuu nädal", -"first" => "esimene", -"second" => "teine", -"third" => "kolmas", -"fourth" => "neljas", -"fifth" => "viies", -"last" => "viimane", -"January" => "Jaanuar", -"February" => "Veebruar", -"March" => "Märts", -"April" => "Aprill", -"May" => "Mai", -"June" => "Juuni", -"July" => "Juuli", -"August" => "August", -"September" => "September", -"October" => "Oktoober", -"November" => "November", -"December" => "Detsember", -"by events date" => "ürituste kuupäeva järgi", -"by yearday(s)" => "aasta päeva(de) järgi", -"by weeknumber(s)" => "nädala numbri(te) järgi", -"by day and month" => "kuu ja päeva järgi", -"Date" => "Kuupäev", -"Cal." => "Kal.", -"All day" => "Kogu päev", -"New Calendar" => "Uus kalender", -"Missing fields" => "Puuduvad väljad", -"Title" => "Pealkiri", -"From Date" => "Alates kuupäevast", -"From Time" => "Alates kellaajast", -"To Date" => "Kuni kuupäevani", -"To Time" => "Kuni kellaajani", -"The event ends before it starts" => "Üritus lõpeb enne, kui see algab", -"There was a database fail" => "Tekkis andmebaasi viga", -"Week" => "Nädal", -"Month" => "Kuu", -"List" => "Nimekiri", -"Today" => "Täna", -"Calendars" => "Kalendrid", -"There was a fail, while parsing the file." => "Faili parsimisel tekkis viga.", -"Choose active calendars" => "Vali aktiivsed kalendrid", -"Your calendars" => "Sinu kalendrid", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Jagatud kalendrid", -"No shared calendars" => "Jagatud kalendreid pole", -"Share Calendar" => "Jaga kalendrit", -"Download" => "Lae alla", -"Edit" => "Muuda", -"Delete" => "Kustuta", -"shared with you by" => "jagas sinuga", -"New calendar" => "Uus kalender", -"Edit calendar" => "Muuda kalendrit", -"Displayname" => "Näidatav nimi", -"Active" => "Aktiivne", -"Calendar color" => "Kalendri värv", -"Save" => "Salvesta", -"Submit" => "OK", -"Cancel" => "Loobu", -"Edit an event" => "Muuda sündmust", -"Export" => "Ekspordi", -"Eventinfo" => "Ürituse info", -"Repeating" => "Kordamine", -"Alarm" => "Alarm", -"Attendees" => "Osalejad", -"Share" => "Jaga", -"Title of the Event" => "Sündmuse pealkiri", -"Category" => "Kategooria", -"Separate categories with commas" => "Eralda kategooriad komadega", -"Edit categories" => "Muuda kategooriaid", -"All Day Event" => "Kogu päeva sündmus", -"From" => "Alates", -"To" => "Kuni", -"Advanced options" => "Lisavalikud", -"Location" => "Asukoht", -"Location of the Event" => "Sündmuse toimumiskoht", -"Description" => "Kirjeldus", -"Description of the Event" => "Sündmuse kirjeldus", -"Repeat" => "Korda", -"Advanced" => "Täpsem", -"Select weekdays" => "Vali nädalapäevad", -"Select days" => "Vali päevad", -"and the events day of year." => "ja ürituse päev aastas.", -"and the events day of month." => "ja ürituse päev kuus.", -"Select months" => "Vali kuud", -"Select weeks" => "Vali nädalad", -"and the events week of year." => "ja ürituse nädal aastas.", -"Interval" => "Intervall", -"End" => "Lõpp", -"occurrences" => "toimumiskordi", -"Import a calendar file" => "Impordi kalendrifail", -"Please choose the calendar" => "Palun vali kalender", -"create a new calendar" => "loo uus kalender", -"Name of new calendar" => "Uue kalendri nimi", -"Import" => "Impordi", -"Importing calendar" => "Kalendri importimine", -"Calendar imported successfully" => "Kalender on imporditud", -"Close Dialog" => "Sulge dialoogiaken", -"Create a new event" => "Loo sündmus", -"View an event" => "Vaata üritust", -"No categories selected" => "Ühtegi kategooriat pole valitud", -"Select category" => "Salvesta kategooria", -"of" => "/", -"at" => "kell", -"Timezone" => "Ajavöönd", -"Check always for changes of the timezone" => "Kontrolli alati muudatusi ajavööndis", -"Timeformat" => "Aja vorming", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Nädala esimene päev", -"Calendar CalDAV syncing address:" => "Kalendri CalDAV sünkroniseerimise aadress:", -"Users" => "Kasutajad", -"select users" => "valitud kasutajad", -"Editable" => "Muudetav", -"Groups" => "Grupid", -"select groups" => "valitud grupid", -"make public" => "tee avalikuks" -); diff --git a/apps/calendar/l10n/eu.php b/apps/calendar/l10n/eu.php deleted file mode 100644 index 9e1300032f..0000000000 --- a/apps/calendar/l10n/eu.php +++ /dev/null @@ -1,159 +0,0 @@ - "Ez da egutegirik aurkitu.", -"No events found." => "Ez da gertaerarik aurkitu.", -"Wrong calendar" => "Egutegi okerra", -"New Timezone:" => "Ordu-zonalde berria", -"Timezone changed" => "Ordu-zonaldea aldatuta", -"Invalid request" => "Baliogabeko eskaera", -"Calendar" => "Egutegia", -"Birthday" => "Jaioteguna", -"Business" => "Negozioa", -"Call" => "Deia", -"Clients" => "Bezeroak", -"Deliverer" => "Banatzailea", -"Holidays" => "Oporrak", -"Ideas" => "Ideiak", -"Journey" => "Bidaia", -"Jubilee" => "Urteurrena", -"Meeting" => "Bilera", -"Other" => "Bestelakoa", -"Personal" => "Pertsonala", -"Projects" => "Proiektuak", -"Questions" => "Galderak", -"Work" => "Lana", -"unnamed" => "izengabea", -"Does not repeat" => "Ez da errepikatzen", -"Daily" => "Egunero", -"Weekly" => "Astero", -"Every Weekday" => "Asteko egun guztietan", -"Bi-Weekly" => "Bi-Astero", -"Monthly" => "Hilabetero", -"Yearly" => "Urtero", -"never" => "inoiz", -"by occurrences" => "errepikapen kopuruagatik", -"by date" => "dataren arabera", -"by monthday" => "hileko egunaren arabera", -"by weekday" => "asteko egunaren arabera", -"Monday" => "Astelehena", -"Tuesday" => "Asteartea", -"Wednesday" => "Asteazkena", -"Thursday" => "Osteguna", -"Friday" => "Ostirala", -"Saturday" => "Larunbata", -"Sunday" => "Igandea", -"events week of month" => "gertaeraren hilabeteko astea", -"first" => "lehenengoa", -"second" => "bigarrean", -"third" => "hirugarrena", -"fourth" => "laugarrena", -"fifth" => "bostgarrena", -"last" => "azkena", -"January" => "Urtarrila", -"February" => "Otsaila", -"March" => "Martxoa", -"April" => "Apirila", -"May" => "Maiatza", -"June" => "Ekaina", -"July" => "Uztaila", -"August" => "Abuztua", -"September" => "Iraila", -"October" => "Urria", -"November" => "Azaroa", -"December" => "Abendua", -"by events date" => "gertaeren dataren arabera", -"by yearday(s)" => "urteko egunaren arabera", -"by weeknumber(s)" => "aste zenbaki(ar)en arabera", -"by day and month" => "eguna eta hilabetearen arabera", -"Date" => "Data", -"Cal." => "Eg.", -"All day" => "Egun guztia", -"New Calendar" => "Egutegi berria", -"Missing fields" => "Eremuak faltan", -"Title" => "Izenburua", -"From Date" => "Hasierako Data", -"From Time" => "Hasierako Ordua", -"To Date" => "Bukaerako Data", -"To Time" => "Bukaerako Ordua", -"The event ends before it starts" => "Gertaera hasi baino lehen bukatzen da", -"There was a database fail" => "Datu-baseak huts egin du", -"Week" => "Astea", -"Month" => "Hilabetea", -"List" => "Zerrenda", -"Today" => "Gaur", -"Calendars" => "Egutegiak", -"There was a fail, while parsing the file." => "Huts bat egon da, fitxategia aztertzen zen bitartea.", -"Choose active calendars" => "Aukeratu egutegi aktiboak", -"Your calendars" => "Zure egutegiak", -"CalDav Link" => "CalDav lotura", -"Shared calendars" => "Elkarbanatutako egutegiak", -"No shared calendars" => "Ez dago elkarbanatutako egutegirik", -"Share Calendar" => "Elkarbanatu egutegia", -"Download" => "Deskargatu", -"Edit" => "Editatu", -"Delete" => "Ezabatu", -"shared with you by" => "honek zurekin elkarbanatu du", -"New calendar" => "Egutegi berria", -"Edit calendar" => "Editatu egutegia", -"Displayname" => "Bistaratzeko izena", -"Active" => "Aktiboa", -"Calendar color" => "Egutegiaren kolorea", -"Save" => "Gorde", -"Submit" => "Bidali", -"Cancel" => "Ezeztatu", -"Edit an event" => "Editatu gertaera", -"Export" => "Exportatu", -"Eventinfo" => "Gertaeraren informazioa", -"Repeating" => "Errepikapena", -"Alarm" => "Alarma", -"Attendees" => "Partaideak", -"Share" => "Elkarbanatu", -"Title of the Event" => "Gertaeraren izenburua", -"Category" => "Kategoria", -"Separate categories with commas" => "Banatu kategoriak komekin", -"Edit categories" => "Editatu kategoriak", -"All Day Event" => "Egun osoko gertaera", -"From" => "Hasiera", -"To" => "Bukaera", -"Advanced options" => "Aukera aurreratuak", -"Location" => "Kokalekua", -"Location of the Event" => "Gertaeraren kokalekua", -"Description" => "Deskribapena", -"Description of the Event" => "Gertaeraren deskribapena", -"Repeat" => "Errepikatu", -"Advanced" => "Aurreratua", -"Select weekdays" => "Hautatu asteko egunak", -"Select days" => "Hautatu egunak", -"and the events day of year." => "eta gertaeraren urteko eguna.", -"and the events day of month." => "eta gertaeraren hilabeteko eguna.", -"Select months" => "Hautatu hilabeteak", -"Select weeks" => "Hautatu asteak", -"and the events week of year." => "eta gertaeraren urteko astea.", -"Interval" => "Tartea", -"End" => "Amaiera", -"occurrences" => "errepikapenak", -"Import a calendar file" => "Inportatu egutegi fitxategi bat", -"Please choose the calendar" => "Mesedez aukeratu egutegia", -"create a new calendar" => "sortu egutegi berria", -"Name of new calendar" => "Egutegi berriaren izena", -"Import" => "Importatu", -"Importing calendar" => "Egutegia inportatzen", -"Calendar imported successfully" => "Egutegia ongi inportatu da", -"Close Dialog" => "Itxi lehioa", -"Create a new event" => "Sortu gertaera berria", -"View an event" => "Ikusi gertaera bat", -"No categories selected" => "Ez da kategoriarik hautatu", -"Select category" => "Aukeratu kategoria", -"Timezone" => "Ordu-zonaldea", -"Check always for changes of the timezone" => "Egiaztatu beti ordu-zonalde aldaketen bila", -"Timeformat" => "Ordu formatua", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Asteko lehenego eguna", -"Calendar CalDAV syncing address:" => "Egutegiaren CalDAV sinkronizazio helbidea", -"Users" => "Erabiltzaileak", -"select users" => "hautatutako erabiltzaileak", -"Editable" => "Editagarria", -"Groups" => "Taldeak", -"select groups" => "hautatutako taldeak", -"make public" => "publikoa egin" -); diff --git a/apps/calendar/l10n/fa.php b/apps/calendar/l10n/fa.php deleted file mode 100644 index cd2bb9c2e5..0000000000 --- a/apps/calendar/l10n/fa.php +++ /dev/null @@ -1,162 +0,0 @@ - "هیچ تقویمی پیدا نشد", -"No events found." => "هیچ رویدادی پیدا نشد", -"Wrong calendar" => "تقویم اشتباه", -"New Timezone:" => "زمان محلی جدید", -"Timezone changed" => "زمان محلی تغییر یافت", -"Invalid request" => "درخواست نامعتبر", -"Calendar" => "تقویم", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "DDD m[ yyyy]{ '—'[ DDD] m yyyy}", -"Birthday" => "روزتولد", -"Business" => "تجارت", -"Call" => "تماس گرفتن", -"Clients" => "مشتریان", -"Deliverer" => "نجات", -"Holidays" => "روزهای تعطیل", -"Ideas" => "ایده ها", -"Journey" => "سفر", -"Jubilee" => "سالگرد", -"Meeting" => "ملاقات", -"Other" => "دیگر", -"Personal" => "شخصی", -"Projects" => "پروژه ها", -"Questions" => "سوالات", -"Work" => "کار", -"unnamed" => "نام گذاری نشده", -"Does not repeat" => "تکرار نکنید", -"Daily" => "روزانه", -"Weekly" => "هفتهگی", -"Every Weekday" => "هرروز هفته", -"Bi-Weekly" => "دوهفته", -"Monthly" => "ماهانه", -"Yearly" => "سالانه", -"never" => "هرگز", -"by occurrences" => "به وسیله ظهور", -"by date" => "به وسیله تاریخ", -"by monthday" => "به وسیله روزهای ماه", -"by weekday" => "به وسیله روز های هفته", -"Monday" => "دوشنبه", -"Tuesday" => "سه شنبه", -"Wednesday" => "چهارشنبه", -"Thursday" => "پنجشنبه", -"Friday" => "جمعه", -"Saturday" => "شنبه", -"Sunday" => "یکشنبه", -"events week of month" => "رویداد های هفته هایی از ماه", -"first" => "اولین", -"second" => "دومین", -"third" => "سومین", -"fourth" => "چهارمین", -"fifth" => "پنجمین", -"last" => "آخرین", -"January" => "ژانویه", -"February" => "فبریه", -"March" => "مارس", -"April" => "آوریل", -"May" => "می", -"June" => "ژوءن", -"July" => "جولای", -"August" => "آگوست", -"September" => "سپتامبر", -"October" => "اکتبر", -"November" => "نوامبر", -"December" => "دسامبر", -"by events date" => "به وسیله رویداد های روزانه", -"by yearday(s)" => "به وسیله روز های سال(ها)", -"by weeknumber(s)" => "به وسیله شماره هفته(ها)", -"by day and month" => "به وسیله روز و ماه", -"Date" => "تاریخ", -"Cal." => "تقویم.", -"All day" => "هرروز", -"New Calendar" => "تقویم جدید", -"Missing fields" => "فیلد های گم شده", -"Title" => "عنوان", -"From Date" => "از تاریخ", -"From Time" => "از ساعت", -"To Date" => "به تاریخ", -"To Time" => "به ساعت", -"The event ends before it starts" => "رویداد قبل از شروع شدن تمام شده!", -"There was a database fail" => "یک پایگاه داده فرو مانده است", -"Week" => "هفته", -"Month" => "ماه", -"List" => "فهرست", -"Today" => "امروز", -"Calendars" => "تقویم ها", -"There was a fail, while parsing the file." => "ناتوان در تجزیه پرونده", -"Choose active calendars" => "تقویم فعال را انتخاب کنید", -"Your calendars" => "تقویم های شما", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "تقویمهای به اشترک گذاری شده", -"No shared calendars" => "هیچ تقویمی به اشتراک گذارده نشده", -"Share Calendar" => "تقویم را به اشتراک بگذارید", -"Download" => "بارگیری", -"Edit" => "ویرایش", -"Delete" => "پاک کردن", -"shared with you by" => "به اشتراک گذارده شده به وسیله", -"New calendar" => "تقویم جدید", -"Edit calendar" => "ویرایش تقویم", -"Displayname" => "نام برای نمایش", -"Active" => "فعال", -"Calendar color" => "رنگ تقویم", -"Save" => "ذخیره سازی", -"Submit" => "ارسال", -"Cancel" => "انصراف", -"Edit an event" => "ویرایش رویداد", -"Export" => "خروجی گرفتن", -"Eventinfo" => "اطلاعات رویداد", -"Repeating" => "در حال تکرار کردن", -"Alarm" => "هشدار", -"Attendees" => "شرکت کنندگان", -"Share" => "به اشتراک گذاردن", -"Title of the Event" => "عنوان رویداد", -"Category" => "نوع", -"Separate categories with commas" => "گروه ها را به وسیله درنگ نما از هم جدا کنید", -"Edit categories" => "ویرایش گروه", -"All Day Event" => "رویداد های روزانه", -"From" => "از", -"To" => "به", -"Advanced options" => "تنظیمات حرفه ای", -"Location" => "منطقه", -"Location of the Event" => "منطقه رویداد", -"Description" => "توضیحات", -"Description of the Event" => "توضیحات درباره رویداد", -"Repeat" => "تکرار", -"Advanced" => "پیشرفته", -"Select weekdays" => "انتخاب روز های هفته ", -"Select days" => "انتخاب روز ها", -"and the events day of year." => "و رویداد های روز از سال", -"and the events day of month." => "و رویداد های روز از ماه", -"Select months" => "انتخاب ماه ها", -"Select weeks" => "انتخاب هفته ها", -"and the events week of year." => "و رویداد هفته ها از سال", -"Interval" => "فاصله", -"End" => "پایان", -"occurrences" => "ظهور", -"Import a calendar file" => "یک پرونده حاوی تقویم وارد کنید", -"Please choose the calendar" => "لطفا تقویم را انتخاب کنید", -"create a new calendar" => "یک تقویم جدید ایجاد کنید", -"Name of new calendar" => "نام تقویم جدید", -"Import" => "ورودی دادن", -"Importing calendar" => "درحال افزودن تقویم", -"Calendar imported successfully" => "افزودن تقویم موفقیت آمیز بود", -"Close Dialog" => "بستن دیالوگ", -"Create a new event" => "یک رویداد ایجاد کنید", -"View an event" => "دیدن یک رویداد", -"No categories selected" => "هیچ گروهی انتخاب نشده", -"Select category" => "انتخاب گروه", -"of" => "از", -"at" => "در", -"Timezone" => "زمان محلی", -"Check always for changes of the timezone" => "همیشه بررسی کنید برای تغییر زمان محلی", -"Timeformat" => "نوع زمان", -"24h" => "24 ساعت", -"12h" => "12 ساعت", -"First day of the week" => "یکمین روز هفته", -"Calendar CalDAV syncing address:" => "Calendar CalDAV syncing address :", -"Users" => "کاربرها", -"select users" => "انتخاب شناسه ها", -"Editable" => "قابل ویرایش", -"Groups" => "گروه ها", -"select groups" => "انتخاب گروه ها", -"make public" => "عمومی سازی" -); diff --git a/apps/calendar/l10n/fi_FI.php b/apps/calendar/l10n/fi_FI.php deleted file mode 100644 index 4de94b7b7b..0000000000 --- a/apps/calendar/l10n/fi_FI.php +++ /dev/null @@ -1,138 +0,0 @@ - "Kalentereita ei löytynyt", -"No events found." => "Tapahtumia ei löytynyt.", -"Wrong calendar" => "Väärä kalenteri", -"New Timezone:" => "Uusi aikavyöhyke:", -"Timezone changed" => "Aikavyöhyke vaihdettu", -"Invalid request" => "Virheellinen pyyntö", -"Calendar" => "Kalenteri", -"Birthday" => "Syntymäpäivä", -"Call" => "Ota yhteyttä", -"Clients" => "Asiakkaat", -"Deliverer" => "Toimittaja", -"Holidays" => "Vapaapäivät", -"Ideas" => "Ideat", -"Journey" => "Matkustus", -"Jubilee" => "Vuosipäivät", -"Meeting" => "Tapaamiset", -"Other" => "Muut", -"Personal" => "Henkilökohtainen", -"Projects" => "Projektit", -"Questions" => "Kysymykset", -"Work" => "Työ", -"unnamed" => "nimetön", -"Does not repeat" => "Ei toistoa", -"Daily" => "Päivittäin", -"Weekly" => "Viikottain", -"Every Weekday" => "Arkipäivisin", -"Bi-Weekly" => "Joka toinen viikko", -"Monthly" => "Kuukausittain", -"Yearly" => "Vuosittain", -"never" => "Ei koskaan", -"Monday" => "Maanantai", -"Tuesday" => "Tiistai", -"Wednesday" => "Keskiviikko", -"Thursday" => "Torstai", -"Friday" => "Perjantai", -"Saturday" => "Lauantai", -"Sunday" => "Sunnuntai", -"first" => "ensimmäinen", -"second" => "toinen", -"third" => "kolmas", -"fourth" => "neljäs", -"fifth" => "viides", -"last" => "viimeinen", -"January" => "Tammikuu", -"February" => "Helmikuu", -"March" => "Maaliskuu", -"April" => "Huhtikuu", -"May" => "Toukokuu", -"June" => "Kesäkuu", -"July" => "Heinäkuu", -"August" => "Elokuu", -"September" => "Syyskuu", -"October" => "Lokakuu", -"November" => "Marraskuu", -"December" => "Joulukuu", -"Date" => "Päivämäärä", -"All day" => "Koko päivä", -"New Calendar" => "Uusi kalenteri", -"Missing fields" => "Puuttuvat kentät", -"Title" => "Otsikko", -"The event ends before it starts" => "Tapahtuma päättyy ennen alkamistaan", -"There was a database fail" => "Tapahtui tietokantavirhe", -"Week" => "Viikko", -"Month" => "Kuukausi", -"List" => "Lista", -"Today" => "Tänään", -"Calendars" => "Kalenterit", -"There was a fail, while parsing the file." => "Tiedostoa jäsennettäessä tapahtui virhe.", -"Choose active calendars" => "Valitse aktiiviset kalenterit", -"Your calendars" => "Omat kalenterisi", -"CalDav Link" => "CalDav-linkki", -"Shared calendars" => "Jaetut kalenterit", -"No shared calendars" => "Ei jaettuja kalentereita", -"Share Calendar" => "Jaa kalenteri", -"Download" => "Lataa", -"Edit" => "Muokkaa", -"Delete" => "Poista", -"shared with you by" => "kanssasi jaettu", -"New calendar" => "Uusi kalenteri", -"Edit calendar" => "Muokkaa kalenteria", -"Displayname" => "Kalenterin nimi", -"Active" => "Aktiivinen", -"Calendar color" => "Kalenterin väri", -"Save" => "Tallenna", -"Submit" => "Talleta", -"Cancel" => "Peru", -"Edit an event" => "Muokkaa tapahtumaa", -"Export" => "Vie", -"Eventinfo" => "Tapahtumatiedot", -"Repeating" => "Toisto", -"Alarm" => "Hälytys", -"Attendees" => "Osallistujat", -"Share" => "Jaa", -"Title of the Event" => "Tapahtuman otsikko", -"Category" => "Luokka", -"Separate categories with commas" => "Erota luokat pilkuilla", -"Edit categories" => "Muokkaa luokkia", -"All Day Event" => "Koko päivän tapahtuma", -"From" => "Alkaa", -"To" => "Päättyy", -"Advanced options" => "Tarkemmat asetukset", -"Location" => "Sijainti", -"Location of the Event" => "Tapahtuman sijainti", -"Description" => "Kuvaus", -"Description of the Event" => "Tapahtuman kuvaus", -"Repeat" => "Toisto", -"Select weekdays" => "Valitse viikonpäivät", -"Select days" => "Valitse päivät", -"Select months" => "Valitse kuukaudet", -"Select weeks" => "Valitse viikot", -"Interval" => "Intervalli", -"Import a calendar file" => "Tuo kalenteritiedosto", -"Please choose the calendar" => "Valitse kalenteri", -"create a new calendar" => "luo uusi kalenteri", -"Name of new calendar" => "Uuden kalenterin nimi", -"Import" => "Tuo", -"Importing calendar" => "Tuodaan kalenteria", -"Calendar imported successfully" => "Kalenteri tuotu onnistuneesti", -"Close Dialog" => "Sulje ikkuna", -"Create a new event" => "Luo uusi tapahtuma", -"View an event" => "Avaa tapahtuma", -"No categories selected" => "Luokkia ei ole valittu", -"Select category" => "Valitse luokka", -"Timezone" => "Aikavyöhyke", -"Check always for changes of the timezone" => "Tarkista aina aikavyöhykkeen muutokset", -"Timeformat" => "Ajan esitysmuoto", -"24h" => "24 tuntia", -"12h" => "12 tuntia", -"First day of the week" => "Viikon ensimmäinen päivä", -"Calendar CalDAV syncing address:" => "Kalenterin CalDAV-synkronointiosoite:", -"Users" => "Käyttäjät", -"select users" => "valitse käyttäjät", -"Editable" => "Muoktattava", -"Groups" => "Ryhmät", -"select groups" => "valitse ryhmät", -"make public" => "aseta julkiseksi" -); diff --git a/apps/calendar/l10n/fr.php b/apps/calendar/l10n/fr.php deleted file mode 100644 index 506453af42..0000000000 --- a/apps/calendar/l10n/fr.php +++ /dev/null @@ -1,162 +0,0 @@ - "Aucun calendrier n'a été trouvé.", -"No events found." => "Aucun événement n'a été trouvé.", -"Wrong calendar" => "Mauvais calendrier", -"New Timezone:" => "Nouveau fuseau horaire :", -"Timezone changed" => "Fuseau horaire modifié", -"Invalid request" => "Requête invalide", -"Calendar" => "Calendrier", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Anniversaire", -"Business" => "Professionnel", -"Call" => "Appel", -"Clients" => "Clientèle", -"Deliverer" => "Livraison", -"Holidays" => "Vacances", -"Ideas" => "Idées", -"Journey" => "Déplacement", -"Jubilee" => "Jubilé", -"Meeting" => "Meeting", -"Other" => "Autre", -"Personal" => "Personnel", -"Projects" => "Projets", -"Questions" => "Questions", -"Work" => "Travail", -"unnamed" => "sans-nom", -"Does not repeat" => "Pas de répétition", -"Daily" => "Tous les jours", -"Weekly" => "Hebdomadaire", -"Every Weekday" => "Quotidien", -"Bi-Weekly" => "Bi-hebdomadaire", -"Monthly" => "Mensuel", -"Yearly" => "Annuel", -"never" => "jamais", -"by occurrences" => "par occurrences", -"by date" => "par date", -"by monthday" => "par jour du mois", -"by weekday" => "par jour de la semaine", -"Monday" => "Lundi", -"Tuesday" => "Mardi", -"Wednesday" => "Mercredi", -"Thursday" => "Jeudi", -"Friday" => "Vendredi", -"Saturday" => "Samedi", -"Sunday" => "Dimanche", -"events week of month" => "événements du mois par semaine", -"first" => "premier", -"second" => "deuxième", -"third" => "troisième", -"fourth" => "quatrième", -"fifth" => "cinquième", -"last" => "dernier", -"January" => "Janvier", -"February" => "Février", -"March" => "Mars", -"April" => "Avril", -"May" => "Mai", -"June" => "Juin", -"July" => "Juillet", -"August" => "Août", -"September" => "Septembre", -"October" => "Octobre", -"November" => "Novembre", -"December" => "Décembre", -"by events date" => "par date d’événements", -"by yearday(s)" => "par jour(s) de l'année", -"by weeknumber(s)" => "par numéro de semaine(s)", -"by day and month" => "par jour et mois", -"Date" => "Date", -"Cal." => "Cal.", -"All day" => "Journée entière", -"New Calendar" => "Nouveau Calendrier", -"Missing fields" => "Champs manquants", -"Title" => "Titre", -"From Date" => "De la date", -"From Time" => "De l'heure", -"To Date" => "A la date", -"To Time" => "A l'heure", -"The event ends before it starts" => "L'évènement s'est terminé avant qu'il ne commence", -"There was a database fail" => "Il y a eu un échec dans la base de donnée", -"Week" => "Semaine", -"Month" => "Mois", -"List" => "Liste", -"Today" => "Aujourd'hui", -"Calendars" => "Calendriers", -"There was a fail, while parsing the file." => "Une erreur est survenue pendant la lecture du fichier.", -"Choose active calendars" => "Choix des calendriers actifs", -"Your calendars" => "Vos calendriers", -"CalDav Link" => "Lien CalDav", -"Shared calendars" => "Calendriers partagés", -"No shared calendars" => "Aucun calendrier partagé", -"Share Calendar" => "Partager le calendrier", -"Download" => "Télécharger", -"Edit" => "Éditer", -"Delete" => "Supprimer", -"shared with you by" => "partagé avec vous par", -"New calendar" => "Nouveau calendrier", -"Edit calendar" => "Éditer le calendrier", -"Displayname" => "Nom d'affichage", -"Active" => "Actif", -"Calendar color" => "Couleur du calendrier", -"Save" => "Sauvegarder", -"Submit" => "Soumettre", -"Cancel" => "Annuler", -"Edit an event" => "Éditer un événement", -"Export" => "Exporter", -"Eventinfo" => "Événement", -"Repeating" => "Occurences", -"Alarm" => "Alarmes", -"Attendees" => "Participants", -"Share" => "Partage", -"Title of the Event" => "Titre de l'événement", -"Category" => "Catégorie", -"Separate categories with commas" => "Séparer les catégories par des virgules", -"Edit categories" => "Modifier les catégories", -"All Day Event" => "Journée entière", -"From" => "De", -"To" => "À", -"Advanced options" => "Options avancées", -"Location" => "Emplacement", -"Location of the Event" => "Emplacement de l'événement", -"Description" => "Description", -"Description of the Event" => "Description de l'événement", -"Repeat" => "Répétition", -"Advanced" => "Avancé", -"Select weekdays" => "Sélection des jours de la semaine", -"Select days" => "Sélection des jours", -"and the events day of year." => "et les événements de l'année par jour.", -"and the events day of month." => "et les événements du mois par jour.", -"Select months" => "Sélection des mois", -"Select weeks" => "Sélection des semaines", -"and the events week of year." => "et les événements de l'année par semaine.", -"Interval" => "Intervalle", -"End" => "Fin", -"occurrences" => "occurrences", -"Import a calendar file" => "Importer un fichier de calendriers", -"Please choose the calendar" => "Choisissez le calendrier svp", -"create a new calendar" => "Créer un nouveau calendrier", -"Name of new calendar" => "Nom pour le nouveau calendrier", -"Import" => "Importer", -"Importing calendar" => "Import du calendrier", -"Calendar imported successfully" => "Calendrier importé avec succès", -"Close Dialog" => "Fermer la fenêtre", -"Create a new event" => "Créer un nouvel événement", -"View an event" => "Voir un événement", -"No categories selected" => "Aucune catégorie sélectionnée", -"Select category" => "Sélectionner une catégorie", -"of" => "de", -"at" => "à", -"Timezone" => "Fuseau horaire", -"Check always for changes of the timezone" => "Toujours vérifier d'éventuels changements de fuseau horaire", -"Timeformat" => "Format de l'heure", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Premier jour de la semaine", -"Calendar CalDAV syncing address:" => "Adresse de synchronisation du calendrier CalDAV :", -"Users" => "Utilisateurs", -"select users" => "sélectionner les utilisateurs", -"Editable" => "Modifiable", -"Groups" => "Groupes", -"select groups" => "sélectionner les groupes", -"make public" => "rendre public" -); diff --git a/apps/calendar/l10n/gl.php b/apps/calendar/l10n/gl.php deleted file mode 100644 index 3178b1819e..0000000000 --- a/apps/calendar/l10n/gl.php +++ /dev/null @@ -1,162 +0,0 @@ - "Non se atoparon calendarios.", -"No events found." => "Non se atoparon eventos.", -"Wrong calendar" => "Calendario equivocado", -"New Timezone:" => "Novo fuso horario:", -"Timezone changed" => "Fuso horario trocado", -"Invalid request" => "Petición non válida", -"Calendar" => "Calendario", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—'d [ MMM] yyyy}", -"Birthday" => "Aniversario", -"Business" => "Traballo", -"Call" => "Chamada", -"Clients" => "Clientes", -"Deliverer" => "Remitente", -"Holidays" => "Vacacións", -"Ideas" => "Ideas", -"Journey" => "Viaxe", -"Jubilee" => "Aniversario especial", -"Meeting" => "Reunión", -"Other" => "Outro", -"Personal" => "Persoal", -"Projects" => "Proxectos", -"Questions" => "Preguntas", -"Work" => "Traballo", -"unnamed" => "sen nome", -"Does not repeat" => "Non se repite", -"Daily" => "A diario", -"Weekly" => "Semanalmente", -"Every Weekday" => "Todas as semanas", -"Bi-Weekly" => "Cada dúas semanas", -"Monthly" => "Mensual", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por acontecementos", -"by date" => "por data", -"by monthday" => "por día do mes", -"by weekday" => "por día da semana", -"Monday" => "Luns", -"Tuesday" => "Martes", -"Wednesday" => "Mércores", -"Thursday" => "Xoves", -"Friday" => "Venres", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "semana dos eventos no mes", -"first" => "primeiro", -"second" => "segundo", -"third" => "terceiro", -"fourth" => "cuarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Xaneiro", -"February" => "Febreiro", -"March" => "Marzo", -"April" => "Abril", -"May" => "Maio", -"June" => "Xuño", -"July" => "Xullo", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Decembro", -"by events date" => "por data dos eventos", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) de semana", -"by day and month" => "por día e mes", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Todo o dia", -"New Calendar" => "Novo calendario", -"Missing fields" => "Faltan campos", -"Title" => "Título", -"From Date" => "Desde a data", -"From Time" => "Desde a hora", -"To Date" => "á data", -"To Time" => "á hora", -"The event ends before it starts" => "O evento remata antes de iniciarse", -"There was a database fail" => "Produciuse un erro na base de datos", -"Week" => "Semana", -"Month" => "Mes", -"List" => "Lista", -"Today" => "Hoxe", -"Calendars" => "Calendarios", -"There was a fail, while parsing the file." => "Produciuse un erro ao procesar o ficheiro", -"Choose active calendars" => "Escolla os calendarios activos", -"Your calendars" => "Os seus calendarios", -"CalDav Link" => "Ligazón CalDav", -"Shared calendars" => "Calendarios compartidos", -"No shared calendars" => "Sen calendarios compartidos", -"Share Calendar" => "Compartir calendario", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Borrar", -"shared with you by" => "compartido con vostede por", -"New calendar" => "Novo calendario", -"Edit calendar" => "Editar calendario", -"Displayname" => "Mostrar nome", -"Active" => "Activo", -"Calendar color" => "Cor do calendario", -"Save" => "Gardar", -"Submit" => "Enviar", -"Cancel" => "Cancelar", -"Edit an event" => "Editar un evento", -"Export" => "Exportar", -"Eventinfo" => "Info do evento", -"Repeating" => "Repetido", -"Alarm" => "Alarma", -"Attendees" => "Participantes", -"Share" => "Compartir", -"Title of the Event" => "Título do evento", -"Category" => "Categoría", -"Separate categories with commas" => "Separe as categorías con comas", -"Edit categories" => "Editar categorías", -"All Day Event" => "Eventos do día", -"From" => "Desde", -"To" => "a", -"Advanced options" => "Opcións avanzadas", -"Location" => "Localización", -"Location of the Event" => "Localización do evento", -"Description" => "Descrición", -"Description of the Event" => "Descrición do evento", -"Repeat" => "Repetir", -"Advanced" => "Avanzado", -"Select weekdays" => "Seleccionar días da semana", -"Select days" => "Seleccionar días", -"and the events day of year." => "e día dos eventos no ano.", -"and the events day of month." => "e día dos eventos no mes.", -"Select months" => "Seleccione meses", -"Select weeks" => "Seleccionar semanas", -"and the events week of year." => "e semana dos eventos no ano.", -"Interval" => "Intervalo", -"End" => "Fin", -"occurrences" => "acontecementos", -"Import a calendar file" => "Importar un ficheiro de calendario", -"Please choose the calendar" => "Por favor, seleccione o calendario", -"create a new calendar" => "crear un novo calendario", -"Name of new calendar" => "Nome do novo calendario", -"Import" => "Importar", -"Importing calendar" => "Importar calendario", -"Calendar imported successfully" => "Calendario importado correctamente", -"Close Dialog" => "Pechar diálogo", -"Create a new event" => "Crear un novo evento", -"View an event" => "Ver un evento", -"No categories selected" => "Non seleccionou as categorías", -"Select category" => "Seleccionar categoría", -"of" => "de", -"at" => "a", -"Timezone" => "Fuso horario", -"Check always for changes of the timezone" => "Comprobar sempre cambios de fuso horario", -"Timeformat" => "Formato de hora", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primeiro día da semana", -"Calendar CalDAV syncing address:" => "Enderezo de sincronización do calendario CalDAV:", -"Users" => "Usuarios", -"select users" => "escoller usuarios", -"Editable" => "Editable", -"Groups" => "Grupos", -"select groups" => "escoller grupos", -"make public" => "facer público" -); diff --git a/apps/calendar/l10n/he.php b/apps/calendar/l10n/he.php deleted file mode 100644 index c161d3be2e..0000000000 --- a/apps/calendar/l10n/he.php +++ /dev/null @@ -1,162 +0,0 @@ - "לא נמצאו לוחות שנה.", -"No events found." => "לא נמצאו אירועים.", -"Wrong calendar" => "לוח שנה לא נכון", -"New Timezone:" => "אזור זמן חדש:", -"Timezone changed" => "אזור זמן השתנה", -"Invalid request" => "בקשה לא חוקית", -"Calendar" => "ח שנה", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM [ yyyy]{ '—'d[ MMM] yyyy}", -"Birthday" => "יום הולדת", -"Business" => "עסקים", -"Call" => "שיחה", -"Clients" => "לקוחות", -"Deliverer" => "משלוח", -"Holidays" => "חגים", -"Ideas" => "רעיונות", -"Journey" => "מסע", -"Jubilee" => "יובל", -"Meeting" => "פגישה", -"Other" => "אחר", -"Personal" => "אישי", -"Projects" => "פרוייקטים", -"Questions" => "שאלות", -"Work" => "עבודה", -"unnamed" => "ללא שם", -"Does not repeat" => "ללא חזרה", -"Daily" => "יומי", -"Weekly" => "שבועי", -"Every Weekday" => "כל יום עבודה", -"Bi-Weekly" => "דו שבועי", -"Monthly" => "חודשי", -"Yearly" => "שנתי", -"never" => "לעולם לא", -"by occurrences" => "לפי מופעים", -"by date" => "לפי תאריך", -"by monthday" => "לפי היום בחודש", -"by weekday" => "לפי היום בשבוע", -"Monday" => "יום שני", -"Tuesday" => "יום שלישי", -"Wednesday" => "יום רביעי", -"Thursday" => "יום חמישי", -"Friday" => "יום שישי", -"Saturday" => "שבת", -"Sunday" => "יום ראשון", -"events week of month" => "שבוע בחודש לציון הפעילות", -"first" => "ראשון", -"second" => "שני", -"third" => "שלישי", -"fourth" => "רביעי", -"fifth" => "חמישי", -"last" => "אחרון", -"January" => "ינואר", -"February" => "פברואר", -"March" => "מרץ", -"April" => "אפריל", -"May" => "מאי", -"June" => "יוני", -"July" => "יולי", -"August" => "אוגוסט", -"September" => "ספטמבר", -"October" => "אוקטובר", -"November" => "נובמבר", -"December" => "דצמבר", -"by events date" => "לפי תאריכי האירועים", -"by yearday(s)" => "לפי ימים בשנה", -"by weeknumber(s)" => "לפי מספרי השבועות", -"by day and month" => "לפי יום וחודש", -"Date" => "תאריך", -"Cal." => "לוח שנה", -"All day" => "היום", -"New Calendar" => "לוח שנה חדש", -"Missing fields" => "שדות חסרים", -"Title" => "כותרת", -"From Date" => "מתאריך", -"From Time" => "משעה", -"To Date" => "עד תאריך", -"To Time" => "עד שעה", -"The event ends before it starts" => "האירוע מסתיים עוד לפני שהתחיל", -"There was a database fail" => "אירע כשל במסד הנתונים", -"Week" => "שבוע", -"Month" => "חודש", -"List" => "רשימה", -"Today" => "היום", -"Calendars" => "לוחות שנה", -"There was a fail, while parsing the file." => "אירעה שגיאה בעת פענוח הקובץ.", -"Choose active calendars" => "בחר לוחות שנה פעילים", -"Your calendars" => "לוחות השנה שלך", -"CalDav Link" => "קישור CalDav", -"Shared calendars" => "לוחות שנה מושתפים", -"No shared calendars" => "אין לוחות שנה משותפים", -"Share Calendar" => "שיתוף לוח שנה", -"Download" => "הורדה", -"Edit" => "עריכה", -"Delete" => "מחיקה", -"shared with you by" => "שותף אתך על ידי", -"New calendar" => "לוח שנה חדש", -"Edit calendar" => "עריכת לוח שנה", -"Displayname" => "שם תצוגה", -"Active" => "פעיל", -"Calendar color" => "צבע לוח שנה", -"Save" => "שמירה", -"Submit" => "שליחה", -"Cancel" => "ביטול", -"Edit an event" => "עריכת אירוע", -"Export" => "יצוא", -"Eventinfo" => "פרטי האירוע", -"Repeating" => "חוזר", -"Alarm" => "תזכורת", -"Attendees" => "משתתפים", -"Share" => "שיתוף", -"Title of the Event" => "כותרת האירוע", -"Category" => "קטגוריה", -"Separate categories with commas" => "הפרדת קטגוריות בפסיק", -"Edit categories" => "עריכת קטגוריות", -"All Day Event" => "אירוע של כל היום", -"From" => "מאת", -"To" => "עבור", -"Advanced options" => "אפשרויות מתקדמות", -"Location" => "מיקום", -"Location of the Event" => "מיקום האירוע", -"Description" => "תיאור", -"Description of the Event" => "תיאור האירוע", -"Repeat" => "חזרה", -"Advanced" => "מתקדם", -"Select weekdays" => "יש לבחור ימים בשבוע", -"Select days" => "יש לבחור בימים", -"and the events day of year." => "ויום האירוע בשנה.", -"and the events day of month." => "ויום האירוע בחודש.", -"Select months" => "יש לבחור בחודשים", -"Select weeks" => "יש לבחור בשבועות", -"and the events week of year." => "ומספור השבוע הפעיל בשנה.", -"Interval" => "משך", -"End" => "סיום", -"occurrences" => "מופעים", -"Import a calendar file" => "יבוא קובץ לוח שנה", -"Please choose the calendar" => "נא לבחור את לוח השנה", -"create a new calendar" => "יצירת לוח שנה חדש", -"Name of new calendar" => "שם לוח השנה החדש", -"Import" => "יבוא", -"Importing calendar" => "היומן מייובא", -"Calendar imported successfully" => "היומן ייובא בהצלחה", -"Close Dialog" => "סגירת הדו־שיח", -"Create a new event" => "יצירת אירוע חדש", -"View an event" => "צפייה באירוע", -"No categories selected" => "לא נבחרו קטגוריות", -"Select category" => "בחר קטגוריה", -"of" => "מתוך", -"at" => "בשנה", -"Timezone" => "אזור זמן", -"Check always for changes of the timezone" => "יש לבדוק תמיד אם יש הבדלים באזורי הזמן", -"Timeformat" => "מבנה התאריך", -"24h" => "24 שעות", -"12h" => "12 שעות", -"First day of the week" => "היום הראשון בשבוע", -"Calendar CalDAV syncing address:" => "כתובת הסנכרון ללוח שנה מסוג CalDAV:", -"Users" => "משתמשים", -"select users" => "נא לבחור במשתמשים", -"Editable" => "ניתן לעריכה", -"Groups" => "קבוצות", -"select groups" => "בחירת קבוצות", -"make public" => "הפיכה לציבורי" -); diff --git a/apps/calendar/l10n/hr.php b/apps/calendar/l10n/hr.php deleted file mode 100644 index 551bb4abbc..0000000000 --- a/apps/calendar/l10n/hr.php +++ /dev/null @@ -1,158 +0,0 @@ - "Nisu pronađeni kalendari", -"No events found." => "Događaj nije pronađen.", -"Wrong calendar" => "Pogrešan kalendar", -"New Timezone:" => "Nova vremenska zona:", -"Timezone changed" => "Vremenska zona promijenjena", -"Invalid request" => "Neispravan zahtjev", -"Calendar" => "Kalendar", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Rođendan", -"Business" => "Poslovno", -"Call" => "Poziv", -"Clients" => "Klijenti", -"Deliverer" => "Dostavljač", -"Holidays" => "Praznici", -"Ideas" => "Ideje", -"Journey" => "Putovanje", -"Jubilee" => "Obljetnica", -"Meeting" => "Sastanak", -"Other" => "Ostalo", -"Personal" => "Osobno", -"Projects" => "Projekti", -"Questions" => "Pitanja", -"Work" => "Posao", -"unnamed" => "bezimeno", -"Does not repeat" => "Ne ponavlja se", -"Daily" => "Dnevno", -"Weekly" => "Tjedno", -"Every Weekday" => "Svakog radnog dana", -"Bi-Weekly" => "Dvotjedno", -"Monthly" => "Mjesečno", -"Yearly" => "Godišnje", -"never" => "nikad", -"by occurrences" => "po pojavama", -"by date" => "po datum", -"by monthday" => "po dana mjeseca", -"by weekday" => "po tjednu", -"Monday" => "ponedeljak", -"Tuesday" => "utorak", -"Wednesday" => "srijeda", -"Thursday" => "četvrtak", -"Friday" => "petak", -"Saturday" => "subota", -"Sunday" => "nedelja", -"first" => "prvi", -"second" => "drugi", -"third" => "treći", -"fourth" => "četvrti", -"fifth" => "peti", -"last" => "zadnji", -"January" => "siječanj", -"February" => "veljača", -"March" => "ožujak", -"April" => "travanj", -"May" => "svibanj", -"June" => "lipanj", -"July" => "srpanj", -"August" => "kolovoz", -"September" => "rujan", -"October" => "listopad", -"November" => "studeni", -"December" => "prosinac", -"by events date" => "po datumu događaja", -"by yearday(s)" => "po godini(-nama)", -"by weeknumber(s)" => "po broju tjedna(-ana)", -"by day and month" => "po danu i mjeseca", -"Date" => "datum", -"Cal." => "Kal.", -"All day" => "Cijeli dan", -"New Calendar" => "Novi kalendar", -"Missing fields" => "Nedostaju polja", -"Title" => "Naslov", -"From Date" => "Datum od", -"From Time" => "Vrijeme od", -"To Date" => "Datum do", -"To Time" => "Vrijeme do", -"The event ends before it starts" => "Događaj završava prije nego počinje", -"There was a database fail" => "Pogreška u bazi podataka", -"Week" => "Tjedan", -"Month" => "Mjesec", -"List" => "Lista", -"Today" => "Danas", -"Calendars" => "Kalendari", -"There was a fail, while parsing the file." => "Pogreška pri čitanju datoteke.", -"Choose active calendars" => "Odabir aktivnih kalendara", -"Your calendars" => "Vaši kalendari", -"CalDav Link" => "CalDav poveznica", -"Shared calendars" => "Podijeljeni kalendari", -"No shared calendars" => "Nema zajedničkih kalendara", -"Share Calendar" => "Podjeli kalendar", -"Download" => "Spremi lokalno", -"Edit" => "Uredi", -"Delete" => "Briši", -"shared with you by" => "podijeljeno s vama od ", -"New calendar" => "Novi kalendar", -"Edit calendar" => "Uredi kalendar", -"Displayname" => "Naziv", -"Active" => "Aktivan", -"Calendar color" => "Boja kalendara", -"Save" => "Spremi", -"Submit" => "Potvrdi", -"Cancel" => "Odustani", -"Edit an event" => "Uredi događaj", -"Export" => "Izvoz", -"Eventinfo" => "Informacije o događaju", -"Repeating" => "Ponavljanje", -"Alarm" => "Alarm", -"Attendees" => "Polaznici", -"Share" => "Podijeli", -"Title of the Event" => "Naslov događaja", -"Category" => "Kategorija", -"Separate categories with commas" => "Odvoji kategorije zarezima", -"Edit categories" => "Uredi kategorije", -"All Day Event" => "Cjelodnevni događaj", -"From" => "Od", -"To" => "Za", -"Advanced options" => "Napredne mogućnosti", -"Location" => "Lokacija", -"Location of the Event" => "Lokacija događaja", -"Description" => "Opis", -"Description of the Event" => "Opis događaja", -"Repeat" => "Ponavljanje", -"Advanced" => "Napredno", -"Select weekdays" => "Odaberi dane u tjednu", -"Select days" => "Odaberi dane", -"Select months" => "Odaberi mjesece", -"Select weeks" => "Odaberi tjedne", -"Interval" => "Interval", -"End" => "Kraj", -"occurrences" => "pojave", -"Import a calendar file" => "Uvozite datoteku kalendara", -"Please choose the calendar" => "Odaberi kalendar", -"create a new calendar" => "stvori novi kalendar", -"Name of new calendar" => "Ime novog kalendara", -"Import" => "Uvoz", -"Importing calendar" => "Uvoz kalendara", -"Calendar imported successfully" => "Kalendar je uspješno uvezen", -"Close Dialog" => "Zatvori dijalog", -"Create a new event" => "Unesi novi događaj", -"View an event" => "Vidjeti događaj", -"No categories selected" => "Nema odabranih kategorija", -"Select category" => "Odabir kategorije", -"of" => "od", -"at" => "na", -"Timezone" => "Vremenska zona", -"Check always for changes of the timezone" => "Provjerite uvijek za promjene vremenske zone", -"Timeformat" => "Format vremena", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Prvi dan tjedna", -"Calendar CalDAV syncing address:" => "Adresa za CalDAV sinkronizaciju kalendara:", -"Users" => "Korisnici", -"select users" => "odaberi korisnike", -"Editable" => "Može se uređivati", -"Groups" => "Grupe", -"select groups" => "izaberite grupe", -"make public" => "podjeli s javnošću" -); diff --git a/apps/calendar/l10n/hu_HU.php b/apps/calendar/l10n/hu_HU.php deleted file mode 100644 index d97887aac7..0000000000 --- a/apps/calendar/l10n/hu_HU.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nem található naptár", -"No events found." => "Nem található esemény", -"Wrong calendar" => "Hibás naptár", -"New Timezone:" => "Új időzóna", -"Timezone changed" => "Időzóna megváltozott", -"Invalid request" => "Érvénytelen kérés", -"Calendar" => "Naptár", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Születésap", -"Business" => "Üzlet", -"Call" => "Hívás", -"Clients" => "Kliensek", -"Deliverer" => "Szállító", -"Holidays" => "Ünnepek", -"Ideas" => "Ötletek", -"Journey" => "Utazás", -"Jubilee" => "Évforduló", -"Meeting" => "Találkozó", -"Other" => "Egyéb", -"Personal" => "Személyes", -"Projects" => "Projektek", -"Questions" => "Kérdések", -"Work" => "Munka", -"unnamed" => "névtelen", -"Does not repeat" => "Nem ismétlődik", -"Daily" => "Napi", -"Weekly" => "Heti", -"Every Weekday" => "Minden hétköznap", -"Bi-Weekly" => "Kéthetente", -"Monthly" => "Havi", -"Yearly" => "Évi", -"never" => "soha", -"by occurrences" => "előfordulás szerint", -"by date" => "dátum szerint", -"by monthday" => "hónap napja szerint", -"by weekday" => "hét napja szerint", -"Monday" => "Hétfő", -"Tuesday" => "Kedd", -"Wednesday" => "Szerda", -"Thursday" => "Csütörtök", -"Friday" => "Péntek", -"Saturday" => "Szombat", -"Sunday" => "Vasárnap", -"events week of month" => "hónap heteinek sorszáma", -"first" => "első", -"second" => "második", -"third" => "harmadik", -"fourth" => "negyedik", -"fifth" => "ötödik", -"last" => "utolsó", -"January" => "Január", -"February" => "Február", -"March" => "Március", -"April" => "Április", -"May" => "Május", -"June" => "Június", -"July" => "Július", -"August" => "Augusztus", -"September" => "Szeptember", -"October" => "Október", -"November" => "November", -"December" => "December", -"by events date" => "az esemény napja szerint", -"by yearday(s)" => "az év napja(i) szerint", -"by weeknumber(s)" => "a hét sorszáma szerint", -"by day and month" => "nap és hónap szerint", -"Date" => "Dátum", -"Cal." => "Naptár", -"All day" => "Egész nap", -"New Calendar" => "Új naptár", -"Missing fields" => "Hiányzó mezők", -"Title" => "Cím", -"From Date" => "Napjától", -"From Time" => "Időtől", -"To Date" => "Napig", -"To Time" => "Ideig", -"The event ends before it starts" => "Az esemény véget ér a kezdés előtt.", -"There was a database fail" => "Adatbázis hiba történt", -"Week" => "Hét", -"Month" => "Hónap", -"List" => "Lista", -"Today" => "Ma", -"Calendars" => "Naptárak", -"There was a fail, while parsing the file." => "Probléma volt a fájl elemzése közben.", -"Choose active calendars" => "Aktív naptár kiválasztása", -"Your calendars" => "Naptárjaid", -"CalDav Link" => "CalDAV link", -"Shared calendars" => "Megosztott naptárak", -"No shared calendars" => "Nincs megosztott naptár", -"Share Calendar" => "Naptármegosztás", -"Download" => "Letöltés", -"Edit" => "Szerkesztés", -"Delete" => "Törlés", -"shared with you by" => "megosztotta veled: ", -"New calendar" => "Új naptár", -"Edit calendar" => "Naptár szerkesztése", -"Displayname" => "Megjelenítési név", -"Active" => "Aktív", -"Calendar color" => "Naptár szín", -"Save" => "Mentés", -"Submit" => "Beküldés", -"Cancel" => "Mégse", -"Edit an event" => "Esemény szerkesztése", -"Export" => "Export", -"Eventinfo" => "Eseményinfó", -"Repeating" => "Ismétlődő", -"Alarm" => "Riasztás", -"Attendees" => "Résztvevők", -"Share" => "Megosztás", -"Title of the Event" => "Az esemény címe", -"Category" => "Kategória", -"Separate categories with commas" => "Vesszővel válaszd el a kategóriákat", -"Edit categories" => "Kategóriák szerkesztése", -"All Day Event" => "Egész napos esemény", -"From" => "Ettől", -"To" => "Eddig", -"Advanced options" => "Haladó beállítások", -"Location" => "Hely", -"Location of the Event" => "Az esemény helyszíne", -"Description" => "Leírás", -"Description of the Event" => "Az esemény leírása", -"Repeat" => "Ismétlés", -"Advanced" => "Haladó", -"Select weekdays" => "Hétköznapok kiválasztása", -"Select days" => "Napok kiválasztása", -"and the events day of year." => "és az éves esemény napja.", -"and the events day of month." => "és a havi esemény napja.", -"Select months" => "Hónapok kiválasztása", -"Select weeks" => "Hetek kiválasztása", -"and the events week of year." => "és az heti esemény napja.", -"Interval" => "Időköz", -"End" => "Vége", -"occurrences" => "előfordulások", -"Import a calendar file" => "Naptár-fájl importálása", -"Please choose the calendar" => "Válassz naptárat", -"create a new calendar" => "új naptár létrehozása", -"Name of new calendar" => "Új naptár neve", -"Import" => "Importálás", -"Importing calendar" => "Naptár importálása", -"Calendar imported successfully" => "Naptár sikeresen importálva", -"Close Dialog" => "Párbeszédablak bezárása", -"Create a new event" => "Új esemény létrehozása", -"View an event" => "Esemény megtekintése", -"No categories selected" => "Nincs kiválasztott kategória", -"Select category" => "Kategória kiválasztása", -"of" => ", tulaj ", -"at" => ", ", -"Timezone" => "Időzóna", -"Check always for changes of the timezone" => "Mindig ellenőrizze az időzóna-változásokat", -"Timeformat" => "Időformátum", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "A hét első napja", -"Calendar CalDAV syncing address:" => "Naptár CalDAV szinkronizálási cím:", -"Users" => "Felhasználók", -"select users" => "válassz felhasználókat", -"Editable" => "Szerkeszthető", -"Groups" => "Csoportok", -"select groups" => "válassz csoportokat", -"make public" => "nyilvánossá tétel" -); diff --git a/apps/calendar/l10n/hy.php b/apps/calendar/l10n/hy.php deleted file mode 100644 index 3b675693b0..0000000000 --- a/apps/calendar/l10n/hy.php +++ /dev/null @@ -1,11 +0,0 @@ - "Օրացույց", -"Other" => "Այլ", -"Month" => "Ամիս", -"Today" => "Այսօր", -"Download" => "Բեռնել", -"Delete" => "Ջնջել", -"Save" => "Պահպանել", -"Submit" => "Հաստատել", -"Description" => "Նկարագրություն" -); diff --git a/apps/calendar/l10n/ia.php b/apps/calendar/l10n/ia.php deleted file mode 100644 index a346e4de5b..0000000000 --- a/apps/calendar/l10n/ia.php +++ /dev/null @@ -1,115 +0,0 @@ - "Necun calendarios trovate.", -"No events found." => "Nulle eventos trovate.", -"New Timezone:" => "Nove fuso horari", -"Invalid request" => "Requesta invalide.", -"Calendar" => "Calendario", -"Birthday" => "Anniversario de nativitate", -"Business" => "Affaires", -"Call" => "Appello", -"Clients" => "Clientes", -"Holidays" => "Dies feriate", -"Meeting" => "Incontro", -"Other" => "Altere", -"Personal" => "Personal", -"Projects" => "Projectos", -"Questions" => "Demandas", -"Work" => "Travalio", -"unnamed" => "sin nomine", -"Does not repeat" => "Non repite", -"Daily" => "Quotidian", -"Weekly" => "Septimanal", -"Every Weekday" => "Cata die", -"Monthly" => "Mensual", -"Yearly" => "Cata anno", -"never" => "nunquam", -"by date" => "per data", -"Monday" => "Lunedi", -"Tuesday" => "Martedi", -"Wednesday" => "Mercuridi", -"Thursday" => "Jovedi", -"Friday" => "Venerdi", -"Saturday" => "Sabbato", -"Sunday" => "Dominica", -"first" => "prime", -"second" => "secunde", -"third" => "tertie", -"last" => "ultime", -"January" => "januario", -"February" => "Februario", -"March" => "Martio", -"April" => "April", -"May" => "Mai", -"June" => "Junio", -"July" => "Julio", -"August" => "Augusto", -"September" => "Septembre", -"October" => "Octobre", -"November" => "Novembre", -"December" => "Decembre", -"by events date" => "per data de eventos", -"by day and month" => "per dia e mense", -"Date" => "Data", -"All day" => "Omne die", -"New Calendar" => "Nove calendario", -"Missing fields" => "Campos incomplete", -"Title" => "Titulo", -"From Date" => "Data de initio", -"From Time" => "Hora de initio", -"To Date" => "Data de fin", -"To Time" => "Hora de fin", -"Week" => "Septimana", -"Month" => "Mense", -"List" => "Lista", -"Today" => "Hodie", -"Calendars" => "Calendarios", -"Choose active calendars" => "Selectionar calendarios active", -"Your calendars" => "Tu calendarios", -"Download" => "Discarga", -"Edit" => "Modificar", -"Delete" => "Deler", -"New calendar" => "Nove calendario", -"Edit calendar" => "Modificar calendario", -"Active" => "Active", -"Calendar color" => "Color de calendario", -"Save" => "Salveguardar", -"Submit" => "Inviar", -"Cancel" => "Cancellar", -"Edit an event" => "Modificar evento", -"Export" => "Exportar", -"Share" => "Compartir", -"Title of the Event" => "Titulo del evento.", -"Category" => "Categoria", -"Edit categories" => "Modificar categorias", -"From" => "Ab", -"To" => "A", -"Advanced options" => "Optiones avantiate", -"Location" => "Loco", -"Location of the Event" => "Loco del evento.", -"Description" => "Description", -"Description of the Event" => "Description del evento", -"Repeat" => "Repeter", -"Advanced" => "Avantiate", -"Select weekdays" => "Seliger dies del septimana", -"Select days" => "Seliger dies", -"Select months" => "Seliger menses", -"Select weeks" => "Seliger septimanas", -"Interval" => "Intervallo", -"End" => "Fin", -"Import a calendar file" => "Importar un file de calendario", -"Please choose the calendar" => "Selige el calendario", -"create a new calendar" => "crear un nove calendario", -"Name of new calendar" => "Nomine del calendario", -"Import" => "Importar", -"Close Dialog" => "Clauder dialogo", -"Create a new event" => "Crear un nove evento", -"View an event" => "Vide un evento", -"No categories selected" => "Nulle categorias seligite", -"Select category" => "Selectionar categoria", -"of" => "de", -"at" => "in", -"Timezone" => "Fuso horari", -"First day of the week" => "Prime die del septimana", -"Users" => "Usatores", -"Groups" => "Gruppos" -); diff --git a/apps/calendar/l10n/id.php b/apps/calendar/l10n/id.php deleted file mode 100644 index ac0734abba..0000000000 --- a/apps/calendar/l10n/id.php +++ /dev/null @@ -1,40 +0,0 @@ - "Zona waktu telah diubah", -"Invalid request" => "Permintaan tidak sah", -"Calendar" => "Kalender", -"Does not repeat" => "Tidak akan mengulangi", -"Daily" => "Harian", -"Weekly" => "Mingguan", -"Every Weekday" => "Setiap Hari Minggu", -"Bi-Weekly" => "Dwi-mingguan", -"Monthly" => "Bulanan", -"Yearly" => "Tahunan", -"All day" => "Semua Hari", -"Title" => "Judul", -"Week" => "Minggu", -"Month" => "Bulan", -"Today" => "Hari ini", -"Calendars" => "Kalender", -"There was a fail, while parsing the file." => "Terjadi kesalahan, saat mengurai berkas.", -"Choose active calendars" => "Pilih kalender aktif", -"Download" => "Unduh", -"Edit" => "Sunting", -"Edit calendar" => "Sunting kalender", -"Displayname" => "Namatampilan", -"Active" => "Aktif", -"Calendar color" => "Warna kalender", -"Submit" => "Sampaikan", -"Edit an event" => "Sunting agenda", -"Title of the Event" => "Judul Agenda", -"Category" => "Kategori", -"All Day Event" => "Agenda di Semua Hari", -"From" => "Dari", -"To" => "Ke", -"Location" => "Lokasi", -"Location of the Event" => "Lokasi Agenda", -"Description" => "Deskripsi", -"Description of the Event" => "Deskripsi dari Agenda", -"Repeat" => "Ulangi", -"Create a new event" => "Buat agenda baru", -"Timezone" => "Zonawaktu" -); diff --git a/apps/calendar/l10n/it.php b/apps/calendar/l10n/it.php deleted file mode 100644 index cdb2d99c82..0000000000 --- a/apps/calendar/l10n/it.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nessun calendario trovato.", -"No events found." => "Nessun evento trovato.", -"Wrong calendar" => "Calendario sbagliato", -"New Timezone:" => "Nuovo fuso orario:", -"Timezone changed" => "Fuso orario cambiato", -"Invalid request" => "Richiesta non valida", -"Calendar" => "Calendario", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Compleanno", -"Business" => "Azienda", -"Call" => "Chiama", -"Clients" => "Clienti", -"Deliverer" => "Consegna", -"Holidays" => "Vacanze", -"Ideas" => "Idee", -"Journey" => "Viaggio", -"Jubilee" => "Anniversario", -"Meeting" => "Riunione", -"Other" => "Altro", -"Personal" => "Personale", -"Projects" => "Progetti", -"Questions" => "Domande", -"Work" => "Lavoro", -"unnamed" => "senza nome", -"Does not repeat" => "Non ripetere", -"Daily" => "Giornaliero", -"Weekly" => "Settimanale", -"Every Weekday" => "Ogni giorno della settimana", -"Bi-Weekly" => "Ogni due settimane", -"Monthly" => "Mensile", -"Yearly" => "Annuale", -"never" => "mai", -"by occurrences" => "per occorrenze", -"by date" => "per data", -"by monthday" => "per giorno del mese", -"by weekday" => "per giorno della settimana", -"Monday" => "Lunedì", -"Tuesday" => "Martedì", -"Wednesday" => "Mercoledì", -"Thursday" => "Giovedì", -"Friday" => "Venerdì", -"Saturday" => "Sabato", -"Sunday" => "Domenica", -"events week of month" => "settimana del mese degli eventi", -"first" => "primo", -"second" => "secondo", -"third" => "terzo", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "ultimo", -"January" => "Gennaio", -"February" => "Febbraio", -"March" => "Marzo", -"April" => "Aprile", -"May" => "Maggio", -"June" => "Giugno", -"July" => "Luglio", -"August" => "Agosto", -"September" => "Settembre", -"October" => "Ottobre", -"November" => "Novembre", -"December" => "Dicembre", -"by events date" => "per data evento", -"by yearday(s)" => "per giorno/i dell'anno", -"by weeknumber(s)" => "per numero/i settimana", -"by day and month" => "per giorno e mese", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Tutti il giorno", -"New Calendar" => "Nuovo calendario", -"Missing fields" => "Campi mancanti", -"Title" => "Titolo", -"From Date" => "Dal giorno", -"From Time" => "Ora iniziale", -"To Date" => "Al giorno", -"To Time" => "Ora finale", -"The event ends before it starts" => "L'evento finisce prima d'iniziare", -"There was a database fail" => "Si è verificato un errore del database", -"Week" => "Settimana", -"Month" => "Mese", -"List" => "Elenco", -"Today" => "Oggi", -"Calendars" => "Calendari", -"There was a fail, while parsing the file." => "Si è verificato un errore durante l'analisi del file.", -"Choose active calendars" => "Scegli i calendari attivi", -"Your calendars" => "I tuoi calendari", -"CalDav Link" => "Collegamento CalDav", -"Shared calendars" => "Calendari condivisi", -"No shared calendars" => "Nessun calendario condiviso", -"Share Calendar" => "Condividi calendario", -"Download" => "Scarica", -"Edit" => "Modifica", -"Delete" => "Elimina", -"shared with you by" => "condiviso con te da", -"New calendar" => "Nuovo calendario", -"Edit calendar" => "Modifica calendario", -"Displayname" => "Nome visualizzato", -"Active" => "Attivo", -"Calendar color" => "Colore calendario", -"Save" => "Salva", -"Submit" => "Invia", -"Cancel" => "Annulla", -"Edit an event" => "Modifica un evento", -"Export" => "Esporta", -"Eventinfo" => "Informazioni evento", -"Repeating" => "Ripetizione", -"Alarm" => "Avviso", -"Attendees" => "Partecipanti", -"Share" => "Condividi", -"Title of the Event" => "Titolo dell'evento", -"Category" => "Categoria", -"Separate categories with commas" => "Categorie separate con virgole", -"Edit categories" => "Modifica le categorie", -"All Day Event" => "Evento che occupa tutta la giornata", -"From" => "Da", -"To" => "A", -"Advanced options" => "Opzioni avanzate", -"Location" => "Luogo", -"Location of the Event" => "Luogo dell'evento", -"Description" => "Descrizione", -"Description of the Event" => "Descrizione dell'evento", -"Repeat" => "Ripeti", -"Advanced" => "Avanzato", -"Select weekdays" => "Seleziona i giorni della settimana", -"Select days" => "Seleziona i giorni", -"and the events day of year." => "e il giorno dell'anno degli eventi.", -"and the events day of month." => "e il giorno del mese degli eventi.", -"Select months" => "Seleziona i mesi", -"Select weeks" => "Seleziona le settimane", -"and the events week of year." => "e la settimana dell'anno degli eventi.", -"Interval" => "Intervallo", -"End" => "Fine", -"occurrences" => "occorrenze", -"Import a calendar file" => "Importa un file di calendario", -"Please choose the calendar" => "Scegli il calendario", -"create a new calendar" => "Crea un nuovo calendario", -"Name of new calendar" => "Nome del nuovo calendario", -"Import" => "Importa", -"Importing calendar" => "Importazione del calendario in corso", -"Calendar imported successfully" => "Calendario importato correttamente", -"Close Dialog" => "Chiudi la finestra di dialogo", -"Create a new event" => "Crea un nuovo evento", -"View an event" => "Visualizza un evento", -"No categories selected" => "Nessuna categoria selezionata", -"Select category" => "Seleziona una categoria", -"of" => "di", -"at" => "alle", -"Timezone" => "Fuso orario", -"Check always for changes of the timezone" => "Controlla sempre i cambiamenti di fuso orario", -"Timeformat" => "Formato orario", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primo giorno della settimana", -"Calendar CalDAV syncing address:" => "Indirizzo sincronizzazione calendario CalDAV:", -"Users" => "Utenti", -"select users" => "seleziona utenti", -"Editable" => "Modificabile", -"Groups" => "Gruppi", -"select groups" => "seleziona gruppi", -"make public" => "rendi pubblico" -); diff --git a/apps/calendar/l10n/ja_JP.php b/apps/calendar/l10n/ja_JP.php deleted file mode 100644 index c533a9bd1a..0000000000 --- a/apps/calendar/l10n/ja_JP.php +++ /dev/null @@ -1,160 +0,0 @@ - "カレンダーが見つかりませんでした。", -"No events found." => "イベントが見つかりませんでした。", -"Wrong calendar" => "誤ったカレンダーです", -"New Timezone:" => "新しいタイムゾーン:", -"Timezone changed" => "タイムゾーンが変更されました", -"Invalid request" => "無効なリクエストです", -"Calendar" => "カレンダー", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "誕生日", -"Business" => "ビジネス", -"Call" => "電話をかける", -"Clients" => "顧客", -"Deliverer" => "運送会社", -"Holidays" => "休日", -"Ideas" => "アイデア", -"Journey" => "旅行", -"Jubilee" => "記念祭", -"Meeting" => "ミーティング", -"Other" => "その他", -"Personal" => "個人", -"Projects" => "プロジェクト", -"Questions" => "質問事項", -"Work" => "週の始まり", -"Does not repeat" => "繰り返さない", -"Daily" => "毎日", -"Weekly" => "毎週", -"Every Weekday" => "毎平日", -"Bi-Weekly" => "2週間ごと", -"Monthly" => "毎月", -"Yearly" => "毎年", -"never" => "無し", -"by occurrences" => "回数で指定", -"by date" => "日付で指定", -"by monthday" => "日にちで指定", -"by weekday" => "曜日で指定", -"Monday" => "月曜", -"Tuesday" => "火曜", -"Wednesday" => "水曜", -"Thursday" => "木曜", -"Friday" => "金曜", -"Saturday" => "土曜", -"Sunday" => "日曜", -"events week of month" => "予定のある週を指定", -"first" => "1週目", -"second" => "2週目", -"third" => "3週目", -"fourth" => "4週目", -"fifth" => "5週目", -"last" => "最終週", -"January" => "1月", -"February" => "2月", -"March" => "3月", -"April" => "4月", -"May" => "5月", -"June" => "6月", -"July" => "7月", -"August" => "8月", -"September" => "9月", -"October" => "10月", -"November" => "11月", -"December" => "12月", -"by events date" => "日付で指定", -"by yearday(s)" => "日番号で指定", -"by weeknumber(s)" => "週番号で指定", -"by day and month" => "月と日で指定", -"Date" => "日付", -"Cal." => "カレンダー", -"All day" => "終日", -"New Calendar" => "新しくカレンダーを作成", -"Missing fields" => "項目がありません", -"Title" => "タイトル", -"From Date" => "開始日", -"From Time" => "開始時間", -"To Date" => "終了日", -"To Time" => "終了時間", -"The event ends before it starts" => "イベント終了時間が開始時間より先です", -"There was a database fail" => "データベースのエラーがありました", -"Week" => "週", -"Month" => "月", -"List" => "リスト", -"Today" => "今日", -"Calendars" => "カレンダー", -"There was a fail, while parsing the file." => "ファイルの構文解析に失敗しました。", -"Choose active calendars" => "アクティブなカレンダーを選択", -"Your calendars" => "あなたのカレンダー", -"CalDav Link" => "CalDavへのリンク", -"Shared calendars" => "共有カレンダー", -"No shared calendars" => "共有カレンダーはありません", -"Share Calendar" => "カレンダーを共有する", -"Download" => "ダウンロード", -"Edit" => "編集", -"Delete" => "削除", -"New calendar" => "新しいカレンダー", -"Edit calendar" => "カレンダーを編集", -"Displayname" => "表示名", -"Active" => "アクティブ", -"Calendar color" => "カレンダーの色", -"Save" => "保存", -"Submit" => "完了", -"Cancel" => "キャンセル", -"Edit an event" => "イベントを編集", -"Export" => "エクスポート", -"Eventinfo" => "イベント情報", -"Repeating" => "繰り返し", -"Alarm" => "アラーム", -"Attendees" => "参加者", -"Share" => "共有", -"Title of the Event" => "イベントのタイトル", -"Category" => "カテゴリー", -"Separate categories with commas" => "カテゴリをコンマで区切る", -"Edit categories" => "カテゴリを編集", -"All Day Event" => "終日イベント", -"From" => "開始", -"To" => "終了", -"Advanced options" => "詳細設定", -"Location" => "場所", -"Location of the Event" => "イベントの場所", -"Description" => "メモ", -"Description of the Event" => "イベントの説明", -"Repeat" => "繰り返し", -"Advanced" => "詳細設定", -"Select weekdays" => "曜日を指定", -"Select days" => "日付を指定", -"and the events day of year." => "対象の年を選択する。", -"and the events day of month." => "対象の月を選択する。", -"Select months" => "月を指定する", -"Select weeks" => "週を指定する", -"and the events week of year." => "対象の週を選択する。", -"Interval" => "間隔", -"End" => "繰り返す期間", -"occurrences" => "回繰り返す", -"Import a calendar file" => "カレンダーファイルをインポート", -"Please choose the calendar" => "カレンダーを選択してください", -"create a new calendar" => "新規カレンダーの作成", -"Name of new calendar" => "新規カレンダーの名称", -"Import" => "インポート", -"Importing calendar" => "カレンダーを取り込み中", -"Calendar imported successfully" => "カレンダーの取り込みに成功しました", -"Close Dialog" => "ダイアログを閉じる", -"Create a new event" => "新しいイベントを作成", -"View an event" => "イベントを閲覧", -"No categories selected" => "カテゴリが選択されていません", -"Select category" => "カテゴリーを選択してください", -"of" => "of", -"at" => "at", -"Timezone" => "タイムゾーン", -"Check always for changes of the timezone" => "タイムゾーンの変更を常に確認", -"Timeformat" => "時刻のフォーマット", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "週の始まり", -"Calendar CalDAV syncing address:" => "CalDAVカレンダーの同期アドレス:", -"Users" => "ユーザ", -"select users" => "ユーザを選択", -"Editable" => "編集可能", -"Groups" => "グループ", -"select groups" => "グループを選択", -"make public" => "公開する" -); diff --git a/apps/calendar/l10n/ko.php b/apps/calendar/l10n/ko.php deleted file mode 100644 index 181bfa4378..0000000000 --- a/apps/calendar/l10n/ko.php +++ /dev/null @@ -1,161 +0,0 @@ - "달력이 없습니다", -"No events found." => "일정이 없습니다", -"Wrong calendar" => "잘못된 달력", -"New Timezone:" => "새로운 시간대 설정", -"Timezone changed" => "시간대 변경됨", -"Invalid request" => "잘못된 요청", -"Calendar" => "달력", -"Birthday" => "생일", -"Business" => "사업", -"Call" => "통화", -"Clients" => "클라이언트", -"Deliverer" => "배송", -"Holidays" => "공휴일", -"Ideas" => "생각", -"Journey" => "여행", -"Jubilee" => "기념일", -"Meeting" => "미팅", -"Other" => "기타", -"Personal" => "개인", -"Projects" => "프로젝트", -"Questions" => "질문", -"Work" => "작업", -"unnamed" => "익명의", -"Does not repeat" => "반복 없음", -"Daily" => "매일", -"Weekly" => "매주", -"Every Weekday" => "매주 특정 요일", -"Bi-Weekly" => "2주마다", -"Monthly" => "매월", -"Yearly" => "매년", -"never" => "전혀", -"by occurrences" => "번 이후", -"by date" => "날짜", -"by monthday" => "월", -"by weekday" => "주", -"Monday" => "월요일", -"Tuesday" => "화요일", -"Wednesday" => "수요일", -"Thursday" => "목요일", -"Friday" => "금요일", -"Saturday" => "토요일", -"Sunday" => "일요일", -"events week of month" => "이달의 한 주 일정", -"first" => "첫번째", -"second" => "두번째", -"third" => "세번째", -"fourth" => "네번째", -"fifth" => "다섯번째", -"last" => "마지막", -"January" => "1월", -"February" => "2월", -"March" => "3월", -"April" => "4월", -"May" => "5월", -"June" => "6월", -"July" => "7월", -"August" => "8월", -"September" => "9월", -"October" => "10월", -"November" => "11월", -"December" => "12월", -"by events date" => "이벤트 날짜 순", -"by yearday(s)" => "날짜 번호 순", -"by weeknumber(s)" => "주 번호 순", -"by day and month" => "날짜 순", -"Date" => "날짜", -"Cal." => "달력", -"All day" => "매일", -"New Calendar" => "새로운 달력", -"Missing fields" => "기입란이 비어있습니다", -"Title" => "제목", -"From Date" => "시작날짜", -"From Time" => "시작시간", -"To Date" => "마침 날짜", -"To Time" => "마침 시간", -"The event ends before it starts" => "마침일정이 시작일정 보다 빠릅니다. ", -"There was a database fail" => "데이터베이스 에러입니다.", -"Week" => "주", -"Month" => "달", -"List" => "목록", -"Today" => "오늘", -"Calendars" => "달력", -"There was a fail, while parsing the file." => "파일을 처리하는 중 오류가 발생하였습니다.", -"Choose active calendars" => "활성 달력 선택", -"Your calendars" => "내 달력", -"CalDav Link" => "CalDav 링크", -"Shared calendars" => "공유 달력", -"No shared calendars" => "달력 공유하지 않음", -"Share Calendar" => "달력 공유", -"Download" => "다운로드", -"Edit" => "편집", -"Delete" => "삭제", -"shared with you by" => "로 인해 당신과 함께 공유", -"New calendar" => "새로운 달력", -"Edit calendar" => "달력 편집", -"Displayname" => "표시 이름", -"Active" => "활성", -"Calendar color" => "달력 색상", -"Save" => "저장", -"Submit" => "보내기", -"Cancel" => "취소", -"Edit an event" => "이벤트 편집", -"Export" => "출력", -"Eventinfo" => "일정 정보", -"Repeating" => "반복", -"Alarm" => "알람", -"Attendees" => "참석자", -"Share" => "공유", -"Title of the Event" => "이벤트 제목", -"Category" => "분류", -"Separate categories with commas" => "쉼표로 카테고리 구분", -"Edit categories" => "카테고리 수정", -"All Day Event" => "종일 이벤트", -"From" => "시작", -"To" => "끝", -"Advanced options" => "고급 설정", -"Location" => "위치", -"Location of the Event" => "이벤트 위치", -"Description" => "설명", -"Description of the Event" => "이벤트 설명", -"Repeat" => "반복", -"Advanced" => "고급", -"Select weekdays" => "요일 선택", -"Select days" => "날짜 선택", -"and the events day of year." => "그리고 이 해의 일정", -"and the events day of month." => "그리고 이 달의 일정", -"Select months" => "달 선택", -"Select weeks" => "주 선택", -"and the events week of year." => "그리고 이 해의 주간 일정", -"Interval" => "간격", -"End" => "끝", -"occurrences" => "번 이후", -"Import a calendar file" => "달력 파일 가져오기", -"Please choose the calendar" => "달력을 선택해 주세요", -"create a new calendar" => "새 달력 만들기", -"Name of new calendar" => "새 달력 이름", -"Import" => "입력", -"Importing calendar" => "달력 입력", -"Calendar imported successfully" => "달력 입력을 성공적으로 마쳤습니다.", -"Close Dialog" => "대화 마침", -"Create a new event" => "새 이벤트 만들기", -"View an event" => "일정 보기", -"No categories selected" => "선택된 카테고리 없음", -"Select category" => "선택 카테고리", -"of" => "의", -"at" => "에서", -"Timezone" => "시간대", -"Check always for changes of the timezone" => "항상 시간대 변경 확인하기", -"Timeformat" => "시간 형식 설정", -"24h" => "24시간", -"12h" => "12시간", -"First day of the week" => "그 주의 첫째날", -"Calendar CalDAV syncing address:" => "달력 CalDav 동기화 주소", -"Users" => "사용자", -"select users" => "사용자 선택", -"Editable" => "편집 가능", -"Groups" => "그룹", -"select groups" => "선택 그룹", -"make public" => "공개" -); diff --git a/apps/calendar/l10n/lb.php b/apps/calendar/l10n/lb.php deleted file mode 100644 index b40f652cc5..0000000000 --- a/apps/calendar/l10n/lb.php +++ /dev/null @@ -1,132 +0,0 @@ - "Keng Kalenner fonnt.", -"No events found." => "Keng Evenementer fonnt.", -"Wrong calendar" => "Falschen Kalenner", -"New Timezone:" => "Nei Zäitzone:", -"Timezone changed" => "Zäitzon geännert", -"Invalid request" => "Ongülteg Requête", -"Calendar" => "Kalenner", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Gebuertsdag", -"Business" => "Geschäftlech", -"Call" => "Uruff", -"Clients" => "Clienten", -"Deliverer" => "Liwwerant", -"Holidays" => "Vakanzen", -"Ideas" => "Ideeën", -"Journey" => "Dag", -"Jubilee" => "Jubiläum", -"Meeting" => "Meeting", -"Other" => "Aner", -"Personal" => "Perséinlech", -"Projects" => "Projeten", -"Questions" => "Froen", -"Work" => "Aarbecht", -"Does not repeat" => "Widderhëlt sech net", -"Daily" => "Deeglech", -"Weekly" => "All Woch", -"Every Weekday" => "All Wochendag", -"Bi-Weekly" => "All zweet Woch", -"Monthly" => "All Mount", -"Yearly" => "All Joer", -"never" => "ni", -"by occurrences" => "no Virkommes", -"by date" => "no Datum", -"by monthday" => "no Mount-Dag", -"by weekday" => "no Wochendag", -"Monday" => "Méindes", -"Tuesday" => "Dënschdes", -"Wednesday" => "Mëttwoch", -"Thursday" => "Donneschdes", -"Friday" => "Freides", -"Saturday" => "Samschdes", -"Sunday" => "Sonndes", -"first" => "éischt", -"second" => "Sekonn", -"third" => "Drëtt", -"fourth" => "Féiert", -"fifth" => "Fënneft", -"last" => "Läscht", -"January" => "Januar", -"February" => "Februar", -"March" => "Mäerz", -"April" => "Abrëll", -"May" => "Mee", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Dezember", -"Date" => "Datum", -"Cal." => "Cal.", -"All day" => "All Dag", -"New Calendar" => "Neien Kalenner", -"Missing fields" => "Felder déi feelen", -"Title" => "Titel", -"From Date" => "Vun Datum", -"From Time" => "Vun Zäit", -"To Date" => "Bis Datum", -"To Time" => "Bis Zäit", -"The event ends before it starts" => "D'Evenement hält op ier et ufänkt", -"There was a database fail" => "En Datebank Feeler ass opgetrueden", -"Week" => "Woch", -"Month" => "Mount", -"List" => "Lescht", -"Today" => "Haut", -"Calendars" => "Kalenneren", -"There was a fail, while parsing the file." => "Feeler beim lueden vum Fichier.", -"Choose active calendars" => "Wiel aktiv Kalenneren aus", -"Your calendars" => "Deng Kalenneren", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Gedeelte Kalenneren", -"No shared calendars" => "Keng gedeelten Kalenneren", -"Download" => "Eroflueden", -"Edit" => "Editéieren", -"Delete" => "Läschen", -"New calendar" => "Neien Kalenner", -"Edit calendar" => "Kalenner editéieren", -"Displayname" => "Numm", -"Active" => "Aktiv", -"Calendar color" => "Fuerf vum Kalenner", -"Save" => "Späicheren", -"Submit" => "Fortschécken", -"Cancel" => "Ofbriechen", -"Edit an event" => "Evenement editéieren", -"Export" => "Export", -"Title of the Event" => "Titel vum Evenement", -"Category" => "Kategorie", -"All Day Event" => "Ganz-Dag Evenement", -"From" => "Vun", -"To" => "Fir", -"Advanced options" => "Avancéiert Optiounen", -"Location" => "Uert", -"Location of the Event" => "Uert vum Evenement", -"Description" => "Beschreiwung", -"Description of the Event" => "Beschreiwung vum Evenement", -"Repeat" => "Widderhuelen", -"Advanced" => "Erweidert", -"Select weekdays" => "Wochendeeg auswielen", -"Select days" => "Deeg auswielen", -"Select months" => "Méint auswielen", -"Select weeks" => "Wochen auswielen", -"Interval" => "Intervall", -"End" => "Enn", -"occurrences" => "Virkommes", -"Import a calendar file" => "E Kalenner Fichier importéieren", -"Please choose the calendar" => "Wiel den Kalenner aus", -"create a new calendar" => "E neie Kalenner uleeën", -"Name of new calendar" => "Numm vum neie Kalenner", -"Import" => "Import", -"Importing calendar" => "Importéiert Kalenner", -"Calendar imported successfully" => "Kalenner erfollegräich importéiert", -"Close Dialog" => "Dialog zoumaachen", -"Create a new event" => "En Evenement maachen", -"Select category" => "Kategorie auswielen", -"Timezone" => "Zäitzon", -"Timeformat" => "Zäit Format", -"24h" => "24h", -"12h" => "12h", -"Calendar CalDAV syncing address:" => "CalDAV Kalenner Synchronisatioun's Adress:" -); diff --git a/apps/calendar/l10n/lt_LT.php b/apps/calendar/l10n/lt_LT.php deleted file mode 100644 index d7e15fb438..0000000000 --- a/apps/calendar/l10n/lt_LT.php +++ /dev/null @@ -1,140 +0,0 @@ - "Kalendorių nerasta.", -"No events found." => "Įvykių nerasta.", -"Wrong calendar" => "Ne tas kalendorius", -"New Timezone:" => "Nauja laiko juosta:", -"Timezone changed" => "Laiko zona pakeista", -"Invalid request" => "Klaidinga užklausa", -"Calendar" => "Kalendorius", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Gimtadienis", -"Business" => "Verslas", -"Call" => "Skambučiai", -"Clients" => "Klientai", -"Deliverer" => "Vykdytojas", -"Holidays" => "Išeiginės", -"Ideas" => "Idėjos", -"Journey" => "Kelionė", -"Jubilee" => "Jubiliejus", -"Meeting" => "Susitikimas", -"Other" => "Kiti", -"Personal" => "Asmeniniai", -"Projects" => "Projektai", -"Questions" => "Klausimai", -"Work" => "Darbas", -"unnamed" => "be pavadinimo", -"Does not repeat" => "Nekartoti", -"Daily" => "Kasdien", -"Weekly" => "Kiekvieną savaitę", -"Every Weekday" => "Kiekvieną savaitės dieną", -"Bi-Weekly" => "Kas dvi savaites", -"Monthly" => "Kiekvieną mėnesį", -"Yearly" => "Kiekvienais metais", -"never" => "niekada", -"by date" => "pagal datą", -"by monthday" => "pagal mėnesio dieną", -"by weekday" => "pagal savaitės dieną", -"Monday" => "Pirmadienis", -"Tuesday" => "Antradienis", -"Wednesday" => "Trečiadienis", -"Thursday" => "Ketvirtadienis", -"Friday" => "Penktadienis", -"Saturday" => "Šeštadienis", -"Sunday" => "Sekmadienis", -"January" => "Sausis", -"February" => "Vasaris", -"March" => "Kovas", -"April" => "Balandis", -"May" => "Gegužė", -"June" => "Birželis", -"July" => "Liepa", -"August" => "Rugpjūtis", -"September" => "Rugsėjis", -"October" => "Spalis", -"November" => "Lapkritis", -"December" => "Gruodis", -"Date" => "Data", -"Cal." => "Kal.", -"All day" => "Visa diena", -"New Calendar" => "Naujas kalendorius", -"Missing fields" => "Trūkstami laukai", -"Title" => "Pavadinimas", -"From Date" => "Nuo datos", -"From Time" => "Nuo laiko", -"To Date" => "Iki datos", -"To Time" => "Iki laiko", -"The event ends before it starts" => "Įvykis baigiasi anksčiau nei jis prasideda", -"There was a database fail" => "Įvyko duomenų bazės klaida", -"Week" => "Savaitė", -"Month" => "Mėnuo", -"List" => "Sąrašas", -"Today" => "Šiandien", -"Calendars" => "Kalendoriai", -"There was a fail, while parsing the file." => "Apdorojant failą įvyko klaida.", -"Choose active calendars" => "Pasirinkite naudojamus kalendorius", -"Your calendars" => "Jūsų kalendoriai", -"CalDav Link" => "CalDav adresas", -"Shared calendars" => "Bendri kalendoriai", -"No shared calendars" => "Bendrų kalendorių nėra", -"Share Calendar" => "Dalintis kalendoriumi", -"Download" => "Atsisiųsti", -"Edit" => "Keisti", -"Delete" => "Trinti", -"New calendar" => "Naujas kalendorius", -"Edit calendar" => "Taisyti kalendorių", -"Displayname" => "Pavadinimas", -"Active" => "Naudojamas", -"Calendar color" => "Kalendoriaus spalva", -"Save" => "Išsaugoti", -"Submit" => "Išsaugoti", -"Cancel" => "Atšaukti", -"Edit an event" => "Taisyti įvykį", -"Export" => "Eksportuoti", -"Eventinfo" => "Informacija", -"Repeating" => "Pasikartojantis", -"Attendees" => "Dalyviai", -"Share" => "Dalintis", -"Title of the Event" => "Įvykio pavadinimas", -"Category" => "Kategorija", -"Separate categories with commas" => "Atskirkite kategorijas kableliais", -"Edit categories" => "Redaguoti kategorijas", -"All Day Event" => "Visos dienos įvykis", -"From" => "Nuo", -"To" => "Iki", -"Advanced options" => "Papildomi nustatymai", -"Location" => "Vieta", -"Location of the Event" => "Įvykio vieta", -"Description" => "Aprašymas", -"Description of the Event" => "Įvykio aprašymas", -"Repeat" => "Kartoti", -"Select weekdays" => "Pasirinkite savaitės dienas", -"Select days" => "Pasirinkite dienas", -"Select months" => "Pasirinkite mėnesius", -"Select weeks" => "Pasirinkite savaites", -"Interval" => "Intervalas", -"End" => "Pabaiga", -"Import a calendar file" => "Importuoti kalendoriaus failą", -"Please choose the calendar" => "Pasirinkite kalendorių", -"create a new calendar" => "sukurti naują kalendorių", -"Name of new calendar" => "Naujo kalendoriaus pavadinimas", -"Import" => "Importuoti", -"Importing calendar" => "Importuojamas kalendorius", -"Calendar imported successfully" => "Kalendorius sėkmingai importuotas", -"Close Dialog" => "Uždaryti", -"Create a new event" => "Sukurti naują įvykį", -"View an event" => "Peržiūrėti įvykį", -"No categories selected" => "Nepasirinktos jokios katagorijos", -"Select category" => "Pasirinkite kategoriją", -"Timezone" => "Laiko juosta", -"Check always for changes of the timezone" => "Visada tikrinti laiko zonos pasikeitimus", -"Timeformat" => "Laiko formatas", -"24h" => "24val", -"12h" => "12val", -"Calendar CalDAV syncing address:" => "CalDAV kalendoriaus synchronizavimo adresas:", -"Users" => "Vartotojai", -"select users" => "pasirinkti vartotojus", -"Editable" => "Redaguojamas", -"Groups" => "Grupės", -"select groups" => "pasirinkti grupes", -"make public" => "viešinti" -); diff --git a/apps/calendar/l10n/mk.php b/apps/calendar/l10n/mk.php deleted file mode 100644 index 41df376dfa..0000000000 --- a/apps/calendar/l10n/mk.php +++ /dev/null @@ -1,162 +0,0 @@ - "Не се најдени календари.", -"No events found." => "Не се најдени настани.", -"Wrong calendar" => "Погрешен календар", -"New Timezone:" => "Нова временска зона:", -"Timezone changed" => "Временската зона е променета", -"Invalid request" => "Неправилно барање", -"Calendar" => "Календар", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Роденден", -"Business" => "Деловно", -"Call" => "Повикај", -"Clients" => "Клиенти", -"Deliverer" => "Доставувач", -"Holidays" => "Празници", -"Ideas" => "Идеи", -"Journey" => "Патување", -"Jubilee" => "Јубилеј", -"Meeting" => "Состанок", -"Other" => "Останато", -"Personal" => "Лично", -"Projects" => "Проекти", -"Questions" => "Прашања", -"Work" => "Работа", -"unnamed" => "неименувано", -"Does not repeat" => "Не се повторува", -"Daily" => "Дневно", -"Weekly" => "Седмично", -"Every Weekday" => "Секој работен ден", -"Bi-Weekly" => "Дво-седмично", -"Monthly" => "Месечно", -"Yearly" => "Годишно", -"never" => "никогаш", -"by occurrences" => "по настан", -"by date" => "по датум", -"by monthday" => "по ден во месецот", -"by weekday" => "по работен ден", -"Monday" => "Понеделник", -"Tuesday" => "Вторник", -"Wednesday" => "Среда", -"Thursday" => "Четврток", -"Friday" => "Петок", -"Saturday" => "Сабота", -"Sunday" => "Недела", -"events week of month" => "седмични настани од месец", -"first" => "прв", -"second" => "втор", -"third" => "трет", -"fourth" => "четврт", -"fifth" => "пет", -"last" => "последен", -"January" => "Јануари", -"February" => "Февруари", -"March" => "Март", -"April" => "Април", -"May" => "Мај", -"June" => "Јуни", -"July" => "Јули", -"August" => "Август", -"September" => "Септември", -"October" => "Октомври", -"November" => "Ноември", -"December" => "Декември", -"by events date" => "по датумот на настанот", -"by yearday(s)" => "по вчерашните", -"by weeknumber(s)" => "по број на седмицата", -"by day and month" => "по ден и месец", -"Date" => "Датум", -"Cal." => "Кал.", -"All day" => "Цел ден", -"New Calendar" => "Нов календар", -"Missing fields" => "Полиња кои недостасуваат", -"Title" => "Наслов", -"From Date" => "Од датум", -"From Time" => "Од време", -"To Date" => "До датум", -"To Time" => "До време", -"The event ends before it starts" => "Овој настан завршува пред за почне", -"There was a database fail" => "Имаше проблем со базата", -"Week" => "Седмица", -"Month" => "Месец", -"List" => "Листа", -"Today" => "Денеска", -"Calendars" => "Календари", -"There was a fail, while parsing the file." => "Имаше проблем при парсирање на датотеката.", -"Choose active calendars" => "Избери активни календари", -"Your calendars" => "Ваши календари", -"CalDav Link" => "Врска за CalDav", -"Shared calendars" => "Споделени календари", -"No shared calendars" => "Нема споделени календари", -"Share Calendar" => "Сподели календар", -"Download" => "Преземи", -"Edit" => "Уреди", -"Delete" => "Избриши", -"shared with you by" => "Споделен со вас од", -"New calendar" => "Нов календар", -"Edit calendar" => "Уреди календар", -"Displayname" => "Име за приказ", -"Active" => "Активен", -"Calendar color" => "Боја на календарот", -"Save" => "Сними", -"Submit" => "Прати", -"Cancel" => "Откажи", -"Edit an event" => "Уреди настан", -"Export" => "Извези", -"Eventinfo" => "Инфо за настан", -"Repeating" => "Повторување", -"Alarm" => "Аларм", -"Attendees" => "Присутни", -"Share" => "Сподели", -"Title of the Event" => "Наслов на настанот", -"Category" => "Категорија", -"Separate categories with commas" => "Одвоете ги категориите со запирка", -"Edit categories" => "Уреди категории", -"All Day Event" => "Целодневен настан", -"From" => "Од", -"To" => "До", -"Advanced options" => "Напредни опции", -"Location" => "Локација", -"Location of the Event" => "Локација на настанот", -"Description" => "Опис", -"Description of the Event" => "Опис на настанот", -"Repeat" => "Повтори", -"Advanced" => "Напредно", -"Select weekdays" => "Избери работни денови", -"Select days" => "Избери денови", -"and the events day of year." => "и настаните ден од година.", -"and the events day of month." => "и настаните ден од месец.", -"Select months" => "Избери месеци", -"Select weeks" => "Избери седмици", -"and the events week of year." => "и настаните седмица од година.", -"Interval" => "интервал", -"End" => "Крај", -"occurrences" => "повторувања", -"Import a calendar file" => "Внеси календар од датотека ", -"Please choose the calendar" => "Ве молам изберете го календарот", -"create a new calendar" => "создади нов календар", -"Name of new calendar" => "Име на новиот календар", -"Import" => "Увези", -"Importing calendar" => "Увезување на календар", -"Calendar imported successfully" => "Календарот беше успешно увезен", -"Close Dialog" => "Затвори дијалог", -"Create a new event" => "Создади нов настан", -"View an event" => "Погледај настан", -"No categories selected" => "Нема избрано категории", -"Select category" => "Избери категорија", -"of" => "од", -"at" => "на", -"Timezone" => "Временска зона", -"Check always for changes of the timezone" => "Секогаш провери за промени на временската зона", -"Timeformat" => "Формат на времето", -"24h" => "24ч", -"12h" => "12ч", -"First day of the week" => "Прв ден од седмицата", -"Calendar CalDAV syncing address:" => "CalDAV календар адресата за синхронизација:", -"Users" => "Корисници", -"select users" => "избери корисници", -"Editable" => "Изменливо", -"Groups" => "Групи", -"select groups" => "избери групи", -"make public" => "направи јавно" -); diff --git a/apps/calendar/l10n/ms_MY.php b/apps/calendar/l10n/ms_MY.php deleted file mode 100644 index 2cb3ac41c3..0000000000 --- a/apps/calendar/l10n/ms_MY.php +++ /dev/null @@ -1,135 +0,0 @@ - "Silap kalendar", -"New Timezone:" => "Timezone Baru", -"Timezone changed" => "Zon waktu diubah", -"Invalid request" => "Permintaan tidak sah", -"Calendar" => "Kalendar", -"Birthday" => "Hari lahir", -"Business" => "Perniagaan", -"Call" => "Panggilan", -"Clients" => "Klien", -"Deliverer" => "Penghantar", -"Holidays" => "Cuti", -"Ideas" => "Idea", -"Journey" => "Perjalanan", -"Jubilee" => "Jubli", -"Meeting" => "Perjumpaan", -"Other" => "Lain", -"Personal" => "Peribadi", -"Projects" => "Projek", -"Questions" => "Soalan", -"Work" => "Kerja", -"Does not repeat" => "Tidak berulang", -"Daily" => "Harian", -"Weekly" => "Mingguan", -"Every Weekday" => "Setiap hari minggu", -"Bi-Weekly" => "Dua kali seminggu", -"Monthly" => "Bulanan", -"Yearly" => "Tahunan", -"never" => "jangan", -"by occurrences" => "dari kekerapan", -"by date" => "dari tarikh", -"by monthday" => "dari haribulan", -"by weekday" => "dari hari minggu", -"Monday" => "Isnin", -"Tuesday" => "Selasa", -"Wednesday" => "Rabu", -"Thursday" => "Khamis", -"Friday" => "Jumaat", -"Saturday" => "Sabtu", -"Sunday" => "Ahad", -"events week of month" => "event minggu dari bulan", -"first" => "pertama", -"second" => "kedua", -"third" => "ketiga", -"fourth" => "keempat", -"fifth" => "kelima", -"last" => "akhir", -"January" => "Januari", -"February" => "Februari", -"March" => "Mac", -"April" => "April", -"May" => "Mei", -"June" => "Jun", -"July" => "Julai", -"August" => "Ogos", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Disember", -"by events date" => "dari tarikh event", -"by yearday(s)" => "dari tahun", -"by weeknumber(s)" => "dari nombor minggu", -"by day and month" => "dari hari dan bulan", -"Date" => "Tarikh", -"Cal." => "Kalendar", -"All day" => "Sepanjang hari", -"New Calendar" => "Kalendar baru", -"Missing fields" => "Ruangan tertinggal", -"Title" => "Tajuk", -"From Date" => "Dari tarikh", -"From Time" => "Masa Dari", -"To Date" => "Sehingga kini", -"To Time" => "Semasa", -"The event ends before it starts" => "Peristiwa berakhir sebelum bermula", -"There was a database fail" => "Terdapat kegagalan pada pengkalan data", -"Week" => "Minggu", -"Month" => "Bulan", -"List" => "Senarai", -"Today" => "Hari ini", -"Calendars" => "Kalendar", -"There was a fail, while parsing the file." => "Berlaku kegagalan ketika penguraian fail. ", -"Choose active calendars" => "Pilih kalendar yang aktif", -"CalDav Link" => "Pautan CalDav", -"Download" => "Muat turun", -"Edit" => "Edit", -"Delete" => "Hapus", -"New calendar" => "Kalendar baru", -"Edit calendar" => "Edit kalendar", -"Displayname" => "Paparan nama", -"Active" => "Aktif", -"Calendar color" => "Warna kalendar", -"Save" => "Simpan", -"Submit" => "Hantar", -"Cancel" => "Batal", -"Edit an event" => "Edit agenda", -"Export" => "Export", -"Title of the Event" => "Tajuk agenda", -"Category" => "kategori", -"All Day Event" => "Agenda di sepanjang hari ", -"From" => "Dari", -"To" => "ke", -"Advanced options" => "Pilihan maju", -"Location" => "Lokasi", -"Location of the Event" => "Lokasi agenda", -"Description" => "Huraian", -"Description of the Event" => "Huraian agenda", -"Repeat" => "Ulang", -"Advanced" => "Maju", -"Select weekdays" => "Pilih hari minggu", -"Select days" => "Pilih hari", -"and the events day of year." => "dan hari event dalam tahun.", -"and the events day of month." => "dan hari event dalam bulan.", -"Select months" => "Pilih bulan", -"Select weeks" => "Pilih minggu", -"and the events week of year." => "dan event mingguan dalam setahun.", -"Interval" => "Tempoh", -"End" => "Tamat", -"occurrences" => "Peristiwa", -"Import a calendar file" => "Import fail kalendar", -"Please choose the calendar" => "Sila pilih kalendar", -"create a new calendar" => "Cipta kalendar baru", -"Name of new calendar" => "Nama kalendar baru", -"Import" => "Import", -"Importing calendar" => "Import kalendar", -"Calendar imported successfully" => "Kalendar berjaya diimport", -"Close Dialog" => "Tutup dialog", -"Create a new event" => "Buat agenda baru", -"Select category" => "Pilih kategori", -"Timezone" => "Zon waktu", -"Check always for changes of the timezone" => "Sentiasa mengemaskini perubahan zon masa", -"Timeformat" => "Timeformat", -"24h" => "24h", -"12h" => "12h", -"Calendar CalDAV syncing address:" => "Kelendar CalDAV mengemaskini alamat:" -); diff --git a/apps/calendar/l10n/nb_NO.php b/apps/calendar/l10n/nb_NO.php deleted file mode 100644 index 95ba5a9dba..0000000000 --- a/apps/calendar/l10n/nb_NO.php +++ /dev/null @@ -1,157 +0,0 @@ - "Ingen kalendere funnet", -"No events found." => "Ingen hendelser funnet", -"Wrong calendar" => "Feil kalender", -"New Timezone:" => "Ny tidssone:", -"Timezone changed" => "Tidssone endret", -"Invalid request" => "Ugyldig forespørsel", -"Calendar" => "Kalender", -"Birthday" => "Bursdag", -"Business" => "Forretninger", -"Clients" => "Kunder", -"Holidays" => "Ferie", -"Ideas" => "Ideér", -"Journey" => "Reise", -"Jubilee" => "Jubileum", -"Meeting" => "Møte", -"Other" => "Annet", -"Personal" => "ersonlig", -"Projects" => "Prosjekter", -"Questions" => "Spørsmål", -"Work" => "Arbeid", -"unnamed" => "uten navn", -"Does not repeat" => "Gjentas ikke", -"Daily" => "Daglig", -"Weekly" => "Ukentlig", -"Every Weekday" => "Hver ukedag", -"Bi-Weekly" => "Annenhver uke", -"Monthly" => "Månedlig", -"Yearly" => "Årlig", -"never" => "aldri", -"by occurrences" => "etter hyppighet", -"by date" => "etter dato", -"by monthday" => "etter dag i måned", -"by weekday" => "etter ukedag", -"Monday" => "Mandag", -"Tuesday" => "Tirsdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lørdag", -"Sunday" => "Søndag", -"events week of month" => "begivenhetens uke denne måneden", -"first" => "første", -"second" => "andre", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "siste", -"January" => "Januar", -"February" => "Februar", -"March" => "Mars", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Desember", -"by events date" => "etter hendelsenes dato", -"by yearday(s)" => "etter dag i året", -"by weeknumber(s)" => "etter ukenummer/-numre", -"by day and month" => "etter dag og måned", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "Hele dagen ", -"New Calendar" => "Ny kalender", -"Missing fields" => "Manglende felt", -"Title" => "Tittel", -"From Date" => "Fra dato", -"From Time" => "Fra tidspunkt", -"To Date" => "Til dato", -"To Time" => "Til tidspunkt", -"The event ends before it starts" => "En hendelse kan ikke slutte før den har begynt.", -"There was a database fail" => "Det oppstod en databasefeil.", -"Week" => "Uke", -"Month" => "ned", -"List" => "Liste", -"Today" => "I dag", -"Calendars" => "Kalendre", -"There was a fail, while parsing the file." => "Det oppstod en feil under åpningen av filen.", -"Choose active calendars" => "Velg en aktiv kalender", -"Your calendars" => "Dine kalendere", -"CalDav Link" => "CalDav-lenke", -"Shared calendars" => "Delte kalendere", -"No shared calendars" => "Ingen delte kalendere", -"Share Calendar" => "Del Kalender", -"Download" => "Last ned", -"Edit" => "Endre", -"Delete" => "Slett", -"shared with you by" => "delt med deg", -"New calendar" => "Ny kalender", -"Edit calendar" => "Rediger kalender", -"Displayname" => "Visningsnavn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarge", -"Save" => "Lagre", -"Submit" => "Lagre", -"Cancel" => "Avbryt", -"Edit an event" => "Rediger en hendelse", -"Export" => "Eksporter", -"Eventinfo" => "Hendelsesinformasjon", -"Repeating" => "Gjentas", -"Alarm" => "Alarm", -"Attendees" => "Deltakere", -"Share" => "Del", -"Title of the Event" => "Hendelsestittel", -"Category" => "Kategori", -"Separate categories with commas" => "Separer kategorier med komma", -"Edit categories" => "Rediger kategorier", -"All Day Event" => "Hele dagen-hendelse", -"From" => "Fra", -"To" => "Til", -"Advanced options" => "Avanserte innstillinger", -"Location" => "Sted", -"Location of the Event" => "Hendelsessted", -"Description" => "Beskrivelse", -"Description of the Event" => "Hendelesebeskrivelse", -"Repeat" => "Gjenta", -"Advanced" => "Avansert", -"Select weekdays" => "Velg ukedager", -"Select days" => "Velg dager", -"and the events day of year." => "og hendelsenes dag i året.", -"and the events day of month." => "og hendelsenes dag i måneden.", -"Select months" => "Velg måneder", -"Select weeks" => "Velg uker", -"and the events week of year." => "og hendelsenes uke i året.", -"Interval" => "Intervall", -"End" => "Slutt", -"occurrences" => "forekomster", -"Import a calendar file" => "Importer en kalenderfil", -"Please choose the calendar" => "Vennligst velg kalenderen", -"create a new calendar" => "Lag en ny kalender", -"Name of new calendar" => "Navn på ny kalender:", -"Import" => "Importer", -"Importing calendar" => "Importerer kalender", -"Calendar imported successfully" => "Kalenderen ble importert uten feil", -"Close Dialog" => "Lukk dialog", -"Create a new event" => "Opprett en ny hendelse", -"View an event" => "Se på hendelse", -"No categories selected" => "Ingen kategorier valgt", -"Select category" => "Velg kategori", -"Timezone" => "Tidssone", -"Check always for changes of the timezone" => "Se alltid etter endringer i tidssone", -"Timeformat" => "Tidsformat:", -"24h" => "24 t", -"12h" => "12 t", -"First day of the week" => "Ukens første dag", -"Calendar CalDAV syncing address:" => "Synkroniseringsadresse fo kalender CalDAV:", -"Users" => "Brukere", -"select users" => "valgte brukere", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "velg grupper", -"make public" => "gjør offentlig" -); diff --git a/apps/calendar/l10n/nl.php b/apps/calendar/l10n/nl.php deleted file mode 100644 index d141a1cc08..0000000000 --- a/apps/calendar/l10n/nl.php +++ /dev/null @@ -1,162 +0,0 @@ - "Geen kalenders gevonden.", -"No events found." => "Geen gebeurtenissen gevonden.", -"Wrong calendar" => "Verkeerde kalender", -"New Timezone:" => "Nieuwe tijdszone:", -"Timezone changed" => "Tijdzone is veranderd", -"Invalid request" => "Ongeldige aanvraag", -"Calendar" => "Kalender", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—' d[ MMM] yyyy}", -"Birthday" => "Verjaardag", -"Business" => "Zakelijk", -"Call" => "Bellen", -"Clients" => "Klanten", -"Deliverer" => "Leverancier", -"Holidays" => "Vakantie", -"Ideas" => "Ideeën", -"Journey" => "Reis", -"Jubilee" => "Jubileum", -"Meeting" => "Vergadering", -"Other" => "Ander", -"Personal" => "Persoonlijk", -"Projects" => "Projecten", -"Questions" => "Vragen", -"Work" => "Werk", -"unnamed" => "onbekend", -"Does not repeat" => "Wordt niet herhaald", -"Daily" => "Dagelijks", -"Weekly" => "Wekelijks", -"Every Weekday" => "Elke weekdag", -"Bi-Weekly" => "Tweewekelijks", -"Monthly" => "Maandelijks", -"Yearly" => "Jaarlijks", -"never" => "nooit meer", -"by occurrences" => "volgens gebeurtenissen", -"by date" => "op datum", -"by monthday" => "per dag van de maand", -"by weekday" => "op weekdag", -"Monday" => "Maandag", -"Tuesday" => "Dinsdag", -"Wednesday" => "Woensdag", -"Thursday" => "Donderdag", -"Friday" => "Vrijdag", -"Saturday" => "Zaterdag", -"Sunday" => "Zondag", -"events week of month" => "gebeurtenissen week van maand", -"first" => "eerste", -"second" => "tweede", -"third" => "derde", -"fourth" => "vierde", -"fifth" => "vijfde", -"last" => "laatste", -"January" => "Januari", -"February" => "Februari", -"March" => "Maart", -"April" => "April", -"May" => "Mei", -"June" => "Juni", -"July" => "Juli", -"August" => "Augustus", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "volgens evenementsdatum", -"by yearday(s)" => "volgens jaardag(en)", -"by weeknumber(s)" => "volgens weeknummer(s)", -"by day and month" => "per dag en maand", -"Date" => "Datum", -"Cal." => "Cal.", -"All day" => "Hele dag", -"New Calendar" => "Nieuwe Kalender", -"Missing fields" => "missende velden", -"Title" => "Titel", -"From Date" => "Begindatum", -"From Time" => "Begintijd", -"To Date" => "Einddatum", -"To Time" => "Eindtijd", -"The event ends before it starts" => "Het evenement eindigt voordat het begint", -"There was a database fail" => "Er was een databasefout", -"Week" => "Week", -"Month" => "Maand", -"List" => "Lijst", -"Today" => "Vandaag", -"Calendars" => "Kalenders", -"There was a fail, while parsing the file." => "Er is een fout opgetreden bij het verwerken van het bestand.", -"Choose active calendars" => "Kies actieve kalenders", -"Your calendars" => "Je kalenders", -"CalDav Link" => "CalDav Link", -"Shared calendars" => "Gedeelde kalenders", -"No shared calendars" => "Geen gedeelde kalenders", -"Share Calendar" => "Deel kalender", -"Download" => "Download", -"Edit" => "Bewerken", -"Delete" => "Verwijderen", -"shared with you by" => "gedeeld met jou door", -"New calendar" => "Nieuwe kalender", -"Edit calendar" => "Bewerk kalender", -"Displayname" => "Weergavenaam", -"Active" => "Actief", -"Calendar color" => "Kalender kleur", -"Save" => "Opslaan", -"Submit" => "Opslaan", -"Cancel" => "Annuleren", -"Edit an event" => "Bewerken van een afspraak", -"Export" => "Exporteren", -"Eventinfo" => "Geberurtenisinformatie", -"Repeating" => "Herhalend", -"Alarm" => "Alarm", -"Attendees" => "Deelnemers", -"Share" => "Delen", -"Title of the Event" => "Titel van de afspraak", -"Category" => "Categorie", -"Separate categories with commas" => "Gescheiden door komma's", -"Edit categories" => "Wijzig categorieën", -"All Day Event" => "Hele dag", -"From" => "Van", -"To" => "Aan", -"Advanced options" => "Geavanceerde opties", -"Location" => "Locatie", -"Location of the Event" => "Locatie van de afspraak", -"Description" => "Beschrijving", -"Description of the Event" => "Beschrijving van het evenement", -"Repeat" => "Herhalen", -"Advanced" => "Geavanceerd", -"Select weekdays" => "Selecteer weekdagen", -"Select days" => "Selecteer dagen", -"and the events day of year." => "en de gebeurtenissen dag van het jaar", -"and the events day of month." => "en de gebeurtenissen dag van de maand", -"Select months" => "Selecteer maanden", -"Select weeks" => "Selecteer weken", -"and the events week of year." => "en de gebeurtenissen week van het jaar", -"Interval" => "Interval", -"End" => "Einde", -"occurrences" => "gebeurtenissen", -"Import a calendar file" => "Importeer een agenda bestand", -"Please choose the calendar" => "Kies de kalender", -"create a new calendar" => "Maak een nieuw agenda", -"Name of new calendar" => "Naam van de nieuwe agenda", -"Import" => "Importeer", -"Importing calendar" => "Importeer agenda", -"Calendar imported successfully" => "Agenda succesvol geïmporteerd", -"Close Dialog" => "Sluit venster", -"Create a new event" => "Maak een nieuwe afspraak", -"View an event" => "Bekijk een gebeurtenis", -"No categories selected" => "Geen categorieën geselecteerd", -"Select category" => "Kies een categorie", -"of" => "van", -"at" => "op", -"Timezone" => "Tijdzone", -"Check always for changes of the timezone" => "Controleer altijd op aanpassingen van de tijdszone", -"Timeformat" => "Tijdformaat", -"24h" => "24uur", -"12h" => "12uur", -"First day of the week" => "Eerste dag van de week", -"Calendar CalDAV syncing address:" => "CalDAV kalender synchronisatie adres:", -"Users" => "Gebruikers", -"select users" => "kies gebruikers", -"Editable" => "Te wijzigen", -"Groups" => "Groepen", -"select groups" => "kies groep", -"make public" => "maak publiek" -); diff --git a/apps/calendar/l10n/nn_NO.php b/apps/calendar/l10n/nn_NO.php deleted file mode 100644 index 79119e8100..0000000000 --- a/apps/calendar/l10n/nn_NO.php +++ /dev/null @@ -1,135 +0,0 @@ - "Feil kalender", -"New Timezone:" => "Ny tidssone:", -"Timezone changed" => "Endra tidssone", -"Invalid request" => "Ugyldig førespurnad", -"Calendar" => "Kalender", -"Birthday" => "Bursdag", -"Business" => "Forretning", -"Call" => "Telefonsamtale", -"Clients" => "Klientar", -"Deliverer" => "Forsending", -"Holidays" => "Høgtid", -"Ideas" => "Idear", -"Journey" => "Reise", -"Jubilee" => "Jubileum", -"Meeting" => "Møte", -"Other" => "Anna", -"Personal" => "Personleg", -"Projects" => "Prosjekt", -"Questions" => "Spørsmål", -"Work" => "Arbeid", -"Does not repeat" => "Ikkje gjenta", -"Daily" => "Kvar dag", -"Weekly" => "Kvar veke", -"Every Weekday" => "Kvar vekedag", -"Bi-Weekly" => "Annakvar veke", -"Monthly" => "Kvar månad", -"Yearly" => "Kvart år", -"never" => "aldri", -"by occurrences" => "av førekomstar", -"by date" => "av dato", -"by monthday" => "av månadsdag", -"by weekday" => "av vekedag", -"Monday" => "Måndag", -"Tuesday" => "Tysdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Laurdag", -"Sunday" => "Søndag", -"events week of month" => "hendingas veke av månad", -"first" => "første", -"second" => "andre", -"third" => "tredje", -"fourth" => "fjerde", -"fifth" => "femte", -"last" => "siste", -"January" => "Januar", -"February" => "Februar", -"March" => "Mars", -"April" => "April", -"May" => "Mai", -"June" => "Juni", -"July" => "Juli", -"August" => "August", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "Desember", -"by events date" => "av hendingsdato", -"by yearday(s)" => "av årsdag(ar)", -"by weeknumber(s)" => "av vekenummer", -"by day and month" => "av dag og månad", -"Date" => "Dato", -"Cal." => "Kal.", -"All day" => "Heile dagen", -"New Calendar" => "Ny kalender", -"Missing fields" => "Manglande felt", -"Title" => "Tittel", -"From Date" => "Frå dato", -"From Time" => "Frå tid", -"To Date" => "Til dato", -"To Time" => "Til tid", -"The event ends before it starts" => "Hendinga endar før den startar", -"There was a database fail" => "Det oppstod ein databasefeil", -"Week" => "Veke", -"Month" => "Månad", -"List" => "Liste", -"Today" => "I dag", -"Calendars" => "Kalendarar", -"There was a fail, while parsing the file." => "Feil ved tolking av fila.", -"Choose active calendars" => "Vel aktive kalendarar", -"CalDav Link" => "CalDav-lenkje", -"Download" => "Last ned", -"Edit" => "Endra", -"Delete" => "Slett", -"New calendar" => "Ny kalender", -"Edit calendar" => "Endra kalendarar", -"Displayname" => "Visingsnamn", -"Active" => "Aktiv", -"Calendar color" => "Kalenderfarge", -"Save" => "Lagra", -"Submit" => "Lagra", -"Cancel" => "Avbryt", -"Edit an event" => "Endra ein hending", -"Export" => "Eksporter", -"Title of the Event" => "Tittel på hendinga", -"Category" => "Kategori", -"All Day Event" => "Heildagshending", -"From" => "Frå", -"To" => "Til", -"Advanced options" => "Avanserte alternativ", -"Location" => "Stad", -"Location of the Event" => "Stad for hendinga", -"Description" => "Skildring", -"Description of the Event" => "Skildring av hendinga", -"Repeat" => "Gjenta", -"Advanced" => "Avansert", -"Select weekdays" => "Vel vekedagar", -"Select days" => "Vel dagar", -"and the events day of year." => "og hendingane dag for år.", -"and the events day of month." => "og hendingane dag for månad.", -"Select months" => "Vel månedar", -"Select weeks" => "Vel veker", -"and the events week of year." => "og hendingane veke av året.", -"Interval" => "Intervall", -"End" => "Ende", -"occurrences" => "førekomstar", -"Import a calendar file" => "Importer ei kalenderfil", -"Please choose the calendar" => "Venlegast vel kalenderen", -"create a new calendar" => "Lag ny kalender", -"Name of new calendar" => "Namn for ny kalender", -"Import" => "Importer", -"Importing calendar" => "Importerar kalender", -"Calendar imported successfully" => "Kalender importert utan feil", -"Close Dialog" => "Steng dialog", -"Create a new event" => "Opprett ei ny hending", -"Select category" => "Vel kategori", -"Timezone" => "Tidssone", -"Check always for changes of the timezone" => "Sjekk alltid for endringar i tidssona", -"Timeformat" => "Tidsformat", -"24h" => "24t", -"12h" => "12t", -"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse:" -); diff --git a/apps/calendar/l10n/pl.php b/apps/calendar/l10n/pl.php deleted file mode 100644 index e582cdbb9b..0000000000 --- a/apps/calendar/l10n/pl.php +++ /dev/null @@ -1,162 +0,0 @@ - "Brak kalendarzy", -"No events found." => "Brak wydzarzeń", -"Wrong calendar" => "Nieprawidłowy kalendarz", -"New Timezone:" => "Nowa strefa czasowa:", -"Timezone changed" => "Zmieniono strefę czasową", -"Invalid request" => "Nieprawidłowe żądanie", -"Calendar" => "Kalendarz", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Urodziny", -"Business" => "Interesy", -"Call" => "Rozmowy", -"Clients" => "Klienci", -"Deliverer" => "Dostawcy", -"Holidays" => "Święta", -"Ideas" => "Pomysły", -"Journey" => "Podróże", -"Jubilee" => "Jubileusze", -"Meeting" => "Spotkania", -"Other" => "Inne", -"Personal" => "Osobiste", -"Projects" => "Projekty", -"Questions" => "Pytania", -"Work" => "Zawodowe", -"unnamed" => "nienazwany", -"Does not repeat" => "Brak", -"Daily" => "Codziennie", -"Weekly" => "Tygodniowo", -"Every Weekday" => "Każdego dnia tygodnia", -"Bi-Weekly" => "Dwa razy w tygodniu", -"Monthly" => "Miesięcznie", -"Yearly" => "Rocznie", -"never" => "nigdy", -"by occurrences" => "przez wydarzenia", -"by date" => "po dacie", -"by monthday" => "miesięcznie", -"by weekday" => "tygodniowo", -"Monday" => "Poniedziałek", -"Tuesday" => "Wtorek", -"Wednesday" => "Środa", -"Thursday" => "Czwartek", -"Friday" => "Piątek", -"Saturday" => "Sobota", -"Sunday" => "Niedziela", -"events week of month" => "wydarzenia miesiąca", -"first" => "pierwszy", -"second" => "drugi", -"third" => "trzeci", -"fourth" => "czwarty", -"fifth" => "piąty", -"last" => "ostatni", -"January" => "Styczeń", -"February" => "Luty", -"March" => "Marzec", -"April" => "Kwiecień", -"May" => "Maj", -"June" => "Czerwiec", -"July" => "Lipiec", -"August" => "Sierpień", -"September" => "Wrzesień", -"October" => "Październik", -"November" => "Listopad", -"December" => "Grudzień", -"by events date" => "po datach wydarzeń", -"by yearday(s)" => "po dniach roku", -"by weeknumber(s)" => "po tygodniach", -"by day and month" => "przez dzień i miesiąc", -"Date" => "Data", -"Cal." => "Kal.", -"All day" => "Cały dzień", -"New Calendar" => "Nowy kalendarz", -"Missing fields" => "Brakujące pola", -"Title" => "Nazwa", -"From Date" => "Od daty", -"From Time" => "Od czasu", -"To Date" => "Do daty", -"To Time" => "Do czasu", -"The event ends before it starts" => "Wydarzenie kończy się przed rozpoczęciem", -"There was a database fail" => "Awaria bazy danych", -"Week" => "Tydzień", -"Month" => "Miesiąc", -"List" => "Lista", -"Today" => "Dzisiaj", -"Calendars" => "Kalendarze", -"There was a fail, while parsing the file." => "Nie udało się przetworzyć pliku.", -"Choose active calendars" => "Wybór aktywnych kalendarzy", -"Your calendars" => "Twoje kalendarze", -"CalDav Link" => "Wyświetla odnośnik CalDAV", -"Shared calendars" => "Współdzielone kalendarze", -"No shared calendars" => "Brak współdzielonych kalendarzy", -"Share Calendar" => "Współdziel kalendarz", -"Download" => "Pobiera kalendarz", -"Edit" => "Edytuje kalendarz", -"Delete" => "Usuwa kalendarz", -"shared with you by" => "współdzielisz z", -"New calendar" => "Nowy kalendarz", -"Edit calendar" => "Edytowanie kalendarza", -"Displayname" => "Wyświetlana nazwa", -"Active" => "Aktywny", -"Calendar color" => "Kolor", -"Save" => "Zapisz", -"Submit" => "Prześlij", -"Cancel" => "Anuluj", -"Edit an event" => "Edytowanie wydarzenia", -"Export" => "Wyeksportuj", -"Eventinfo" => "Informacja o wydarzeniach", -"Repeating" => "Powtarzanie", -"Alarm" => "Alarm", -"Attendees" => "Uczestnicy", -"Share" => "Współdziel", -"Title of the Event" => "Nazwa wydarzenia", -"Category" => "Kategoria", -"Separate categories with commas" => "Oddziel kategorie przecinkami", -"Edit categories" => "Edytuj kategorie", -"All Day Event" => "Wydarzenie całodniowe", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Opcje zaawansowane", -"Location" => "Lokalizacja", -"Location of the Event" => "Lokalizacja wydarzenia", -"Description" => "Opis", -"Description of the Event" => "Opis wydarzenia", -"Repeat" => "Powtarzanie", -"Advanced" => "Zaawansowane", -"Select weekdays" => "Wybierz dni powszechne", -"Select days" => "Wybierz dni", -"and the events day of year." => "oraz wydarzenia roku", -"and the events day of month." => "oraz wydarzenia miesiąca", -"Select months" => "Wybierz miesiące", -"Select weeks" => "Wybierz tygodnie", -"and the events week of year." => "oraz wydarzenia roku.", -"Interval" => "Interwał", -"End" => "Koniec", -"occurrences" => "wystąpienia", -"Import a calendar file" => "Zaimportuj plik kalendarza", -"Please choose the calendar" => "Proszę wybrać kalendarz", -"create a new calendar" => "stwórz nowy kalendarz", -"Name of new calendar" => "Nazwa kalendarza", -"Import" => "Import", -"Importing calendar" => "Importuje kalendarz", -"Calendar imported successfully" => "Zaimportowano kalendarz", -"Close Dialog" => "Zamknij okno", -"Create a new event" => "Tworzenie nowego wydarzenia", -"View an event" => "Zobacz wydarzenie", -"No categories selected" => "nie zaznaczono kategorii", -"Select category" => "Wybierz kategorię", -"of" => "z", -"at" => "w", -"Timezone" => "Strefa czasowa", -"Check always for changes of the timezone" => "Zawsze sprawdzaj zmiany strefy czasowej", -"Timeformat" => "Format czasu", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Pierwszy dzień tygodnia", -"Calendar CalDAV syncing address:" => "Adres synchronizacji kalendarza CalDAV:", -"Users" => "Użytkownicy", -"select users" => "wybierz użytkowników", -"Editable" => "Edytowalne", -"Groups" => "Grupy", -"select groups" => "wybierz grupy", -"make public" => "uczyń publicznym" -); diff --git a/apps/calendar/l10n/pt_BR.php b/apps/calendar/l10n/pt_BR.php deleted file mode 100644 index 95317eea0f..0000000000 --- a/apps/calendar/l10n/pt_BR.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nenhum calendário encontrado.", -"No events found." => "Nenhum evento encontrado.", -"Wrong calendar" => "Calendário incorreto", -"New Timezone:" => "Novo fuso horário", -"Timezone changed" => "Fuso horário alterado", -"Invalid request" => "Pedido inválido", -"Calendar" => "Calendário", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Aniversário", -"Business" => "Negócio", -"Call" => "Chamada", -"Clients" => "Clientes", -"Deliverer" => "Entrega", -"Holidays" => "Feriados", -"Ideas" => "Idéias", -"Journey" => "Jornada", -"Jubilee" => "Jubileu", -"Meeting" => "Reunião", -"Other" => "Outros", -"Personal" => "Pessoal", -"Projects" => "Projetos", -"Questions" => "Perguntas", -"Work" => "Trabalho", -"unnamed" => "sem nome", -"Does not repeat" => "Não repetir", -"Daily" => "Diariamente", -"Weekly" => "Semanal", -"Every Weekday" => "Cada dia da semana", -"Bi-Weekly" => "De duas em duas semanas", -"Monthly" => "Mensal", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por ocorrências", -"by date" => "por data", -"by monthday" => "por dia do mês", -"by weekday" => "por dia da semana", -"Monday" => "Segunda-feira", -"Tuesday" => "Terça-feira", -"Wednesday" => "Quarta-feira", -"Thursday" => "Quinta-feira", -"Friday" => "Sexta-feira", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "semana do evento no mês", -"first" => "primeiro", -"second" => "segundo", -"third" => "terceiro", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Janeiro", -"February" => "Fevereiro", -"March" => "Março", -"April" => "Abril", -"May" => "Maio", -"June" => "Junho", -"July" => "Julho", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Dezembro", -"by events date" => "eventos por data", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) da semana", -"by day and month" => "por dia e mês", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Todo o dia", -"New Calendar" => "Novo Calendário", -"Missing fields" => "Campos incompletos", -"Title" => "Título", -"From Date" => "Desde a Data", -"From Time" => "Desde a Hora", -"To Date" => "Até a Data", -"To Time" => "Até a Hora", -"The event ends before it starts" => "O evento termina antes de começar", -"There was a database fail" => "Houve uma falha de banco de dados", -"Week" => "Semana", -"Month" => "Mês", -"List" => "Lista", -"Today" => "Hoje", -"Calendars" => "Calendários", -"There was a fail, while parsing the file." => "Houve uma falha, ao analisar o arquivo.", -"Choose active calendars" => "Escolha calendários ativos", -"Your calendars" => "Meus Calendários", -"CalDav Link" => "Link para CalDav", -"Shared calendars" => "Calendários Compartilhados", -"No shared calendars" => "Nenhum Calendário Compartilhado", -"Share Calendar" => "Compartilhar Calendário", -"Download" => "Baixar", -"Edit" => "Editar", -"Delete" => "Excluir", -"shared with you by" => "compartilhado com você por", -"New calendar" => "Novo calendário", -"Edit calendar" => "Editar calendário", -"Displayname" => "Mostrar Nome", -"Active" => "Ativo", -"Calendar color" => "Cor do Calendário", -"Save" => "Salvar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", -"Edit an event" => "Editar um evento", -"Export" => "Exportar", -"Eventinfo" => "Info de Evento", -"Repeating" => "Repetindo", -"Alarm" => "Alarme", -"Attendees" => "Participantes", -"Share" => "Compartilhar", -"Title of the Event" => "Título do evento", -"Category" => "Categoria", -"Separate categories with commas" => "Separe as categorias por vírgulas", -"Edit categories" => "Editar categorias", -"All Day Event" => "Evento de dia inteiro", -"From" => "De", -"To" => "Para", -"Advanced options" => "Opções avançadas", -"Location" => "Local", -"Location of the Event" => "Local do evento", -"Description" => "Descrição", -"Description of the Event" => "Descrição do Evento", -"Repeat" => "Repetir", -"Advanced" => "Avançado", -"Select weekdays" => "Selecionar dias da semana", -"Select days" => "Selecionar dias", -"and the events day of year." => "e o dia do evento no ano.", -"and the events day of month." => "e o dia do evento no mês.", -"Select months" => "Selecionar meses", -"Select weeks" => "Selecionar semanas", -"and the events week of year." => "e a semana do evento no ano.", -"Interval" => "Intervalo", -"End" => "Final", -"occurrences" => "ocorrências", -"Import a calendar file" => "Importar um arquivo de calendário", -"Please choose the calendar" => "Por favor, escolha o calendário", -"create a new calendar" => "criar um novo calendário", -"Name of new calendar" => "Nome do novo calendário", -"Import" => "Importar", -"Importing calendar" => "Importar calendário", -"Calendar imported successfully" => "Calendário importado com sucesso", -"Close Dialog" => "Fechar caixa de diálogo", -"Create a new event" => "Criar um novo evento", -"View an event" => "Visualizar evento", -"No categories selected" => "Nenhuma categoria selecionada", -"Select category" => "Selecionar categoria", -"of" => "de", -"at" => "para", -"Timezone" => "Fuso horário", -"Check always for changes of the timezone" => "Verificar sempre mudanças no fuso horário", -"Timeformat" => "Formato da Hora", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primeiro dia da semana", -"Calendar CalDAV syncing address:" => "Sincronização de endereço do calendário CalDAV :", -"Users" => "Usuários", -"select users" => "Selecione usuários", -"Editable" => "Editável", -"Groups" => "Grupos", -"select groups" => "Selecione grupos", -"make public" => "Tornar público" -); diff --git a/apps/calendar/l10n/pt_PT.php b/apps/calendar/l10n/pt_PT.php deleted file mode 100644 index 33f85569cc..0000000000 --- a/apps/calendar/l10n/pt_PT.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nenhum calendário encontrado.", -"No events found." => "Nenhum evento encontrado.", -"Wrong calendar" => "Calendário errado", -"New Timezone:" => "Nova zona horária", -"Timezone changed" => "Zona horária alterada", -"Invalid request" => "Pedido inválido", -"Calendar" => "Calendário", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Dia de anos", -"Business" => "Negócio", -"Call" => "Telefonar", -"Clients" => "Clientes", -"Deliverer" => "Entregar", -"Holidays" => "Férias", -"Ideas" => "Ideias", -"Journey" => "Jornada", -"Jubilee" => "Jublieu", -"Meeting" => "Encontro", -"Other" => "Outro", -"Personal" => "Pessoal", -"Projects" => "Projetos", -"Questions" => "Perguntas", -"Work" => "Trabalho", -"unnamed" => "não definido", -"Does not repeat" => "Não repete", -"Daily" => "Diário", -"Weekly" => "Semanal", -"Every Weekday" => "Todos os dias da semana", -"Bi-Weekly" => "Bi-semanal", -"Monthly" => "Mensal", -"Yearly" => "Anual", -"never" => "nunca", -"by occurrences" => "por ocorrências", -"by date" => "por data", -"by monthday" => "por dia do mês", -"by weekday" => "por dia da semana", -"Monday" => "Segunda", -"Tuesday" => "Terça", -"Wednesday" => "Quarta", -"Thursday" => "Quinta", -"Friday" => "Sexta", -"Saturday" => "Sábado", -"Sunday" => "Domingo", -"events week of month" => "Eventos da semana do mês", -"first" => "primeiro", -"second" => "segundo", -"third" => "terçeiro", -"fourth" => "quarto", -"fifth" => "quinto", -"last" => "último", -"January" => "Janeiro", -"February" => "Fevereiro", -"March" => "Março", -"April" => "Abril", -"May" => "Maio", -"June" => "Junho", -"July" => "Julho", -"August" => "Agosto", -"September" => "Setembro", -"October" => "Outubro", -"November" => "Novembro", -"December" => "Dezembro", -"by events date" => "por data de evento", -"by yearday(s)" => "por dia(s) do ano", -"by weeknumber(s)" => "por número(s) da semana", -"by day and month" => "por dia e mês", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Todo o dia", -"New Calendar" => "Novo calendário", -"Missing fields" => "Falta campos", -"Title" => "Título", -"From Date" => "Da data", -"From Time" => "Da hora", -"To Date" => "Para data", -"To Time" => "Para hora", -"The event ends before it starts" => "O evento acaba antes de começar", -"There was a database fail" => "Houve uma falha de base de dados", -"Week" => "Semana", -"Month" => "Mês", -"List" => "Lista", -"Today" => "Hoje", -"Calendars" => "Calendários", -"There was a fail, while parsing the file." => "Houve uma falha durante a análise do ficheiro", -"Choose active calendars" => "Escolhe calendários ativos", -"Your calendars" => "Os seus calendários", -"CalDav Link" => "Endereço CalDav", -"Shared calendars" => "Calendários partilhados", -"No shared calendars" => "Nenhum calendário partilhado", -"Share Calendar" => "Partilhar calendário", -"Download" => "Transferir", -"Edit" => "Editar", -"Delete" => "Apagar", -"shared with you by" => "Partilhado consigo por", -"New calendar" => "Novo calendário", -"Edit calendar" => "Editar calendário", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Calendar color" => "Cor do calendário", -"Save" => "Guardar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", -"Edit an event" => "Editar um evento", -"Export" => "Exportar", -"Eventinfo" => "Informação do evento", -"Repeating" => "Repetição", -"Alarm" => "Alarme", -"Attendees" => "Participantes", -"Share" => "Partilhar", -"Title of the Event" => "Título do evento", -"Category" => "Categoria", -"Separate categories with commas" => "Separe categorias por virgulas", -"Edit categories" => "Editar categorias", -"All Day Event" => "Evento de dia inteiro", -"From" => "De", -"To" => "Para", -"Advanced options" => "Opções avançadas", -"Location" => "Localização", -"Location of the Event" => "Localização do evento", -"Description" => "Descrição", -"Description of the Event" => "Descrição do evento", -"Repeat" => "Repetir", -"Advanced" => "Avançado", -"Select weekdays" => "Seleciona os dias da semana", -"Select days" => "Seleciona os dias", -"and the events day of year." => "e o dia de eventos do ano.", -"and the events day of month." => "e o dia de eventos do mês.", -"Select months" => "Seleciona os meses", -"Select weeks" => "Seleciona as semanas", -"and the events week of year." => "e a semana de eventos do ano.", -"Interval" => "Intervalo", -"End" => "Fim", -"occurrences" => "ocorrências", -"Import a calendar file" => "Importar um ficheiro de calendário", -"Please choose the calendar" => "Por favor escolhe o calendário", -"create a new calendar" => "criar novo calendário", -"Name of new calendar" => "Nome do novo calendário", -"Import" => "Importar", -"Importing calendar" => "A importar calendário", -"Calendar imported successfully" => "Calendário importado com sucesso", -"Close Dialog" => "Fechar diálogo", -"Create a new event" => "Criar novo evento", -"View an event" => "Ver um evento", -"No categories selected" => "Nenhuma categoria seleccionada", -"Select category" => "Selecionar categoria", -"of" => "de", -"at" => "em", -"Timezone" => "Zona horária", -"Check always for changes of the timezone" => "Verificar sempre por alterações na zona horária", -"Timeformat" => "Formato da hora", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Primeiro dia da semana", -"Calendar CalDAV syncing address:" => "Endereço de sincronização CalDav do calendário", -"Users" => "Utilizadores", -"select users" => "Selecione utilizadores", -"Editable" => "Editavel", -"Groups" => "Grupos", -"select groups" => "Selecione grupos", -"make public" => "Tornar público" -); diff --git a/apps/calendar/l10n/ro.php b/apps/calendar/l10n/ro.php deleted file mode 100644 index 550afcd102..0000000000 --- a/apps/calendar/l10n/ro.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nici un calendar găsit.", -"No events found." => "Nici un eveniment găsit.", -"Wrong calendar" => "Calendar greșit", -"New Timezone:" => "Fus orar nou:", -"Timezone changed" => "Fus orar schimbat", -"Invalid request" => "Cerere eronată", -"Calendar" => "Calendar", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "LLL z[aaaa]{'—'[LLL] z aaaa}", -"Birthday" => "Zi de naștere", -"Business" => "Afaceri", -"Call" => "Sună", -"Clients" => "Clienți", -"Deliverer" => "Curier", -"Holidays" => "Sărbători", -"Ideas" => "Idei", -"Journey" => "Călătorie", -"Jubilee" => "Aniversare", -"Meeting" => "Întâlnire", -"Other" => "Altele", -"Personal" => "Personal", -"Projects" => "Proiecte", -"Questions" => "Întrebări", -"Work" => "Servici", -"unnamed" => "fără nume", -"Does not repeat" => "Nerepetabil", -"Daily" => "Zilnic", -"Weekly" => "Săptămânal", -"Every Weekday" => "În fiecare zii a săptămânii", -"Bi-Weekly" => "La fiecare două săptămâni", -"Monthly" => "Lunar", -"Yearly" => "Anual", -"never" => "niciodată", -"by occurrences" => "după repetiție", -"by date" => "după dată", -"by monthday" => "după ziua lunii", -"by weekday" => "după ziua săptămânii", -"Monday" => "Luni", -"Tuesday" => "Marți", -"Wednesday" => "Miercuri", -"Thursday" => "Joi", -"Friday" => "Vineri", -"Saturday" => "Sâmbătă", -"Sunday" => "Duminică", -"events week of month" => "evenimentele săptămânii din luna", -"first" => "primul", -"second" => "al doilea", -"third" => "al treilea", -"fourth" => "al patrulea", -"fifth" => "al cincilea", -"last" => "ultimul", -"January" => "Ianuarie", -"February" => "Februarie", -"March" => "Martie", -"April" => "Aprilie", -"May" => "Mai", -"June" => "Iunie", -"July" => "Iulie", -"August" => "August", -"September" => "Septembrie", -"October" => "Octombrie", -"November" => "Noiembrie", -"December" => "Decembrie", -"by events date" => "după data evenimentului", -"by yearday(s)" => "după ziua(zilele) anului", -"by weeknumber(s)" => "după numărul săptămânii", -"by day and month" => "după zi și lună", -"Date" => "Data", -"Cal." => "Cal.", -"All day" => "Toată ziua", -"New Calendar" => "Calendar nou", -"Missing fields" => "Câmpuri lipsă", -"Title" => "Titlu", -"From Date" => "Începând cu", -"From Time" => "De la", -"To Date" => "Până pe", -"To Time" => "La", -"The event ends before it starts" => "Evenimentul se termină înainte să înceapă", -"There was a database fail" => "A avut loc o eroare a bazei de date", -"Week" => "Săptămâna", -"Month" => "Luna", -"List" => "Listă", -"Today" => "Astăzi", -"Calendars" => "Calendare", -"There was a fail, while parsing the file." => "A fost întâmpinată o eroare în procesarea fișierului", -"Choose active calendars" => "Alege calendarele active", -"Your calendars" => "Calendarele tale", -"CalDav Link" => "Legătură CalDav", -"Shared calendars" => "Calendare partajate", -"No shared calendars" => "Nici un calendar partajat", -"Share Calendar" => "Partajați calendarul", -"Download" => "Descarcă", -"Edit" => "Modifică", -"Delete" => "Șterge", -"shared with you by" => "Partajat cu tine de", -"New calendar" => "Calendar nou", -"Edit calendar" => "Modifică calendarul", -"Displayname" => "Nume afișat", -"Active" => "Activ", -"Calendar color" => "Culoarea calendarului", -"Save" => "Salveză", -"Submit" => "Trimite", -"Cancel" => "Anulează", -"Edit an event" => "Modifică un eveniment", -"Export" => "Exportă", -"Eventinfo" => "Informații despre eveniment", -"Repeating" => "Ciclic", -"Alarm" => "Alarmă", -"Attendees" => "Participanți", -"Share" => "Partajează", -"Title of the Event" => "Numele evenimentului", -"Category" => "Categorie", -"Separate categories with commas" => "Separă categoriile prin virgule", -"Edit categories" => "Editează categorii", -"All Day Event" => "Toată ziua", -"From" => "De la", -"To" => "Către", -"Advanced options" => "Opțiuni avansate", -"Location" => "Locație", -"Location of the Event" => "Locația evenimentului", -"Description" => "Descriere", -"Description of the Event" => "Descrierea evenimentului", -"Repeat" => "Repetă", -"Advanced" => "Avansat", -"Select weekdays" => "Selectează zilele săptămânii", -"Select days" => "Selectează zilele", -"and the events day of year." => "și evenimentele de zi cu zi ale anului.", -"and the events day of month." => "și evenimentele de zi cu zi ale lunii.", -"Select months" => "Selectează lunile", -"Select weeks" => "Selectează săptămânile", -"and the events week of year." => "și evenimentele săptămânale ale anului.", -"Interval" => "Interval", -"End" => "Sfârșit", -"occurrences" => "repetiții", -"Import a calendar file" => "Importă un calendar", -"Please choose the calendar" => "Alegeți calendarul", -"create a new calendar" => "crează un calendar nou", -"Name of new calendar" => "Numele noului calendar", -"Import" => "Importă", -"Importing calendar" => "Importă calendar", -"Calendar imported successfully" => "Calendarul a fost importat cu succes", -"Close Dialog" => "Închide", -"Create a new event" => "Crează un eveniment nou", -"View an event" => "Vizualizează un eveniment", -"No categories selected" => "Nici o categorie selectată", -"Select category" => "Selecteză categoria", -"of" => "din", -"at" => "la", -"Timezone" => "Fus orar", -"Check always for changes of the timezone" => "Verifică mereu pentru schimbări ale fusului orar", -"Timeformat" => "Forma de afișare a orei", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Prima zi a săptămînii", -"Calendar CalDAV syncing address:" => "Adresa pentru sincronizarea calendarului CalDAV", -"Users" => "Utilizatori", -"select users" => "utilizatori selectați", -"Editable" => "Editabil", -"Groups" => "Grupuri", -"select groups" => "grupuri selectate", -"make public" => "fă public" -); diff --git a/apps/calendar/l10n/ru.php b/apps/calendar/l10n/ru.php deleted file mode 100644 index af40b06b9f..0000000000 --- a/apps/calendar/l10n/ru.php +++ /dev/null @@ -1,159 +0,0 @@ - "Календари не найдены.", -"No events found." => "События не найдены.", -"Wrong calendar" => "Неверный календарь", -"New Timezone:" => "Новый часовой пояс:", -"Timezone changed" => "Часовой пояс изменён", -"Invalid request" => "Неверный запрос", -"Calendar" => "Календарь", -"Birthday" => "День рождения", -"Business" => "Бизнес", -"Call" => "Звонить", -"Clients" => "Клиенты", -"Deliverer" => "Доставщик", -"Holidays" => "Праздники", -"Ideas" => "Идеи", -"Journey" => "Поездка", -"Jubilee" => "Юбилей", -"Meeting" => "Встреча", -"Other" => "Другое", -"Personal" => "Личное", -"Projects" => "Проекты", -"Questions" => "Вопросы", -"Work" => "Работа", -"unnamed" => "без имени", -"Does not repeat" => "Не повторяется", -"Daily" => "Ежедневно", -"Weekly" => "Еженедельно", -"Every Weekday" => "По будням", -"Bi-Weekly" => "Каждые две недели", -"Monthly" => "Каждый месяц", -"Yearly" => "Каждый год", -"never" => "никогда", -"by occurrences" => "по числу повторений", -"by date" => "по дате", -"by monthday" => "по дню месяца", -"by weekday" => "по дню недели", -"Monday" => "Понедельник", -"Tuesday" => "Вторник", -"Wednesday" => "Среда", -"Thursday" => "Четверг", -"Friday" => "Пятница", -"Saturday" => "Суббота", -"Sunday" => "Воскресенье", -"events week of month" => "неделя месяца", -"first" => "первая", -"second" => "вторая", -"third" => "третья", -"fourth" => "червётрая", -"fifth" => "пятая", -"last" => "последняя", -"January" => "Январь", -"February" => "Февраль", -"March" => "Март", -"April" => "Апрель", -"May" => "Май", -"June" => "Июнь", -"July" => "Июль", -"August" => "Август", -"September" => "Сентябрь", -"October" => "Октябрь", -"November" => "Ноябрь", -"December" => "Декабрь", -"by events date" => "по дате событий", -"by yearday(s)" => "по дням недели", -"by weeknumber(s)" => "по номерам недели", -"by day and month" => "по дню и месяцу", -"Date" => "Дата", -"Cal." => "Кал.", -"All day" => "Весь день", -"New Calendar" => "Новый Календарь", -"Missing fields" => "Незаполненные поля", -"Title" => "Название", -"From Date" => "Дата начала", -"From Time" => "Время начала", -"To Date" => "Дата окончания", -"To Time" => "Время окончания", -"The event ends before it starts" => "Окончание события раньше, чем его начало", -"There was a database fail" => "Ошибка базы данных", -"Week" => "Неделя", -"Month" => "Месяц", -"List" => "Список", -"Today" => "Сегодня", -"Calendars" => "Календари", -"There was a fail, while parsing the file." => "Не удалось обработать файл.", -"Choose active calendars" => "Выберите активные календари", -"Your calendars" => "Ваши календари", -"CalDav Link" => "Ссылка для CalDav", -"Shared calendars" => "Общие календари", -"No shared calendars" => "Нет общих календарей", -"Share Calendar" => "Сделать календарь общим", -"Download" => "Скачать", -"Edit" => "Редактировать", -"Delete" => "Удалить", -"shared with you by" => "с вами поделился", -"New calendar" => "Новый календарь", -"Edit calendar" => "Редактировать календарь", -"Displayname" => "Отображаемое имя", -"Active" => "Активен", -"Calendar color" => "Цвет календаря", -"Save" => "Сохранить", -"Submit" => "Отправить", -"Cancel" => "Отмена", -"Edit an event" => "Редактировать событие", -"Export" => "Экспортировать", -"Eventinfo" => "Информация о событии", -"Repeating" => "Повторение", -"Alarm" => "Сигнал", -"Attendees" => "Участники", -"Share" => "Поделиться", -"Title of the Event" => "Название событие", -"Category" => "Категория", -"Separate categories with commas" => "Разделяйте категории запятыми", -"Edit categories" => "Редактировать категории", -"All Day Event" => "Событие на весь день", -"From" => "От", -"To" => "До", -"Advanced options" => "Дополнительные параметры", -"Location" => "Место", -"Location of the Event" => "Место события", -"Description" => "Описание", -"Description of the Event" => "Описание события", -"Repeat" => "Повтор", -"Advanced" => "Дополнительно", -"Select weekdays" => "Выбрать дни недели", -"Select days" => "Выбрать дни", -"and the events day of year." => "и день года события", -"and the events day of month." => "и день месяца события", -"Select months" => "Выбрать месяцы", -"Select weeks" => "Выбрать недели", -"and the events week of year." => "и номер недели события", -"Interval" => "Интервал", -"End" => "Окончание", -"occurrences" => "повторений", -"Import a calendar file" => "Импортировать календарь из файла", -"Please choose the calendar" => "Пожалуйста, выберите календарь", -"create a new calendar" => "Создать новый календарь", -"Name of new calendar" => "Название нового календаря", -"Import" => "Импортировать", -"Importing calendar" => "Импортируется календарь", -"Calendar imported successfully" => "Календарь успешно импортирован", -"Close Dialog" => "Закрыть Сообщение", -"Create a new event" => "Создать новое событие", -"View an event" => "Показать событие", -"No categories selected" => "Категории не выбраны", -"Select category" => "Выбрать категорию", -"Timezone" => "Часовой пояс", -"Check always for changes of the timezone" => "Всегда проверяйте изменение часового пояса", -"Timeformat" => "Формат времени", -"24h" => "24ч", -"12h" => "12ч", -"First day of the week" => "Первый день недели", -"Calendar CalDAV syncing address:" => "Адрес синхронизации календаря CalDAV:", -"Users" => "Пользователи", -"select users" => "выбрать пользователей", -"Editable" => "Редактируемо", -"Groups" => "Группы", -"select groups" => "выбрать группы", -"make public" => "селать публичным" -); diff --git a/apps/calendar/l10n/sk_SK.php b/apps/calendar/l10n/sk_SK.php deleted file mode 100644 index e182a9d3ea..0000000000 --- a/apps/calendar/l10n/sk_SK.php +++ /dev/null @@ -1,162 +0,0 @@ - "Nenašiel sa žiadny kalendár.", -"No events found." => "Nenašla sa žiadna udalosť.", -"Wrong calendar" => "Zlý kalendár", -"New Timezone:" => "Nová časová zóna:", -"Timezone changed" => "Časové pásmo zmenené", -"Invalid request" => "Neplatná požiadavka", -"Calendar" => "Kalendár", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d. MMM[ yyyy]{ '—' d.[ MMM] yyyy}", -"Birthday" => "Narodeniny", -"Business" => "Podnikanie", -"Call" => "Hovor", -"Clients" => "Klienti", -"Deliverer" => "Doručovateľ", -"Holidays" => "Prázdniny", -"Ideas" => "Nápady", -"Journey" => "Cesta", -"Jubilee" => "Jubileá", -"Meeting" => "Stretnutia", -"Other" => "Ostatné", -"Personal" => "Osobné", -"Projects" => "Projekty", -"Questions" => "Otázky", -"Work" => "Práca", -"unnamed" => "nepomenovaný", -"Does not repeat" => "Neopakovať", -"Daily" => "Denne", -"Weekly" => "Týždenne", -"Every Weekday" => "Každý deň v týždni", -"Bi-Weekly" => "Každý druhý týždeň", -"Monthly" => "Mesačne", -"Yearly" => "Ročne", -"never" => "nikdy", -"by occurrences" => "podľa výskytu", -"by date" => "podľa dátumu", -"by monthday" => "podľa dňa v mesiaci", -"by weekday" => "podľa dňa v týždni", -"Monday" => "Pondelok", -"Tuesday" => "Utorok", -"Wednesday" => "Streda", -"Thursday" => "Štvrtok", -"Friday" => "Piatok", -"Saturday" => "Sobota", -"Sunday" => "Nedeľa", -"events week of month" => "týždenné udalosti v mesiaci", -"first" => "prvý", -"second" => "druhý", -"third" => "tretí", -"fourth" => "štvrtý", -"fifth" => "piaty", -"last" => "posledný", -"January" => "Január", -"February" => "Február", -"March" => "Marec", -"April" => "Apríl", -"May" => "Máj", -"June" => "Jún", -"July" => "Júl", -"August" => "August", -"September" => "September", -"October" => "Október", -"November" => "November", -"December" => "December", -"by events date" => "podľa dátumu udalosti", -"by yearday(s)" => "po dňoch", -"by weeknumber(s)" => "podľa čísel týždňov", -"by day and month" => "podľa dňa a mesiaca", -"Date" => "Dátum", -"Cal." => "Kal.", -"All day" => "Celý deň", -"New Calendar" => "Nový kalendár", -"Missing fields" => "Nevyplnené položky", -"Title" => "Nadpis", -"From Date" => "Od dátumu", -"From Time" => "Od času", -"To Date" => "Do dátumu", -"To Time" => "Do času", -"The event ends before it starts" => "Udalosť končí ešte pred tým než začne", -"There was a database fail" => "Nastala chyba databázy", -"Week" => "Týždeň", -"Month" => "Mesiac", -"List" => "Zoznam", -"Today" => "Dnes", -"Calendars" => "Kalendáre", -"There was a fail, while parsing the file." => "Nastala chyba počas parsovania súboru.", -"Choose active calendars" => "Zvoľte aktívne kalendáre", -"Your calendars" => "Vaše kalendáre", -"CalDav Link" => "CalDav odkaz", -"Shared calendars" => "Zdielané kalendáre", -"No shared calendars" => "Žiadne zdielané kalendáre", -"Share Calendar" => "Zdielať kalendár", -"Download" => "Stiahnuť", -"Edit" => "Upraviť", -"Delete" => "Odstrániť", -"shared with you by" => "zdielané s vami používateľom", -"New calendar" => "Nový kalendár", -"Edit calendar" => "Upraviť kalendár", -"Displayname" => "Zobrazené meno", -"Active" => "Aktívne", -"Calendar color" => "Farba kalendáru", -"Save" => "Uložiť", -"Submit" => "Odoslať", -"Cancel" => "Zrušiť", -"Edit an event" => "Upraviť udalosť", -"Export" => "Exportovať", -"Eventinfo" => "Informácie o udalosti", -"Repeating" => "Opakovanie", -"Alarm" => "Alarm", -"Attendees" => "Účastníci", -"Share" => "Zdielať", -"Title of the Event" => "Nadpis udalosti", -"Category" => "Kategória", -"Separate categories with commas" => "Kategórie oddelené čiarkami", -"Edit categories" => "Úprava kategórií", -"All Day Event" => "Celodenná udalosť", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Pokročilé možnosti", -"Location" => "Poloha", -"Location of the Event" => "Poloha udalosti", -"Description" => "Popis", -"Description of the Event" => "Popis udalosti", -"Repeat" => "Opakovať", -"Advanced" => "Pokročilé", -"Select weekdays" => "Do času", -"Select days" => "Vybrať dni", -"and the events day of year." => "a denné udalosti v roku.", -"and the events day of month." => "a denné udalosti v mesiaci.", -"Select months" => "Vybrať mesiace", -"Select weeks" => "Vybrať týždne", -"and the events week of year." => "a týždenné udalosti v roku.", -"Interval" => "Interval", -"End" => "Koniec", -"occurrences" => "výskyty", -"Import a calendar file" => "Importovať súbor kalendára", -"Please choose the calendar" => "Prosím zvoľte kalendár", -"create a new calendar" => "vytvoriť nový kalendár", -"Name of new calendar" => "Meno nového kalendára", -"Import" => "Importovať", -"Importing calendar" => "Importujem kalendár", -"Calendar imported successfully" => "Kalendár úspešne importovaný", -"Close Dialog" => "Zatvoriť dialóg", -"Create a new event" => "Vytvoriť udalosť", -"View an event" => "Zobraziť udalosť", -"No categories selected" => "Žiadne vybraté kategórie", -"Select category" => "Vybrať kategóriu", -"of" => "z", -"at" => "v", -"Timezone" => "Časová zóna", -"Check always for changes of the timezone" => "Vždy kontroluj zmeny časového pásma", -"Timeformat" => "Formát času", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Prvý deň v týždni", -"Calendar CalDAV syncing address:" => "Synchronizačná adresa kalendára CalDAV: ", -"Users" => "Používatelia", -"select users" => "vybrať používateľov", -"Editable" => "Upravovateľné", -"Groups" => "Skupiny", -"select groups" => "vybrať skupiny", -"make public" => "zverejniť" -); diff --git a/apps/calendar/l10n/sl.php b/apps/calendar/l10n/sl.php deleted file mode 100644 index 3bf03ede12..0000000000 --- a/apps/calendar/l10n/sl.php +++ /dev/null @@ -1,162 +0,0 @@ - "Ni bilo najdenih koledarjev.", -"No events found." => "Ni bilo najdenih dogodkov.", -"Wrong calendar" => "Napačen koledar", -"New Timezone:" => "Nov časovni pas:", -"Timezone changed" => "Časovni pas je bil spremenjen", -"Invalid request" => "Neveljaven zahtevek", -"Calendar" => "Koledar", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Rojstni dan", -"Business" => "Poslovno", -"Call" => "Pokliči", -"Clients" => "Stranke", -"Deliverer" => "Dobavitelj", -"Holidays" => "Dopust", -"Ideas" => "Ideje", -"Journey" => "Potovanje", -"Jubilee" => "Obletnica", -"Meeting" => "Sestanek", -"Other" => "Ostalo", -"Personal" => "Osebno", -"Projects" => "Projekt", -"Questions" => "Vprašanja", -"Work" => "Delo", -"unnamed" => "neimenovan", -"Does not repeat" => "Se ne ponavlja", -"Daily" => "Dnevno", -"Weekly" => "Tedensko", -"Every Weekday" => "Vsak dan v tednu", -"Bi-Weekly" => "Dvakrat tedensko", -"Monthly" => "Mesečno", -"Yearly" => "Letno", -"never" => "nikoli", -"by occurrences" => "po številu dogodkov", -"by date" => "po datumu", -"by monthday" => "po dnevu v mesecu", -"by weekday" => "po dnevu v tednu", -"Monday" => "ponedeljek", -"Tuesday" => "torek", -"Wednesday" => "sreda", -"Thursday" => "četrtek", -"Friday" => "petek", -"Saturday" => "sobota", -"Sunday" => "nedelja", -"events week of month" => "dogodki tedna v mesecu", -"first" => "prvi", -"second" => "drugi", -"third" => "tretji", -"fourth" => "četrti", -"fifth" => "peti", -"last" => "zadnji", -"January" => "januar", -"February" => "februar", -"March" => "marec", -"April" => "april", -"May" => "maj", -"June" => "junij", -"July" => "julij", -"August" => "avgust", -"September" => "september", -"October" => "oktober", -"November" => "november", -"December" => "december", -"by events date" => "po datumu dogodka", -"by yearday(s)" => "po številu let", -"by weeknumber(s)" => "po tednu v letu", -"by day and month" => "po dnevu in mesecu", -"Date" => "Datum", -"Cal." => "Kol.", -"All day" => "Cel dan", -"New Calendar" => "Nov koledar", -"Missing fields" => "Mankajoča polja", -"Title" => "Naslov", -"From Date" => "od Datum", -"From Time" => "od Čas", -"To Date" => "do Datum", -"To Time" => "do Čas", -"The event ends before it starts" => "Dogodek se konča preden se začne", -"There was a database fail" => "Napaka v podatkovni zbirki", -"Week" => "Teden", -"Month" => "Mesec", -"List" => "Seznam", -"Today" => "Danes", -"Calendars" => "Koledarji", -"There was a fail, while parsing the file." => "Pri razčlenjevanju datoteke je prišlo do napake.", -"Choose active calendars" => "Izberite aktivne koledarje", -"Your calendars" => "Vaši koledarji", -"CalDav Link" => "CalDav povezava", -"Shared calendars" => "Koledarji v souporabi", -"No shared calendars" => "Ni koledarjev v souporabi", -"Share Calendar" => "Daj koledar v souporabo", -"Download" => "Prenesi", -"Edit" => "Uredi", -"Delete" => "Izbriši", -"shared with you by" => "z vami souporablja", -"New calendar" => "Nov koledar", -"Edit calendar" => "Uredi koledar", -"Displayname" => "Ime za prikaz", -"Active" => "Aktivno", -"Calendar color" => "Barva koledarja", -"Save" => "Shrani", -"Submit" => "Potrdi", -"Cancel" => "Prekliči", -"Edit an event" => "Uredi dogodek", -"Export" => "Izvozi", -"Eventinfo" => "Informacije od dogodku", -"Repeating" => "Ponavljanja", -"Alarm" => "Alarm", -"Attendees" => "Udeleženci", -"Share" => "Souporaba", -"Title of the Event" => "Naslov dogodka", -"Category" => "Kategorija", -"Separate categories with commas" => "Kategorije ločite z vejico", -"Edit categories" => "Uredi kategorije", -"All Day Event" => "Celodnevni dogodek", -"From" => "Od", -"To" => "Do", -"Advanced options" => "Napredne možnosti", -"Location" => "Kraj", -"Location of the Event" => "Kraj dogodka", -"Description" => "Opis", -"Description of the Event" => "Opis dogodka", -"Repeat" => "Ponovi", -"Advanced" => "Napredno", -"Select weekdays" => "Izberite dneve v tednu", -"Select days" => "Izberite dneve", -"and the events day of year." => "in dnevu dogodka v letu.", -"and the events day of month." => "in dnevu dogodka v mesecu.", -"Select months" => "Izberite mesece", -"Select weeks" => "Izberite tedne", -"and the events week of year." => "in tednu dogodka v letu.", -"Interval" => "Časovni razmik", -"End" => "Konec", -"occurrences" => "ponovitev", -"Import a calendar file" => "Uvozi datoteko koledarja", -"Please choose the calendar" => "Izberi koledar", -"create a new calendar" => "Ustvari nov koledar", -"Name of new calendar" => "Ime novega koledarja", -"Import" => "Uvozi", -"Importing calendar" => "Uvažam koledar", -"Calendar imported successfully" => "Koledar je bil uspešno uvožen", -"Close Dialog" => "Zapri dialog", -"Create a new event" => "Ustvari nov dogodek", -"View an event" => "Poglej dogodek", -"No categories selected" => "Nobena kategorija ni izbrana", -"Select category" => "Izberi kategorijo", -"of" => "od", -"at" => "pri", -"Timezone" => "Časovni pas", -"Check always for changes of the timezone" => "Vedno preveri za spremembe časovnega pasu", -"Timeformat" => "Zapis časa", -"24h" => "24ur", -"12h" => "12ur", -"First day of the week" => "Prvi dan v tednu", -"Calendar CalDAV syncing address:" => "CalDAV sinhronizacijski naslov koledarja:", -"Users" => "Uporabniki", -"select users" => "izberite uporabnike", -"Editable" => "Možno urejanje", -"Groups" => "Skupine", -"select groups" => "izberite skupine", -"make public" => "objavi" -); diff --git a/apps/calendar/l10n/sr.php b/apps/calendar/l10n/sr.php deleted file mode 100644 index 5798c66e0a..0000000000 --- a/apps/calendar/l10n/sr.php +++ /dev/null @@ -1,64 +0,0 @@ - "Погрешан календар", -"Timezone changed" => "Временска зона је промењена", -"Invalid request" => "Неисправан захтев", -"Calendar" => "Календар", -"Birthday" => "Рођендан", -"Business" => "Посао", -"Call" => "Позив", -"Clients" => "Клијенти", -"Deliverer" => "Достављач", -"Holidays" => "Празници", -"Ideas" => "Идеје", -"Journey" => "путовање", -"Jubilee" => "јубилеј", -"Meeting" => "Састанак", -"Other" => "Друго", -"Personal" => "Лично", -"Projects" => "Пројекти", -"Questions" => "Питања", -"Work" => "Посао", -"Does not repeat" => "Не понавља се", -"Daily" => "дневно", -"Weekly" => "недељно", -"Every Weekday" => "сваког дана у недељи", -"Bi-Weekly" => "двонедељно", -"Monthly" => "месечно", -"Yearly" => "годишње", -"All day" => "Цео дан", -"New Calendar" => "Нови календар", -"Title" => "Наслов", -"Week" => "Недеља", -"Month" => "Месец", -"List" => "Списак", -"Today" => "Данас", -"Calendars" => "Календари", -"There was a fail, while parsing the file." => "дошло је до грешке при расчлањивању фајла.", -"Choose active calendars" => "Изаберите активне календаре", -"CalDav Link" => "КалДав веза", -"Download" => "Преузми", -"Edit" => "Уреди", -"Delete" => "Обриши", -"New calendar" => "Нови календар", -"Edit calendar" => "Уреди календар", -"Displayname" => "Приказаноиме", -"Active" => "Активан", -"Calendar color" => "Боја календара", -"Save" => "Сними", -"Submit" => "Пошаљи", -"Cancel" => "Откажи", -"Edit an event" => "Уреди догађај", -"Title of the Event" => "Наслов догађаја", -"Category" => "Категорија", -"All Day Event" => "Целодневни догађај", -"From" => "Од", -"To" => "До", -"Location" => "Локација", -"Location of the Event" => "Локација догађаја", -"Description" => "Опис", -"Description of the Event" => "Опис догађаја", -"Repeat" => "Понављај", -"Create a new event" => "Направи нови догађај", -"Select category" => "Изаберите категорију", -"Timezone" => "Временска зона" -); diff --git a/apps/calendar/l10n/sr@latin.php b/apps/calendar/l10n/sr@latin.php deleted file mode 100644 index c261f903f7..0000000000 --- a/apps/calendar/l10n/sr@latin.php +++ /dev/null @@ -1,64 +0,0 @@ - "Pogrešan kalendar", -"Timezone changed" => "Vremenska zona je promenjena", -"Invalid request" => "Neispravan zahtev", -"Calendar" => "Kalendar", -"Birthday" => "Rođendan", -"Business" => "Posao", -"Call" => "Poziv", -"Clients" => "Klijenti", -"Deliverer" => "Dostavljač", -"Holidays" => "Praznici", -"Ideas" => "Ideje", -"Journey" => "putovanje", -"Jubilee" => "jubilej", -"Meeting" => "Sastanak", -"Other" => "Drugo", -"Personal" => "Lično", -"Projects" => "Projekti", -"Questions" => "Pitanja", -"Work" => "Posao", -"Does not repeat" => "Ne ponavlja se", -"Daily" => "dnevno", -"Weekly" => "nedeljno", -"Every Weekday" => "svakog dana u nedelji", -"Bi-Weekly" => "dvonedeljno", -"Monthly" => "mesečno", -"Yearly" => "godišnje", -"All day" => "Ceo dan", -"New Calendar" => "Novi kalendar", -"Title" => "Naslov", -"Week" => "Nedelja", -"Month" => "Mesec", -"List" => "Spisak", -"Today" => "Danas", -"Calendars" => "Kalendari", -"There was a fail, while parsing the file." => "došlo je do greške pri rasčlanjivanju fajla.", -"Choose active calendars" => "Izaberite aktivne kalendare", -"CalDav Link" => "KalDav veza", -"Download" => "Preuzmi", -"Edit" => "Uredi", -"Delete" => "Obriši", -"New calendar" => "Novi kalendar", -"Edit calendar" => "Uredi kalendar", -"Displayname" => "Prikazanoime", -"Active" => "Aktivan", -"Calendar color" => "Boja kalendara", -"Save" => "Snimi", -"Submit" => "Pošalji", -"Cancel" => "Otkaži", -"Edit an event" => "Uredi događaj", -"Title of the Event" => "Naslov događaja", -"Category" => "Kategorija", -"All Day Event" => "Celodnevni događaj", -"From" => "Od", -"To" => "Do", -"Location" => "Lokacija", -"Location of the Event" => "Lokacija događaja", -"Description" => "Opis", -"Description of the Event" => "Opis događaja", -"Repeat" => "Ponavljaj", -"Create a new event" => "Napravi novi događaj", -"Select category" => "Izaberite kategoriju", -"Timezone" => "Vremenska zona" -); diff --git a/apps/calendar/l10n/sv.php b/apps/calendar/l10n/sv.php deleted file mode 100644 index 59f8c6e6b5..0000000000 --- a/apps/calendar/l10n/sv.php +++ /dev/null @@ -1,162 +0,0 @@ - "Inga kalendrar funna", -"No events found." => "Inga händelser funna.", -"Wrong calendar" => "Fel kalender", -"New Timezone:" => "Ny tidszon:", -"Timezone changed" => "Tidszon ändrad", -"Invalid request" => "Ogiltig begäran", -"Calendar" => "Kalender", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "Födelsedag", -"Business" => "Företag", -"Call" => "Ringa", -"Clients" => "Klienter", -"Deliverer" => "Leverantör", -"Holidays" => "Semester", -"Ideas" => "Idéer", -"Journey" => "Resa", -"Jubilee" => "Jubileum", -"Meeting" => "Möte", -"Other" => "Annat", -"Personal" => "Personlig", -"Projects" => "Projekt", -"Questions" => "Frågor", -"Work" => "Arbetet", -"unnamed" => "Namn saknas", -"Does not repeat" => "Upprepas inte", -"Daily" => "Dagligen", -"Weekly" => "Varje vecka", -"Every Weekday" => "Varje vardag", -"Bi-Weekly" => "Varannan vecka", -"Monthly" => "Varje månad", -"Yearly" => "Årligen", -"never" => "aldrig", -"by occurrences" => "efter händelser", -"by date" => "efter datum", -"by monthday" => "efter dag i månaden", -"by weekday" => "efter veckodag", -"Monday" => "Måndag", -"Tuesday" => "Tisdag", -"Wednesday" => "Onsdag", -"Thursday" => "Torsdag", -"Friday" => "Fredag", -"Saturday" => "Lördag", -"Sunday" => "Söndag", -"events week of month" => "händelse vecka av månad", -"first" => "första", -"second" => "andra", -"third" => "tredje", -"fourth" => "fjärde", -"fifth" => "femte", -"last" => "sist", -"January" => "Januari", -"February" => "Februari", -"March" => "Mars", -"April" => "April", -"May" => "Maj", -"June" => "Juni", -"July" => "Juli", -"August" => "Augusti", -"September" => "September", -"October" => "Oktober", -"November" => "November", -"December" => "December", -"by events date" => "efter händelsedatum", -"by yearday(s)" => "efter årsdag(ar)", -"by weeknumber(s)" => "efter veckonummer", -"by day and month" => "efter dag och månad", -"Date" => "Datum", -"Cal." => "Kal.", -"All day" => "Hela dagen", -"New Calendar" => "Ny kalender", -"Missing fields" => "Saknade fält", -"Title" => "Rubrik", -"From Date" => "Från datum", -"From Time" => "Från tid", -"To Date" => "Till datum", -"To Time" => "Till tid", -"The event ends before it starts" => "Händelsen slutar innan den börjar", -"There was a database fail" => "Det blev ett databasfel", -"Week" => "Vecka", -"Month" => "Månad", -"List" => "Lista", -"Today" => "Idag", -"Calendars" => "Kalendrar", -"There was a fail, while parsing the file." => "Det blev ett fel medan filen analyserades.", -"Choose active calendars" => "Välj aktiva kalendrar", -"Your calendars" => "Dina kalendrar", -"CalDav Link" => "CalDAV-länk", -"Shared calendars" => "Delade kalendrar", -"No shared calendars" => "Inga delade kalendrar", -"Share Calendar" => "Dela kalender", -"Download" => "Ladda ner", -"Edit" => "Redigera", -"Delete" => "Radera", -"shared with you by" => "delad med dig av", -"New calendar" => "Nya kalender", -"Edit calendar" => "Redigera kalender", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", -"Calendar color" => "Kalender-färg", -"Save" => "Spara", -"Submit" => "Lägg till", -"Cancel" => "Avbryt", -"Edit an event" => "Redigera en händelse", -"Export" => "Exportera", -"Eventinfo" => "Händelseinfo", -"Repeating" => "Repetera", -"Alarm" => "Alarm", -"Attendees" => "Deltagare", -"Share" => "Dela", -"Title of the Event" => "Rubrik för händelsen", -"Category" => "Kategori", -"Separate categories with commas" => "Separera kategorier med komman", -"Edit categories" => "Redigera kategorier", -"All Day Event" => "Hela dagen", -"From" => "Från", -"To" => "Till", -"Advanced options" => "Avancerade alternativ", -"Location" => "Plats", -"Location of the Event" => "Platsen för händelsen", -"Description" => "Beskrivning", -"Description of the Event" => "Beskrivning av händelse", -"Repeat" => "Upprepa", -"Advanced" => "Avancerad", -"Select weekdays" => "Välj veckodagar", -"Select days" => "Välj dagar", -"and the events day of year." => "och händelsedagen för året.", -"and the events day of month." => "och händelsedagen för månaden.", -"Select months" => "Välj månader", -"Select weeks" => "Välj veckor", -"and the events week of year." => "och händelsevecka för året.", -"Interval" => "Hur ofta", -"End" => "Slut", -"occurrences" => "Händelser", -"Import a calendar file" => "Importera en kalenderfil", -"Please choose the calendar" => "Välj kalender", -"create a new calendar" => "skapa en ny kalender", -"Name of new calendar" => "Namn på ny kalender", -"Import" => "Importera", -"Importing calendar" => "Importerar kalender", -"Calendar imported successfully" => "Kalender importerades utan problem", -"Close Dialog" => "Stäng ", -"Create a new event" => "Skapa en ny händelse", -"View an event" => "Visa en händelse", -"No categories selected" => "Inga kategorier valda", -"Select category" => "Välj kategori", -"of" => "av", -"at" => "på", -"Timezone" => "Tidszon", -"Check always for changes of the timezone" => "Kontrollera alltid ändringar i tidszon.", -"Timeformat" => "Tidsformat", -"24h" => "24h", -"12h" => "12h", -"First day of the week" => "Första dagen av veckan", -"Calendar CalDAV syncing address:" => "Synkroniseringsadress för CalDAV kalender:", -"Users" => "Användare", -"select users" => "välj användare", -"Editable" => "Redigerbar", -"Groups" => "Grupper", -"select groups" => "Välj grupper", -"make public" => "Gör offentlig" -); diff --git a/apps/calendar/l10n/th_TH.php b/apps/calendar/l10n/th_TH.php deleted file mode 100644 index 8aaa7ae756..0000000000 --- a/apps/calendar/l10n/th_TH.php +++ /dev/null @@ -1,162 +0,0 @@ - "ไม่พบปฏิทินที่ต้องการ", -"No events found." => "ไม่พบกิจกรรมที่ต้องการ", -"Wrong calendar" => "ปฏิทินไม่ถูกต้อง", -"New Timezone:" => "สร้างโซนเวลาใหม่:", -"Timezone changed" => "โซนเวลาถูกเปลี่ยนแล้ว", -"Invalid request" => "คำร้องขอไม่ถูกต้อง", -"Calendar" => "ปฏิทิน", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "วันเกิด", -"Business" => "ธุรกิจ", -"Call" => "โทรติดต่อ", -"Clients" => "ลูกค้า", -"Deliverer" => "จัดส่ง", -"Holidays" => "วันหยุด", -"Ideas" => "ไอเดีย", -"Journey" => "การเดินทาง", -"Jubilee" => "งานเลี้ยง", -"Meeting" => "นัดประชุม", -"Other" => "อื่นๆ", -"Personal" => "ส่วนตัว", -"Projects" => "โครงการ", -"Questions" => "คำถาม", -"Work" => "งาน", -"unnamed" => "ไม่มีชื่อ", -"Does not repeat" => "ไม่ต้องทำซ้ำ", -"Daily" => "รายวัน", -"Weekly" => "รายสัปดาห์", -"Every Weekday" => "ทุกวันหยุด", -"Bi-Weekly" => "รายปักษ์", -"Monthly" => "รายเดือน", -"Yearly" => "รายปี", -"never" => "ไม่ต้องเลย", -"by occurrences" => "ตามจำนวนที่ปรากฏ", -"by date" => "ตามวันที่", -"by monthday" => "จากเดือน", -"by weekday" => "จากสัปดาห์", -"Monday" => "วันจันทร์", -"Tuesday" => "วันอังคาร", -"Wednesday" => "วันพุธ", -"Thursday" => "วันพฤหัสบดี", -"Friday" => "วันศุกร์", -"Saturday" => "วันเสาร์", -"Sunday" => "วันอาทิตย์", -"events week of month" => "สัปดาห์ที่มีกิจกรรมของเดือน", -"first" => "ลำดับแรก", -"second" => "ลำดับที่สอง", -"third" => "ลำดับที่สาม", -"fourth" => "ลำดับที่สี่", -"fifth" => "ลำดับที่ห้า", -"last" => "ลำดับสุดท้าย", -"January" => "มกราคม", -"February" => "กุมภาพันธ์", -"March" => "มีนาคม", -"April" => "เมษายน", -"May" => "พฤษภาคม", -"June" => "มิถุนายน", -"July" => "กรกฏาคม", -"August" => "สิงหาคม", -"September" => "กันยายน", -"October" => "ตุลาคม", -"November" => "พฤศจิกายน", -"December" => "ธันวาคม", -"by events date" => "ตามวันที่จัดกิจกรรม", -"by yearday(s)" => "ของเมื่อวานนี้", -"by weeknumber(s)" => "จากหมายเลขของสัปดาห์", -"by day and month" => "ตามวันและเดือน", -"Date" => "วันที่", -"Cal." => "คำนวณ", -"All day" => "ทั้งวัน", -"New Calendar" => "สร้างปฏิทินใหม่", -"Missing fields" => "ช่องฟิลด์เกิดการสูญหาย", -"Title" => "ชื่อกิจกรรม", -"From Date" => "จากวันที่", -"From Time" => "ตั้งแต่เวลา", -"To Date" => "ถึงวันที่", -"To Time" => "ถึงเวลา", -"The event ends before it starts" => "วันที่สิ้นสุดกิจกรรมดังกล่าวอยู่ก่อนวันเริ่มต้น", -"There was a database fail" => "เกิดความล้มเหลวกับฐานข้อมูล", -"Week" => "สัปดาห์", -"Month" => "เดือน", -"List" => "รายการ", -"Today" => "วันนี้", -"Calendars" => "ปฏิทิน", -"There was a fail, while parsing the file." => "เกิดความล้มเหลวในการแยกไฟล์", -"Choose active calendars" => "เลือกปฏิทินที่ต้องการใช้งาน", -"Your calendars" => "ปฏิทินของคุณ", -"CalDav Link" => "ลิงค์ CalDav", -"Shared calendars" => "ปฏิทินที่เปิดแชร์", -"No shared calendars" => "ไม่มีปฏิทินที่เปิดแชร์ไว้", -"Share Calendar" => "เปิดแชร์ปฏิทิน", -"Download" => "ดาวน์โหลด", -"Edit" => "แก้ไข", -"Delete" => "ลบ", -"shared with you by" => "แชร์ให้คุณโดย", -"New calendar" => "สร้างปฏิทินใหม่", -"Edit calendar" => "แก้ไขปฏิทิน", -"Displayname" => "ชื่อที่ต้องการให้แสดง", -"Active" => "ใช้งาน", -"Calendar color" => "สีของปฏิทิน", -"Save" => "บันทึก", -"Submit" => "ส่งข้อมูล", -"Cancel" => "ยกเลิก", -"Edit an event" => "แก้ไขกิจกรรม", -"Export" => "ส่งออกข้อมูล", -"Eventinfo" => "ข้อมูลเกี่ยวกับกิจกรรม", -"Repeating" => "ทำซ้ำ", -"Alarm" => "แจ้งเตือน", -"Attendees" => "ผู้เข้าร่วมกิจกรรม", -"Share" => "แชร์", -"Title of the Event" => "ชื่อของกิจกรรม", -"Category" => "หมวดหมู่", -"Separate categories with commas" => "คั่นระหว่างรายการหมวดหมู่ด้วยเครื่องหมายจุลภาคหรือคอมม่า", -"Edit categories" => "แก้ไขหมวดหมู่", -"All Day Event" => "เป็นกิจกรรมตลอดทั้งวัน", -"From" => "จาก", -"To" => "ถึง", -"Advanced options" => "ตัวเลือกขั้นสูง", -"Location" => "สถานที่", -"Location of the Event" => "สถานที่จัดกิจกรรม", -"Description" => "คำอธิบาย", -"Description of the Event" => "คำอธิบายเกี่ยวกับกิจกรรม", -"Repeat" => "ทำซ้ำ", -"Advanced" => "ขั้นสูง", -"Select weekdays" => "เลือกสัปดาห์", -"Select days" => "เลือกวัน", -"and the events day of year." => "และวันที่มีเหตุการณ์เกิดขึ้นในปี", -"and the events day of month." => "และวันที่มีเหตุการณ์เกิดขึ้นในเดือน", -"Select months" => "เลือกเดือน", -"Select weeks" => "เลือกสัปดาห์", -"and the events week of year." => "และสัปดาห์ที่มีเหตุการณ์เกิดขึ้นในปี", -"Interval" => "ช่วงเวลา", -"End" => "สิ้นสุด", -"occurrences" => "จำนวนที่ปรากฏ", -"Import a calendar file" => "นำเข้าไฟล์ปฏิทิน", -"Please choose the calendar" => "กรณาเลือกปฏิทิน", -"create a new calendar" => "สร้างปฏิทินใหม่", -"Name of new calendar" => "ชื่อของปฏิทิน", -"Import" => "นำเข้าข้อมูล", -"Importing calendar" => "นำเข้าข้อมูลปฏิทิน", -"Calendar imported successfully" => "ปฏิทินถูกนำเข้าข้อมูลเรียบร้อยแล้ว", -"Close Dialog" => "ปิดกล่องข้อความโต้ตอบ", -"Create a new event" => "สร้างกิจกรรมใหม่", -"View an event" => "ดูกิจกรรม", -"No categories selected" => "ยังไม่ได้เลือกหมวดหมู่", -"Select category" => "เลือกหมวดหมู่", -"of" => "ของ", -"at" => "ที่", -"Timezone" => "โซนเวลา", -"Check always for changes of the timezone" => "ตรวจสอบการเปลี่ยนแปลงโซนเวลาอยู่เสมอ", -"Timeformat" => "รูปแบบการแสดงเวลา", -"24h" => "24 ช.ม.", -"12h" => "12 ช.ม.", -"First day of the week" => "วันแรกของสัปดาห์", -"Calendar CalDAV syncing address:" => "ที่อยู่ในการเชื่อมข้อมูลกับปฏิทิน CalDav:", -"Users" => "ผู้ใช้งาน", -"select users" => "เลือกผู้ใช้งาน", -"Editable" => "สามารถแก้ไขได้", -"Groups" => "กลุ่ม", -"select groups" => "เลือกกลุ่ม", -"make public" => "กำหนดเป็นสาธารณะ" -); diff --git a/apps/calendar/l10n/tr.php b/apps/calendar/l10n/tr.php deleted file mode 100644 index a72e4c39f6..0000000000 --- a/apps/calendar/l10n/tr.php +++ /dev/null @@ -1,162 +0,0 @@ - "Takvim yok.", -"No events found." => "Etkinlik yok.", -"Wrong calendar" => "Yanlış takvim", -"New Timezone:" => "Yeni Zamandilimi:", -"Timezone changed" => "Zaman dilimi değiştirildi", -"Invalid request" => "Geçersiz istek", -"Calendar" => "Takvim", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "AAA g[ yyyy]{ '—'[ AAA] g yyyy}", -"Birthday" => "Doğum günü", -"Business" => "İş", -"Call" => "Arama", -"Clients" => "Müşteriler", -"Deliverer" => "Teslimatçı", -"Holidays" => "Tatil günleri", -"Ideas" => "Fikirler", -"Journey" => "Seyahat", -"Jubilee" => "Yıl dönümü", -"Meeting" => "Toplantı", -"Other" => "Diğer", -"Personal" => "Kişisel", -"Projects" => "Projeler", -"Questions" => "Sorular", -"Work" => "İş", -"unnamed" => "isimsiz", -"Does not repeat" => "Tekrar etmiyor", -"Daily" => "Günlük", -"Weekly" => "Haftalı", -"Every Weekday" => "Haftaiçi Her gün", -"Bi-Weekly" => "İki haftada bir", -"Monthly" => "Aylık", -"Yearly" => "Yıllı", -"never" => "asla", -"by occurrences" => "sıklığa göre", -"by date" => "tarihe göre", -"by monthday" => "ay günlerine göre", -"by weekday" => "hafta günlerine göre", -"Monday" => "Pazartesi", -"Tuesday" => "Salı", -"Wednesday" => "Çarşamba", -"Thursday" => "Perşembe", -"Friday" => "Cuma", -"Saturday" => "Cumartesi", -"Sunday" => "Pazar", -"events week of month" => "ayın etkinlikler haftası", -"first" => "birinci", -"second" => "ikinci", -"third" => "üçüncü", -"fourth" => "dördüncü", -"fifth" => "beşinci", -"last" => "sonuncu", -"January" => "Ocak", -"February" => "Şubat", -"March" => "Mart", -"April" => "Nisan", -"May" => "Mayıs", -"June" => "Haziran", -"July" => "Temmuz", -"August" => "Ağustos", -"September" => "Eylül", -"October" => "Ekim", -"November" => "Kasım", -"December" => "Aralık", -"by events date" => "olay tarihine göre", -"by yearday(s)" => "yıl gün(ler)ine göre", -"by weeknumber(s)" => "hafta sayı(lar)ına göre", -"by day and month" => "gün ve aya göre", -"Date" => "Tarih", -"Cal." => "Takv.", -"All day" => "Tüm gün", -"New Calendar" => "Yeni Takvim", -"Missing fields" => "Eksik alanlar", -"Title" => "Başlık", -"From Date" => "Bu Tarihten", -"From Time" => "Bu Saatten", -"To Date" => "Bu Tarihe", -"To Time" => "Bu Saate", -"The event ends before it starts" => "Olay başlamadan önce bitiyor", -"There was a database fail" => "Bir veritabanı başarısızlığı oluştu", -"Week" => "Hafta", -"Month" => "Ay", -"List" => "Liste", -"Today" => "Bugün", -"Calendars" => "Takvimler", -"There was a fail, while parsing the file." => "Dosya okunurken başarısızlık oldu.", -"Choose active calendars" => "Aktif takvimleri seçin", -"Your calendars" => "Takvimleriniz", -"CalDav Link" => "CalDav Bağlantısı", -"Shared calendars" => "Paylaşılan", -"No shared calendars" => "Paylaşılan takvim yok", -"Share Calendar" => "Takvimi paylaş", -"Download" => "İndir", -"Edit" => "Düzenle", -"Delete" => "Sil", -"shared with you by" => "sizinle paylaşılmış", -"New calendar" => "Yeni takvim", -"Edit calendar" => "Takvimi düzenle", -"Displayname" => "Görünüm adı", -"Active" => "Aktif", -"Calendar color" => "Takvim rengi", -"Save" => "Kaydet", -"Submit" => "Gönder", -"Cancel" => "İptal", -"Edit an event" => "Bir olay düzenle", -"Export" => "Dışa aktar", -"Eventinfo" => "Etkinlik bilgisi", -"Repeating" => "Tekrarlama", -"Alarm" => "Alarm", -"Attendees" => "Katılanlar", -"Share" => "Paylaş", -"Title of the Event" => "Olayın Başlığı", -"Category" => "Kategori", -"Separate categories with commas" => "Kategorileri virgülle ayırın", -"Edit categories" => "Kategorileri düzenle", -"All Day Event" => "Tüm Gün Olay", -"From" => "Kimden", -"To" => "Kime", -"Advanced options" => "Gelişmiş opsiyonlar", -"Location" => "Konum", -"Location of the Event" => "Olayın Konumu", -"Description" => "Açıklama", -"Description of the Event" => "Olayın Açıklaması", -"Repeat" => "Tekrar", -"Advanced" => "Gelişmiş", -"Select weekdays" => "Hafta günlerini seçin", -"Select days" => "Günleri seçin", -"and the events day of year." => "ve yılın etkinlikler günü.", -"and the events day of month." => "ve ayın etkinlikler günü.", -"Select months" => "Ayları seç", -"Select weeks" => "Haftaları seç", -"and the events week of year." => "ve yılın etkinkinlikler haftası.", -"Interval" => "Aralık", -"End" => "Son", -"occurrences" => "olaylar", -"Import a calendar file" => "Takvim dosyasını içeri aktar", -"Please choose the calendar" => "Lütfen takvimi seçin", -"create a new calendar" => "Yeni bir takvim oluştur", -"Name of new calendar" => "Yeni takvimin adı", -"Import" => "İçe Al", -"Importing calendar" => "Takvim içe aktarılıyor", -"Calendar imported successfully" => "Takvim başarıyla içe aktarıldı", -"Close Dialog" => "Diyalogu kapat", -"Create a new event" => "Yeni olay oluştur", -"View an event" => "Bir olay görüntüle", -"No categories selected" => "Kategori seçilmedi", -"Select category" => "Kategori seçin", -"of" => "nın", -"at" => "üzerinde", -"Timezone" => "Zaman dilimi", -"Check always for changes of the timezone" => "Sürekli zaman dilimi değişikliklerini kontrol et", -"Timeformat" => "Saat biçimi", -"24h" => "24s", -"12h" => "12s", -"First day of the week" => "Haftanın ilk günü", -"Calendar CalDAV syncing address:" => "CalDAV Takvim eşzamanlama adresi:", -"Users" => "Kullanıcılar", -"select users" => "kullanıcıları seç", -"Editable" => "Düzenlenebilir", -"Groups" => "Gruplar", -"select groups" => "grupları seç", -"make public" => "kamuyla paylaş" -); diff --git a/apps/calendar/l10n/uk.php b/apps/calendar/l10n/uk.php deleted file mode 100644 index 892896742d..0000000000 --- a/apps/calendar/l10n/uk.php +++ /dev/null @@ -1,89 +0,0 @@ - "Новий часовий пояс", -"Timezone changed" => "Часовий пояс змінено", -"Calendar" => "Календар", -"Birthday" => "День народження", -"Business" => "Справи", -"Call" => "Подзвонити", -"Clients" => "Клієнти", -"Holidays" => "Свята", -"Ideas" => "Ідеї", -"Journey" => "Поїздка", -"Jubilee" => "Ювілей", -"Meeting" => "Зустріч", -"Other" => "Інше", -"Personal" => "Особисте", -"Projects" => "Проекти", -"Questions" => "Запитання", -"Work" => "Робота", -"Does not repeat" => "Не повторювати", -"Daily" => "Щоденно", -"Weekly" => "Щотижня", -"Every Weekday" => "По будням", -"Bi-Weekly" => "Кожні дві неділі", -"Monthly" => "Щомісяця", -"Yearly" => "Щорічно", -"never" => "ніколи", -"Monday" => "Понеділок", -"Tuesday" => "Вівторок", -"Wednesday" => "Середа", -"Thursday" => "Четвер", -"Friday" => "П'ятниця", -"Saturday" => "Субота", -"Sunday" => "Неділя", -"first" => "перший", -"second" => "другий", -"third" => "третій", -"fourth" => "четвертий", -"fifth" => "п'ятий", -"last" => "останній", -"January" => "Січень", -"February" => "Лютий", -"March" => "Березень", -"April" => "Квітень", -"May" => "Травень", -"June" => "Червень", -"July" => "Липень", -"August" => "Серпень", -"September" => "Вересень", -"October" => "Жовтень", -"November" => "Листопад", -"December" => "Грудень", -"Date" => "Дата", -"Cal." => "Кал.", -"All day" => "Увесь день", -"New Calendar" => "новий Календар", -"Title" => "Назва", -"Week" => "Тиждень", -"Month" => "Місяць", -"List" => "Список", -"Today" => "Сьогодні", -"Calendars" => "Календарі", -"There was a fail, while parsing the file." => "Сталася помилка при обробці файлу", -"Choose active calendars" => "Вибрати активні календарі", -"Download" => "Завантажити", -"Edit" => "Редагувати", -"New calendar" => "Новий календар", -"Edit calendar" => "Редагувати календар", -"Active" => "Активний", -"Calendar color" => "Колір календаря", -"Title of the Event" => "Назва події", -"Category" => "Категорія", -"From" => "З", -"To" => "По", -"Location" => "Місце", -"Location of the Event" => "Місце події", -"Description" => "Опис", -"Description of the Event" => "Опис події", -"Repeat" => "Повторювати", -"Import a calendar file" => "Імпортувати файл календаря", -"create a new calendar" => "створити новий календар", -"Name of new calendar" => "Назва нового календаря", -"Calendar imported successfully" => "Календар успішно імпортовано", -"Create a new event" => "Створити нову подію", -"Timezone" => "Часовий пояс", -"Timeformat" => "Формат часу", -"24h" => "24г", -"12h" => "12г", -"Calendar CalDAV syncing address:" => "Адреса синхронізації календаря CalDAV:" -); diff --git a/apps/calendar/l10n/xgettextfiles b/apps/calendar/l10n/xgettextfiles deleted file mode 100644 index a8c2601045..0000000000 --- a/apps/calendar/l10n/xgettextfiles +++ /dev/null @@ -1,12 +0,0 @@ -../appinfo/app.php -../lib/object.php -../templates/calendar.php -../templates/part.choosecalendar.php -../templates/part.choosecalendar.rowfields.php -../templates/part.editcalendar.php -../templates/part.editevent.php -../templates/part.eventform.php -../templates/part.import.php -../templates/part.newevent.php -../templates/settings.php -../templates/lAfix.php \ No newline at end of file diff --git a/apps/calendar/l10n/zh_CN.php b/apps/calendar/l10n/zh_CN.php deleted file mode 100644 index bb7e0a2872..0000000000 --- a/apps/calendar/l10n/zh_CN.php +++ /dev/null @@ -1,162 +0,0 @@ - "无法找到日历。", -"No events found." => "无法找到事件。", -"Wrong calendar" => "错误的日历", -"New Timezone:" => "新时区:", -"Timezone changed" => "时区已修改", -"Invalid request" => "非法请求", -"Calendar" => "日历", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "生日", -"Business" => "商务", -"Call" => "呼叫", -"Clients" => "客户", -"Deliverer" => "派送", -"Holidays" => "节日", -"Ideas" => "想法", -"Journey" => "旅行", -"Jubilee" => "周年纪念", -"Meeting" => "会议", -"Other" => "其他", -"Personal" => "个人", -"Projects" => "项目", -"Questions" => "问题", -"Work" => "工作", -"unnamed" => "未命名", -"Does not repeat" => "不重复", -"Daily" => "每天", -"Weekly" => "每周", -"Every Weekday" => "每个工作日", -"Bi-Weekly" => "每两周", -"Monthly" => "每月", -"Yearly" => "每年", -"never" => "从不", -"by occurrences" => "按发生次数", -"by date" => "按日期", -"by monthday" => "按月的某天", -"by weekday" => "按星期的某天", -"Monday" => "星期一", -"Tuesday" => "星期二", -"Wednesday" => "星期三", -"Thursday" => "星期四", -"Friday" => "星期五", -"Saturday" => "星期六", -"Sunday" => "星期日", -"events week of month" => "事件在每月的第几个星期", -"first" => "第一", -"second" => "第二", -"third" => "第三", -"fourth" => "第四", -"fifth" => "第五", -"last" => "最后", -"January" => "一月", -"February" => "二月", -"March" => "三月", -"April" => "四月", -"May" => "五月", -"June" => "六月", -"July" => "七月", -"August" => "八月", -"September" => "九月", -"October" => "十月", -"November" => "十一月", -"December" => "十二月", -"by events date" => "按事件日期", -"by yearday(s)" => "按每年的某天", -"by weeknumber(s)" => "按星期数", -"by day and month" => "按天和月份", -"Date" => "日期", -"Cal." => "日历", -"All day" => "全天", -"New Calendar" => "新日历", -"Missing fields" => "缺少字段", -"Title" => "标题", -"From Date" => "从", -"From Time" => "从", -"To Date" => "至", -"To Time" => "至", -"The event ends before it starts" => "事件在开始前已结束", -"There was a database fail" => "数据库访问失败", -"Week" => "星期", -"Month" => "月", -"List" => "列表", -"Today" => "今天", -"Calendars" => "日历", -"There was a fail, while parsing the file." => "解析文件失败", -"Choose active calendars" => "选择活动日历", -"Your calendars" => "您的日历", -"CalDav Link" => "CalDav 链接", -"Shared calendars" => "共享的日历", -"No shared calendars" => "无共享的日历", -"Share Calendar" => "共享日历", -"Download" => "下载", -"Edit" => "编辑", -"Delete" => "删除", -"shared with you by" => " ", -"New calendar" => "新日历", -"Edit calendar" => "编辑日历", -"Displayname" => "显示名称", -"Active" => "激活", -"Calendar color" => "日历颜色", -"Save" => "保存", -"Submit" => "提交", -"Cancel" => "取消", -"Edit an event" => "编辑事件", -"Export" => "导出", -"Eventinfo" => "事件信息", -"Repeating" => "重复", -"Alarm" => "提醒", -"Attendees" => "参加者", -"Share" => "共享", -"Title of the Event" => "事件标题", -"Category" => "分类", -"Separate categories with commas" => "用逗号分隔分类", -"Edit categories" => "编辑分类", -"All Day Event" => "全天事件", -"From" => "自", -"To" => "至", -"Advanced options" => "高级选项", -"Location" => "地点", -"Location of the Event" => "事件地点", -"Description" => "描述", -"Description of the Event" => "事件描述", -"Repeat" => "重复", -"Advanced" => "高级", -"Select weekdays" => "选择星期中的某天", -"Select days" => "选择某天", -"and the events day of year." => "选择每年事件发生的日子", -"and the events day of month." => "选择每月事件发生的日子", -"Select months" => "选择月份", -"Select weeks" => "选择星期", -"and the events week of year." => "选择每年的事件发生的星期", -"Interval" => "间隔", -"End" => "结束", -"occurrences" => "次", -"Import a calendar file" => "导入日历文件", -"Please choose the calendar" => "请选择日历", -"create a new calendar" => "创建新日历", -"Name of new calendar" => "新日历名称", -"Import" => "导入", -"Importing calendar" => "导入日历", -"Calendar imported successfully" => "导入日历成功", -"Close Dialog" => "关闭对话框", -"Create a new event" => "创建新事件", -"View an event" => "查看事件", -"No categories selected" => "无选中分类", -"Select category" => "选择分类", -"of" => "在", -"at" => "在", -"Timezone" => "时区", -"Check always for changes of the timezone" => "选中则总是按照时区变化", -"Timeformat" => "时间格式", -"24h" => "24小时", -"12h" => "12小时", -"First day of the week" => "每周的第一天", -"Calendar CalDAV syncing address:" => "日历CalDAV 同步地址:", -"Users" => "用户", -"select users" => "选中用户", -"Editable" => "可编辑", -"Groups" => "分组", -"select groups" => "选中分组", -"make public" => "公开" -); diff --git a/apps/calendar/l10n/zh_TW.php b/apps/calendar/l10n/zh_TW.php deleted file mode 100644 index 746594462c..0000000000 --- a/apps/calendar/l10n/zh_TW.php +++ /dev/null @@ -1,162 +0,0 @@ - "沒有找到行事曆", -"No events found." => "沒有找到活動", -"Wrong calendar" => "錯誤日曆", -"New Timezone:" => "新時區:", -"Timezone changed" => "時區已變更", -"Invalid request" => "無效請求", -"Calendar" => "日曆", -"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", -"Birthday" => "生日", -"Business" => "商業", -"Call" => "呼叫", -"Clients" => "客戶", -"Deliverer" => "遞送者", -"Holidays" => "節日", -"Ideas" => "主意", -"Journey" => "旅行", -"Jubilee" => "周年慶", -"Meeting" => "會議", -"Other" => "其他", -"Personal" => "個人", -"Projects" => "計畫", -"Questions" => "問題", -"Work" => "工作", -"unnamed" => "無名稱的", -"Does not repeat" => "不重覆", -"Daily" => "每日", -"Weekly" => "每週", -"Every Weekday" => "每週末", -"Bi-Weekly" => "每雙週", -"Monthly" => "每月", -"Yearly" => "每年", -"never" => "絕不", -"by occurrences" => "由事件", -"by date" => "由日期", -"by monthday" => "依月份日期", -"by weekday" => "由平日", -"Monday" => "週一", -"Tuesday" => "週二", -"Wednesday" => "週三", -"Thursday" => "週四", -"Friday" => "週五", -"Saturday" => "週六", -"Sunday" => "週日", -"events week of month" => "月份中活動週", -"first" => "第一", -"second" => "第二", -"third" => "第三", -"fourth" => "第四", -"fifth" => "第五", -"last" => "最後", -"January" => "一月", -"February" => "二月", -"March" => "三月", -"April" => "四月", -"May" => "五月", -"June" => "六月", -"July" => "七月", -"August" => "八月", -"September" => "九月", -"October" => "十月", -"November" => "十一月", -"December" => "十二月", -"by events date" => "由事件日期", -"by yearday(s)" => "依年份日期", -"by weeknumber(s)" => "由週數", -"by day and month" => "由日與月", -"Date" => "日期", -"Cal." => "行事曆", -"All day" => "整天", -"New Calendar" => "新日曆", -"Missing fields" => "遺失欄位", -"Title" => "標題", -"From Date" => "自日期", -"From Time" => "至時間", -"To Date" => "至日期", -"To Time" => "至時間", -"The event ends before it starts" => "事件的結束在開始之前", -"There was a database fail" => "資料庫錯誤", -"Week" => "週", -"Month" => "月", -"List" => "清單", -"Today" => "今日", -"Calendars" => "日曆", -"There was a fail, while parsing the file." => "解析檔案時失敗。", -"Choose active calendars" => "選擇一個作用中的日曆", -"Your calendars" => "你的行事曆", -"CalDav Link" => "CalDav 聯結", -"Shared calendars" => "分享的行事曆", -"No shared calendars" => "不分享的行事曆", -"Share Calendar" => "分享行事曆", -"Download" => "下載", -"Edit" => "編輯", -"Delete" => "刪除", -"shared with you by" => "分享給你由", -"New calendar" => "新日曆", -"Edit calendar" => "編輯日曆", -"Displayname" => "顯示名稱", -"Active" => "作用中", -"Calendar color" => "日曆顏色", -"Save" => "儲存", -"Submit" => "提出", -"Cancel" => "取消", -"Edit an event" => "編輯事件", -"Export" => "匯出", -"Eventinfo" => "活動資訊", -"Repeating" => "重覆中", -"Alarm" => "鬧鐘", -"Attendees" => "出席者", -"Share" => "分享", -"Title of the Event" => "事件標題", -"Category" => "分類", -"Separate categories with commas" => "用逗點分隔分類", -"Edit categories" => "編輯分類", -"All Day Event" => "全天事件", -"From" => "自", -"To" => "至", -"Advanced options" => "進階選項", -"Location" => "位置", -"Location of the Event" => "事件位置", -"Description" => "描述", -"Description of the Event" => "事件描述", -"Repeat" => "重覆", -"Advanced" => "進階", -"Select weekdays" => "選擇平日", -"Select days" => "選擇日", -"and the events day of year." => "以及年中的活動日", -"and the events day of month." => "以及月中的活動日", -"Select months" => "選擇月", -"Select weeks" => "選擇週", -"and the events week of year." => "以及年中的活動週", -"Interval" => "間隔", -"End" => "結束", -"occurrences" => "事件", -"Import a calendar file" => "匯入日曆檔案", -"Please choose the calendar" => "請選擇日曆", -"create a new calendar" => "建立新日曆", -"Name of new calendar" => "新日曆名稱", -"Import" => "匯入", -"Importing calendar" => "匯入日曆", -"Calendar imported successfully" => "已成功匯入日曆", -"Close Dialog" => "關閉對話", -"Create a new event" => "建立一個新事件", -"View an event" => "觀看一個活動", -"No categories selected" => "沒有選擇分類", -"Select category" => "選擇分類", -"of" => "於", -"at" => "於", -"Timezone" => "時區", -"Check always for changes of the timezone" => "總是檢查是否變更了時區", -"Timeformat" => "日期格式", -"24h" => "24小時制", -"12h" => "12小時制", -"First day of the week" => "每週的第一天", -"Calendar CalDAV syncing address:" => "CalDAV 的日曆同步地址:", -"Users" => "使用者", -"select users" => "選擇使用者", -"Editable" => "可編輯", -"Groups" => "群組", -"select groups" => "選擇群組", -"make public" => "公開" -); diff --git a/apps/calendar/lib/alarm.php b/apps/calendar/lib/alarm.php deleted file mode 100644 index a71cc08682..0000000000 --- a/apps/calendar/lib/alarm.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class manages reminders for calendars - */ -class OC_Calendar_Alarm{ - -} \ No newline at end of file diff --git a/apps/calendar/lib/app.php b/apps/calendar/lib/app.php deleted file mode 100644 index 29e5ab5b0c..0000000000 --- a/apps/calendar/lib/app.php +++ /dev/null @@ -1,436 +0,0 @@ - - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - * - * This class manages our app actions - */ -OC_Calendar_App::$l10n = new OC_L10N('calendar'); -OC_Calendar_App::$tz = OC_Calendar_App::getTimezone(); -class OC_Calendar_App{ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - /** - * @brief language object for calendar app - */ - public static $l10n; - - /** - * @brief categories of the user - */ - protected static $categories = null; - - /** - * @brief timezone of the user - */ - public static $tz; - - /** - * @brief returns informations about a calendar - * @param int $id - id of the calendar - * @param bool $security - check access rights or not - * @param bool $shared - check if the user got access via sharing - * @return mixed - bool / array - */ - public static function getCalendar($id, $security = true, $shared = false){ - if(! is_numeric($id)){ - return false; - } - $calendar = OC_Calendar_Calendar::find($id); - if($shared === true){ - if(OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR)){ - return $calendar; - } - } - if($security === true){ - if($calendar['userid'] != OCP\USER::getUser()){ - return false; - } - } - return $calendar; - } - - /** - * @brief returns informations about an event - * @param int $id - id of the event - * @param bool $security - check access rights or not - * @param bool $shared - check if the user got access via sharing - * @return mixed - bool / array - */ - public static function getEventObject($id, $security = true, $shared = false){ - $event = OC_Calendar_Object::find($id); - if($shared === true){ - if(OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT)){ - return $event; - } - } - if($security === true){ - $calendar = self::getCalendar($event['calendarid'], false); - if($calendar['userid'] != OCP\USER::getUser()){ - return false; - } - } - if($event === false){ - return false; - } - return $event; - } - - /** - * @brief returns the parsed calendar data - * @param int $id - id of the event - * @param bool $security - check access rights or not - * @return mixed - bool / object - */ - public static function getVCalendar($id, $security = true, $shared = false){ - $event_object = self::getEventObject($id, $security, $shared); - if($event_object === false){ - return false; - } - $vobject = OC_VObject::parse($event_object['calendardata']); - if(is_null($vobject)){ - return false; - } - return $vobject; - } - - /** - * @brief checks if an event was edited and dies if it was - * @param (object) $vevent - vevent object of the event - * @param (int) $lastmodified - time of last modification as unix timestamp - * @return (bool) - */ - public static function isNotModified($vevent, $lastmodified){ - $last_modified = $vevent->__get('LAST-MODIFIED'); - if($last_modified && $lastmodified != $last_modified->getDateTime()->format('U')){ - OCP\JSON::error(array('modified'=>true)); - exit; - } - return true; - } - - /** - * @brief returns the default categories of ownCloud - * @return (array) $categories - */ - protected static function getDefaultCategories(){ - return array( - self::$l10n->t('Birthday'), - self::$l10n->t('Business'), - self::$l10n->t('Call'), - self::$l10n->t('Clients'), - self::$l10n->t('Deliverer'), - self::$l10n->t('Holidays'), - self::$l10n->t('Ideas'), - self::$l10n->t('Journey'), - self::$l10n->t('Jubilee'), - self::$l10n->t('Meeting'), - self::$l10n->t('Other'), - self::$l10n->t('Personal'), - self::$l10n->t('Projects'), - self::$l10n->t('Questions'), - self::$l10n->t('Work'), - ); - } - - /** - * @brief returns the vcategories object of the user - * @return (object) $vcategories - */ - protected static function getVCategories() { - if (is_null(self::$categories)) { - self::$categories = new OC_VCategories('calendar', null, self::getDefaultCategories()); - } - return self::$categories; - } - - /** - * @brief returns the categories of the vcategories object - * @return (array) $categories - */ - public static function getCategoryOptions(){ - $categories = self::getVCategories()->categories(); - return $categories; - } - - /** - * scan events for categories. - * @param $events VEVENTs to scan. null to check all events for the current user. - */ - public static function scanCategories($events = null) { - if (is_null($events)) { - $calendars = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); - if(count($calendars) > 0) { - $events = array(); - foreach($calendars as $calendar) { - $calendar_events = OC_Calendar_Object::all($calendar['id']); - $events = $events + $calendar_events; - } - } - } - if(is_array($events) && count($events) > 0) { - $vcategories = self::getVCategories(); - $vcategories->delete($vcategories->categories()); - foreach($events as $event) { - $vobject = OC_VObject::parse($event['calendardata']); - if(!is_null($vobject)) { - self::loadCategoriesFromVCalendar($vobject); - } - } - } - } - - /** - * check VEvent for new categories. - * @see OC_VCategories::loadFromVObject - */ - public static function loadCategoriesFromVCalendar(OC_VObject $calendar) { - $object = null; - if (isset($calendar->VEVENT)) { - $object = $calendar->VEVENT; - } else - if (isset($calendar->VTODO)) { - $object = $calendar->VTODO; - } else - if (isset($calendar->VJOURNAL)) { - $object = $calendar->VJOURNAL; - } - if ($object) { - self::getVCategories()->loadFromVObject($object, true); - } - } - - /** - * @brief returns the options for the repeat rule of an repeating event - * @return array - valid inputs for the repeat rule of an repeating event - */ - public static function getRepeatOptions(){ - return OC_Calendar_Object::getRepeatOptions(self::$l10n); - } - - /** - * @brief returns the options for the end of an repeating event - * @return array - valid inputs for the end of an repeating events - */ - public static function getEndOptions(){ - return OC_Calendar_Object::getEndOptions(self::$l10n); - } - - /** - * @brief returns the options for an monthly repeating event - * @return array - valid inputs for monthly repeating events - */ - public static function getMonthOptions(){ - return OC_Calendar_Object::getMonthOptions(self::$l10n); - } - - /** - * @brief returns the options for an weekly repeating event - * @return array - valid inputs for weekly repeating events - */ - public static function getWeeklyOptions(){ - return OC_Calendar_Object::getWeeklyOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event - * @return array - valid inputs for yearly repeating events - */ - public static function getYearOptions(){ - return OC_Calendar_Object::getYearOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific days of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByYearDayOptions(){ - return OC_Calendar_Object::getByYearDayOptions(); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific month of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByMonthOptions(){ - return OC_Calendar_Object::getByMonthOptions(self::$l10n); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific week numbers of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByWeekNoOptions(){ - return OC_Calendar_Object::getByWeekNoOptions(); - } - - /** - * @brief returns the options for an yearly or monthly repeating event which occurs on specific days of the month - * @return array - valid inputs for yearly or monthly repeating events - */ - public static function getByMonthDayOptions(){ - return OC_Calendar_Object::getByMonthDayOptions(); - } - - /** - * @brief returns the options for an monthly repeating event which occurs on specific weeks of the month - * @return array - valid inputs for monthly repeating events - */ - public static function getWeekofMonth(){ - return OC_Calendar_Object::getWeekofMonth(self::$l10n); - } - - /** - * @return (string) $timezone as set by user or the default timezone - */ - public static function getTimezone() { - return OCP\Config::getUserValue(OCP\User::getUser(), - 'calendar', - 'timezone', - date_default_timezone_get()); - } - - /** - * @brief checks the access for a calendar / an event - * @param (int) $id - id of the calendar / event - * @param (string) $type - type of the id (calendar/event) - * @return (string) $access - level of access - */ - public static function getaccess($id, $type){ - if($type == self::CALENDAR){ - $calendar = self::getCalendar($id, false, false); - if($calendar['userid'] == OCP\USER::getUser()){ - return 'owner'; - } - $isshared = OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR); - if($isshared){ - $writeaccess = OC_Calendar_Share::is_editing_allowed(OCP\USER::getUser(), $id, OC_Calendar_Share::CALENDAR); - if($writeaccess){ - return 'rw'; - }else{ - return 'r'; - } - }else{ - return false; - } - }elseif($type == self::EVENT){ - if(OC_Calendar_Object::getowner($id) == OCP\USER::getUser()){ - return 'owner'; - } - $isshared = OC_Calendar_Share::check_access(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT); - if($isshared){ - $writeaccess = OC_Calendar_Share::is_editing_allowed(OCP\USER::getUser(), $id, OC_Calendar_Share::EVENT); - if($writeaccess){ - return 'rw'; - }else{ - return 'r'; - } - }else{ - return false; - } - } - } - - /** - * @brief analyses the parameter for calendar parameter and returns the objects - * @param (string) $calendarid - calendarid - * @param (int) $start - unixtimestamp of start - * @param (int) $end - unixtimestamp of end - * @return (array) $events - */ - public static function getrequestedEvents($calendarid, $start, $end){ - $events = array(); - if($calendarid == 'shared_rw' || $calendarid == 'shared_r'){ - $calendars = OC_Calendar_Share::allSharedwithuser(OCP\USER::getUser(), OC_Calendar_Share::CALENDAR, 1, ($_GET['calendar_id'] == 'shared_rw')?'rw':'r'); - foreach($calendars as $calendar){ - $calendarevents = OC_Calendar_Object::allInPeriod($calendar['calendarid'], $start, $end); - foreach($calendarevents as $event){ - $event['summary'] .= ' (' . self::$l10n->t('by') . ' ' . OC_Calendar_Object::getowner($event['id']) . ')'; - } - $events = array_merge($events, $calendarevents); - } - $singleevents = OC_Calendar_Share::allSharedwithuser(OCP\USER::getUser(), OC_Calendar_Share::EVENT, 1, ($_GET['calendar_id'] == 'shared_rw')?'rw':'r'); - foreach($singleevents as $singleevent){ - $event = OC_Calendar_Object::find($singleevent['eventid']); - if(!array_key_exists('summary', $event)){ - $event['summary'] = self::$l10n->t('unnamed'); - } - $event['summary'] .= ' (' . self::$l10n->t('by') . ' ' . OC_Calendar_Object::getowner($event['id']) . ')'; - $events[] = $event; - } - }else{ - if (is_numeric($calendarid)) { - $calendar = self::getCalendar($calendarid); - OCP\Response::enableCaching(0); - OCP\Response::setETagHeader($calendar['ctag']); - $events = OC_Calendar_Object::allInPeriod($calendarid, $start, $end); - } else { - OCP\Util::emitHook('OC_Calendar', 'getEvents', array('calendar_id' => $calendarid, 'events' => &$events)); - } - } - return $events; - } - - /** - * @brief generates the output for an event which will be readable for our js - * @param (mixed) $event - event object / array - * @param (int) $start - DateTime object of start - * @param (int) $end - DateTime object of end - * @return (array) $output - readable output - */ - public static function generateEventOutput($event, $start, $end){ - if(!isset($event['calendardata']) && !isset($event['vevent'])){ - return false; - } - if(!isset($event['calendardata']) && isset($event['vevent'])){ - $event['calendardata'] = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud's Internal iCal System\n" . $event['vevent']->serialize() . "END:VCALENDAR"; - } - $object = OC_VObject::parse($event['calendardata']); - $vevent = $object->VEVENT; - $return = array(); - $id = $event['id']; - $allday = ($vevent->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE)?true:false; - $last_modified = @$vevent->__get('LAST-MODIFIED'); - $lastmodified = ($last_modified)?$last_modified->getDateTime()->format('U'):0; - $staticoutput = array('id'=>(int)$event['id'], - 'title' => htmlspecialchars(($event['summary']!=NULL || $event['summary'] != '')?$event['summary']: self::$l10n->t('unnamed')), - 'description' => isset($vevent->DESCRIPTION)?htmlspecialchars($vevent->DESCRIPTION->value):'', - 'lastmodified'=>$lastmodified, - 'allDay'=>$allday); - if(OC_Calendar_Object::isrepeating($id) && OC_Calendar_Repeat::is_cached_inperiod($event['id'], $start, $end)){ - $cachedinperiod = OC_Calendar_Repeat::get_inperiod($id, $start, $end); - foreach($cachedinperiod as $cachedevent){ - $dynamicoutput = array(); - if($allday){ - $start_dt = new DateTime($cachedevent['startdate'], new DateTimeZone('UTC')); - $end_dt = new DateTime($cachedevent['enddate'], new DateTimeZone('UTC')); - $dynamicoutput['start'] = $start_dt->format('Y-m-d'); - $dynamicoutput['end'] = $end_dt->format('Y-m-d'); - }else{ - $start_dt = new DateTime($cachedevent['startdate'], new DateTimeZone('UTC')); - $end_dt = new DateTime($cachedevent['enddate'], new DateTimeZone('UTC')); - $start_dt->setTimezone(new DateTimeZone(self::$tz)); - $end_dt->setTimezone(new DateTimeZone(self::$tz)); - $dynamicoutput['start'] = $start_dt->format('Y-m-d H:i:s'); - $dynamicoutput['end'] = $end_dt->format('Y-m-d H:i:s'); - } - $return[] = array_merge($staticoutput, $dynamicoutput); - } - }else{ - if(OC_Calendar_Object::isrepeating($id) || $event['repeating'] == 1){ - $object->expand($start, $end); - } - foreach($object->getComponents() as $singleevent){ - if(!($singleevent instanceof Sabre_VObject_Component_VEvent)){ - continue; - } - $dynamicoutput = OC_Calendar_Object::generateStartEndDate($singleevent->DTSTART, OC_Calendar_Object::getDTEndFromVEvent($singleevent), $allday, self::$tz); - $return[] = array_merge($staticoutput, $dynamicoutput); - } - } - return $return; - } -} diff --git a/apps/calendar/lib/attendees.php b/apps/calendar/lib/attendees.php deleted file mode 100644 index ac30e11b3b..0000000000 --- a/apps/calendar/lib/attendees.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class manages Attendees for calendars - */ -class OC_Calendar_Attendees{ - -} \ No newline at end of file diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php deleted file mode 100644 index 7778242464..0000000000 --- a/apps/calendar/lib/calendar.php +++ /dev/null @@ -1,308 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE calendar_calendars ( - * id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * userid VARCHAR(255), - * displayname VARCHAR(100), - * uri VARCHAR(100), - * active INTEGER UNSIGNED NOT NULL DEFAULT '0', - * ctag INTEGER UNSIGNED NOT NULL DEFAULT '0', - * calendarorder INTEGER UNSIGNED NOT NULL DEFAULT '0', - * calendarcolor VARCHAR(10), - * timezone TEXT, - * components VARCHAR(20) - * ); - * - */ - -/** - * This class manages our calendars - */ -class OC_Calendar_Calendar{ - /** - * @brief Returns the list of calendars for a specific user. - * @param string $uid User ID - * @param boolean $active Only return calendars with this $active state, default(=false) is don't care - * @return array - */ - public static function allCalendars($uid, $active=false){ - $values = array($uid); - $active_where = ''; - if ($active){ - $active_where = ' AND active = ?'; - $values[] = $active; - } - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE userid = ?' . $active_where ); - $result = $stmt->execute($values); - - $calendars = array(); - while( $row = $result->fetchRow()){ - $calendars[] = $row; - } - - return $calendars; - } - - /** - * @brief Returns the list of calendars for a principal (DAV term of user) - * @param string $principaluri - * @return array - */ - public static function allCalendarsWherePrincipalURIIs($principaluri){ - $uid = self::extractUserID($principaluri); - return self::allCalendars($uid); - } - - /** - * @brief Gets the data of one calendar - * @param integer $id - * @return associative array - */ - public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE id = ?' ); - $result = $stmt->execute(array($id)); - - return $result->fetchRow(); - } - - /** - * @brief Creates a new calendar - * @param string $userid - * @param string $name - * @param string $components Default: "VEVENT,VTODO,VJOURNAL" - * @param string $timezone Default: null - * @param integer $order Default: 1 - * @param string $color Default: null, format: '#RRGGBB(AA)' - * @return insertid - */ - public static function addCalendar($userid,$name,$components='VEVENT,VTODO,VJOURNAL',$timezone=null,$order=0,$color=null){ - $all = self::allCalendars($userid); - $uris = array(); - foreach($all as $i){ - $uris[] = $i['uri']; - } - - $uri = self::createURI($name, $uris ); - - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); - - $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); - OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid); - - return $insertid; - } - - /** - * @brief Creates a new calendar from the data sabredav provides - * @param string $principaluri - * @param string $uri - * @param string $name - * @param string $components - * @param string $timezone - * @param integer $order - * @param string $color format: '#RRGGBB(AA)' - * @return insertid - */ - public static function addCalendarFromDAVData($principaluri,$uri,$name,$components,$timezone,$order,$color){ - $userid = self::extractUserID($principaluri); - - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); - - $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); - OCP\Util::emitHook('OC_Calendar', 'addCalendar', $insertid); - - return $insertid; - } - - /** - * @brief Edits a calendar - * @param integer $id - * @param string $name Default: null - * @param string $components Default: null - * @param string $timezone Default: null - * @param integer $order Default: null - * @param string $color Default: null, format: '#RRGGBB(AA)' - * @return boolean - * - * Values not null will be set - */ - public static function editCalendar($id,$name=null,$components=null,$timezone=null,$order=null,$color=null){ - // Need these ones for checking uri - $calendar = self::find($id); - - // Keep old stuff - if(is_null($name)) $name = $calendar['displayname']; - if(is_null($components)) $components = $calendar['components']; - if(is_null($timezone)) $timezone = $calendar['timezone']; - if(is_null($order)) $order = $calendar['calendarorder']; - if(is_null($color)) $color = $calendar['calendarcolor']; - - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET displayname=?,calendarorder=?,calendarcolor=?,timezone=?,components=?,ctag=ctag+1 WHERE id=?' ); - $result = $stmt->execute(array($name,$order,$color,$timezone,$components,$id)); - - OCP\Util::emitHook('OC_Calendar', 'editCalendar', $id); - return true; - } - - /** - * @brief Sets a calendar (in)active - * @param integer $id - * @param boolean $active - * @return boolean - */ - public static function setCalendarActive($id,$active){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET active = ? WHERE id = ?' ); - $stmt->execute(array($active, $id)); - - return true; - } - - /** - * @brief Updates ctag for calendar - * @param integer $id - * @return boolean - */ - public static function touchCalendar($id){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET ctag = ctag + 1 WHERE id = ?' ); - $stmt->execute(array($id)); - - return true; - } - - /** - * @brief removes a calendar - * @param integer $id - * @return boolean - */ - public static function deleteCalendar($id){ - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_calendars WHERE id = ?' ); - $stmt->execute(array($id)); - - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); - $stmt->execute(array($id)); - - OCP\Util::emitHook('OC_Calendar', 'deleteCalendar', $id); - if(count(self::allCalendars(OCP\USER::getUser())) == 0) { - self::addCalendar(OCP\USER::getUser(),'Default calendar'); - } - - return true; - } - - /** - * @brief merges two calendars - * @param integer $id1 - * @param integer $id2 - * @return boolean - */ - public static function mergeCalendar($id1, $id2){ - $stmt = OCP\DB::prepare('UPDATE *PREFIX*calendar_objects SET calendarid = ? WHERE calendarid = ?'); - $stmt->execute(array($id1, $id2)); - self::touchCalendar($id1); - self::deleteCalendar($id2); - } - - /** - * @brief Creates a URI for Calendar - * @param string $name name of the calendar - * @param array $existing existing calendar URIs - * @return string uri - */ - public static function createURI($name,$existing){ - $name = strtolower($name); - $newname = $name; - $i = 1; - while(in_array($newname,$existing)){ - $newname = $name.$i; - $i = $i + 1; - } - return $newname; - } - - /** - * @brief gets the userid from a principal path - * @return string - */ - public static function extractUserID($principaluri){ - list($prefix,$userid) = Sabre_DAV_URLUtil::splitPath($principaluri); - return $userid; - } - - /** - * @brief returns the possible color for calendars - * @return array - */ - public static function getCalendarColorOptions(){ - return array( - '#ff0000', // "Red" - '#b3dc6c', // "Green" - '#ffff00', // "Yellow" - '#808000', // "Olive" - '#ffa500', // "Orange" - '#ff7f50', // "Coral" - '#ee82ee', // "Violet" - '#9fc6e7', // "light blue" - ); - } - - /** - * @brief generates the Event Source Info for our JS - * @param array $calendar calendar data - * @return array - */ - public static function getEventSourceInfo($calendar){ - return array( - 'url' => OCP\Util::linkTo('calendar', 'ajax/events.php').'?calendar_id='.$calendar['id'], - 'backgroundColor' => $calendar['calendarcolor'], - 'borderColor' => '#888', - 'textColor' => self::generateTextColor($calendar['calendarcolor']), - 'cache' => true, - ); - } - - /* - * @brief checks if a calendar name is available for a user - * @param string $calendarname - * @param string $userid - * @return boolean - */ - public static function isCalendarNameavailable($calendarname, $userid){ - $calendars = self::allCalendars($userid); - foreach($calendars as $calendar){ - if($calendar['displayname'] == $calendarname){ - return false; - } - } - return true; - } - - /* - * @brief generates the text color for the calendar - * @param string $calendarcolor rgb calendar color code in hex format (with or without the leading #) - * (this function doesn't pay attention on the alpha value of rgba color codes) - * @return boolean - */ - public static function generateTextColor($calendarcolor){ - if(substr_count($calendarcolor, '#') == 1){ - $calendarcolor = substr($calendarcolor,1); - } - $red = hexdec(substr($calendarcolor,0,2)); - $green = hexdec(substr($calendarcolor,2,2)); - $blue = hexdec(substr($calendarcolor,2,2)); - //recommendation by W3C - $computation = ((($red * 299) + ($green * 587) + ($blue * 114)) / 1000); - return ($computation > 130)?'#000000':'#FAFAFA'; - } -} diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/connector_sabre.php deleted file mode 100644 index 263fb7ffde..0000000000 --- a/apps/calendar/lib/connector_sabre.php +++ /dev/null @@ -1,308 +0,0 @@ - 'displayname', - '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', - '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', - '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', - ); - - /** - * Returns a list of calendars for a principal. - * - * Every project is an array with the following keys: - * * id, a unique id that will be used by other functions to modify the - * calendar. This can be the same as the uri or a database key. - * * uri, which the basename of the uri with which the calendar is - * accessed. - * * principalUri. The owner of the calendar. Almost always the same as - * principalUri passed to this method. - * - * Furthermore it can contain webdav properties in clark notation. A very - * common one is '{DAV:}displayname'. - * - * @param string $principalUri - * @return array - */ - public function getCalendarsForUser($principalUri) { - $raw = OC_Calendar_Calendar::allCalendarsWherePrincipalURIIs($principalUri); - - $calendars = array(); - foreach( $raw as $row ){ - $components = explode(',',$row['components']); - - $calendar = array( - 'id' => $row['id'], - 'uri' => $row['uri'], - 'principaluri' => 'principals/'.$row['userid'], - '{' . Sabre_CalDAV_Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0', - '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}supported-calendar-component-set' => new Sabre_CalDAV_Property_SupportedCalendarComponentSet($components), - ); - - foreach($this->propertyMap as $xmlName=>$dbName) { - $calendar[$xmlName] = $row[$dbName]; - } - - $calendars[] = $calendar; - } - return $calendars; - } - - /** - * Creates a new calendar for a principal. - * - * If the creation was a success, an id must be returned that can be used to reference - * this calendar in other methods, such as updateCalendar - * - * @param string $principalUri - * @param string $calendarUri - * @param array $properties - * @return mixed - */ - public function createCalendar($principalUri,$calendarUri, array $properties) { - $fieldNames = array( - 'principaluri', - 'uri', - 'ctag', - ); - $values = array( - ':principaluri' => $principalUri, - ':uri' => $calendarUri, - ':ctag' => 1, - ); - - // Default value - $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; - $fieldNames[] = 'components'; - if (!isset($properties[$sccs])) { - $values[':components'] = 'VEVENT,VTODO'; - } else { - if (!($properties[$sccs] instanceof Sabre_CalDAV_Property_SupportedCalendarComponentSet)) { - throw new Sabre_DAV_Exception('The ' . $sccs . ' property must be of type: Sabre_CalDAV_Property_SupportedCalendarComponentSet'); - } - $values[':components'] = implode(',',$properties[$sccs]->getValue()); - } - - foreach($this->propertyMap as $xmlName=>$dbName) { - if (isset($properties[$xmlName])) { - - $myValue = $properties[$xmlName]; - $values[':' . $dbName] = $properties[$xmlName]; - $fieldNames[] = $dbName; - } - } - - if(!isset($newValues['displayname'])) $newValues['displayname'] = 'unnamed'; - if(!isset($newValues['components'])) $newValues['components'] = 'VEVENT,VTODO'; - if(!isset($newValues['timezone'])) $newValues['timezone'] = null; - if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = 0; - if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; - - return OC_Calendar_Calendar::addCalendarFromDAVData($principalUri,$calendarUri,$newValues['displayname'],$newValues['components'],$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); - } - - /** - * Updates a calendars properties - * - * The properties array uses the propertyName in clark-notation as key, - * and the array value for the property value. In the case a property - * should be deleted, the property value will be null. - * - * This method must be atomic. If one property cannot be changed, the - * entire operation must fail. - * - * If the operation was successful, true can be returned. - * If the operation failed, false can be returned. - * - * Deletion of a non-existant property is always succesful. - * - * Lastly, it is optional to return detailed information about any - * failures. In this case an array should be returned with the following - * structure: - * - * array( - * 403 => array( - * '{DAV:}displayname' => null, - * ), - * 424 => array( - * '{DAV:}owner' => null, - * ) - * ) - * - * In this example it was forbidden to update {DAV:}displayname. - * (403 Forbidden), which in turn also caused {DAV:}owner to fail - * (424 Failed Dependency) because the request needs to be atomic. - * - * @param string $calendarId - * @param array $properties - * @return bool|array - */ - public function updateCalendar($calendarId, array $properties) { - - $newValues = array(); - $result = array( - 200 => array(), // Ok - 403 => array(), // Forbidden - 424 => array(), // Failed Dependency - ); - - $hasError = false; - - foreach($properties as $propertyName=>$propertyValue) { - - // We don't know about this property. - if (!isset($this->propertyMap[$propertyName])) { - $hasError = true; - $result[403][$propertyName] = null; - unset($properties[$propertyName]); - continue; - } - - $fieldName = $this->propertyMap[$propertyName]; - $newValues[$fieldName] = $propertyValue; - - } - - // If there were any errors we need to fail the request - if ($hasError) { - // Properties has the remaining properties - foreach($properties as $propertyName=>$propertyValue) { - $result[424][$propertyName] = null; - } - - // Removing unused statuscodes for cleanliness - foreach($result as $status=>$properties) { - if (is_array($properties) && count($properties)===0) unset($result[$status]); - } - - return $result; - - } - - // Success - if(!isset($newValues['displayname'])) $newValues['displayname'] = null; - if(!isset($newValues['timezone'])) $newValues['timezone'] = null; - if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = null; - if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null; - - OC_Calendar_Calendar::editCalendar($calendarId,$newValues['displayname'],null,$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']); - - return true; - - } - - /** - * Delete a calendar and all it's objects - * - * @param string $calendarId - * @return void - */ - public function deleteCalendar($calendarId) { - OC_Calendar_Calendar::deleteCalendar($calendarId); - } - - /** - * Returns all calendar objects within a calendar object. - * - * Every item contains an array with the following keys: - * * id - unique identifier which will be used for subsequent updates - * * calendardata - The iCalendar-compatible calnedar data - * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string. - * * lastmodified - a timestamp of the last modification time - * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: - * ' "abcdef"') - * * calendarid - The calendarid as it was passed to this function. - * - * Note that the etag is optional, but it's highly encouraged to return for - * speed reasons. - * - * The calendardata is also optional. If it's not returned - * 'getCalendarObject' will be called later, which *is* expected to return - * calendardata. - * - * @param string $calendarId - * @return array - */ - public function getCalendarObjects($calendarId) { - $data = array(); - foreach(OC_Calendar_Object::all($calendarId) as $row){ - $data[] = $this->OCAddETag($row); - } - return $data; - } - - /** - * Returns information from a single calendar object, based on it's object - * uri. - * - * The returned array must have the same keys as getCalendarObjects. The - * 'calendardata' object is required here though, while it's not required - * for getCalendarObjects. - * - * @param string $calendarId - * @param string $objectUri - * @return array - */ - public function getCalendarObject($calendarId,$objectUri) { - $data = OC_Calendar_Object::findWhereDAVDataIs($calendarId,$objectUri); - if(is_array($data)){ - $data = $this->OCAddETag($data); - } - return $data; - } - - /** - * Creates a new calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function createCalendarObject($calendarId,$objectUri,$calendarData) { - OC_Calendar_Object::addFromDAVData($calendarId,$objectUri,$calendarData); - } - - /** - * Updates an existing calendarobject, based on it's uri. - * - * @param string $calendarId - * @param string $objectUri - * @param string $calendarData - * @return void - */ - public function updateCalendarObject($calendarId,$objectUri,$calendarData){ - OC_Calendar_Object::editFromDAVData($calendarId,$objectUri,$calendarData); - } - - /** - * Deletes an existing calendar object. - * - * @param string $calendarId - * @param string $objectUri - * @return void - */ - public function deleteCalendarObject($calendarId,$objectUri){ - OC_Calendar_Object::deleteFromDAVData($calendarId,$objectUri); - } - - /** - * @brief Creates a etag - * @param array $row Database result - * @returns associative array - * - * Adds a key "etag" to the row - */ - private function OCAddETag($row){ - $row['etag'] = '"'.md5($row['calendarid'].$row['uri'].$row['calendardata'].$row['lastmodified']).'"'; - return $row; - } -} diff --git a/apps/calendar/lib/export.php b/apps/calendar/lib/export.php deleted file mode 100644 index 8f26891f36..0000000000 --- a/apps/calendar/lib/export.php +++ /dev/null @@ -1,94 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class does export and converts all times to UTC - */ -class OC_Calendar_Export{ - /** - * @brief Use one of these constants as second parameter if you call OC_Calendar_Export::export() - */ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - - /** - * @brief export a calendar or an event - * @param integer $id id of calendar / event - * @param string $type use OC_Calendar_Export constants - * @return string - */ - public static function export($id, $type){ - if($type == self::EVENT){ - $return = self::event($id); - }else{ - $return = self::calendar($id); - } - return self::fixLineBreaks($return); - } - - /** - * @brief exports a calendar and convert all times to UTC - * @param integer $id id of the calendar - * @return string - */ - private static function calendar($id){ - $events = OC_Calendar_Object::all($id); - $calendar = OC_Calendar_Calendar::find($id); - $return = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\nX-WR-CALNAME:" . $calendar['displayname'] . "\n"; - foreach($events as $event){ - $return .= self::generateEvent($event); - } - $return .= "END:VCALENDAR"; - return $return; - } - - /** - * @brief exports an event and convert all times to UTC - * @param integer $id id of the event - * @return string - */ - private static function event($id){ - $event = OC_Calendar_Object::find($id); - $return = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\nX-WR-CALNAME:" . $event['summary'] . "\n"; - $return .= self::generateEvent($event); - $return .= "END:VCALENDAR"; - return $return; - } - - /** - * @brief generates the VEVENT with UTC dates - * @param array $event - * @return string - */ - private static function generateEvent($event){ - $object = OC_VObject::parse($event['calendardata']); - $dtstart = $object->VEVENT->DTSTART; - $start_dt = $dtstart->getDateTime(); - $dtend = OC_Calendar_Object::getDTEndFromVEvent($object->VEVENT); - $end_dt = $dtend->getDateTime(); - if($dtstart->getDateType() !== Sabre_VObject_Element_DateTime::DATE){ - $start_dt->setTimezone(new DateTimeZone('UTC')); - $end_dt->setTimezone(new DateTimeZone('UTC')); - $object->VEVENT->setDateTime('DTSTART', $start_dt, Sabre_VObject_Property_DateTime::UTC); - $object->VEVENT->setDateTime('DTEND', $end_dt, Sabre_VObject_Property_DateTime::UTC); - } - return $object->VEVENT->serialize(); - } - - /** - * @brief fixes new line breaks - * (fixes problems with Apple iCal) - * @param string $string to fix - * @return string - */ - private static function fixLineBreaks($string){ - $string = str_replace("\r\n", "\n", $string); - $string = str_replace("\r", "\n", $string); - $string = str_replace("\n", "\r\n", $string); - return $string; - } -} diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php deleted file mode 100644 index bc0b02c62b..0000000000 --- a/apps/calendar/lib/hooks.php +++ /dev/null @@ -1,40 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -/** - * This class contains all hooks. - */ -class OC_Calendar_Hooks{ - /** - * @brief Creates default calendar for a user - * @param paramters parameters from postCreateUser-Hook - * @return array - */ - public static function createUser($parameters) { - OC_Calendar_Calendar::addCalendar($parameters['uid'],'Default calendar'); - - return true; - } - - /** - * @brief Deletes all calendars of a certain user - * @param paramters parameters from postDeleteUser-Hook - * @return array - */ - public static function deleteUser($parameters) { - $calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']); - - foreach($calendars as $calendar) { - OC_Calendar_Calendar::deleteCalendar($calendar['id']); - } - - OC_Calendar_Share::post_userdelete($parameters['uid']); - - return true; - } -} diff --git a/apps/calendar/lib/import.php b/apps/calendar/lib/import.php deleted file mode 100644 index d36891cb2b..0000000000 --- a/apps/calendar/lib/import.php +++ /dev/null @@ -1,334 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/* - * This class does import and converts all times to the users current timezone - */ -class OC_Calendar_Import{ - /* - * @brief counts the absolute number of parsed elements - */ - private $abscount; - - /* - * @brief var saves if the percentage should be saved with OC_Cache - */ - private $cacheprogress; - - /* - * @brief Sabre_VObject_Component_VCalendar object - for documentation see http://code.google.com/p/sabredav/wiki/Sabre_VObject_Component_VCalendar - */ - private $calobject; - - /* - * @brief var counts the number of imported elements - */ - private $count; - - /* - * @brief var to check if errors happend while initialization - */ - private $error; - - /* - * @brief var saves the ical string that was submitted with the __construct function - */ - private $ical; - - /* - * @brief calendar id for import - */ - private $id; - - /* - * @brief var saves the percentage of the import's progress - */ - private $progress; - - /* - * @brief var saves the key for the percentage of the import's progress - */ - private $progresskey; - - /* - * @brief var saves the timezone the events shell converted to - */ - private $tz; - - /* - * @brief var saves the userid - */ - private $userid; - - /* - * public methods - */ - - /* - * @brief does general initialization for import object - * @param string $calendar content of ical file - * @param string $tz timezone of the user - * @return boolean - */ - public function __construct($ical){ - $this->error = null; - $this->ical = $ical; - $this->abscount = 0; - $this->count = 0; - try{ - $this->calobject = OC_VObject::parse($this->ical); - }catch(Exception $e){ - //MISSING: write some log - $this->error = true; - return false; - } - return true; - } - - /* - * @brief imports a calendar - * @return boolean - */ - public function import(){ - if(!$this->isValid()){ - return false; - } - $numofcomponents = count($this->calobject->getComponents()); - foreach($this->calobject->getComponents() as $object){ - if(!($object instanceof Sabre_VObject_Component_VEvent) && !($object instanceof Sabre_VObject_Component_VJournal) && !($object instanceof Sabre_VObject_Component_VTodo)){ - continue; - } - $dtend = OC_Calendar_Object::getDTEndFromVEvent($object); - $object->DTSTART->getDateTime()->setTimezone(new DateTimeZone($this->tz)); - $object->DTEND->setDateTime($dtend->getDateTime(), $object->DTSTART->getDateType()); - $object->DTEND->getDateTime()->setTimezone(new DateTimeZone($this->tz)); - $vcalendar = $this->createVCalendar($object->serialize()); - $insertid = OC_Calendar_Object::add($this->id, $vcalendar); - $this->abscount++; - if($this->isDuplicate($insertid)){ - OC_Calendar_Object::delete($insertid); - }else{ - $this->count++; - } - $this->updateProgress(intval(($this->abscount / $numofcomponents)*100)); - } - OC_Cache::remove($this->progresskey); - return true; - } - - /* - * @brief sets the timezone - * @return boolean - */ - public function setTimeZone($tz){ - $this->tz = $tz; - return true; - } - - /* - * @brief sets the progresskey - * @return boolean - */ - public function setProgresskey($progresskey){ - $this->progresskey = $progresskey; - return true; - } - - /* - * @brief checks if something went wrong while initialization - * @return boolean - */ - public function isValid(){ - if(is_null($this->error)){ - return true; - } - return false; - } - - /* - * @brief returns the percentage of progress - * @return integer - */ - public function getProgress(){ - return $this->progress; - } - - /* - * @brief enables the cache for the percentage of progress - * @return boolean - */ - public function enableProgressCache(){ - $this->cacheprogress = true; - return true; - } - - /* - * @brief disables the cache for the percentage of progress - * @return boolean - */ - public function disableProgressCache(){ - $this->cacheprogress = false; - return false; - } - - /* - * @brief generates a new calendar name - * @return string - */ - public function createCalendarName(){ - $calendars = OC_Calendar_Calendar::allCalendars($this->userid); - $calendarname = $guessedcalendarname = !is_null($this->guessCalendarName())?($this->guessCalendarName()):(OC_Calendar_App::$l10n->t('New Calendar')); - $i = 1; - while(!OC_Calendar_Calendar::isCalendarNameavailable($calendarname, $this->userid)){ - $calendarname = $guessedcalendarname . ' (' . $i . ')'; - $i++; - } - return $calendarname; - } - - /* - * @brief generates a new calendar color - * @return string - */ - public function createCalendarColor(){ - if(is_null($this->guessCalendarColor())){ - return '#9fc6e7'; - } - return $this->guessCalendarColor(); - } - - /* - * @brief sets the id for the calendar - * @param integer $id of the calendar - * @return boolean - */ - public function setCalendarID($id){ - $this->id = $id; - return true; - } - - /* - * @brief sets the userid to import the calendar - * @param string $id of the user - * @return boolean - */ - public function setUserID($userid){ - $this->userid = $userid; - return true; - } - - /* - * @brief returns the private - * @param string $id of the user - * @return boolean - */ - public function getCount(){ - return $this->count; - } - - /* - * private methods - */ - - /* - * @brief generates an unique ID - * @return string - */ - //private function createUID(){ - // return substr(md5(rand().time()),0,10); - //} - - /* - * @brief checks is the UID is already in use for another event - * @param string $uid uid to check - * @return boolean - */ - //private function isUIDAvailable($uid){ - // - //} - - /* - * @brief generates a proper VCalendar string - * @param string $vobject - * @return string - */ - private function createVCalendar($vobject){ - if(is_object($vobject)){ - $vobject = @$vobject->serialize(); - } - $vcalendar = "BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:ownCloud Calendar " . OCP\App::getAppVersion('calendar') . "\n"; - $vcalendar .= $vobject; - $vcalendar .= "END:VCALENDAR"; - return $vcalendar; - } - - /* - * @brief checks if an event already exists in the user's calendars - * @param integer $insertid id of the new object - * @return boolean - */ - private function isDuplicate($insertid){ - $newobject = OC_Calendar_Object::find($insertid); - $stmt = OCP\DB::prepare('SELECT COUNT(*) as count FROM *PREFIX*calendar_objects WHERE objecttype=? AND startdate=? AND enddate=? AND repeating=? AND summary=? AND calendardata=?'); - $result = $stmt->execute(array($newobject['objecttype'],$newobject['startdate'],$newobject['enddate'],$newobject['repeating'],$newobject['summary'],$newobject['calendardata'])); - $result = $result->fetchRow(); - if($result['count'] >= 2){ - return true; - } - return false; - } - - /* - * @brief updates the progress var - * @param integer $percentage - * @return boolean - */ - private function updateProgress($percentage){ - $this->progress = $percentage; - if($this->cacheprogress){ - OC_Cache::set($this->progresskey, $this->progress, 300); - } - return true; - } - - /* - * public methods for (pre)rendering of X-... Attributes - */ - - /* - * @brief guesses the calendar color - * @return mixed - string or boolean - */ - public function guessCalendarColor(){ - if(!is_null($this->calobject->__get('X-APPLE-CALENDAR-COLOR'))){ - return $this->calobject->__get('X-APPLE-CALENDAR-COLOR'); - } - return null; - } - - /* - * @brief guesses the calendar description - * @return mixed - string or boolean - */ - public function guessCalendarDescription(){ - if(!is_null($this->calobject->__get('X-WR-CALDESC'))){ - return $this->calobject->__get('X-WR-CALDESC'); - } - return null; - } - - /* - * @brief guesses the calendar name - * @return mixed - string or boolean - */ - public function guessCalendarName(){ - if(!is_null($this->calobject->__get('X-WR-CALNAME'))){ - return $this->calobject->__get('X-WR-CALNAME'); - } - return null; - } -} diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php deleted file mode 100644 index 3467683020..0000000000 --- a/apps/calendar/lib/object.php +++ /dev/null @@ -1,937 +0,0 @@ - - * Copyright (c) 2012 Bart Visscher - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - /** - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE calendar_objects ( - * id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * calendarid INTEGER UNSIGNED NOT NULL, - * objecttype VARCHAR(40) NOT NULL, - * startdate DATETIME, - * enddate DATETIME, - * repeating INT(1), - * summary VARCHAR(255), - * calendardata TEXT, - * uri VARCHAR(100), - * lastmodified INT(11) - * ); - * - */ - -/** - * This class manages our calendar objects - */ -class OC_Calendar_Object{ - /** - * @brief Returns all objects of a calendar - * @param integer $id - * @return array - * - * The objects are associative arrays. You'll find the original vObject in - * ['calendardata'] - */ - public static function all($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); - $result = $stmt->execute(array($id)); - - $calendarobjects = array(); - while( $row = $result->fetchRow()){ - $calendarobjects[] = $row; - } - - return $calendarobjects; - } - - /** - * @brief Returns all objects of a calendar between $start and $end - * @param integer $id - * @param DateTime $start - * @param DateTime $end - * @return array - * - * The objects are associative arrays. You'll find the original vObject - * in ['calendardata'] - */ - public static function allInPeriod($id, $start, $end){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' - .' AND ((startdate >= ? AND startdate <= ? AND repeating = 0)' - .' OR (enddate >= ? AND enddate <= ? AND repeating = 0)' - .' OR (startdate <= ? AND repeating = 1))' ); - $start = self::getUTCforMDB($start); - $end = self::getUTCforMDB($end); - $result = $stmt->execute(array($id, - $start, $end, - $start, $end, - $end)); - - $calendarobjects = array(); - while( $row = $result->fetchRow()){ - $calendarobjects[] = $row; - } - - return $calendarobjects; - } - - /** - * @brief Returns an object - * @param integer $id - * @return associative array - */ - public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE id = ?' ); - $result = $stmt->execute(array($id)); - - return $result->fetchRow(); - } - - /** - * @brief finds an object by its DAV Data - * @param integer $cid Calendar id - * @param string $uri the uri ('filename') - * @return associative array - */ - public static function findWhereDAVDataIs($cid,$uri){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri = ?' ); - $result = $stmt->execute(array($cid,$uri)); - - return $result->fetchRow(); - } - - /** - * @brief Adds an object - * @param integer $id Calendar id - * @param string $data object - * @return insertid - */ - public static function add($id,$data){ - $object = OC_VObject::parse($data); - OC_Calendar_App::loadCategoriesFromVCalendar($object); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - if(is_null($uid)){ - $object->setUID(); - $data = $object->serialize(); - } - - $uri = 'owncloud-'.md5($data.rand().time()).'.ics'; - - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); - $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); - $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'addEvent', $object_id); - return $object_id; - } - - /** - * @brief Adds an object with the data provided by sabredav - * @param integer $id Calendar id - * @param string $uri the uri the card will have - * @param string $data object - * @return insertid - */ - public static function addFromDAVData($id,$uri,$data){ - $object = OC_VObject::parse($data); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); - $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); - $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'addEvent', $object_id); - return $object_id; - } - - /** - * @brief edits an object - * @param integer $id id of object - * @param string $data object - * @return boolean - */ - public static function edit($id, $data){ - $oldobject = self::find($id); - - $object = OC_VObject::parse($data); - OC_Calendar_App::loadCategoriesFromVCalendar($object); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); - $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$id)); - - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'editEvent', $id); - - return true; - } - - /** - * @brief edits an object with the data provided by sabredav - * @param integer $id calendar id - * @param string $uri the uri of the object - * @param string $data object - * @return boolean - */ - public static function editFromDAVData($cid,$uri,$data){ - $oldobject = self::findWhereDAVDataIs($cid,$uri); - - $object = OC_VObject::parse($data); - list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); - $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$oldobject['id'])); - - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'editEvent', $oldobject['id']); - - return true; - } - - /** - * @brief deletes an object - * @param integer $id id of object - * @return boolean - */ - public static function delete($id){ - $oldobject = self::find($id); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE id = ?' ); - $stmt->execute(array($id)); - OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); - OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $id); - - return true; - } - - /** - * @brief deletes an object with the data provided by sabredav - * @param integer $cid calendar id - * @param string $uri the uri of the object - * @return boolean - */ - public static function deleteFromDAVData($cid,$uri){ - $oldobject = self::findWhereDAVDataIs($cid, $uri); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri=?' ); - $stmt->execute(array($cid,$uri)); - OC_Calendar_Calendar::touchCalendar($cid); - OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $oldobject['id']); - - return true; - } - - public static function moveToCalendar($id, $calendarid){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET calendarid=? WHERE id = ?' ); - $stmt->execute(array($calendarid,$id)); - - OC_Calendar_Calendar::touchCalendar($id); - OCP\Util::emitHook('OC_Calendar', 'moveEvent', $id); - - return true; - } - - /** - * @brief Creates a UID - * @return string - */ - protected static function createUID(){ - return substr(md5(rand().time()),0,10); - } - - /** - * @brief Extracts data from a vObject-Object - * @param Sabre_VObject $object - * @return array - * - * [type, start, end, summary, repeating, uid] - */ - protected static function extractData($object){ - $return = array('',null,null,'',0,null); - - // Child to use - $children = 0; - $use = null; - foreach($object->children as $property){ - if($property->name == 'VEVENT'){ - $children++; - $thisone = true; - - foreach($property->children as &$element){ - if($element->name == 'RECURRENCE-ID'){ - $thisone = false; - } - } unset($element); - - if($thisone){ - $use = $property; - } - } - elseif($property->name == 'VTODO' || $property->name == 'VJOURNAL'){ - $return[0] = $property->name; - foreach($property->children as &$element){ - if($element->name == 'SUMMARY'){ - $return[3] = $element->value; - } - elseif($element->name == 'UID'){ - $return[5] = $element->value; - } - }; - - // Only one VTODO or VJOURNAL per object - // (only one UID per object but a UID is required by a VTODO => - // one VTODO per object) - break; - } - } - - // find the data - if(!is_null($use)){ - $return[0] = $use->name; - foreach($use->children as $property){ - if($property->name == 'DTSTART'){ - $return[1] = self::getUTCforMDB($property->getDateTime()); - } - elseif($property->name == 'DTEND'){ - $return[2] = self::getUTCforMDB($property->getDateTime()); - } - elseif($property->name == 'SUMMARY'){ - $return[3] = $property->value; - } - elseif($property->name == 'RRULE'){ - $return[4] = 1; - } - elseif($property->name == 'UID'){ - $return[5] = $property->value; - } - } - } - - // More than one child means reoccuring! - if($children > 1){ - $return[4] = 1; - } - return $return; - } - - /** - * @brief DateTime to UTC string - * @param DateTime $datetime The date to convert - * @returns date as YYYY-MM-DD hh:mm - * - * This function creates a date string that can be used by MDB2. - * Furthermore it converts the time to UTC. - */ - public static function getUTCforMDB($datetime){ - return date('Y-m-d H:i', $datetime->format('U') - $datetime->getOffset()); - } - - /** - * @brief returns the DTEND of an $vevent object - * @param object $vevent vevent object - * @return object - */ - public static function getDTEndFromVEvent($vevent){ - if ($vevent->DTEND) { - $dtend = $vevent->DTEND; - }else{ - $dtend = clone $vevent->DTSTART; - // clone creates a shallow copy, also clone DateTime - $dtend->setDateTime(clone $dtend->getDateTime(), $dtend->getDateType()); - if ($vevent->DURATION){ - $duration = strval($vevent->DURATION); - $invert = 0; - if ($duration[0] == '-'){ - $duration = substr($duration, 1); - $invert = 1; - } - if ($duration[0] == '+'){ - $duration = substr($duration, 1); - } - $interval = new DateInterval($duration); - $interval->invert = $invert; - $dtend->getDateTime()->add($interval); - } - } - return $dtend; - } - - /** - * @brief returns the options for the repeat rule of an repeating event - * @return array - valid inputs for the repeat rule of an repeating event - */ - public static function getRepeatOptions($l10n){ - return array( - 'doesnotrepeat' => $l10n->t('Does not repeat'), - 'daily' => $l10n->t('Daily'), - 'weekly' => $l10n->t('Weekly'), - 'weekday' => $l10n->t('Every Weekday'), - 'biweekly' => $l10n->t('Bi-Weekly'), - 'monthly' => $l10n->t('Monthly'), - 'yearly' => $l10n->t('Yearly') - ); - } - - /** - * @brief returns the options for the end of an repeating event - * @return array - valid inputs for the end of an repeating events - */ - public static function getEndOptions($l10n){ - return array( - 'never' => $l10n->t('never'), - 'count' => $l10n->t('by occurrences'), - 'date' => $l10n->t('by date') - ); - } - - /** - * @brief returns the options for an monthly repeating event - * @return array - valid inputs for monthly repeating events - */ - public static function getMonthOptions($l10n){ - return array( - 'monthday' => $l10n->t('by monthday'), - 'weekday' => $l10n->t('by weekday') - ); - } - - /** - * @brief returns the options for an weekly repeating event - * @return array - valid inputs for weekly repeating events - */ - public static function getWeeklyOptions($l10n){ - return array( - 'MO' => $l10n->t('Monday'), - 'TU' => $l10n->t('Tuesday'), - 'WE' => $l10n->t('Wednesday'), - 'TH' => $l10n->t('Thursday'), - 'FR' => $l10n->t('Friday'), - 'SA' => $l10n->t('Saturday'), - 'SU' => $l10n->t('Sunday') - ); - } - - /** - * @brief returns the options for an monthly repeating event which occurs on specific weeks of the month - * @return array - valid inputs for monthly repeating events - */ - public static function getWeekofMonth($l10n){ - return array( - 'auto' => $l10n->t('events week of month'), - '1' => $l10n->t('first'), - '2' => $l10n->t('second'), - '3' => $l10n->t('third'), - '4' => $l10n->t('fourth'), - '5' => $l10n->t('fifth'), - '-1' => $l10n->t('last') - ); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific days of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByYearDayOptions(){ - $return = array(); - foreach(range(1,366) as $num){ - $return[(string) $num] = (string) $num; - } - return $return; - } - - /** - * @brief returns the options for an yearly or monthly repeating event which occurs on specific days of the month - * @return array - valid inputs for yearly or monthly repeating events - */ - public static function getByMonthDayOptions(){ - $return = array(); - foreach(range(1,31) as $num){ - $return[(string) $num] = (string) $num; - } - return $return; - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific month of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByMonthOptions($l10n){ - return array( - '1' => $l10n->t('January'), - '2' => $l10n->t('February'), - '3' => $l10n->t('March'), - '4' => $l10n->t('April'), - '5' => $l10n->t('May'), - '6' => $l10n->t('June'), - '7' => $l10n->t('July'), - '8' => $l10n->t('August'), - '9' => $l10n->t('September'), - '10' => $l10n->t('October'), - '11' => $l10n->t('November'), - '12' => $l10n->t('December') - ); - } - - /** - * @brief returns the options for an yearly repeating event - * @return array - valid inputs for yearly repeating events - */ - public static function getYearOptions($l10n){ - return array( - 'bydate' => $l10n->t('by events date'), - 'byyearday' => $l10n->t('by yearday(s)'), - 'byweekno' => $l10n->t('by weeknumber(s)'), - 'bydaymonth' => $l10n->t('by day and month') - ); - } - - /** - * @brief returns the options for an yearly repeating event which occurs on specific week numbers of the year - * @return array - valid inputs for yearly repeating events - */ - public static function getByWeekNoOptions(){ - return range(1, 52); - } - - /** - * @brief validates a request - * @param array $request - * @return mixed (array / boolean) - */ - public static function validateRequest($request){ - $errnum = 0; - $errarr = array('title'=>'false', 'cal'=>'false', 'from'=>'false', 'fromtime'=>'false', 'to'=>'false', 'totime'=>'false', 'endbeforestart'=>'false'); - if($request['title'] == ''){ - $errarr['title'] = 'true'; - $errnum++; - } - - $fromday = substr($request['from'], 0, 2); - $frommonth = substr($request['from'], 3, 2); - $fromyear = substr($request['from'], 6, 4); - if(!checkdate($frommonth, $fromday, $fromyear)){ - $errarr['from'] = 'true'; - $errnum++; - } - $allday = isset($request['allday']); - if(!$allday && self::checkTime(urldecode($request['fromtime']))) { - $errarr['fromtime'] = 'true'; - $errnum++; - } - - $today = substr($request['to'], 0, 2); - $tomonth = substr($request['to'], 3, 2); - $toyear = substr($request['to'], 6, 4); - if(!checkdate($tomonth, $today, $toyear)){ - $errarr['to'] = 'true'; - $errnum++; - } - if($request['repeat'] != 'doesnotrepeat'){ - if(is_nan($request['interval']) && $request['interval'] != ''){ - $errarr['interval'] = 'true'; - $errnum++; - } - if(array_key_exists('repeat', $request) && !array_key_exists($request['repeat'], self::getRepeatOptions(OC_Calendar_App::$l10n))){ - $errarr['repeat'] = 'true'; - $errnum++; - } - if(array_key_exists('advanced_month_select', $request) && !array_key_exists($request['advanced_month_select'], self::getMonthOptions(OC_Calendar_App::$l10n))){ - $errarr['advanced_month_select'] = 'true'; - $errnum++; - } - if(array_key_exists('advanced_year_select', $request) && !array_key_exists($request['advanced_year_select'], self::getYearOptions(OC_Calendar_App::$l10n))){ - $errarr['advanced_year_select'] = 'true'; - $errnum++; - } - if(array_key_exists('weekofmonthoptions', $request) && !array_key_exists($request['weekofmonthoptions'], self::getWeekofMonth(OC_Calendar_App::$l10n))){ - $errarr['weekofmonthoptions'] = 'true'; - $errnum++; - } - if($request['end'] != 'never'){ - if(!array_key_exists($request['end'], self::getEndOptions(OC_Calendar_App::$l10n))){ - $errarr['end'] = 'true'; - $errnum++; - } - if($request['end'] == 'count' && is_nan($request['byoccurrences'])){ - $errarr['byoccurrences'] = 'true'; - $errnum++; - } - if($request['end'] == 'date'){ - list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']); - if(!checkdate($bydate_month, $bydate_day, $bydate_year)){ - $errarr['bydate'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('weeklyoptions', $request)){ - foreach($request['weeklyoptions'] as $option){ - if(!in_array($option, self::getWeeklyOptions(OC_Calendar_App::$l10n))){ - $errarr['weeklyoptions'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('byyearday', $request)){ - foreach($request['byyearday'] as $option){ - if(!array_key_exists($option, self::getByYearDayOptions())){ - $errarr['byyearday'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('weekofmonthoptions', $request)){ - if(is_nan((double)$request['weekofmonthoptions'])){ - $errarr['weekofmonthoptions'] = 'true'; - $errnum++; - } - } - if(array_key_exists('bymonth', $request)){ - foreach($request['bymonth'] as $option){ - if(!in_array($option, self::getByMonthOptions(OC_Calendar_App::$l10n))){ - $errarr['bymonth'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('byweekno', $request)){ - foreach($request['byweekno'] as $option){ - if(!array_key_exists($option, self::getByWeekNoOptions())){ - $errarr['byweekno'] = 'true'; - $errnum++; - } - } - } - if(array_key_exists('bymonthday', $request)){ - foreach($request['bymonthday'] as $option){ - if(!array_key_exists($option, self::getByMonthDayOptions())){ - $errarr['bymonthday'] = 'true'; - $errnum++; - } - } - } - } - if(!$allday && self::checkTime(urldecode($request['totime']))) { - $errarr['totime'] = 'true'; - $errnum++; - } - if($today < $fromday && $frommonth == $tomonth && $fromyear == $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($today == $fromday && $frommonth > $tomonth && $fromyear == $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($today == $fromday && $frommonth == $tomonth && $fromyear > $toyear){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if(!$allday && $fromday == $today && $frommonth == $tomonth && $fromyear == $toyear){ - list($tohours, $tominutes) = explode(':', $request['totime']); - list($fromhours, $fromminutes) = explode(':', $request['fromtime']); - if($tohours < $fromhours){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - if($tohours == $fromhours && $tominutes < $fromminutes){ - $errarr['endbeforestart'] = 'true'; - $errnum++; - } - } - if ($errnum) - { - return $errarr; - } - return false; - } - - /** - * @brief validates time - * @param string $time - * @return boolean - */ - protected static function checkTime($time){ - list($hours, $minutes) = explode(':', $time); - return empty($time) - || $hours < 0 || $hours > 24 - || $minutes < 0 || $minutes > 60; - } - - /** - * @brief creates an VCalendar Object from the request data - * @param array $request - * @return object created $vcalendar - */ public static function createVCalendarFromRequest($request){ - $vcalendar = new OC_VObject('VCALENDAR'); - $vcalendar->add('PRODID', 'ownCloud Calendar'); - $vcalendar->add('VERSION', '2.0'); - - $vevent = new OC_VObject('VEVENT'); - $vcalendar->add($vevent); - - $vevent->setDateTime('CREATED', 'now', Sabre_VObject_Property_DateTime::UTC); - - $vevent->setUID(); - return self::updateVCalendarFromRequest($request, $vcalendar); - } - - /** - * @brief updates an VCalendar Object from the request data - * @param array $request - * @param object $vcalendar - * @return object updated $vcalendar - */ - public static function updateVCalendarFromRequest($request, $vcalendar){ - $title = $request["title"]; - $location = $request["location"]; - $categories = $request["categories"]; - $allday = isset($request["allday"]); - $from = $request["from"]; - $to = $request["to"]; - if (!$allday){ - $fromtime = $request['fromtime']; - $totime = $request['totime']; - } - $vevent = $vcalendar->VEVENT; - $description = $request["description"]; - $repeat = $request["repeat"]; - if($repeat != 'doesnotrepeat'){ - $rrule = ''; - $interval = $request['interval']; - $end = $request['end']; - $byoccurrences = $request['byoccurrences']; - switch($repeat){ - case 'daily': - $rrule .= 'FREQ=DAILY'; - break; - case 'weekly': - $rrule .= 'FREQ=WEEKLY'; - if(array_key_exists('weeklyoptions', $request)){ - $byday = ''; - $daystrings = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - foreach($request['weeklyoptions'] as $days){ - if($byday == ''){ - $byday .= $daystrings[$days]; - }else{ - $byday .= ',' .$daystrings[$days]; - } - } - $rrule .= ';BYDAY=' . $byday; - } - break; - case 'weekday': - $rrule .= 'FREQ=WEEKLY'; - $rrule .= ';BYDAY=MO,TU,WE,TH,FR'; - break; - case 'biweekly': - $rrule .= 'FREQ=WEEKLY'; - $interval = $interval * 2; - break; - case 'monthly': - $rrule .= 'FREQ=MONTHLY'; - if($request['advanced_month_select'] == 'monthday'){ - break; - }elseif($request['advanced_month_select'] == 'weekday'){ - if($request['weekofmonthoptions'] == 'auto'){ - list($_day, $_month, $_year) = explode('-', $from); - $weekofmonth = floor($_day/7); - }else{ - $weekofmonth = $request['weekofmonthoptions']; - } - $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - $byday = ''; - foreach($request['weeklyoptions'] as $day){ - if($byday == ''){ - $byday .= $weekofmonth . $days[$day]; - }else{ - $byday .= ',' . $weekofmonth . $days[$day]; - } - } - if($byday == ''){ - $byday = 'MO,TU,WE,TH,FR,SA,SU'; - } - $rrule .= ';BYDAY=' . $byday; - } - break; - case 'yearly': - $rrule .= 'FREQ=YEARLY'; - if($request['advanced_year_select'] == 'bydate'){ - - }elseif($request['advanced_year_select'] == 'byyearday'){ - list($_day, $_month, $_year) = explode('-', $from); - $byyearday = date('z', mktime(0,0,0, $_month, $_day, $_year)) + 1; - if(array_key_exists('byyearday', $request)){ - foreach($request['byyearday'] as $yearday){ - $byyearday .= ',' . $yearday; - } - } - $rrule .= ';BYYEARDAY=' . $byyearday; - }elseif($request['advanced_year_select'] == 'byweekno'){ - list($_day, $_month, $_year) = explode('-', $from); - $rrule .= ';BYDAY=' . strtoupper(substr(date('l', mktime(0,0,0, $_month, $_day, $_year)), 0, 2)); - $byweekno = ''; - foreach($request['byweekno'] as $weekno){ - if($byweekno == ''){ - $byweekno = $weekno; - }else{ - $byweekno .= ',' . $weekno; - } - } - $rrule .= ';BYWEEKNO=' . $byweekno; - }elseif($request['advanced_year_select'] == 'bydaymonth'){ - if(array_key_exists('weeklyoptions', $request)){ - $days = array_flip(self::getWeeklyOptions(OC_Calendar_App::$l10n)); - $byday = ''; - foreach($request['weeklyoptions'] as $day){ - if($byday == ''){ - $byday .= $days[$day]; - }else{ - $byday .= ',' . $days[$day]; - } - } - $rrule .= ';BYDAY=' . $byday; - } - if(array_key_exists('bymonth', $request)){ - $monthes = array_flip(self::getByMonthOptions(OC_Calendar_App::$l10n)); - $bymonth = ''; - foreach($request['bymonth'] as $month){ - if($bymonth == ''){ - $bymonth .= $monthes[$month]; - }else{ - $bymonth .= ',' . $monthes[$month]; - } - } - $rrule .= ';BYMONTH=' . $bymonth; - - } - if(array_key_exists('bymonthday', $request)){ - $bymonthday = ''; - foreach($request['bymonthday'] as $monthday){ - if($bymonthday == ''){ - $bymonthday .= $monthday; - }else{ - $bymonthday .= ',' . $monthday; - } - } - $rrule .= ';BYMONTHDAY=' . $bymonthday; - - } - } - break; - default: - break; - } - if($interval != ''){ - $rrule .= ';INTERVAL=' . $interval; - } - if($end == 'count'){ - $rrule .= ';COUNT=' . $byoccurrences; - } - if($end == 'date'){ - list($bydate_day, $bydate_month, $bydate_year) = explode('-', $request['bydate']); - $rrule .= ';UNTIL=' . $bydate_year . $bydate_month . $bydate_day; - } - $vevent->setString('RRULE', $rrule); - $repeat = "true"; - }else{ - $repeat = "false"; - } - - - $vevent->setDateTime('LAST-MODIFIED', 'now', Sabre_VObject_Property_DateTime::UTC); - $vevent->setDateTime('DTSTAMP', 'now', Sabre_VObject_Property_DateTime::UTC); - $vevent->setString('SUMMARY', $title); - - if($allday){ - $start = new DateTime($from); - $end = new DateTime($to.' +1 day'); - $vevent->setDateTime('DTSTART', $start, Sabre_VObject_Property_DateTime::DATE); - $vevent->setDateTime('DTEND', $end, Sabre_VObject_Property_DateTime::DATE); - }else{ - $timezone = OC_Calendar_App::getTimezone(); - $timezone = new DateTimeZone($timezone); - $start = new DateTime($from.' '.$fromtime, $timezone); - $end = new DateTime($to.' '.$totime, $timezone); - $vevent->setDateTime('DTSTART', $start, Sabre_VObject_Property_DateTime::LOCALTZ); - $vevent->setDateTime('DTEND', $end, Sabre_VObject_Property_DateTime::LOCALTZ); - } - unset($vevent->DURATION); - - $vevent->setString('LOCATION', $location); - $vevent->setString('DESCRIPTION', $description); - $vevent->setString('CATEGORIES', $categories); - - /**if($repeat == "true"){ - $vevent->RRULE = $repeat; - }*/ - - return $vcalendar; - } - - /** - * @brief returns the owner of an object - * @param integer $id - * @return string - */ - public static function getowner($id){ - $event = self::find($id); - $cal = OC_Calendar_Calendar::find($event['calendarid']); - return $cal['userid']; - } - - /** - * @brief returns the calendarid of an object - * @param integer $id - * @return integer - */ - public static function getCalendarid($id){ - $event = self::find($id); - return $event['calendarid']; - } - - /** - * @brief checks if an object is repeating - * @param integer $id - * @return boolean - */ - public static function isrepeating($id){ - $event = self::find($id); - return ($event['repeating'] == 1)?true:false; - } - - /** - * @brief converts the start_dt and end_dt to a new timezone - * @param object $dtstart - * @param object $dtend - * @param boolean $allday - * @param string $tz - * @return array - */ - public static function generateStartEndDate($dtstart, $dtend, $allday, $tz){ - $start_dt = $dtstart->getDateTime(); - $end_dt = $dtend->getDateTime(); - $return = array(); - if($allday){ - $return['start'] = $start_dt->format('Y-m-d'); - $end_dt->modify('-1 minute'); - while($start_dt >= $end_dt){ - $end_dt->modify('+1 day'); - } - $return['end'] = $end_dt->format('Y-m-d'); - }else{ - $start_dt->setTimezone(new DateTimeZone($tz)); - $end_dt->setTimezone(new DateTimeZone($tz)); - $return['start'] = $start_dt->format('Y-m-d H:i:s'); - $return['end'] = $end_dt->format('Y-m-d H:i:s'); - } - return $return; - } -} diff --git a/apps/calendar/lib/repeat.php b/apps/calendar/lib/repeat.php deleted file mode 100644 index b9fbee8fe0..0000000000 --- a/apps/calendar/lib/repeat.php +++ /dev/null @@ -1,204 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class manages the caching of repeating events - * Events will be cached for the current year ± 5 years - */ -class OC_Calendar_Repeat{ - /** - * @brief returns the cache of an event - * @param (int) $id - id of the event - * @return (array) - */ - public static function get($id){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_repeat WHERE eventid = ?'); - $result = $stmt->execute(array($id)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of an event in a specific peroid - * @param (int) $id - id of the event - * @param (DateTime) $from - start for period in UTC - * @param (DateTime) $until - end for period in UTC - * @return (array) - */ - public static function get_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_repeat WHERE eventid = ?' - .' AND ((startdate >= ? AND startdate <= ?)' - .' OR (enddate >= ? AND enddate <= ?))'); - $result = $stmt->execute(array($id, - OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until), - OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until))); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of all repeating events of a calendar - * @param (int) $id - id of the calendar - * @return (array) - */ - public static function getCalendar($id){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_repeat WHERE calid = ?'); - $result = $stmt->execute(array($id)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief returns the cache of all repeating events of a calendar in a specific period - * @param (int) $id - id of the event - * @param (string) $from - start for period in UTC - * @param (string) $until - end for period in UTC - * @return (array) - */ - public static function getCalendar_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_repeat WHERE calid = ?' - .' AND ((startdate >= ? AND startdate <= ?)' - .' OR (enddate >= ? AND enddate <= ?))'); - $result = $stmt->execute(array($id, - $from, $until, - $from, $until)); - $return = array(); - while($row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief generates the cache the first time - * @param (int) id - id of the event - * @return (bool) - */ - public static function generate($id){ - $event = OC_Calendar_Object::find($id); - if($event['repeating'] == 0){ - return false; - } - $object = OC_VObject::parse($event['calendardata']); - $start = new DateTime('01-01-' . date('Y') . ' 00:00:00', new DateTimeZone('UTC')); - $start->modify('-5 years'); - $end = new DateTime('31-12-' . date('Y') . ' 23:59:59', new DateTimeZone('UTC')); - $end->modify('+5 years'); - $object->expand($start, $end); - foreach($object->getComponents() as $vevent){ - if(!($vevent instanceof Sabre_VObject_Component_VEvent)){ - continue; - } - $startenddate = OC_Calendar_Object::generateStartEndDate($vevent->DTSTART, OC_Calendar_Object::getDTEndFromVEvent($vevent), ($vevent->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE)?true:false, 'UTC'); - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*calendar_repeat (eventid,calid,startdate,enddate) VALUES(?,?,?,?)'); - $stmt->execute(array($id,OC_Calendar_Object::getCalendarid($id),$startenddate['start'],$startenddate['end'])); - } - return true; - } - /** - * @brief generates the cache the first time for all repeating event of an calendar - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function generateCalendar($id){ - $allobjects = OC_Calendar_Object::all($id); - foreach($allobjects as $event){ - self::generate($event['id']); - } - return true; - } - /** - * @brief updates an event that is already cached - * @param (int) id - id of the event - * @return (bool) - */ - public static function update($id){ - self::clean($id); - self::generate($id); - return true; - } - /** - * @brief updates all repating events of a calendar that are already cached - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function updateCalendar($id){ - self::cleanCalendar($id); - self::generateCalendar($id); - return true; - } - /** - * @brief checks if an event is already cached - * @param (int) id - id of the event - * @return (bool) - */ - public static function is_cached($id){ - if(count(self::get($id)) != 0){ - return true; - }else{ - return false; - } - } - /** - * @brief checks if an event is already cached in a specific period - * @param (int) id - id of the event - * @param (DateTime) $from - start for period in UTC - * @param (DateTime) $until - end for period in UTC - * @return (bool) - */ - public static function is_cached_inperiod($id, $start, $end){ - if(count(self::get_inperiod($id, $start, $end)) != 0){ - return true; - }else{ - return false; - } - - } - /** - * @brief checks if a whole calendar is already cached - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function is_calendar_cached($id){ - $cachedevents = count(self::getCalendar($id)); - $repeatingevents = 0; - $allevents = OC_Calendar_Object::all($id); - foreach($allevents as $event){ - if($event['repeating'] === 1){ - $repeatingevents++; - } - } - if($cachedevents < $repeatingevents){ - return false; - }else{ - return true; - } - } - /** - * @brief removes the cache of an event - * @param (int) id - id of the event - * @return (bool) - */ - public static function clean($id){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_repeat WHERE eventid = ?'); - $stmt->execute(array($id)); - } - /** - * @brief removes the cache of all events of a calendar - * @param (int) id - id of the calendar - * @return (bool) - */ - public static function cleanCalendar($id){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_repeat WHERE calid = ?'); - $stmt->execute(array($id)); - } -} \ No newline at end of file diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php deleted file mode 100644 index 551489672b..0000000000 --- a/apps/calendar/lib/search.php +++ /dev/null @@ -1,49 +0,0 @@ - 0){ - $searchquery = explode(' ', $query); - }else{ - $searchquery[] = $query; - } - $user_timezone = OC_Calendar_App::getTimezone(); - $l = new OC_l10n('calendar'); - foreach($calendars as $calendar){ - $objects = OC_Calendar_Object::all($calendar['id']); - foreach($objects as $object){ - if($object['objecttype']!='VEVENT') { - continue; - } - if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){ - $calendardata = OC_VObject::parse($object['calendardata']); - $vevent = $calendardata->VEVENT; - $dtstart = $vevent->DTSTART; - $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); - $start_dt = $dtstart->getDateTime(); - $start_dt->setTimezone(new DateTimeZone($user_timezone)); - $end_dt = $dtend->getDateTime(); - $end_dt->setTimezone(new DateTimeZone($user_timezone)); - if ($dtstart->getDateType() == Sabre_VObject_Property_DateTime::DATE){ - $end_dt->modify('-1 sec'); - if($start_dt->format('d.m.Y') != $end_dt->format('d.m.Y')){ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y') . ' - ' . $end_dt->format('d.m.Y'); - }else{ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.Y'); - } - }else{ - $info = $l->t('Date') . ': ' . $start_dt->format('d.m.y H:i') . ' - ' . $end_dt->format('d.m.y H:i'); - } - $link = OCP\Util::linkTo('calendar', 'index.php').'?showevent='.urlencode($object['id']); - $results[]=new OC_Search_Result($object['summary'],$info, $link,(string)$l->t('Cal.'));//$name,$text,$link,$type - } - } - } - return $results; - } -} diff --git a/apps/calendar/lib/share.php b/apps/calendar/lib/share.php deleted file mode 100644 index 4fe8817140..0000000000 --- a/apps/calendar/lib/share.php +++ /dev/null @@ -1,298 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -/** - * This class manages shared calendars - */ -class OC_Calendar_Share{ - const CALENDAR = 'calendar'; - const EVENT = 'event'; - /** - * @brief: returns informations about all calendar or events which users are sharing with the user - userid - * @param: string $userid - id of the user - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return: array $return - information about calendars - */ - public static function allSharedwithuser($userid, $type, $active=null, $permission=null){ - $group_where = self::group_sql(OC_Group::getUserGroups($userid)); - $permission_where = self::permission_sql($permission); - if($type == self::CALENDAR){ - $active_where = self::active_sql($active); - }else{ - $active_where = ''; - } - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE ((share = ? AND sharetype = 'user') " . $group_where . ") AND owner <> ? " . $permission_where . " " . $active_where); - $result = $stmt->execute(array($userid, $userid)); - $return = array(); - while( $row = $result->fetchRow()){ - $return[] = $row; - } - return $return; - } - /** - * @brief: returns all users a calendar / event is shared with - * @param: integer id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return: array $users - information about users a calendar / event is shared with - */ - public static function allUsersSharedwith($id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE ' . $type . 'id = ? ORDER BY share'); - $result = $stmt->execute(array($id)); - $users = array(); - while( $row = $result->fetchRow()){ - $users[] = $row; - } - return $users; - } - /** - * @brief: shares a calendar / event - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return (mixed) - token (if $sharetype == public) / bool (if $sharetype != public) - */ - public static function share($owner, $share, $sharetype, $id, $type){ - if(self::is_already_shared($owner, $share, $sharetype, $id, $type)){ - return false; - } - switch($sharetype){ - case 'user': - case 'group': - case 'public': - break; - default: - return false; - } - if($sharetype == 'public'){ - $share = self::generate_token($id, $type); - } - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*calendar_share_' . $type . ' (owner,share,sharetype,' . $type . 'id,permissions' . (($type == self::CALENDAR)?', active':'') . ') VALUES(?,?,?,?,0' . (($type == self::CALENDAR)?', 1':'') . ')' ); - $result = $stmt->execute(array($owner,$share,$sharetype,$id)); - if($sharetype == 'public'){ - return $share; - }else{ - return true; - } - } - /** - * @brief: stops sharing a calendar / event - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function unshare($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? ' . (($sharetype != 'public')?'AND share = ?':'') . ' AND sharetype = ? AND ' . $type . 'id = ?'); - if($sharetype != 'public'){ - $stmt->execute(array($owner,$share,$sharetype,$id)); - }else{ - $stmt->execute(array($owner,$sharetype,$id)); - } - return true; - } - /** - * @brief: changes the permission for a calendar / event - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: integer $permission - permission of user the calendar / event is shared with (if $sharetype == public then $permission = 0) - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function changepermission($share, $sharetype, $id, $permission, $type){ - if($sharetype == 'public' && $permission == 1){ - $permission = 0; - } - $stmt = OCP\DB::prepare('UPDATE *PREFIX*calendar_share_' . $type . ' SET permissions = ? WHERE share = ? AND sharetype = ? AND ' . $type . 'id = ?'); - $stmt->execute(array($permission, $share, $sharetype, $id)); - return true; - } - /** - * @brief: generates a token for public calendars / events - * @return: string $token - */ - private static function generate_token($id, $type){ - $uniqid = uniqid(); - if($type == self::CALENDAR){ - $events = OC_Calendar_Object::all($id); - $string = ''; - foreach($events as $event){ - $string .= $event['calendardata']; - } - }else{ - $string = OC_Calendar_Object::find($id); - } - $string = sha1($string['calendardata']); - $id = sha1($id); - $array = array($uniqid,$string,$id); - shuffle($array); - $string = implode('', $array); - $token = md5($string); - return substr($token, rand(0,16), 15); - } - /** - * @brief: checks if it is already shared - * @param: string $owner - userid of the owner - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $sharetype - type of sharing (can be: user/group/public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function is_already_shared($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? AND share = ? AND sharetype = ? AND ' . $type . 'id = ?'); - $result = $stmt->execute(array($owner, $share, $sharetype, $id)); - if($result->numRows() > 0){ - return true; - } - return false; - } - private static function group_sql($groups){ - $group_where = ''; - $i = 0; - foreach($groups as $group){ - $group_where .= ' OR '; - $group_where .= " (share = '" . $group . "' AND sharetype = 'group') "; - $i++; - } - return $group_where; - } - private static function permission_sql($permission = null){ - $permission_where = ''; - if(!is_null($permission)){ - $permission_where = ' AND permissions = '; - $permission_where .= ($permission=='rw')?"'1'":"'0'"; - } - return $permission_where; - } - private static function active_sql($active = null){ - $active_where = ''; - if(!is_null($active)){ - $active_where = 'AND active = '; - $active_where .= (!is_null($active) && $active)?'1':'0'; - } - return $active_where; - } - /** - * @brief: checks the permission for editing an event - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function is_editing_allowed($share, $id, $type){ - $group_where = self::group_sql(OC_Group::getUserGroups($share)); - $permission_where = self::permission_sql('rw'); - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE ((share = ? AND sharetype = 'user') " . $group_where . ") " . $permission_where); - $result = $stmt->execute(array($share)); - if($result->numRows() == 1){ - return true; - } - if($type == self::EVENT){ - $event = OC_Calendar_App::getEventObject($id, false, false); - return self::is_editing_allowed($share, $event['calendarid'], self::CALENDAR); - } - return false; - } - /** - * @brief: checks the access of - * @param: string $share - userid (if $sharetype == user) / groupid (if $sharetype == group) / token (if $sharetype == public) - * @param: string $id - id of the calendar / event - * @param: string $type - use const self::CALENDAR or self::EVENT - * @return boolean - */ - public static function check_access($share, $id, $type){ - $group_where = self::group_sql(OC_Group::getUserGroups($share)); - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE (" . $type . "id = ? AND (share = ? AND sharetype = 'user') " . $group_where . ")"); - $result = $stmt->execute(array($id,$share)); - $rows = $result->numRows(); - if($rows > 0){ - return true; - }elseif($type == self::EVENT){ - $event = OC_Calendar_App::getEventObject($id, false, false); - return self::check_access($share, $event['calendarid'], self::CALENDAR); - }else{ - return false; - } - } - /** - * @brief: returns the calendardata of an event or a calendar - * @param: string $token - token which should be searched - * @return: mixed - bool if false, array with type and id if true - */ - public static function getElementByToken($token){ - $stmt_calendar = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . OC_Calendar_Share::CALENDAR . " WHERE sharetype = 'public' AND share = ?"); - $result_calendar = $stmt_calendar->execute(array($token)); - $stmt_event = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . OC_Calendar_Share::EVENT . " WHERE sharetype = 'public' AND share = ?"); - $result_event = $stmt_event->execute(array($token)); - $return = array(); - if($result_calendar->numRows() == 0 && $result_event->numRows() == 0){ - return false; - }elseif($result_calendar->numRows() != 0){ - $return ['type'] = 'calendar'; - $calendar = $result_calendar->fetchRow(); - $return ['id'] = $calendar['calendarid']; - }else{ - $return ['type'] = 'event'; - $event = $result_event->fetchRow(); - $return ['id'] = $event['eventid']; - } - return $return; - } - - /** - * @brief sets the active status of the calendar - * @param string - */ - public static function set_active($share, $id, $active){ - $stmt = OCP\DB::prepare("UPDATE *PREFIX*calendar_share_calendar SET active = ? WHERE share = ? AND sharetype = 'user' AND calendarid = ?"); - $stmt->execute(array($active, $share, $id)); - } - - /** - * @brief deletes all shared calendars / events after a user was deleted - * @param string $userid - * @return boolean - */ - public static function post_userdelete($userid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE owner = ?'); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE owner = ?'); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_calendar WHERE share = ? AND sharetype = 'user'"); - $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_event WHERE share = ? AND sharetype = 'user'"); - $stmt->execute(array($userid)); - return true; - } - - /** - * @brief deletes all shared events of a calendar - * @param integer $calid - * @return boolean - */ - public static function post_caldelete($calid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE calendarid = ?'); - $stmt->execute(array($calid)); - return true; - } - - /** - * @brief deletes all shares of an event - * @param integer $eventid - * @return boolean - */ - public static function post_eventdelete($eventid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE eventid = ?'); - $stmt->execute(array($eventid)); - return true; - } -} \ No newline at end of file diff --git a/apps/calendar/settings.php b/apps/calendar/settings.php deleted file mode 100644 index eaa20c6c9b..0000000000 --- a/apps/calendar/settings.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$tmpl = new OCP\Template( 'calendar', 'settings'); -$timezone=OCP\Config::getUserValue(OCP\USER::getUser(),'calendar','timezone',''); -$tmpl->assign('timezone',$timezone); -$tmpl->assign('timezones',DateTimeZone::listIdentifiers()); -$tmpl->assign('calendars', OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()), false); - -OCP\Util::addscript('calendar','settings'); - -return $tmpl->fetchPage(); diff --git a/apps/calendar/share.php b/apps/calendar/share.php deleted file mode 100644 index bffcf0b470..0000000000 --- a/apps/calendar/share.php +++ /dev/null @@ -1,31 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -$token = strip_tags($_GET['t']); -$shared = OC_Calendar_Share::getElementByToken($token); -if($shared['type'] == OC_Calendar_Share::CALENDAR){ - $calendar = OC_Calendar_App::getCalendar($shared['id'], false); - if(!$calendar){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $calendar['displayname']) . '.ics'); - echo OC_Calendar_Export::export($shared['id'], OC_Calendar_Export::CALENDAR); -}elseif($shared['type'] == OC_Calendar_Share::EVENT){ - $data = OC_Calendar_App::getEventObject($shared['id'], false); - if(!$data){ - header('HTTP/1.0 404 Not Found'); - exit; - } - header('Content-Type: text/Calendar'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '-', $data['summary']) . '.ics'); - echo OC_Calendar_Export::export($shared['id'], OC_Calendar_Export::EVENT); -}else{ - header('HTTP/1.0 404 Not Found'); - exit; -} diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php deleted file mode 100644 index 29b9bf6bc5..0000000000 --- a/apps/calendar/templates/calendar.php +++ /dev/null @@ -1,61 +0,0 @@ - -
    -
    - - -    - -
    -
    - "/> - " onclick="Calendar.UI.Calendar.overview();" /> -
    -
    - - - -
    -
    - -
    -
    - -
    -
    - t("There was a fail, while parsing the file."); ?> -
    - diff --git a/apps/calendar/templates/part.choosecalendar.php b/apps/calendar/templates/part.choosecalendar.php deleted file mode 100644 index 8d621cc363..0000000000 --- a/apps/calendar/templates/part.choosecalendar.php +++ /dev/null @@ -1,51 +0,0 @@ -
    "> -

    t('Your calendars'); ?>:

    - -"; - $tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields'); - $tmpl->assign('calendar', $option_calendars[$i]); - if(OC_Calendar_Share::allUsersSharedwith($option_calendars[$i]['id'], OC_Calendar_Share::CALENDAR) == array()){ - $shared = false; - }else{ - $shared = true; - } - $tmpl->assign('shared', $shared); - $tmpl->printpage(); - echo ""; -} -?> - - - - - - -
    - -
    -

    ">

    -

    -

    t('Shared calendars'); ?>:

    - -'; - $tmpl = new OCP\Template('calendar', 'part.choosecalendar.rowfields.shared'); - $tmpl->assign('share', $share[$i]); - $tmpl->printpage(); - echo ''; -} -?> -
    -' . $l->t('No shared calendars') . '

    '; -} -?> -
    \ No newline at end of file diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.php b/apps/calendar/templates/part.choosecalendar.rowfields.php deleted file mode 100644 index 4492ce731c..0000000000 --- a/apps/calendar/templates/part.choosecalendar.rowfields.php +++ /dev/null @@ -1,21 +0,0 @@ - - > - - - - - - - - - - - - - - - - - - - diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php b/apps/calendar/templates/part.choosecalendar.rowfields.shared.php deleted file mode 100644 index a23266da0c..0000000000 --- a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php +++ /dev/null @@ -1,4 +0,0 @@ -'; -echo ''; -echo '' . $l->t('shared with you by') . ' ' . $_['share']['owner'] . ''; \ No newline at end of file diff --git a/apps/calendar/templates/part.editcalendar.php b/apps/calendar/templates/part.editcalendar.php deleted file mode 100644 index b4ff573ec8..0000000000 --- a/apps/calendar/templates/part.editcalendar.php +++ /dev/null @@ -1,44 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -t("Edit calendar"); ?>" colspan="6"> - - - - - - - - - - - - - - - -
    t('Displayname') ?> - -
    - > - -
    t('Calendar color') ?> - -
    -);" value="t("Save") : $l->t("Submit"); ?>"> -);" value="t("Cancel"); ?>"> - diff --git a/apps/calendar/templates/part.editevent.php b/apps/calendar/templates/part.editevent.php deleted file mode 100644 index 102366f8f0..0000000000 --- a/apps/calendar/templates/part.editevent.php +++ /dev/null @@ -1,13 +0,0 @@ -
    "> -
    - - -inc("part.eventform"); ?> -
    - - " onclick="Calendar.UI.validateEventForm('?app=calendar&getfile=ajax/event/edit.php');"> - " onclick="Calendar.UI.submitDeleteEventForm('?app=calendar&getfile=ajax/event/delete.php');"> - " onclick="window.location='?app=calendar&getfile=export.php?eventid=';"> - -
    -
    diff --git a/apps/calendar/templates/part.eventform.php b/apps/calendar/templates/part.eventform.php deleted file mode 100644 index 95eecf2622..0000000000 --- a/apps/calendar/templates/part.eventform.php +++ /dev/null @@ -1,251 +0,0 @@ - - - -
    - - - - - -
    t("Title");?>: - " value="" maxlength="100" name="title"/> -
    - - - - - 1) { ?> - - - - - - - -
    t("Category");?>: - - <?php echo $l->t('Edit categories'); ?> -    t("Calendar");?>: - -   - -
    -
    - - - - - - - - - - - - - -
    - id="allday_checkbox" name="allday"> - -
    t("From");?>: - -    - -
    t("To");?>: - -    - -
    - " onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button"> - -
    -
    - - - - - - -
    t("Repeat");?>: - " onclick="Calendar.UI.showadvancedoptionsforrepeating();" id="advanced_options_button">
    - -
    - - -
    - inc('share.dropdown'); } ?> -
    - diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php deleted file mode 100644 index 2ce3cc3423..0000000000 --- a/apps/calendar/templates/part.import.php +++ /dev/null @@ -1,58 +0,0 @@ -'404')); -} -$import = new OC_Calendar_Import($file); -$import->setUserID(OCP\User::getUser()); -$newcalendarname = strip_tags($import->createCalendarName()); -$guessedcalendarname = strip_tags($import->guessCalendarName()); -$calendarcolor = strip_tags($import->createCalendarColor()); -//loading calendars for select box -$calendar_options = OC_Calendar_Calendar::allCalendars(OCP\USER::getUser()); -$calendar_options[] = array('id'=>'newcal', 'displayname'=>$l->t('create a new calendar')); -$defaultcolors = OC_Calendar_Calendar::getCalendarColorOptions(); -?> -
    "> -
    -
    - - - - -
    t('Please choose a calendar'); ?>
    - -

    -
    - -
    -
    - '; - } - ?> -
    - -
    t('A Calendar with this name already exists. If you continue anyhow, these calendars will be merged.'); ?>
    -
    - - -
    -
    -
    -
    -
    -
    -
    - -
    -
    \ No newline at end of file diff --git a/apps/calendar/templates/part.newevent.php b/apps/calendar/templates/part.newevent.php deleted file mode 100644 index f4bb867b18..0000000000 --- a/apps/calendar/templates/part.newevent.php +++ /dev/null @@ -1,9 +0,0 @@ -
    "> - -inc("part.eventform"); ?> -
    - - " onclick="Calendar.UI.validateEventForm('?app=calendar&getfile=ajax/event/new.php');"> - - -
    diff --git a/apps/calendar/templates/part.showevent.php b/apps/calendar/templates/part.showevent.php deleted file mode 100644 index 59684d831e..0000000000 --- a/apps/calendar/templates/part.showevent.php +++ /dev/null @@ -1,243 +0,0 @@ -
    "> - -
    - - - - - -
    t("Title");?>: - -
    - - - - - - - - - -
    t("Category");?>: - t('No categories selected'); - }else{ - echo '
      '; - foreach($_['categories'] as $categorie){ - echo '
    • ' . $categorie . '
    • '; - } - echo '
    '; - } - ?> -
       t("Calendar");?>: - t('of') . ' ' . $calendar['userid']; - ?> -   - -
    -
    - - - - - - - - - - - - - -
    - id="allday_checkbox" name="allday" disabled="disabled"> - t("All Day Event");?> -
    t("From");?>: - -    t('at'):''; ?>    - -
    t("To");?>: - -    t('at'):''; ?>    - -
    - " onclick="Calendar.UI.showadvancedoptions();" id="advanced_options_button"> - -
    -
    - - - - - - -
    t("Repeat");?>: - " onclick="Calendar.UI.showadvancedoptionsforrepeating();" id="advanced_options_button">
    - -
    - - -
    \ No newline at end of file diff --git a/apps/calendar/templates/settings.php b/apps/calendar/templates/settings.php deleted file mode 100644 index 28c357621a..0000000000 --- a/apps/calendar/templates/settings.php +++ /dev/null @@ -1,67 +0,0 @@ - - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -
    -
    - t('Calendar'); ?> - - - - - - - - - -
    - -
    - -
    - -
    - - t('Calendar CalDAV syncing addresses'); ?> (t('more info'); ?>) -
    -
    t('Primary address (Kontact et al)'); ?>
    -
    -
    t('iOS/OS X'); ?>
    -
    principals//
    -
    t('Read only iCalendar link(s)'); ?>
    -
    - -
    - -
    -
    -
    -
    diff --git a/apps/calendar/templates/share.dropdown.php b/apps/calendar/templates/share.dropdown.php deleted file mode 100644 index 07b4c4bced..0000000000 --- a/apps/calendar/templates/share.dropdown.php +++ /dev/null @@ -1,77 +0,0 @@ - -t('Users');?>:
    -
    -
      - -
    • style="visibility:hidden;" title="t('Editable'); ?>">
    • - - -
    -t('Groups');?>:
    -
    -
      - -
    • style="visibility:hidden;" title="t('Editable'); ?>">
    • - - -
    -
    - >
    - -
    \ No newline at end of file diff --git a/apps/contacts/ajax/activation.php b/apps/contacts/ajax/activation.php deleted file mode 100644 index 69173c54c4..0000000000 --- a/apps/contacts/ajax/activation.php +++ /dev/null @@ -1,32 +0,0 @@ - - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$bookid = $_POST['bookid']; -$book = OC_Contacts_App::getAddressbook($bookid);// is owner access check - -if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { - OCP\Util::writeLog('contacts', - 'ajax/activation.php: Error activating addressbook: '. $bookid, - OCP\Util::ERROR); - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')))); - exit(); -} - -OCP\JSON::success(array( - 'active' => OC_Contacts_Addressbook::isActive($bookid), - 'bookid' => $bookid, - 'book' => $book, -)); diff --git a/apps/contacts/ajax/addaddressbook.php b/apps/contacts/ajax/addaddressbook.php deleted file mode 100644 index 40773704bb..0000000000 --- a/apps/contacts/ajax/addaddressbook.php +++ /dev/null @@ -1,37 +0,0 @@ - - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -debug('name: '.$_POST['name']); - -$userid = OCP\USER::getUser(); -$name = isset($_POST['name'])?trim(strip_tags($_POST['name'])):null; -$description = isset($_POST['description']) - ? trim(strip_tags($_POST['description'])) - : null; - -if(is_null($name)) { - bailOut('Cannot add addressbook with an empty name.'); -} -$bookid = OC_Contacts_Addressbook::add($userid, $name, $description); -if(!$bookid) { - bailOut('Error adding addressbook: '.$name); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { - bailOut('Error activating addressbook.'); -} -$addressbook = OC_Contacts_App::getAddressbook($bookid); -OCP\JSON::success(array('data' => $addressbook)); diff --git a/apps/contacts/ajax/addbook.php b/apps/contacts/ajax/addbook.php deleted file mode 100644 index 751185b44f..0000000000 --- a/apps/contacts/ajax/addbook.php +++ /dev/null @@ -1,19 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -$book = array( - 'id' => 'new', - 'displayname' => '', -); -$tmpl = new OCP\Template('contacts', 'part.editaddressbook'); -$tmpl->assign('new', true); -$tmpl->assign('addressbook', $book); -$tmpl->printPage(); diff --git a/apps/contacts/ajax/addcontact.php b/apps/contacts/ajax/addcontact.php deleted file mode 100644 index 6aaf5a9df3..0000000000 --- a/apps/contacts/ajax/addcontact.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$aid = isset($_POST['aid'])?$_POST['aid']:null; -if(!$aid) { - $aid = min(OC_Contacts_Addressbook::activeIds()); // first active addressbook. -} -OC_Contacts_App::getAddressbook( $aid ); // is owner access check - -$isnew = isset($_POST['isnew'])?$_POST['isnew']:false; -$fn = trim($_POST['fn']); -$n = trim($_POST['n']); - -$vcard = new OC_VObject('VCARD'); -$vcard->setUID(); -$vcard->setString('FN', $fn); -$vcard->setString('N', $n); - -$id = OC_Contacts_VCard::add($aid, $vcard, null, $isnew); -if(!$id) { - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.')))); - OCP\Util::writeLog('contacts', 'ajax/addcontact.php: Recieved non-positive ID on adding card: '.$id, OCP\Util::ERROR); - exit(); -} - -OCP\JSON::success(array('data' => array( 'id' => $id, 'aid' => $aid ))); diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/addproperty.php deleted file mode 100644 index 58b857547f..0000000000 --- a/apps/contacts/ajax/addproperty.php +++ /dev/null @@ -1,147 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once 'loghandler.php'; - -$id = isset($_POST['id'])?$_POST['id']:null; -$name = isset($_POST['name'])?$_POST['name']:null; -$value = isset($_POST['value'])?$_POST['value']:null; -$parameters = isset($_POST['parameters'])?$_POST['parameters']:array(); - -$vcard = OC_Contacts_App::getContactVCard($id); -$l10n = OC_Contacts_App::$l10n; - -if(!$name) { - bailOut($l10n->t('element name is not set.')); -} -if(!$id) { - bailOut($l10n->t('id is not set.')); -} - -if(!$vcard) { - bailOut($l10n->t('Could not parse contact: ').$id); -} - -if(!is_array($value)) { - $value = trim($value); - if(!$value - && in_array( - $name, - array('TEL', 'EMAIL', 'ORG', 'BDAY', 'URL', 'NICKNAME', 'NOTE')) - ) { - bailOut($l10n->t('Cannot add empty property.')); - } -} elseif($name === 'ADR') { // only add if non-empty elements. - $empty = true; - foreach($value as $part) { - if(trim($part) != '') { - $empty = false; - break; - } - } - if($empty) { - bailOut($l10n->t('At least one of the address fields has to be filled out.')); - } -} - -// Prevent setting a duplicate entry -$current = $vcard->select($name); -foreach($current as $item) { - $tmpvalue = (is_array($value)?implode(';', $value):$value); - if($tmpvalue == $item->value) { - bailOut($l10n->t('Trying to add duplicate property: '.$name.': '.$tmpvalue)); - } -} - -if(is_array($value)) { - // NOTE: Important, otherwise the compound value will - // be set in the order the fields appear in the form! - ksort($value); - $value = array_map('strip_tags', $value); -} else { - $value = strip_tags($value); -} - -/* preprocessing value */ -switch($name) { - case 'BDAY': - $date = New DateTime($value); - $value = $date->format(DateTime::ATOM); - case 'FN': - if(!$value) { - // create a method thats returns an alternative for FN. - //$value = getOtherValue(); - } - case 'N': - case 'ORG': - case 'NOTE': - $value = str_replace('\n', ' \\n', $value); - break; - case 'NICKNAME': - // TODO: Escape commas and semicolons. - break; - case 'EMAIL': - $value = strtolower($value); - break; - case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? - break; -} - -switch($name) { - case 'NOTE': - $vcard->setString('NOTE', $value); - break; - default: - $property = $vcard->addProperty($name, $value); //, $parameters); - break; -} - -$line = count($vcard->children) - 1; - -// Apparently Sabre_VObject_Parameter doesn't do well with -// multiple values or I don't know how to do it. Tanghus. -foreach ($parameters as $key=>$element) { - if(is_array($element) && strtoupper($key) == 'TYPE') { - // NOTE: Maybe this doesn't only apply for TYPE? - // And it probably shouldn't be done here anyways :-/ - foreach($element as $e) { - if($e != '' && !is_null($e)) { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $e); - } - } - } else { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $element); - } -} -$checksum = md5($vcard->children[$line]->serialize()); - -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut($l10n->t('Error adding contact property: '.$name)); -} - -OCP\JSON::success(array('data' => array( 'checksum' => $checksum ))); diff --git a/apps/contacts/ajax/categories/categoriesfor.php b/apps/contacts/ajax/categories/categoriesfor.php deleted file mode 100644 index 8391b14b54..0000000000 --- a/apps/contacts/ajax/categories/categoriesfor.php +++ /dev/null @@ -1,34 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = isset($_GET['id'])?$_GET['id']:null; -if(is_null($id)) { - OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('No ID provided')))); - exit(); -} -$vcard = OC_Contacts_App::getContactVCard( $id ); -foreach($vcard->children as $property){ - if($property->name == 'CATEGORIES') { - $checksum = md5($property->serialize()); - OCP\JSON::success(array( - 'data' => array( - 'value' => $property->value, - 'checksum' => $checksum, - ))); - exit(); - } -} -OCP\JSON::error(array( - 'data' => array( - 'message' => OC_Contacts_App::$l10n->t('Error setting checksum.')))); diff --git a/apps/contacts/ajax/categories/delete.php b/apps/contacts/ajax/categories/delete.php deleted file mode 100644 index bc9f3e14e8..0000000000 --- a/apps/contacts/ajax/categories/delete.php +++ /dev/null @@ -1,48 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -require_once __DIR__.'/../loghandler.php'; - -$categories = isset($_POST['categories'])?$_POST['categories']:null; - -if(is_null($categories)) { - bailOut(OC_Contacts_App::$l10n->t('No categories selected for deletion.')); -} - -debug(print_r($categories, true)); - -$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -if(count($addressbooks) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No address books found.')); -} -$addressbookids = array(); -foreach($addressbooks as $addressbook) { - $addressbookids[] = $addressbook['id']; -} -$contacts = OC_Contacts_VCard::all($addressbookids); -if(count($contacts) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No contacts found.')); -} - -$cards = array(); -foreach($contacts as $contact) { - $cards[] = array($contact['id'], $contact['carddata']); -} - -debug('Before delete: '.print_r($categories, true)); - -$catman = new OC_VCategories('contacts'); -$catman->delete($categories, $cards); -debug('After delete: '.print_r($catman->categories(), true)); -OC_Contacts_VCard::updateDataByID($cards); -OCP\JSON::success(array('data' => array('categories'=>$catman->categories()))); diff --git a/apps/contacts/ajax/categories/list.php b/apps/contacts/ajax/categories/list.php deleted file mode 100644 index f234116ba8..0000000000 --- a/apps/contacts/ajax/categories/list.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$categories = OC_Contacts_App::getCategories(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); diff --git a/apps/contacts/ajax/categories/rescan.php b/apps/contacts/ajax/categories/rescan.php deleted file mode 100644 index a06e780395..0000000000 --- a/apps/contacts/ajax/categories/rescan.php +++ /dev/null @@ -1,17 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -OC_Contacts_App::scanCategories(); -$categories = OC_Contacts_App::getCategories(); - -OCP\JSON::success(array('data' => array('categories'=>$categories))); diff --git a/apps/contacts/ajax/chooseaddressbook.php b/apps/contacts/ajax/chooseaddressbook.php deleted file mode 100644 index 1ce8dd46ee..0000000000 --- a/apps/contacts/ajax/chooseaddressbook.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$tmpl = new OCP\Template("contacts", "part.chooseaddressbook"); -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page))); diff --git a/apps/contacts/ajax/contactdetails.php b/apps/contacts/ajax/contactdetails.php deleted file mode 100644 index 27d7611ade..0000000000 --- a/apps/contacts/ajax/contactdetails.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -require_once 'loghandler.php'; - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = isset($_GET['id'])?$_GET['id']:null; -if(is_null($id)) { - bailOut(OC_Contacts_App::$l10n->t('Missing ID')); -} -$card = OC_Contacts_VCard::find($id); -$vcard = OC_Contacts_App::getContactVCard( $id ); -if(is_null($vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error parsing VCard for ID: "'.$id.'"')); -} -$details = OC_Contacts_VCard::structureContact($vcard); - -// Make up for not supporting the 'N' field in earlier version. -if(!isset($details['N'])) { - $details['N'] = array(); - $details['N'][0] = array($details['FN'][0]['value'],'','','',''); -} - -// Don't wanna transfer the photo in a json string. -if(isset($details['PHOTO'])) { - $details['PHOTO'] = true; - //unset($details['PHOTO']); -} else { - $details['PHOTO'] = false; -} -$details['id'] = $id; -$details['displayname'] = $card['fullname']; -$details['addressbookid'] = $card['addressbookid']; -OC_Contacts_App::setLastModifiedHeader($vcard); -OCP\JSON::success(array('data' => $details)); diff --git a/apps/contacts/ajax/contacts.php b/apps/contacts/ajax/contacts.php deleted file mode 100644 index 67ebcaf736..0000000000 --- a/apps/contacts/ajax/contacts.php +++ /dev/null @@ -1,74 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -function cmp($a, $b) -{ - if ($a['displayname'] == $b['displayname']) { - return 0; - } - return ($a['displayname'] < $b['displayname']) ? -1 : 1; -} - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$start = isset($_GET['startat'])?$_GET['startat']:0; -$aid = isset($_GET['aid'])?$_GET['aid']:null; - -if(is_null($aid)) { - // Called initially to get the active addressbooks. - $active_addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); -} else { - // called each time more contacts has to be shown. - $active_addressbooks = array(OC_Contacts_Addressbook::find($aid)); -} - - -session_write_close(); - -// create the addressbook associate array -$contacts_addressbook = array(); -$ids = array(); -foreach($active_addressbooks as $addressbook) { - $ids[] = $addressbook['id']; - if(!isset($contacts_addressbook[$addressbook['id']])) { - $contacts_addressbook[$addressbook['id']] = array('contacts' => array('type' => 'book',)); - $contacts_addressbook[$addressbook['id']]['displayname'] = $addressbook['displayname']; - } -} - -$contacts_alphabet = array(); - -// get next 50 for each addressbook. -foreach($ids as $id) { - if($id) { - $contacts_alphabet = array_merge($contacts_alphabet, OC_Contacts_VCard::all($id, $start, 50)); - } -} -// Our new array for the contacts sorted by addressbook -if($contacts_alphabet) { - foreach($contacts_alphabet as $contact) { - if(!isset($contacts_addressbook[$contact['addressbookid']])) { // It should never execute. - $contacts_addressbook[$contact['addressbookid']] = array('contacts' => array('type' => 'book',)); - } - $display = trim($contact['fullname']); - if(!$display) { - $vcard = OC_Contacts_App::getContactVCard($contact['id']); - if(!is_null($vcard)) { - $struct = OC_Contacts_VCard::structureContact($vcard); - $display = isset($struct['EMAIL'][0])?$struct['EMAIL'][0]['value']:'[UNKNOWN]'; - } - } - $contacts_addressbook[$contact['addressbookid']]['contacts'][] = array('type' => 'contact', 'id' => $contact['id'], 'addressbookid' => $contact['addressbookid'], 'displayname' => htmlspecialchars($display)); - } -} -unset($contacts_alphabet); -uasort($contacts_addressbook, 'cmp'); - -OCP\JSON::success(array('data' => array('entries' => $contacts_addressbook))); - diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php deleted file mode 100644 index 8dbd63f642..0000000000 --- a/apps/contacts/ajax/createaddressbook.php +++ /dev/null @@ -1,36 +0,0 @@ - - * Copyright (c) 2011 Bart Visscher - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -$userid = OCP\USER::getUser(); -$name = trim(strip_tags($_POST['name'])); -if(!$name) { - bailOut('Cannot add addressbook with an empty name.'); -} -$bookid = OC_Contacts_Addressbook::add($userid, $name, null); -if(!$bookid) { - bailOut('Error adding addressbook: '.$name); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { - bailOut('Error activating addressbook.'); -} -$addressbook = OC_Contacts_App::getAddressbook($bookid); -$tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); -$tmpl->assign('addressbook', $addressbook); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'addressbook' => $addressbook, -)); diff --git a/apps/contacts/ajax/cropphoto.php b/apps/contacts/ajax/cropphoto.php deleted file mode 100644 index eb9f1fcdb5..0000000000 --- a/apps/contacts/ajax/cropphoto.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$tmpkey = $_GET['tmpkey']; -$requesttoken = $_GET['requesttoken']; -$id = $_GET['id']; -$tmpl = new OCP\Template("contacts", "part.cropphoto"); -$tmpl->assign('tmpkey', $tmpkey); -$tmpl->assign('id', $id); -$tmpl->assign('requesttoken', $requesttoken); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/currentphoto.php b/apps/contacts/ajax/currentphoto.php deleted file mode 100644 index 96080e661e..0000000000 --- a/apps/contacts/ajax/currentphoto.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -if (!isset($_GET['id'])) { - bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); -} - -$contact = OC_Contacts_App::getContactVCard($_GET['id']); -// invalid vcard -if( is_null($contact)) { - bailOut(OC_Contacts_App::$l10n->t('Error reading contact photo.')); -} else { - $image = new OC_Image(); - if(!$image->loadFromBase64($contact->getAsString('PHOTO'))) { - $image->loadFromBase64($contact->getAsString('LOGO')); - } - if($image->valid()) { - $tmpkey = 'contact-photo-'.$contact->getAsString('UID'); - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey))); - exit(); - } else { - bailOut(OC_Contacts_App::$l10n->t('Error saving temporary file.')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('The loading photo is not valid.')); - } -} diff --git a/apps/contacts/ajax/deletebook.php b/apps/contacts/ajax/deletebook.php deleted file mode 100644 index 1b86ecf223..0000000000 --- a/apps/contacts/ajax/deletebook.php +++ /dev/null @@ -1,33 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -//$id = $_GET['id']; -$id = $_POST['id']; -OC_Contacts_App::getAddressbook( $id ); // is owner access check - -OC_Contacts_Addressbook::delete($id); -OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/deletecard.php b/apps/contacts/ajax/deletecard.php deleted file mode 100644 index 9777046fc8..0000000000 --- a/apps/contacts/ajax/deletecard.php +++ /dev/null @@ -1,35 +0,0 @@ -. - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -$id = isset($_POST['id'])?$_POST['id']:null; -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} -$card = OC_Contacts_App::getContactObject( $id ); - -OC_Contacts_VCard::delete($id); -OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/deleteproperty.php deleted file mode 100644 index 205df8bc18..0000000000 --- a/apps/contacts/ajax/deleteproperty.php +++ /dev/null @@ -1,46 +0,0 @@ -. - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -$id = $_POST['id']; -$checksum = $_POST['checksum']; -$l10n = OC_Contacts_App::$l10n; - -$vcard = OC_Contacts_App::getContactVCard( $id ); -$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); -if(is_null($line)) { - bailOut($l10n->t('Information about vCard is incorrect. Please reload the page.')); - exit(); -} - -unset($vcard->children[$line]); - -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut($l10n->t('Error deleting contact property.')); -} - -OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/editaddress.php b/apps/contacts/ajax/editaddress.php deleted file mode 100644 index b5e4b72ed5..0000000000 --- a/apps/contacts/ajax/editaddress.php +++ /dev/null @@ -1,41 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$id = $_GET['id']; -$checksum = isset($_GET['checksum'])?$_GET['checksum']:''; -$vcard = OC_Contacts_App::getContactVCard($id); -$adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); - -$tmpl = new OCP\Template("contacts", "part.edit_address_dialog"); -if($checksum) { - $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); - $element = $vcard->children[$line]; - $adr = OC_Contacts_VCard::structureProperty($element); - $types = array(); - if(isset($adr['parameters']['TYPE'])) { - if(is_array($adr['parameters']['TYPE'])) { - $types = array_map('htmlspecialchars', $adr['parameters']['TYPE']); - $types = array_map('strtoupper', $types); - } else { - $types = array(strtoupper(htmlspecialchars($adr['parameters']['TYPE']))); - } - } - $tmpl->assign('types', $types, false); - $adr = array_map('htmlspecialchars', $adr['value']); - $tmpl->assign('adr', $adr, false); -} - -$tmpl->assign('id', $id); -$tmpl->assign('adr_types', $adr_types); - -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page, 'checksum'=>$checksum))); diff --git a/apps/contacts/ajax/editaddressbook.php b/apps/contacts/ajax/editaddressbook.php deleted file mode 100644 index 4bc77302e5..0000000000 --- a/apps/contacts/ajax/editaddressbook.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -$addressbook = OC_Contacts_App::getAddressbook($_GET['bookid']); -$tmpl = new OCP\Template("contacts", "part.editaddressbook"); -$tmpl->assign('new', false); -$tmpl->assign('addressbook', $addressbook); -$tmpl->printPage(); diff --git a/apps/contacts/ajax/editname.php b/apps/contacts/ajax/editname.php deleted file mode 100644 index eb55634011..0000000000 --- a/apps/contacts/ajax/editname.php +++ /dev/null @@ -1,34 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -$tmpl = new OCP\Template("contacts", "part.edit_name_dialog"); - -$id = isset($_GET['id'])?$_GET['id']:''; - -if($id) { - $vcard = OC_Contacts_App::getContactVCard($id); - $name = array('', '', '', '', ''); - if($vcard->__isset('N')) { - $property = $vcard->__get('N'); - if($property) { - $name = OC_Contacts_VCard::structureProperty($property); - } - } - $name = array_map('htmlspecialchars', $name['value']); - $tmpl->assign('name', $name, false); - $tmpl->assign('id', $id, false); -} else { - bailOut(OC_Contacts_App::$l10n->t('Contact ID is missing.')); -} -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page))); diff --git a/apps/contacts/ajax/importdialog.php b/apps/contacts/ajax/importdialog.php deleted file mode 100644 index 691522538f..0000000000 --- a/apps/contacts/ajax/importdialog.php +++ /dev/null @@ -1,15 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -$tmpl = new OCP\Template('contacts', 'part.import'); -$tmpl->assign('path', $_POST['path']); -$tmpl->assign('filename', $_POST['filename']); -$tmpl->printpage(); diff --git a/apps/contacts/ajax/loadcard.php b/apps/contacts/ajax/loadcard.php deleted file mode 100644 index 75fe33ada6..0000000000 --- a/apps/contacts/ajax/loadcard.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); -$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); -$maxUploadFilesize = min($upload_max_filesize, $post_max_size); -$requesttoken = $_GET['requesttoken']; - -$freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace, 0); -$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); -$adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); -$phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); -$email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); - -$tmpl = new OCP\Template('contacts', 'part.contact'); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); -$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); -$tmpl->assign('adr_types', $adr_types); -$tmpl->assign('phone_types', $phone_types); -$tmpl->assign('email_types', $email_types); -$tmpl->assign('requesttoken', $requesttoken); -$tmpl->assign('id', ''); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/loghandler.php b/apps/contacts/ajax/loghandler.php deleted file mode 100644 index be4b98c111..0000000000 --- a/apps/contacts/ajax/loghandler.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -function bailOut($msg, $tracelevel=1, $debuglevel=OCP\Util::ERROR) -{ - OCP\JSON::error(array('data' => array('message' => $msg))); - debug($msg, $tracelevel, $debuglevel); - exit(); -} - -function debug($msg, $tracelevel=0, $debuglevel=OCP\Util::DEBUG) -{ - if(PHP_VERSION >= "5.4") { - $call = debug_backtrace(false, $tracelevel+1); - } else { - $call = debug_backtrace(false); - } - error_log('trace: '.print_r($call, true)); - $call = $call[$tracelevel]; - if($debuglevel !== false) { - OCP\Util::writeLog('contacts', - $call['file'].'. Line: '.$call['line'].': '.$msg, - $debuglevel); - } -} diff --git a/apps/contacts/ajax/movetoaddressbook.php b/apps/contacts/ajax/movetoaddressbook.php deleted file mode 100644 index a3336c3cb6..0000000000 --- a/apps/contacts/ajax/movetoaddressbook.php +++ /dev/null @@ -1,41 +0,0 @@ - -* Copyright (c) 2012 Thomas Tanghus -* This file is licensed under the Affero General Public License version 3 or -* later. -* See the COPYING-README file. -*/ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$ids = $_POST['ids']; -$aid = intval($_POST['aid']); -OC_Contacts_App::getAddressbook($aid); - -if(!is_array($ids)) { - $ids = array($ids,); -} -$goodids = array(); -foreach ($ids as $id){ - try { - $card = OC_Contacts_App::getContactObject( intval($id) ); - if($card) { - $goodids[] = $id; - } - } catch (Exception $e) { - OCP\Util::writeLog('contacts', 'Error moving contact "'.$id.'" to addressbook "'.$aid.'"'.$e->getMessage(), OCP\Util::ERROR); - } -} -try { - OC_Contacts_VCard::moveToAddressBook($aid, $ids); -} catch (Exception $e) { - $msg = $e->getMessage(); - OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $ids).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR); - OC_JSON::error(array('data' => array('message' => $msg,))); -} - -OC_JSON::success(array('data' => array('ids' => $goodids,))); \ No newline at end of file diff --git a/apps/contacts/ajax/oc_photo.php b/apps/contacts/ajax/oc_photo.php deleted file mode 100644 index fe37b530f8..0000000000 --- a/apps/contacts/ajax/oc_photo.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -if(!isset($_GET['id'])) { - bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); -} - -if(!isset($_GET['path'])) { - bailOut(OC_Contacts_App::$l10n->t('No photo path was submitted.')); -} - -$localpath = OC_Filesystem::getLocalFile($_GET['path']); -$tmpkey = 'contact-photo-'.$_GET['id']; - -if(!file_exists($localpath)) { - bailOut(OC_Contacts_App::$l10n->t('File doesn\'t exist:').$localpath); -} - -$image = new OC_Image(); -if(!$image) { - bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); -} -if(!$image->loadFromFile($localpath)) { - bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); -} -if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. -} -if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - OCP\Util::writeLog('contacts', - 'ajax/oc_photo.php: Couldn\'t save correct image orientation: '.$localpath, - OCP\Util::DEBUG); -} -if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey))); - exit(); -} else { - bailOut('Couldn\'t save temporary image: '.$tmpkey); -} diff --git a/apps/contacts/ajax/savecrop.php b/apps/contacts/ajax/savecrop.php deleted file mode 100644 index 8ee2e46bf0..0000000000 --- a/apps/contacts/ajax/savecrop.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); - -require_once 'loghandler.php'; - -$image = null; - -$x1 = (isset($_POST['x1']) && $_POST['x1']) ? $_POST['x1'] : 0; -//$x2 = isset($_POST['x2']) ? $_POST['x2'] : -1; -$y1 = (isset($_POST['y1']) && $_POST['y1']) ? $_POST['y1'] : 0; -//$y2 = isset($_POST['y2']) ? $_POST['y2'] : -1; -$w = (isset($_POST['w']) && $_POST['w']) ? $_POST['w'] : -1; -$h = (isset($_POST['h']) && $_POST['h']) ? $_POST['h'] : -1; -$tmpkey = isset($_POST['tmpkey']) ? $_POST['tmpkey'] : ''; -$id = isset($_POST['id']) ? $_POST['id'] : ''; - -if($tmpkey == '') { - bailOut('Missing key to temporary file.'); -} - -if($id == '') { - bailOut('Missing contact id.'); -} - -OCP\Util::writeLog('contacts', 'savecrop.php: key: '.$tmpkey, OCP\Util::DEBUG); - -$data = OC_Cache::get($tmpkey); -if($data) { - $image = new OC_Image(); - if($image->loadFromdata($data)) { - $w = ($w != -1 ? $w : $image->width()); - $h = ($h != -1 ? $h : $image->height()); - OCP\Util::writeLog('contacts', - 'savecrop.php, x: '.$x1.' y: '.$y1.' w: '.$w.' h: '.$h, - OCP\Util::DEBUG); - if($image->crop($x1, $y1, $w, $h)) { - if(($image->width() <= 200 && $image->height() <= 200) || $image->resize(200)) { - $card = OC_Contacts_App::getContactVCard($id); - if(!$card) { - OC_Cache::remove($tmpkey); - bailOut(OC_Contacts_App::$l10n->t('Error getting contact object.')); - } - if($card->__isset('PHOTO')) { - OCP\Util::writeLog('contacts', - 'savecrop.php: PHOTO property exists.', - OCP\Util::DEBUG); - $property = $card->__get('PHOTO'); - if(!$property) { - OC_Cache::remove($tmpkey); - bailOut(OC_Contacts_App::$l10n->t('Error getting PHOTO property.')); - } - $property->setValue($image->__toString()); - $property->parameters[] = new Sabre_VObject_Parameter('ENCODING', 'b'); - $property->parameters[] = new Sabre_VObject_Parameter('TYPE', $image->mimeType()); - $card->__set('PHOTO', $property); - } else { - OCP\Util::writeLog('contacts', - 'savecrop.php: files: Adding PHOTO property.', - OCP\Util::DEBUG); - $card->addProperty('PHOTO', - $image->__toString(), array('ENCODING' => 'b', - 'TYPE' => $image->mimeType())); - } - $now = new DateTime; - $card->setString('REV', $now->format(DateTime::W3C)); - if(!OC_Contacts_VCard::edit($id, $card)) { - bailOut(OC_Contacts_App::$l10n->t('Error saving contact.')); - } - $tmpl = new OCP\Template("contacts", "part.contactphoto"); - $tmpl->assign('id', $id); - $tmpl->assign('refresh', true); - $tmpl->assign('width', $image->width()); - $tmpl->assign('height', $image->height()); - $page = $tmpl->fetchPage(); - OCP\JSON::success(array('data' => array('page'=>$page))); - } else { - bailOut(OC_Contacts_App::$l10n->t('Error resizing image')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('Error cropping image')); - } - } else { - bailOut(OC_Contacts_App::$l10n->t('Error creating temporary image')); - } -} else { - bailOut(OC_Contacts_App::$l10n->t('Error finding image: ').$tmpkey); -} - -OC_Cache::remove($tmpkey); diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/saveproperty.php deleted file mode 100644 index 5d743c99df..0000000000 --- a/apps/contacts/ajax/saveproperty.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -require_once 'loghandler.php'; -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -$id = isset($_POST['id'])?$_POST['id']:null; -$name = isset($_POST['name'])?$_POST['name']:null; -$value = isset($_POST['value'])?$_POST['value']:null; -$parameters = isset($_POST['parameters'])?$_POST['parameters']:null; -$checksum = isset($_POST['checksum'])?$_POST['checksum']:null; - -if(!$name) { - bailOut(OC_Contacts_App::$l10n->t('element name is not set.')); -} -if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); -} -if(!$checksum) { - bailOut(OC_Contacts_App::$l10n->t('checksum is not set.')); -} -if(is_array($value)) { - $value = array_map('strip_tags', $value); - // NOTE: Important, otherwise the compound value will be - // set in the order the fields appear in the form! - ksort($value); - //if($name == 'CATEGORIES') { - // $value = OC_Contacts_VCard::escapeDelimiters($value, ','); - //} else { - $value = OC_Contacts_VCard::escapeDelimiters($value, ';'); - //} -} else { - $value = trim(strip_tags($value)); -} - -$vcard = OC_Contacts_App::getContactVCard( $id ); -$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); -if(is_null($line)) { - bailOut(OC_Contacts_App::$l10n->t('Information about vCard is incorrect. Please reload the page: ').$checksum); -} -$element = $vcard->children[$line]->name; - -if($element != $name) { - bailOut(OC_Contacts_App::$l10n->t('Something went FUBAR. ').$name.' != '.$element); -} - -/* preprocessing value */ -switch($element) { - case 'BDAY': - $date = New DateTime($value); - $value = $date->format('Y-m-d'); - break; - case 'FN': - if(!$value) { - // create a method thats returns an alternative for FN. - //$value = getOtherValue(); - } - break; - case 'NOTE': - $value = str_replace('\n', '\\n', $value); - break; - case 'EMAIL': - $value = strtolower($value); - break; -} - -if(!$value) { - unset($vcard->children[$line]); - $checksum = ''; -} else { - /* setting value */ - switch($element) { - case 'BDAY': - // I don't use setDateTime() because that formats it as YYYYMMDD instead of YYYY-MM-DD - // which is what the RFC recommends. - $vcard->children[$line]->setValue($value); - $vcard->children[$line]->parameters = array(); - $vcard->children[$line]->add(new Sabre_VObject_Parameter('VALUE', 'DATE')); - debug('Setting value:'.$name.' '.$vcard->children[$line]); - break; - case 'CATEGORIES': - debug('Setting string:'.$name.' '.$value); - $vcard->children[$line]->setValue($value); - break; - case 'EMAIL': - case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? - debug('Setting element: (EMAIL/TEL/ADR)'.$element); - $vcard->children[$line]->setValue($value); - $vcard->children[$line]->parameters = array(); - if(!is_null($parameters)) { - debug('Setting parameters: '.$parameters); - foreach($parameters as $key => $parameter) { - debug('Adding parameter: '.$key); - foreach($parameter as $val) { - debug('Adding parameter: '.$key.'=>'.$val); - $vcard->children[$line]->add(new Sabre_VObject_Parameter($key, strtoupper(strip_tags($val)))); - } - } - } - break; - default: - debug('Setting string:'.$name.' '.$value); - $vcard->setString($name, $value); - break; - } - // Do checksum and be happy - $checksum = md5($vcard->children[$line]->serialize()); -} -//debug('New checksum: '.$checksum); - -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.')); - exit(); -} - -OCP\JSON::success(array('data' => array( 'line' => $line, 'checksum' => $checksum, 'oldchecksum' => $_POST['checksum'] ))); diff --git a/apps/contacts/ajax/selectaddressbook.php b/apps/contacts/ajax/selectaddressbook.php deleted file mode 100644 index 6c35d08c82..0000000000 --- a/apps/contacts/ajax/selectaddressbook.php +++ /dev/null @@ -1,16 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -$tmpl = new OCP\Template("contacts", "part.selectaddressbook"); -$tmpl->assign('addressbooks', $addressbooks); -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page' => $page ))); diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php deleted file mode 100644 index a14b215843..0000000000 --- a/apps/contacts/ajax/updateaddressbook.php +++ /dev/null @@ -1,38 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -require_once 'loghandler.php'; - -$bookid = $_POST['id']; -OC_Contacts_App::getAddressbook($bookid); // is owner access check - -$name = trim(strip_tags($_POST['name'])); -if(!$name) { - bailOut(OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.')); -} - -if(!OC_Contacts_Addressbook::edit($bookid, $name, null)) { - bailOut(OC_Contacts_App::$l10n->t('Error updating addressbook.')); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { - bailOut(OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')); -} - -$addressbook = OC_Contacts_App::getAddressbook($bookid); -$tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); -$tmpl->assign('addressbook', $addressbook); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'addressbook' => $addressbook, -)); diff --git a/apps/contacts/ajax/uploadimport.php b/apps/contacts/ajax/uploadimport.php deleted file mode 100644 index 87032b731a..0000000000 --- a/apps/contacts/ajax/uploadimport.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -require_once 'loghandler.php'; - -$l10n = OC_Contacts_App::$l10n; - -$view = OCP\Files::getStorage('contacts'); -if(!$view->file_exists('imports')) { - $view->mkdir('imports'); -} -$tmpfile = md5(rand()); - -// If it is a Drag'n'Drop transfer it's handled here. -$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false); -if($fn) { - if($view->file_put_contents('/imports/'.$fn, file_get_contents('php://input'))) { - OCP\JSON::success(array('data' => array('file'=>$tmpfile, 'name'=>$fn))); - exit(); - } else { - bailOut($l10n->t('Error uploading contacts to storage.')); - } -} - -// File input transfers are handled here -if (!isset($_FILES['importfile'])) { - OCP\Util::writeLog('contacts', - 'ajax/uploadphoto.php: No file was uploaded. Unknown error.', - OCP\Util::DEBUG); - OCP\JSON::error(array(' - data' => array( - 'message' => 'No file was uploaded. Unknown error' ))); - exit(); -} -$error = $_FILES['importfile']['error']; -if($error !== UPLOAD_ERR_OK) { - $errors = array( - 0=>$l10n->t("There is no error, the file uploaded with success"), - 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>$l10n->t("The uploaded file was only partially uploaded"), - 4=>$l10n->t("No file was uploaded"), - 6=>$l10n->t("Missing a temporary folder") - ); - bailOut($errors[$error]); -} -$file=$_FILES['importfile']; - -if(file_exists($file['tmp_name'])) { - if($view->file_put_contents('/imports/'.$file['name'], file_get_contents($file['tmp_name']))) { - OCP\JSON::success(array('data' => array('file'=>$file['name'], 'name'=>$file['name']))); - } else { - bailOut($l10n->t('Error uploading contacts to storage.')); - } -} else { - bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); -} diff --git a/apps/contacts/ajax/uploadphoto.php b/apps/contacts/ajax/uploadphoto.php deleted file mode 100644 index 4cd38db8c7..0000000000 --- a/apps/contacts/ajax/uploadphoto.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); -require_once 'loghandler.php'; -$l10n = OC_Contacts_App::$l10n; -// If it is a Drag'n'Drop transfer it's handled here. -$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false); -if ($fn) { - if (!isset($_GET['id'])) { - bailOut($l10n->t('No contact ID was submitted.')); - } - $id = $_GET['id']; - $tmpkey = 'contact-photo-'.md5($fn); - $data = file_get_contents('php://input'); - $image = new OC_Image(); - sleep(1); // Apparently it needs time to load the data. - if($image->loadFromData($data)) { - if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. - } - if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpkey); - } - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array( - 'data' => array( - 'mime'=>$_SERVER['CONTENT_TYPE'], - 'name'=>$fn, - 'id'=>$id, - 'tmp'=>$tmpkey))); - exit(); - } else { - bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); - } - } else { - bailOut($l10n->t('Couldn\'t load temporary image: ').$tmpkey); - } -} - -// Uploads from file dialog are handled here. -if (!isset($_POST['id'])) { - bailOut($l10n->t('No contact ID was submitted.')); -} -if (!isset($_FILES['imagefile'])) { - bailOut($l10n->t('No file was uploaded. Unknown error')); -} - -$error = $_FILES['imagefile']['error']; -if($error !== UPLOAD_ERR_OK) { - $errors = array( - 0=>$l10n->t("There is no error, the file uploaded with success"), - 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>$l10n->t("The uploaded file was only partially uploaded"), - 4=>$l10n->t("No file was uploaded"), - 6=>$l10n->t("Missing a temporary folder") - ); - bailOut($errors[$error]); -} -$file=$_FILES['imagefile']; - -if(file_exists($file['tmp_name'])) { - $tmpkey = 'contact-photo-'.md5(basename($file['tmp_name'])); - $image = new OC_Image(); - if($image->loadFromFile($file['tmp_name'])) { - if($image->width() > 400 || $image->height() > 400) { - $image->resize(400); // Prettier resizing than with browser and saves bandwidth. - } - if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpkey); - } - if(OC_Cache::set($tmpkey, $image->data(), 600)) { - OCP\JSON::success(array( - 'data' => array( - 'mime'=>$file['type'], - 'size'=>$file['size'], - 'name'=>$file['name'], - 'id'=>$_POST['id'], - 'tmp'=>$tmpkey, - ))); - exit(); - } else { - bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); - } - } else { - bailOut($l10n->t('Couldn\'t load temporary image: ').$file['tmp_name']); - } -} else { - bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); -} diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php deleted file mode 100644 index cbbbbc79e5..0000000000 --- a/apps/contacts/appinfo/app.php +++ /dev/null @@ -1,24 +0,0 @@ - 'contacts_index', - 'order' => 10, - 'href' => OCP\Util::linkTo( 'contacts', 'index.php' ), - 'icon' => OCP\Util::imagePath( 'settings', 'users.svg' ), - 'name' => OC_L10N::get('contacts')->t('Contacts') )); - - -OCP\App::registerPersonal('contacts', 'settings'); -OCP\Util::addscript('contacts', 'loader'); -OC_Search::registerProvider('OC_Search_Provider_Contacts'); diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml deleted file mode 100644 index b814b0f151..0000000000 --- a/apps/contacts/appinfo/database.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - *dbname* - true - false - - utf8 - - - - *dbprefix*contacts_addressbooks - - - - - id - integer - 0 - true - 1 - true - 4 - - - - userid - text - - true - 255 - - - - displayname - text - - false - 255 - - - - uri - text - - false - 200 - - - - description - clob - false - - - - ctag - integer - 1 - true - true - 4 - - - - active - integer - 1 - true - 4 - - - - -
    - - - - *dbprefix*contacts_cards - - - - - id - integer - 0 - true - 1 - true - 4 - - - - addressbookid - integer - - true - true - 4 - - - - fullname - text - - false - 255 - - - - carddata - clob - false - - - - uri - text - - false - 200 - - - - lastmodified - integer - - false - true - 4 - - - - -
    - -
    diff --git a/apps/contacts/appinfo/info.xml b/apps/contacts/appinfo/info.xml deleted file mode 100644 index 74fd6b012d..0000000000 --- a/apps/contacts/appinfo/info.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - contacts - Contacts - AGPL - Jakob Sack - 4 - true - Address book with CardDAV support. - - - - appinfo/remote.php - appinfo/remote.php - - diff --git a/apps/contacts/appinfo/migrate.php b/apps/contacts/appinfo/migrate.php deleted file mode 100644 index 2559b4ea45..0000000000 --- a/apps/contacts/appinfo/migrate.php +++ /dev/null @@ -1,70 +0,0 @@ -'contacts_addressbooks', - 'matchcol'=>'userid', - 'matchval'=>$this->uid, - 'idcol'=>'id' - ); - $ids = $this->content->copyRows( $options ); - - $options = array( - 'table'=>'contacts_cards', - 'matchcol'=>'addressbookid', - 'matchval'=>$ids - ); - - // Export tags - $ids2 = $this->content->copyRows( $options ); - - // If both returned some ids then they worked - if(is_array($ids) && is_array($ids2)) { - return true; - } else { - return false; - } - - } - - // Import function for contacts - function import( ) { - switch( $this->appinfo->version ) { - default: - // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM contacts_addressbooks WHERE userid LIKE ?" ); - $results = $query->execute( array( $this->olduid ) ); - $idmap = array(); - while( $row = $results->fetchRow() ) { - // Import each addressbook - $addressbookquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_addressbooks (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)" ); - $addressbookquery->execute( array( $this->uid, $row['displayname'], $row['uri'], $row['description'], $row['ctag'] ) ); - // Map the id - $idmap[$row['id']] = OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - // Make the addressbook active - OC_Contacts_Addressbook::setActive($idmap[$row['id']], true); - } - // Now tags - foreach($idmap as $oldid => $newid) { - - $query = $this->content->prepare( "SELECT * FROM contacts_cards WHERE addressbookid LIKE ?" ); - $results = $query->execute( array( $oldid ) ); - while( $row = $results->fetchRow() ){ - // Import the contacts - $contactquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_cards (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)" ); - $contactquery->execute( array( $newid, $row['fullname'], $row['carddata'], $row['uri'], $row['lastmodified'] ) ); - } - } - // All done! - break; - } - - return true; - } - -} - -// Load the provider -new OC_Migration_Provider_Contacts( 'contacts' ); \ No newline at end of file diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php deleted file mode 100644 index fd5604aec6..0000000000 --- a/apps/contacts/appinfo/remote.php +++ /dev/null @@ -1,55 +0,0 @@ -. - * - */ - -OCP\App::checkAppEnabled('contacts'); - -if(substr($_SERVER["REQUEST_URI"], 0, strlen(OC_App::getAppWebPath('contacts').'/carddav.php')) == OC_App::getAppWebPath('contacts').'/carddav.php') { - $baseuri = OC_App::getAppWebPath('contacts').'/carddav.php'; -} - -// only need authentication apps -$RUNTIME_APPTYPES=array('authentication'); -OC_App::loadApps($RUNTIME_APPTYPES); - -// Backends -$authBackend = new OC_Connector_Sabre_Auth(); -$principalBackend = new OC_Connector_Sabre_Principal(); -$carddavBackend = new OC_Connector_Sabre_CardDAV(); - -// Root nodes -$nodes = array( - new Sabre_CalDAV_Principal_Collection($principalBackend), - new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend), -); - -// Fire up server -$server = new Sabre_DAV_Server($nodes); -$server->setBaseUri($baseuri); -// Add plugins -$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud')); -$server->addPlugin(new Sabre_CardDAV_Plugin()); -$server->addPlugin(new Sabre_DAVACL_Plugin()); -$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new Sabre_CardDAV_VCFExportPlugin()); - -// And off we go! -$server->exec(); diff --git a/apps/contacts/appinfo/update.php b/apps/contacts/appinfo/update.php deleted file mode 100644 index 21e736bb44..0000000000 --- a/apps/contacts/appinfo/update.php +++ /dev/null @@ -1,25 +0,0 @@ -execute(array()); - - // Then get all the active address books. - $stmt = OCP\DB::prepare( 'SELECT userid,configvalue FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); - $result = $stmt->execute(array()); - - // Prepare statement for updating the new 'active' field. - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET active=? WHERE id=? AND userid=?' ); - while( $row = $result->fetchRow()) { - $ids = explode(';', $row['configvalue']); - foreach($ids as $id) { - $r = $stmt->execute(array(1, $id, $row['userid'])); - } - } - - // Remove the old preferences. - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); - $result = $stmt->execute(array()); -} diff --git a/apps/contacts/appinfo/version b/apps/contacts/appinfo/version deleted file mode 100644 index 72f9fa8202..0000000000 --- a/apps/contacts/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2.4 \ No newline at end of file diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php deleted file mode 100644 index 264eb30836..0000000000 --- a/apps/contacts/carddav.php +++ /dev/null @@ -1,6 +0,0 @@ - dt { - font-weight: bold; -}*/ -#leftcontent { top: 3.5em !important; padding: 0; margin: 0; } -#leftcontent a { padding: 0 0 0 25px; } -#rightcontent { top: 3.5em !important; padding-top: 5px; } -#leftcontent h3 { cursor: pointer; -moz-transition: background 300ms ease 0s; background: none no-repeat scroll 1em center #eee; border-bottom: 1px solid #ddd; border-top: 1px solid #fff; display: block; max-width: 100%; padding: 0.5em 0.8em; color: #666; text-shadow: 0 1px 0 #f8f8f8; font-size: 1.2em; } -#leftcontent h3:hover,#leftcontent h3:active,#leftcontent h3.active { background-color: #DBDBDB; border-bottom: 1px solid #CCCCCC; border-top: 1px solid #D4D4D4; color: #333333; font-weight: bold; } -#contacts { position: fixed; background: #fff; max-width: 100%; width: 20em; left: 12.5em; top: 3.7em; bottom: 3em; overflow: auto; padding: 0; margin: 0; } -.contacts a { height: 23px; display: block; left: 12.5em; margin: 0 0 0 0; padding: 0 0 0 25px; } -.contacts li.ui-draggable { height: 23px; } -.ui-draggable-dragging { width: 17em; cursor: move; } -.ui-state-hover { border: 1px solid dashed; } -#bottomcontrols { padding: 0; bottom:0px; height:2.8em; width: 20em; margin:0; background:#eee; border-top:1px solid #ccc; position:fixed; -moz-box-shadow: 0 -3px 3px -3px #000; -webkit-box-shadow: 0 -3px 3px -3px #000; box-shadow: 0 -3px 3px -3px #000;} -#bottomcontrols img { margin-top: 0.35em; } -#uploadprogressbar { display: none; padding: 0; bottom: 3em; height:2em; width: 20em; margin:0; background:#eee; border:1px solid #ccc; position:fixed; } -#contacts_newcontact, #contacts_import, #chooseaddressbook { float: left; margin: 0.2em 0 0 1em; border: 0 none; border-radius: 0; -moz-box-shadow: none; box-shadow: none; outline: 0 none; } -#chooseaddressbook { float: right; margin: 0.2em 1em 0 0; } -#actionbar { clear: both; height: 30px;} -#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } -#contacts_downloadcard {position:relative; float:left; background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } -#contacts_propertymenu { clear: left; float:left; max-width: 15em; margin: 2em; } -#contacts_propertymenu_button { position:relative;top:0;left:0; margin: 0; } -#contacts_propertymenu_dropdown { background-color: #fff; position:relative; right:0; overflow:hidden; text-overflow:ellipsis; border: thin solid #1d2d44; box-shadow: 0 3px 5px #bbb; /* -moz-box-shadow:0 0 10px #000; -webkit-box-shadow:0 0 10px #000; box-shadow:0 0 10px #000; -moz-border-radius:0.5em; -webkit-border-radius:0.5em; border-radius:0.5em; -moz-border-radius:0.5em; -webkit-border-radius:0.5em;*/ border-radius: 3px; } -#contacts_propertymenu li { display: block; font-weight: bold; height: 20px; } -#contacts_propertymenu li a { padding: 3px; display: block } -#contacts_propertymenu li:hover { background-color: #1d2d44; } -#contacts_propertymenu li a:hover { color: #fff } -#card { width: auto;/*max-width: 70em; border: thin solid lightgray; display: block;*/ } -#firstrun { width: 100%; position: absolute; top: 5em; left: 0; text-align: center; font-weight:bold; font-size:1.5em; color:#777; } -#firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; } - -#card input[type="text"].contacts_property,input[type="email"].contacts_property,input[type="url"].contacts_property { width: 14em; float: left; font-weight: bold; } -.categories { float: left; width: 16em; } -#card input[type="text"],input[type="email"],input[type="url"],input[type="tel"],input[type="date"], select, textarea { background-color: #fefefe; border: 0 !important; -webkit-appearance:none !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; } -#card input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active,input[type="email"]:hover,input[type="url"]:hover,input[type="tel"]:hover,input[type="date"]:hover,input[type="date"],input[type="date"]:hover,input[type="date"]:active,input[type="date"]:active,input[type="date"]:active,input[type="email"]:active,input[type="url"]:active,input[type="tel"]:active, select:hover, select:focus, select:active, textarea:focus, textarea:hover { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #ddd, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; } -textarea { width: 80%; min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;} -dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } -.form dt { display: table-cell; clear: left; float: left; width: 7em; margin: 0; padding: 0.8em 0.5em 0 0; text-align:right; text-overflow:ellipsis; o-text-overflow: ellipsis; vertical-align: text-bottom; color: #bbb;/* white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap;*/ } -.form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0px; white-space: nowrap; vertical-align: text-bottom; } -label:hover, dt:hover { color: #333; } -/*::-webkit-input-placeholder { color: #bbb; } -:-moz-placeholder { color: #bbb; } -:-ms-input-placeholder { color: #bbb; }*/ -.droptarget { margin: 0.5em; padding: 0.5em; border: thin solid #ccc; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } -.droppable { margin: 0.5em; padding: 0.5em; border: thin dashed #333; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; } -.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; } -.ui-autocomplete-loading { background: url('%webroot%/core/img/loading.gif') right center no-repeat; } -.ui-autocomplete-input { margin-top: 0.5em; } /* Ugly hack */ -.float { float: left; } -.svg { border: inherit; background: inherit; } -.listactions { height: 1em; width:60px; float: left; clear: right; } -.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } -.add:hover,.edit:hover,.delete:hover,.mail:hover, .globe:hover, .upload:hover, .download:hover .cloud:hover { opacity: 1.0 } -.add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; } -.delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } -.edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; } -.mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } -.upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } -.download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } -.cloud { background:url('%webroot%/core/img/places/picture.svg') no-repeat center; } -/*.globe { background:url('../img/globe.svg') no-repeat center; }*/ -.globe { background:url('%webroot%/core/img/actions/public.svg') no-repeat center; } -.transparent{ opacity: 0.6; } -#edit_name_dialog { padding:0; } -#edit_name_dialog > input { width: 15em; } -#edit_address_dialog { /*width: 30em;*/ } -#edit_address_dialog > input { width: 15em; } -#edit_photo_dialog_img { display: block; min-width: 150; min-height: 200; } -#fn { float: left !important; width: 18em !important; } -#name { /*position: absolute; top: 0px; left: 0px;*/ min-width: 25em; height: 2em; clear: right; display: block; } -#identityprops { /*position: absolute; top: 2.5em; left: 0px;*/ } -/*#contact_photo { max-width: 250px; }*/ -#contact_identity { min-width: 30em; } -.contactsection { position: relative; float: left; padding: 0.5em; height: auto; } - -#cropbox { margin: auto; } -#contacts_details_photo_wrapper { width: 200px; } -#contacts_details_photo_wrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center center; cursor: wait; } -.contacts_details_photo { border-radius: 0.5em; border: thin solid #bbb; margin: 0.3em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } -.contacts_details_photo:hover { background: #fff; cursor: default; } -#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:22px; padding:0px; background-color:#fff; list-style-type:none; border-radius: 0.5em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; } -#phototools li { display: inline; } -#phototools li a { float:left; cursor:pointer; width:22px; height:22px; opacity: 0.6; } -#phototools li a:hover { opacity: 0.8; } - -/* Address editor */ -#addressdisplay { padding: 0.5em; } -dl.addresscard { background-color: #fff; float: left; width: auto; margin: 0 0.3em 0.3em 0.3em; padding: 0; border: 0; } -dl.addresscard dd {} -dl.addresscard dt { padding: 0.3em; font-weight: bold; clear: both; color: #aaa; } -dl.addresscard dt:hover { color:#777; } -dl.addresscard dd > ul { margin: 0.3em; padding: 0.3em; } -dl.addresscard .action { float: right; } -#address dt { width: 30%; white-space:nowrap; } -#address dd { width: 66%; } -#address input { width: 12em; padding: 0.6em 0.5em 0.4em; } -#address input:-moz-placeholder { color: #aaa; } -#address input::-webkit-input-placeholder { color: #aaa; } -#address input:-ms-input-placeholder { color: #aaa; } -#address input:placeholder { color: #aaa; } -#adr_type {} /* Select */ -#adr_pobox {} -#adr_extended {} -#adr_street {} -#adr_city {} -#adr_region {} -#adr_zipcode {} -#adr_country {} - -#file_upload_form { width: 0; height: 0; } -#file_upload_target, #import_upload_target, #crop_target { display:none; } -#file_upload_start, #import_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1001; width:0; height:0;} -#import_upload_start { width: 20px; height: 20px; margin: 0 0 -24px 0; padding: 0;} -input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; } -.big { font-weight:bold; font-size:1.2em; } -.huge { font-weight:bold; font-size:1.5em; } -.propertycontainer dd { float: left; width: 25em; } -.propertylist { clear: none; max-width: 28em; } -.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; /*max-width: 30em;*/ display: block; clear: right; } -.propertycontainer[data-element="EMAIL"] > input[type="email"] { min-width: 19em !important; float: left; } -.propertycontainer[data-element="TEL"] > input[type="text"] { width: 10em !important; float: left; } -.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 20px; height: 20px; vertical-align: middle; } -.propertylist li > select { float: left; max-width: 8em; } -.typelist[type="button"] { float: left; max-width: 10em; border: 0; background-color: #fff; color: #bbb} /* for multiselect */ -.typelist[type="button"]:hover { color: #777; } /* for multiselect */ -.addresslist { clear: both; font-weight: bold; } -#ninjahelp { position: absolute; bottom: 0; left: 0; right: 0; padding: 1em; margin: 1em; border: thin solid #eee; border-radius: 5px; background-color: #DBDBDB; opacity: 0.9; } -#ninjahelp .close { position: absolute; top: 5px; right: 5px; height: 20px; width: 20px; } -#ninjahelp h2, .help-section h3 { width: 100%; font-weight: bold; text-align: center; } -#ninjahelp h2 { font-size: 1.4em; } -.help-section { width: 45%; min-width: 35em; float: left; } -.help-section h3 { font-size: 1.2em; } -.help-section dl { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } -.help-section dt { display: table-cell; clear: left; float: left; width: 35%; margin: 0; padding: 0.2em; text-align: right; text-overflow: ellipsis; vertical-align: text-bottom; font-weight: bold: } -.help-section dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0.2em; white-space: nowrap; vertical-align: text-bottom; } diff --git a/apps/contacts/css/jquery.Jcrop.css b/apps/contacts/css/jquery.Jcrop.css deleted file mode 100644 index a9ba4746e0..0000000000 --- a/apps/contacts/css/jquery.Jcrop.css +++ /dev/null @@ -1,84 +0,0 @@ -/* jquery.Jcrop.css - The code contained in this file is free software under MIT License - Copyright (c)2008-2011 Tapmodo Interactive LLC -*/ - -/* - The outer-most container in a typical Jcrop instance - If you are having difficulty with formatting related to styles - on a parent element, place any fixes here or in a like selector -*/ -.jcrop-holder { - direction: ltr; - text-align: left; -} - -.jcrop-vline, .jcrop-hline { - background: white url('%appswebroot%/contacts/img/Jcrop.gif') top left repeat; - font-size: 0px; - position: absolute; -} - -.jcrop-vline { - height: 100%; - width: 1px !important; -} - -.jcrop-hline { - width: 100%; - height: 1px !important; -} - -.jcrop-vline.right { - right: 0px; -} - -.jcrop-hline.bottom { - bottom: 0px; -} - -.jcrop-handle { - background-color: #333; - border: 1px #eee solid; - font-size: 1px; -} - -.jcrop-tracker { - height: 100%; - -webkit-tap-highlight-color: transparent; /* "turn off" link highlight */ - -webkit-touch-callout: none; /* disable callout, image save panel */ - -webkit-user-select: none; /* disable cut copy paste */ - width: 100%; -} - -/* -*/ - -.jcrop-light .jcrop-vline, .jcrop-light .jcrop-hline { - background: white; - filter: Alpha(opacity=70) !important; - opacity: .70 !important; -} - -.jcrop-light .jcrop-handle { - background-color: black; - border-color: white; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - -.jcrop-dark .jcrop-vline, .jcrop-dark .jcrop-hline { - background: black; - filter: Alpha(opacity=70) !important; - opacity: 0.70 !important; -} - -.jcrop-dark .jcrop-handle { - background-color: white; - border-color: black; - border-radius: 3px; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; -} - diff --git a/apps/contacts/css/jquery.combobox.css b/apps/contacts/css/jquery.combobox.css deleted file mode 100644 index 59294235d2..0000000000 --- a/apps/contacts/css/jquery.combobox.css +++ /dev/null @@ -1,3 +0,0 @@ -.combo-button { background:url('../../../core/img/actions/triangle-s.svg') no-repeat center; margin-left: -1px; float: left; border: none; } -.ui-button-icon-only .ui-button-text { padding: 0.35em; } -.ui-autocomplete-input { margin: 0; padding: 0.48em 0 0.47em 0.45em; } diff --git a/apps/contacts/export.php b/apps/contacts/export.php deleted file mode 100644 index 161ca8047a..0000000000 --- a/apps/contacts/export.php +++ /dev/null @@ -1,38 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -$bookid = isset($_GET['bookid']) ? $_GET['bookid'] : null; -$contactid = isset($_GET['contactid']) ? $_GET['contactid'] : null; -$nl = "\n"; -if(isset($bookid)) { - $addressbook = OC_Contacts_App::getAddressbook($bookid); - //$cardobjects = OC_Contacts_VCard::all($bookid); - header('Content-Type: text/directory'); - header('Content-Disposition: inline; filename=' - . str_replace(' ', '_', $addressbook['displayname']) . '.vcf'); - - $start = 0; - $batchsize = OCP\Config::getUserValue(OCP\User::getUser(), - 'contacts', - 'export_batch_size', 20); - while($cardobjects = OC_Contacts_VCard::all($bookid, $start, $batchsize)){ - foreach($cardobjects as $card) { - echo $card['carddata'] . $nl; - } - $start += $batchsize; - } -}elseif(isset($contactid)) { - $data = OC_Contacts_App::getContactObject($contactid); - header('Content-Type: text/vcard'); - header('Content-Disposition: inline; filename=' - . str_replace(' ', '_', $data['fullname']) . '.vcf'); - echo $data['carddata']; -} diff --git a/apps/contacts/img/Jcrop.gif b/apps/contacts/img/Jcrop.gif deleted file mode 100644 index 72ea7ccb53..0000000000 Binary files a/apps/contacts/img/Jcrop.gif and /dev/null differ diff --git a/apps/contacts/img/contact-new.png b/apps/contacts/img/contact-new.png deleted file mode 100644 index 087ad9ab2d..0000000000 Binary files a/apps/contacts/img/contact-new.png and /dev/null differ diff --git a/apps/contacts/img/contact-new.svg b/apps/contacts/img/contact-new.svg deleted file mode 100644 index 8322414dac..0000000000 --- a/apps/contacts/img/contact-new.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/globe.svg b/apps/contacts/img/globe.svg deleted file mode 100644 index 4e43cfba10..0000000000 --- a/apps/contacts/img/globe.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/person.png b/apps/contacts/img/person.png deleted file mode 100644 index 17e7919654..0000000000 Binary files a/apps/contacts/img/person.png and /dev/null differ diff --git a/apps/contacts/img/person.svg b/apps/contacts/img/person.svg deleted file mode 100644 index c4842c5916..0000000000 --- a/apps/contacts/img/person.svg +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/contacts/img/person_large.png b/apps/contacts/img/person_large.png deleted file mode 100644 index 4edba0c548..0000000000 Binary files a/apps/contacts/img/person_large.png and /dev/null differ diff --git a/apps/contacts/import.php b/apps/contacts/import.php deleted file mode 100644 index 1986d79f6d..0000000000 --- a/apps/contacts/import.php +++ /dev/null @@ -1,150 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -//check for addressbooks rights or create new one -ob_start(); - -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -session_write_close(); - -$nl = "\n"; - -global $progresskey; -$progresskey = 'contacts.import-' . (isset($_GET['progresskey'])?$_GET['progresskey']:''); - -if (isset($_GET['progress']) && $_GET['progress']) { - echo OC_Cache::get($progresskey); - die; -} - -function writeProgress($pct) { - global $progresskey; - OC_Cache::set($progresskey, $pct, 300); -} -writeProgress('10'); -$view = $file = null; -if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - $view = OCP\Files::getStorage('contacts'); - $file = $view->file_get_contents('/imports/' . $_POST['file']); -} else { - $file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); -} -if(!$file) { - OCP\JSON::error(array('data' => array('message' => 'Import file was empty.'))); - exit(); -} -if(isset($_POST['method']) && $_POST['method'] == 'new') { - $id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), - $_POST['addressbookname']); - if(!$id) { - OCP\JSON::error( - array( - 'data' => array('message' => 'Error creating address book.') - ) - ); - exit(); - } - OC_Contacts_Addressbook::setActive($id, 1); -}else{ - $id = $_POST['id']; - if(!$id) { - OCP\JSON::error( - array( - 'data' => array( - 'message' => 'Error getting the ID of the address book.', - 'file'=>$_POST['file'] - ) - ) - ); - exit(); - } - OC_Contacts_App::getAddressbook($id); // is owner access check -} -//analyse the contacts file -writeProgress('40'); -$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file); -$lines = explode($nl, $file); - -$inelement = false; -$parts = array(); -$card = array(); -foreach($lines as $line){ - if(strtoupper(trim($line)) == 'BEGIN:VCARD') { - $inelement = true; - } elseif (strtoupper(trim($line)) == 'END:VCARD') { - $card[] = $line; - $parts[] = implode($nl, $card); - $card = array(); - $inelement = false; - } - if ($inelement === true && trim($line) != '') { - $card[] = $line; - } -} -//import the contacts -writeProgress('70'); -$imported = 0; -$failed = 0; -if(!count($parts) > 0) { - OCP\JSON::error( - array( - 'data' => array( - 'message' => 'No contacts to import in ' - . $_POST['file'].'. Please check if the file is corrupted.', - 'file'=>$_POST['file'] - ) - ) - ); - if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - if(!$view->unlink('/imports/' . $_POST['file'])) { - OCP\Util::writeLog('contacts', - 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], - OCP\Util::ERROR); - } - } - exit(); -} -foreach($parts as $part){ - $card = OC_VObject::parse($part); - if (!$card) { - $failed += 1; - OCP\Util::writeLog('contacts', - 'Import: skipping card. Error parsing VCard: ' . $part, - OCP\Util::ERROR); - continue; // Ditch cards that can't be parsed by Sabre. - } - try { - OC_Contacts_VCard::add($id, $card); - $imported += 1; - } catch (Exception $e) { - OCP\Util::writeLog('contacts', - 'Error importing vcard: ' . $e->getMessage() . $nl . $card, - OCP\Util::ERROR); - $failed += 1; - } -} -//done the import -writeProgress('100'); -sleep(3); -OC_Cache::remove($progresskey); -if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - if(!$view->unlink('/imports/' . $_POST['file'])) { - OCP\Util::writeLog('contacts', - 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], - OCP\Util::ERROR); - } -} -OCP\JSON::success( - array( - 'data' => array( - 'imported'=>$imported, - 'failed'=>$failed, - 'file'=>$_POST['file'], - ) - ) -); diff --git a/apps/contacts/index.php b/apps/contacts/index.php deleted file mode 100644 index c35e1b85d4..0000000000 --- a/apps/contacts/index.php +++ /dev/null @@ -1,68 +0,0 @@ - - * Copyright (c) 2011 Jakob Sack mail@jakobsack.de - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); - -// Get active address books. This creates a default one if none exists. -$ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser()); -$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0 - ? true - : false); // just to check if there are any contacts. -if($has_contacts === false) { - OCP\Util::writeLog('contacts', - 'index.html: No contacts found.', - OCP\Util::DEBUG); -} - -// Load the files we need -OCP\App::setActiveNavigationEntry('contacts_index'); - -// Load a specific user? -$id = isset( $_GET['id'] ) ? $_GET['id'] : null; -$property_types = OC_Contacts_App::getAddPropertyOptions(); -$phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); -$email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); -$categories = OC_Contacts_App::getCategories(); - -$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); -$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); -$maxUploadFilesize = min($upload_max_filesize, $post_max_size); - -$freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace, 0); -$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); - -OCP\Util::addscript('', 'jquery.multiselect'); -OCP\Util::addscript('', 'oc-vcategories'); -OCP\Util::addscript('contacts', 'contacts'); -OCP\Util::addscript('contacts', 'expanding'); -OCP\Util::addscript('contacts', 'jquery.combobox'); -OCP\Util::addscript('files', 'jquery.fileupload'); -OCP\Util::addscript('contacts', 'jquery.inview'); -OCP\Util::addscript('contacts', 'jquery.Jcrop'); -OCP\Util::addscript('contacts', 'jquery.multi-autocomplete'); -OCP\Util::addStyle('', 'jquery.multiselect'); -OCP\Util::addStyle('contacts', 'jquery.combobox'); -OCP\Util::addStyle('contacts', 'jquery.Jcrop'); -OCP\Util::addStyle('contacts', 'contacts'); - -$tmpl = new OCP\Template( "contacts", "index", "user" ); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize, false); -$tmpl->assign('uploadMaxHumanFilesize', - OCP\Util::humanFileSize($maxUploadFilesize), false); -$tmpl->assign('property_types', $property_types, false); -$tmpl->assign('phone_types', $phone_types, false); -$tmpl->assign('email_types', $email_types, false); -$tmpl->assign('categories', $categories, false); -$tmpl->assign('has_contacts', $has_contacts, false); -$tmpl->assign('id', $id, false); -$tmpl->printPage(); diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js deleted file mode 100644 index 4c6c8bf3d9..0000000000 --- a/apps/contacts/js/contacts.js +++ /dev/null @@ -1,2075 +0,0 @@ -function ucwords (str) { - return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) { - return $1.toUpperCase(); - }); -} - -String.prototype.strip_tags = function(){ - tags = this; - stripped = tags.replace(/<(.|\n)*?>/g, ''); - return stripped; -}; - -Contacts={ - UI:{ - /** - * Arguments: - * message: The text message to show. The only mandatory parameter. - * timeout: The timeout in seconds before the notification disappears. Default 10. - * timeouthandler: A function to run on timeout. - * clickhandler: A function to run on click. If a timeouthandler is given it will be cancelled. - * data: An object that will be passed as argument to the timeouthandler and clickhandler functions. - */ - notify:function(params) { - self = this; - if(!self.notifier) { - self.notifier = $('#notification'); - } - self.notifier.text(params.message); - self.notifier.fadeIn(); - self.notifier.on('click', function() { $(this).fadeOut();}); - var timer = setTimeout(function() { - self.notifier.fadeOut(); - if(params.timeouthandler && $.isFunction(params.timeouthandler)) { - params.timeouthandler(self.notifier.data(dataid)); - self.notifier.off('click'); - self.notifier.removeData(dataid); - } - }, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000); - var dataid = timer.toString(); - if(params.data) { - self.notifier.data(dataid, params.data); - } - if(params.clickhandler && $.isFunction(params.clickhandler)) { - self.notifier.on('click', function() { - clearTimeout(timer); - self.notifier.off('click'); - params.clickhandler(self.notifier.data(dataid)); - self.notifier.removeData(dataid); - }); - } - }, - notImplemented:function() { - OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented')); - }, - searchOSM:function(obj) { - var adr = Contacts.UI.propertyContainerFor(obj).find('.adr').val(); - if(adr == undefined) { - OC.dialogs.alert(t('contacts', 'Couldn\'t get a valid address.'), t('contacts', 'Error')); - return; - } - // FIXME: I suck at regexp. /Tanghus - var adrarr = adr.split(';'); - var adrstr = ''; - if(adrarr[2].trim() != '') { - adrstr = adrstr + adrarr[2].trim() + ','; - } - if(adrarr[3].trim() != '') { - adrstr = adrstr + adrarr[3].trim() + ','; - } - if(adrarr[4].trim() != '') { - adrstr = adrstr + adrarr[4].trim() + ','; - } - if(adrarr[5].trim() != '') { - adrstr = adrstr + adrarr[5].trim() + ','; - } - if(adrarr[6].trim() != '') { - adrstr = adrstr + adrarr[6].trim(); - } - adrstr = encodeURIComponent(adrstr); - var uri = 'http://open.mapquestapi.com/nominatim/v1/search.php?q=' + adrstr + '&limit=10&addressdetails=1&polygon=1&zoom='; - var newWindow = window.open(uri,'_blank'); - newWindow.focus(); - }, - mailTo:function(obj) { - var adr = Contacts.UI.propertyContainerFor($(obj)).find('input[type="email"]').val().trim(); - if(adr == '') { - OC.dialogs.alert(t('contacts', 'Please enter an email address.'), t('contacts', 'Error')); - return; - } - window.location.href='mailto:' + adr; - }, - propertyContainerFor:function(obj) { - return $(obj).parents('.propertycontainer').first(); - }, - checksumFor:function(obj) { - return $(obj).parents('.propertycontainer').first().data('checksum'); - }, - propertyTypeFor:function(obj) { - return $(obj).parents('.propertycontainer').first().data('element'); - }, - loading:function(obj, state) { - if(state) { - $(obj).addClass('loading'); - } else { - $(obj).removeClass('loading'); - } - }, - showCardDAVUrl:function(username, bookname){ - $('#carddav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(bookname)); - $('#carddav_url').show(); - $('#carddav_url_close').show(); - }, - loadListHandlers:function() { - $('.propertylist li a.delete').unbind('click'); - $('.propertylist li a.delete').unbind('keydown'); - var deleteItem = function(obj) { - obj.tipsy('hide'); - Contacts.UI.Card.deleteProperty(obj, 'list'); - } - $('.propertylist li a.delete, .addresscard .delete').click(function() { deleteItem($(this)) }); - $('.propertylist li a.delete, .addresscard .delete').keydown(function() { deleteItem($(this)) }); - $('.propertylist li a.mail').click(function() { Contacts.UI.mailTo(this) }); - $('.propertylist li a.mail').keydown(function() { Contacts.UI.mailTo(this) }); - $('.addresscard .globe').click(function() { $(this).tipsy('hide');Contacts.UI.searchOSM(this); }); - $('.addresscard .globe').keydown(function() { $(this).tipsy('hide');Contacts.UI.searchOSM(this); }); - $('.addresscard .edit').click(function() { $(this).tipsy('hide');Contacts.UI.Card.editAddress(this, false); }); - $('.addresscard .edit').keydown(function() { $(this).tipsy('hide');Contacts.UI.Card.editAddress(this, false); }); - $('.addresscard,.propertylist li,.propertycontainer').hover( - function () { - $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 1.0 }, 200, function() {}); - }, - function () { - $(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 0.1 }, 200, function() {}); - } - ); - }, - loadHandlers:function() { - var deleteItem = function(obj) { - obj.tipsy('hide'); - Contacts.UI.Card.deleteProperty(obj, 'single'); - } - - var goToUrl = function(obj) { - var url = Contacts.UI.propertyContainerFor(obj).find('#url').val(); - if(url != '') { - var newWindow = window.open(url,'_blank'); - newWindow.focus(); - } - } - - $('#identityprops a.delete').click( function() { deleteItem($(this)) }); - $('#identityprops a.delete').keydown( function() { deleteItem($(this)) }); - $('#categories_value a.edit').click( function() { $(this).tipsy('hide');OCCategories.edit(); } ); - $('#categories_value a.edit').keydown( function() { $(this).tipsy('hide');OCCategories.edit(); } ); - $('#url_value a.globe').click( function() { $(this).tipsy('hide');goToUrl($(this)); } ); - $('#url_value a.globe').keydown( function() { $(this).tipsy('hide');goToUrl($(this)); } ); - $('#fn_select').combobox({ - 'id': 'fn', - 'name': 'value', - 'classes': ['contacts_property', 'nonempty', 'huge', 'tip', 'float'], - 'attributes': {'placeholder': t('contacts', 'Enter name')}, - 'title': t('contacts', 'Format custom, Short name, Full name, Reverse or Reverse with comma')}); - $('#bday').datepicker({ - dateFormat : 'dd-mm-yy' - }); - // Style phone types - $('#phonelist').find('select.contacts_property').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - $('#edit_name').click(function(){Contacts.UI.Card.editName()}); - $('#edit_name').keydown(function(){Contacts.UI.Card.editName()}); - - $('#phototools li a').click(function() { - $(this).tipsy('hide'); - }); - $('#contacts_details_photo_wrapper').hover( - function () { - $('#phototools').slideDown(200); - }, - function () { - $('#phototools').slideUp(200); - } - ); - $('#phototools').hover( - function () { - $(this).removeClass('transparent'); - }, - function () { - $(this).addClass('transparent'); - } - ); - $('#phototools .upload').click(function() { - $('#file_upload_start').trigger('click'); - }); - $('#phototools .cloud').click(function() { - OC.dialogs.filepicker(t('contacts', 'Select photo'), Contacts.UI.Card.cloudPhotoSelected, false, 'image', true); - }); - /* Initialize the photo edit dialog */ - $('#edit_photo_dialog').dialog({ - autoOpen: false, modal: true, height: 'auto', width: 'auto' - }); - $('#edit_photo_dialog' ).dialog( 'option', 'buttons', [ - { - text: "Ok", - click: function() { - Contacts.UI.Card.savePhoto(this); - $(this).dialog('close'); - } - }, - { - text: "Cancel", - click: function() { $(this).dialog('close'); } - } - ] ); - - // Name has changed. Update it and reorder. - $('#fn').change(function(){ - var name = $('#fn').val().strip_tags(); - var item = $('.contacts li[data-id="'+Contacts.UI.Card.id+'"]').detach(); - $(item).find('a').html(name); - Contacts.UI.Card.fn = name; - Contacts.UI.Contacts.insertContact({contact:item}); - Contacts.UI.Contacts.scrollTo(Contacts.UI.Card.id); - }); - - $('#contacts_deletecard').click( function() { Contacts.UI.Card.delayedDelete();return false;} ); - $('#contacts_deletecard').keydown( function(event) { - if(event.which == 13 || event.which == 32) { - Contacts.UI.Card.delayedDelete(); - } - return false; - }); - - $('#contacts_downloadcard').click( function() { Contacts.UI.Card.doExport();return false;} ); - $('#contacts_downloadcard').keydown( function(event) { - if(event.which == 13 || event.which == 32) { - Contacts.UI.Card.doExport(); - } - return false; - }); - - // Profile picture upload handling - // New profile picture selected - $('#file_upload_start').change(function(){ - Contacts.UI.Card.uploadPhoto(this.files); - }); - $('#contacts_details_photo_wrapper').bind('dragover',function(event){ - $(event.target).addClass('droppable'); - event.stopPropagation(); - event.preventDefault(); - }); - $('#contacts_details_photo_wrapper').bind('dragleave',function(event){ - $(event.target).removeClass('droppable'); - //event.stopPropagation(); - //event.preventDefault(); - }); - $('#contacts_details_photo_wrapper').bind('drop',function(event){ - event.stopPropagation(); - event.preventDefault(); - $(event.target).removeClass('droppable'); - $.fileUpload(event.originalEvent.dataTransfer.files); - }); - - $('#categories').multiple_autocomplete({source: categories}); - $('#contacts_deletecard').tipsy({gravity: 'ne'}); - $('#contacts_downloadcard').tipsy({gravity: 'ne'}); - $('#contacts_propertymenu_button').tipsy(); - $('#contacts_newcontact, #contacts_import, #chooseaddressbook').tipsy({gravity: 'sw'}); - - $('body').click(function(e){ - if(!$(e.target).is('#contacts_propertymenu_button')) { - $('#contacts_propertymenu_dropdown').hide(); - } - }); - function propertyMenu(){ - var menu = $('#contacts_propertymenu_dropdown'); - if(menu.is(':hidden')) { - menu.show(); - menu.find('li').first().focus(); - } else { - menu.hide(); - } - } - $('#contacts_propertymenu_button').click(propertyMenu); - $('#contacts_propertymenu_button').keydown(propertyMenu); - function propertyMenuItem(){ - var type = $(this).data('type'); - Contacts.UI.Card.addProperty(type); - $('#contacts_propertymenu_dropdown').hide(); - } - $('#contacts_propertymenu_dropdown a').click(propertyMenuItem); - $('#contacts_propertymenu_dropdown a').keydown(propertyMenuItem); - }, - Card:{ - update:function(params) { // params {cid:int, aid:int} - if(!params) { params = {}; } - $('#contacts li,#contacts h3').removeClass('active'); - console.log('Card, cid: ' + params.cid + ' aid: ' + params.aid); - var newid, bookid, firstitem; - if(!parseInt(params.cid) && !parseInt(params.aid)) { - firstitem = $('#contacts ul').first().find('li:first-child'); - if(firstitem.length > 0) { - newid = parseInt(firstitem.data('id')); - bookid = parseInt(firstitem.data('bookid')); - } - } else if(!parseInt(params.cid) && parseInt(params.aid)) { - bookid = parseInt(params.aid); - newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); - } else if(parseInt(params.cid) && !parseInt(params.aid)) { - newid = parseInt(params.cid); - var listitem = Contacts.UI.Contacts.getContact(newid); //$('#contacts li[data-id="'+newid+'"]'); - console.log('Is contact in list? ' + listitem.length); - if(listitem.length) { - //bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid')); - bookid = parseInt(Contacts.UI.Contacts.getContact(newid).data('bookid')); - } else { // contact isn't in list yet. - bookid = 'unknown'; - } - } else { - newid = parseInt(params.cid); - bookid = parseInt(params.aid); - } - if(!bookid || !newid) { - bookid = parseInt($('#contacts h3').first().data('id')); - newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); - } - console.log('newid: ' + newid + ' bookid: ' +bookid); - var localLoadContact = function(newid, bookid) { - if($('.contacts li').length > 0) { - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':newid},function(jsondata){ - if(jsondata.status == 'success'){ - if(bookid == 'unknown') { - bookid = jsondata.data.addressbookid; - var contact = Contacts.UI.Contacts.insertContact({ - contactlist:$('#contacts ul[data-id="'+bookid+'"]'), - data:jsondata.data - }); - } - $('#contacts li[data-id="'+newid+'"],#contacts h3[data-id="'+bookid+'"]').addClass('active'); - $('#contacts ul[data-id="'+bookid+'"]').slideDown(300); - Contacts.UI.Card.loadContact(jsondata.data, bookid); - Contacts.UI.Contacts.scrollTo(newid); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - } - - // Make sure proper DOM is loaded. - if(!$('#card').length && newid) { - console.log('Loading card DOM'); - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{requesttoken:requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - Contacts.UI.loadHandlers(); - localLoadContact(newid, bookid); - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - else if(!newid) { - console.log('Loading intro'); - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').data('id',''); - $('#rightcontent').html(jsondata.data.page); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - else { - localLoadContact(newid, bookid); - } - }, - doExport:function() { - document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; - }, - editNew:function(){ // add a new contact - this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; - //Contacts.UI.Card.add(t('contacts', 'Contact')+';'+t('contacts', 'New')+';;;', t('contacts', 'New Contact'), '', true); - Contacts.UI.Card.add(';;;;;', '', '', true); - return false; - }, - add:function(n, fn, aid, isnew){ // add a new contact - console.log('Adding ' + fn); - aid = aid?aid:$('#contacts h3.active').first().data('id'); - var localAddcontact = function(n, fn, aid, isnew) { - $.post(OC.filePath('contacts', 'ajax', 'addcontact.php'), { n: n, fn: fn, aid: aid, isnew: isnew }, - function(jsondata) { - if (jsondata.status == 'success'){ - $('#rightcontent').data('id',jsondata.data.id); - var id = jsondata.data.id; - var aid = jsondata.data.aid; - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data, aid); - var item = Contacts.UI.Contacts.insertContact({data:jsondata.data}); - if(isnew) { // add some default properties - Contacts.UI.Card.addProperty('EMAIL'); - Contacts.UI.Card.addProperty('TEL'); - $('#fn').focus(); - } - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - $('#contact_identity').show(); - $('#actionbar').show(); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - - if(!$('#card').length) { - console.log('Loading card DOM'); - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{'requesttoken': requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - Contacts.UI.loadHandlers(); - localAddcontact(n, fn, aid, isnew); - }); - } else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - localAddcontact(n, fn, aid, isnew); - } - }, - delayedDelete:function() { - /* TODO: - $(window).unload(function() { - deleteFilesInQueue(); - }); - */ - $('#contacts_deletecard').tipsy('hide'); - var newid = '', bookid; - var curlistitem = Contacts.UI.Contacts.getContact(this.id); - curlistitem.removeClass('active'); - var newlistitem = curlistitem.prev('li'); - if(!newlistitem) { - newlistitem = curlistitem.next('li'); - } - curlistitem.detach(); - if($(newlistitem).is('li')) { - newid = newlistitem.data('id'); - bookid = newlistitem.data('bookid'); - } - $('#rightcontent').data('id', newid); - - with(this) { - delete id; delete fn; delete fullname; delete shortname; delete famname; - delete givname; delete addname; delete honpre; delete honsuf; delete data; - } - - if($('.contacts li').length > 0) { - Contacts.UI.Card.update({cid:newid, aid:bookid}); - } else { - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').html(jsondata.data.page).removeData('id'); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - Contacts.UI.notify({ - data:curlistitem, - message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"', - timeouthandler:function(contact) { - Contacts.UI.Card.doDelete(contact.data('id')); - delete contact; - }, - clickhandler:function(contact) { - Contacts.UI.Contacts.insertContact({contact:contact}); - Contacts.UI.notify({message:t('contacts', 'Cancelled deletion of: "') + curlistitem.find('a').text() + '"'}); - } - }); - }, - doDelete:function(id) { - $.post(OC.filePath('contacts', 'ajax', 'deletecard.php'),{'id':id},function(jsondata) { - if(jsondata.status == 'error'){ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - return false; - }, - loadContact:function(jsondata, bookid){ - this.data = jsondata; - this.id = this.data.id; - this.bookid = bookid; - $('#rightcontent').data('id',this.id); - this.populateNameFields(); - this.loadPhoto(); - this.loadMails(); - this.loadPhones(); - this.loadAddresses(); - this.loadSingleProperties(); - Contacts.UI.loadListHandlers(); - var note = $('#note'); - if(this.data.NOTE) { - note.data('checksum', this.data.NOTE[0]['checksum']); - var textarea = note.find('textarea'); - var txt = this.data.NOTE[0]['value']; - var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5; - textarea.css('min-height', nheight+'em'); - textarea.attr('rows', nheight); - textarea.val(txt); - note.show(); - textarea.expandingTextarea(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide(); - } else { - note.removeData('checksum'); - note.find('textarea').val(''); - note.hide(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show(); - } - }, - loadSingleProperties:function() { - var props = ['BDAY', 'NICKNAME', 'ORG', 'URL', 'CATEGORIES']; - // Clear all elements - $('#ident .propertycontainer').each(function(){ - if(props.indexOf($(this).data('element')) > -1) { - $(this).data('checksum', ''); - $(this).find('input').val(''); - $(this).hide(); - $(this).prev().hide(); - } - }); - for(var prop in props) { - var propname = props[prop]; - if(this.data[propname] != undefined) { - $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().hide(); - var property = this.data[propname][0]; - var value = property['value'], checksum = property['checksum']; - - if(propname == 'BDAY') { - var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); - value = $.datepicker.formatDate('dd-mm-yy', val); - } - var identcontainer = $('#contact_identity'); - identcontainer.find('#'+propname.toLowerCase()).val(value); - identcontainer.find('#'+propname.toLowerCase()+'_value').data('checksum', checksum); - identcontainer.find('#'+propname.toLowerCase()+'_label').show(); - identcontainer.find('#'+propname.toLowerCase()+'_value').show(); - } else { - $('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().show(); - } - } - }, - populateNameFields:function() { - var props = ['FN', 'N']; - // Clear all elements - $('#ident .propertycontainer').each(function(){ - if(props.indexOf($(this).data('element')) > -1) { - $(this).data('checksum', ''); - $(this).find('input').val(''); - } - }); - - with(this) { - delete fn; delete fullname; delete givname; delete famname; - delete addname; delete honpre; delete honsuf; - } - - if(this.data.FN) { - this.fn = this.data.FN[0]['value']; - } - else { - this.fn = ''; - } - if(this.data.N == undefined) { - narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P - } else { - narray = this.data.N[0]['value']; - } - this.famname = narray[0] || ''; - this.givname = narray[1] || ''; - this.addname = narray[2] || ''; - this.honpre = narray[3] || ''; - this.honsuf = narray[4] || ''; - if(this.honpre.length > 0) { - this.fullname += this.honpre + ' '; - } - if(this.givname.length > 0) { - this.fullname += ' ' + this.givname; - } - if(this.addname.length > 0) { - this.fullname += ' ' + this.addname; - } - if(this.famname.length > 0) { - this.fullname += ' ' + this.famname; - } - if(this.honsuf.length > 0) { - this.fullname += ', ' + this.honsuf; - } - $('#n').val(narray.join(';')); - $('#fn_select option').remove(); - var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - if(this.data.ORG) { - names[names.length]=this.data.ORG[0].value; - } - $.each(names, function(key, value) { - $('#fn_select') - .append($('') - .text(value)); - }); - $('#fn_select').combobox('value', this.fn); - $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']); - if(this.data.FN) { - $('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']); - } - $('#contact_identity').show(); - }, - hasCategory:function(category) { - if(this.data.CATEGORIES) { - var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/); - for(var c in categories) { - var cat = this.data.CATEGORIES[0]['value'][c]; - if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) { - return true; - } - } - } - return false; - }, - categoriesChanged:function(newcategories) { // Categories added/deleted. - categories = $.map(newcategories, function(v) {return v;}); - $('#categories').multiple_autocomplete('option', 'source', categories); - var categorylist = $('#categories_value').find('input'); - $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':Contacts.UI.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - $('#categories_value').data('checksum', jsondata.data.checksum); - categorylist.val(jsondata.data.value); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - savePropertyInternal:function(name, fields, oldchecksum, checksum){ - // TODO: Add functionality for new fields. - //console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum); - //console.log('savePropertyInternal: ' + this.data[name]); - var multivalue = ['CATEGORIES']; - var params = {}; - var value = multivalue.indexOf(name) != -1 ? new Array() : undefined; - jQuery.each(fields, function(i, field){ - //.substring(11,'parameters[TYPE][]'.indexOf(']')) - if(field.name.substring(0, 5) === 'value') { - if(multivalue.indexOf(name) != -1) { - value.push(field.value); - } else { - value = field.value; - } - } else if(field.name.substring(0, 10) === 'parameters') { - var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']')); - if(!(p in params)) { - params[p] = []; - } - params[p].push(field.value); - } - }); - for(var i in this.data[name]) { - if(this.data[name][i]['checksum'] == oldchecksum) { - this.data[name][i]['checksum'] = checksum; - this.data[name][i]['value'] = value; - this.data[name][i]['parameters'] = params; - } - } - }, - saveProperty:function(obj){ - if(!$(obj).hasClass('contacts_property')) { - return false; - } - if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') { - OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error')); - return false; - } - container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata. - Contacts.UI.loading(obj, true); - var checksum = container.data('checksum'); - var name = container.data('element'); - var fields = container.find('input.contacts_property,select.contacts_property').serializeArray(); - switch(name) { - case 'FN': - var nempty = true; - for(var i in Contacts.UI.Card.data.N[0]['value']) { - if(Contacts.UI.Card.data.N[0]['value'][i] != '') { - nempty = false; - break; - } - } - if(nempty) { - $('#n').val(fields[0].value + ';;;;'); - Contacts.UI.Card.data.N[0]['value'] = Array(fields[0].value, '', '', '', ''); - setTimeout(function() {Contacts.UI.Card.saveProperty($('#n'))}, 500); - } - break; - } - var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize(); - if(q == '' || q == undefined) { - OC.dialogs.alert(t('contacts', 'Couldn\'t serialize elements.'), t('contacts', 'Error')); - Contacts.UI.loading(obj, false); - return false; - } - q = q + '&id=' + this.id + '&name=' + name; - if(checksum != undefined && checksum != '') { // save - q = q + '&checksum=' + checksum; - console.log('Saving: ' + q); - $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'saveproperty.php'),q,function(jsondata){ - if(jsondata.status == 'success'){ - container.data('checksum', jsondata.data.checksum); - Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - Contacts.UI.loading(obj, false); - $(obj).removeAttr('disabled'); - return true; - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - Contacts.UI.loading(obj, false); - $(obj).removeAttr('disabled'); - return false; - } - },'json'); - } else { // add - console.log('Adding: ' + q); - $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'addproperty.php'),q,function(jsondata){ - if(jsondata.status == 'success'){ - container.data('checksum', jsondata.data.checksum); - // TODO: savePropertyInternal doesn't know about new fields - //Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - Contacts.UI.loading(obj, false); - $(obj).removeAttr('disabled'); - return true; - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - Contacts.UI.loading(obj, false); - $(obj).removeAttr('disabled'); - return false; - } - },'json'); - } - }, - addProperty:function(type){ - switch (type) { - case 'NOTE': - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#note').find('textarea').expandingTextarea().show().focus(); - break; - case 'EMAIL': - if($('#emaillist>li').length == 1) { - $('#emails').show(); - } - Contacts.UI.Card.addMail(); - break; - case 'TEL': - if($('#phonelist>li').length == 1) { - $('#phones').show(); - } - Contacts.UI.Card.addPhone(); - break; - case 'ADR': - if($('#addressdisplay>dl').length == 1) { - $('#addresses').show(); - } - Contacts.UI.Card.editAddress('new', true); - break; - case 'NICKNAME': - case 'URL': - case 'ORG': - case 'BDAY': - case 'CATEGORIES': - $('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show(); - $('dd[data-element="'+type+'"]').find('input').focus(); - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - break; - } - }, - deleteProperty:function(obj, type){ - console.log('deleteProperty'); - Contacts.UI.loading(obj, true); - var checksum = Contacts.UI.checksumFor(obj); - if(checksum) { - $.post(OC.filePath('contacts', 'ajax', 'deleteproperty.php'),{'id': this.id, 'checksum': checksum },function(jsondata){ - if(jsondata.status == 'success'){ - if(type == 'list') { - Contacts.UI.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = Contacts.UI.propertyTypeFor(obj); - Contacts.UI.Card.data[proptype] = null; - var othertypes = ['NOTE', 'PHOTO']; - if(othertypes.indexOf(proptype) != -1) { - Contacts.UI.propertyContainerFor(obj).data('checksum', ''); - if(proptype == 'PHOTO') { - Contacts.UI.Contacts.refreshThumbnail(Contacts.UI.Card.id); - Contacts.UI.Card.loadPhoto(true); - } else if(proptype == 'NOTE') { - $('#note').find('textarea').val(''); - Contacts.UI.propertyContainerFor(obj).hide(); - } - } else { - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('dl dd[data-element="'+proptype+'"]').data('checksum', '').find('input').val(''); - } - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - Contacts.UI.loading(obj, false); - } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); - Contacts.UI.loading(obj, false); - } - } - else{ - Contacts.UI.loading(obj, false); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { // Property hasn't been saved so there's nothing to delete. - if(type == 'list') { - Contacts.UI.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = Contacts.UI.propertyTypeFor(obj); - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - Contacts.UI.loading(obj, false); - } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); - } - } - }, - editName:function() { - var params = {id: this.id}; - /* Initialize the name edit dialog */ - if($('#edit_name_dialog').dialog('isOpen') == true) { - $('#edit_name_dialog').dialog('moveToTop'); - } else { - $.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata) { - if(jsondata.status == 'success') { - $('body').append('
    '); - $('#name_dialog').html(jsondata.data.page).find('#edit_name_dialog' ).dialog({ - modal: true, - closeOnEscape: true, - title: t('contacts', 'Edit name'), - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - Contacts.UI.Card.saveName(this); - $(this).dialog('close'); - }, - 'Cancel':function() { $(this).dialog('close'); } - }, - close: function(event, ui) { - $(this).dialog('destroy').remove(); - $('#name_dialog').remove(); - }, - open: function(event, ui) { - // load 'N' property - maybe :-P - } - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - }, - saveName:function(dlg){ - //console.log('saveName, id: ' + this.id); - var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags()); - this.famname = n[0]; - this.givname = n[1]; - this.addname = n[2]; - this.honpre = n[3]; - this.honsuf = n[4]; - this.fullname = ''; - - $('#n').val(n.join(';')); - if(n[3].length > 0) { - this.fullname = n[3] + ' '; - } - this.fullname += n[1] + ' ' + n[2] + ' ' + n[0]; - if(n[4].length > 0) { - this.fullname += ', ' + n[4]; - } - - $('#fn_select option').remove(); - //$('#fn_select').combobox('value', this.fn); - var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - var names = new Array(); - for(var name in tmp) { - if(names.indexOf(tmp[name]) == -1) { - names.push(tmp[name]); - } - } - $.each(names, function(key, value) { - $('#fn_select') - .append($('') - .text(value)); - }); - - if(this.id == '') { - var aid = $(dlg).find('#aid').val(); - Contacts.UI.Card.add(n.join(';'), $('#short').text(), aid); - } else { - Contacts.UI.Card.saveProperty($('#n')); - } - }, - loadAddresses:function(){ - $('#addresses').hide(); - $('#addressdisplay dl.propertycontainer').remove(); - var addresscontainer = $('#addressdisplay'); - for(var adr in this.data.ADR) { - addresscontainer.find('dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); - addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer'); - addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); - var adrarray = this.data.ADR[adr]['value']; - var adrtxt = ''; - if(adrarray[0] && adrarray[0].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[0].strip_tags() + '
  • '; - } - if(adrarray[1] && adrarray[1].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[1].strip_tags() + '
  • '; - } - if(adrarray[2] && adrarray[2].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[2].strip_tags() + '
  • '; - } - if((3 in adrarray && 5 in adrarray) && adrarray[3].length > 0 || adrarray[5].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '
  • '; - } - if(adrarray[4] && adrarray[4].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[4].strip_tags() + '
  • '; - } - if(adrarray[6] && adrarray[6].length > 0) { - adrtxt = adrtxt + '
  • ' + adrarray[6].strip_tags() + '
  • '; - } - addresscontainer.find('dl').last().find('.addresslist').html(adrtxt); - var types = new Array(); - var ttypes = new Array(); - for(var param in this.data.ADR[adr]['parameters']) { - if(param.toUpperCase() == 'TYPE') { - types.push(t('contacts', ucwords(this.data.ADR[adr]['parameters'][param].toLowerCase()))); - ttypes.push(this.data.ADR[adr]['parameters'][param]); - } - } - addresscontainer.find('dl').last().find('.adr_type_label').text(types.join('/')); - addresscontainer.find('dl').last().find('.adr_type').val(ttypes.join(',')); - addresscontainer.find('dl').last().find('.adr').val(adrarray.join(';')); - addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); - } - if(addresscontainer.find('dl').length > 1) { - $('#addresses').show(); - $('#contact_communication').show(); - } - return false; - }, - editAddress:function(obj, isnew){ - var container = undefined; - var params = {id: this.id}; - if(obj === 'new') { - isnew = true; - $('#addressdisplay dl').first().clone(true).insertAfter($('#addressdisplay dl').last()).show(); - container = $('#addressdisplay dl').last(); - container.removeClass('template').addClass('propertycontainer'); - } else { - params['checksum'] = Contacts.UI.checksumFor(obj); - } - /* Initialize the address edit dialog */ - if($('#edit_address_dialog').dialog('isOpen') == true){ - $('#edit_address_dialog').dialog('moveToTop'); - }else{ - $.getJSON(OC.filePath('contacts', 'ajax', 'editaddress.php'),params,function(jsondata){ - if(jsondata.status == 'success'){ - $('body').append('
    '); - $('#address_dialog').html(jsondata.data.page).find('#edit_address_dialog' ).dialog({ - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - if(isnew) { - Contacts.UI.Card.saveAddress(this, $('#addressdisplay dl:last-child').find('input').first(), isnew); - } else { - Contacts.UI.Card.saveAddress(this, obj, isnew); - } - $(this).dialog('close'); - }, - 'Cancel':function() { - $(this).dialog('close'); - if(isnew) { - container.remove(); - } - } - }, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - $('#address_dialog').remove(); - }, - open : function(event, ui) { - $( "#adr_city" ).autocomplete({ - source: function( request, response ) { - $.ajax({ - url: "http://ws.geonames.org/searchJSON", - dataType: "jsonp", - data: { - featureClass: "P", - style: "full", - maxRows: 12, - lang: lang, - name_startsWith: request.term - }, - success: function( data ) { - response( $.map( data.geonames, function( item ) { - return { - label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName, - value: item.name, - country: item.countryName - } - })); - } - }); - }, - minLength: 2, - select: function( event, ui ) { - if(ui.item && $('#adr_country').val().trim().length == 0) { - $('#adr_country').val(ui.item.country); - } - }, - open: function() { - $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); - }, - close: function() { - $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); - } - }); - $('#adr_country').autocomplete({ - source: function( request, response ) { - $.ajax({ - url: "http://ws.geonames.org/searchJSON", - dataType: "jsonp", - data: { - /*featureClass: "A",*/ - featureCode: "PCLI", - /*countryBias: "true",*/ - /*style: "full",*/ - lang: lang, - maxRows: 12, - name_startsWith: request.term - }, - success: function( data ) { - response( $.map( data.geonames, function( item ) { - return { - label: item.name, - value: item.name - } - })); - } - }); - }, - minLength: 2, - select: function( event, ui ) { - /*if(ui.item) { - $('#adr_country').val(ui.item.country); - } - log( ui.item ? - "Selected: " + ui.item.label : - "Nothing selected, input was " + this.value);*/ - }, - open: function() { - $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); - }, - close: function() { - $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); - } - }); - } - }); - } else { - alert(jsondata.data.message); - } - }); - } - }, - saveAddress:function(dlg, obj, isnew){ - if(isnew) { - container = $('#addressdisplay dl').last(); - obj = container.find('input').first(); - } else { - checksum = Contacts.UI.checksumFor(obj); - container = Contacts.UI.propertyContainerFor(obj); - } - var adr = new Array( - $(dlg).find('#adr_pobox').val().strip_tags(), - $(dlg).find('#adr_extended').val().strip_tags(), - $(dlg).find('#adr_street').val().strip_tags(), - $(dlg).find('#adr_city').val().strip_tags(), - $(dlg).find('#adr_region').val().strip_tags(), - $(dlg).find('#adr_zipcode').val().strip_tags(), - $(dlg).find('#adr_country').val().strip_tags() - ); - container.find('.adr').val(adr.join(';')); - container.find('.adr_type').val($(dlg).find('#adr_type').val()); - container.find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase()))); - Contacts.UI.Card.saveProperty($(container).find('input').first()); - var adrtxt = ''; - if(adr[0].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[0] + '
  • '; - } - if(adr[1].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[1] + '
  • '; - } - if(adr[2].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[2] + '
  • '; - } - if(adr[3].length > 0 || adr[5].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[5] + ' ' + adr[3] + '
  • '; - } - if(adr[4].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[4] + '
  • '; - } - if(adr[6].length > 0) { - adrtxt = adrtxt + '
  • ' + adr[6] + '
  • '; - } - container.find('.addresslist').html(adrtxt); - }, - uploadPhoto:function(filelist) { - if(!filelist) { - OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); - return; - } - var file = filelist[0]; - var target = $('#file_upload_target'); - var form = $('#file_upload_form'); - var totalSize=0; - if(file.size > $('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts', 'Error')); - return; - } else { - target.load(function(){ - var response=jQuery.parseJSON(target.contents().text()); - if(response != undefined && response.status == 'success'){ - Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp); - //alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime); - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - }); - form.submit(); - } - }, - loadPhotoHandlers:function() { - var phototools = $('#phototools'); - phototools.find('li a').tipsy('hide'); - phototools.find('li a').tipsy(); - if(this.data.PHOTO) { - phototools.find('.delete').click(function() { - $(this).tipsy('hide'); - Contacts.UI.Card.deleteProperty($('#contacts_details_photo'), 'single'); - $(this).hide(); - }); - phototools.find('.edit').click(function() { - $(this).tipsy('hide'); - Contacts.UI.Card.editCurrentPhoto(); - }); - phototools.find('.delete').show(); - phototools.find('.edit').show(); - } else { - phototools.find('.delete').hide(); - phototools.find('.edit').hide(); - } - }, - cloudPhotoSelected:function(path){ - $.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),{'path':path,'id':Contacts.UI.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - loadPhoto:function(refresh){ - var self = this; - var refreshstr = (refresh?'&refresh=1'+Math.random():'') - $('#phototools li a').tipsy('hide'); - var wrapper = $('#contacts_details_photo_wrapper'); - wrapper.addClass('loading').addClass('wait'); - delete this.photo; - this.photo = new Image(); - $(this.photo).load(function () { - $('img.contacts_details_photo').remove() - $(this).addClass('contacts_details_photo'); - wrapper.removeClass('loading').removeClass('wait'); - $(this).insertAfter($('#phototools')).fadeIn(); - }).error(function () { - // notify the user that the image could not be loaded - Contacts.UI.notify({message:t('contacts','Error loading profile picture.')}); - }).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr); - this.loadPhotoHandlers() - }, - editCurrentPhoto:function(){ - $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - wrapper.removeClass('wait'); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - editPhoto:function(id, tmpkey){ - //alert('editPhoto: ' + tmpkey); - $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':requesttoken},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - if($('#edit_photo_dialog').dialog('isOpen') == true){ - $('#edit_photo_dialog').dialog('moveToTop'); - } else { - $('#edit_photo_dialog').dialog('open'); - } - }, - savePhoto:function(){ - var target = $('#crop_target'); - var form = $('#cropform'); - var wrapper = $('#contacts_details_photo_wrapper'); - var self = this; - wrapper.addClass('wait'); - form.submit(); - target.load(function(){ - var response=jQuery.parseJSON(target.contents().text()); - if(response != undefined && response.status == 'success'){ - // load cropped photo. - self.loadPhoto(true); - Contacts.UI.Card.data.PHOTO = true; - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - wrapper.removeClass('wait'); - } - }); - Contacts.UI.Contacts.refreshThumbnail(this.id); - }, - addMail:function() { - //alert('addMail'); - var emaillist = $('#emaillist'); - emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy(); - emaillist.find('li.template:last-child').find('select').addClass('contacts_property'); - emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); - emaillist.find('li:last-child').find('input[type="email"]').focus(); - return false; - }, - loadMails:function() { - $('#emails').hide(); - $('#emaillist li.propertycontainer').remove(); - for(var mail in this.data.EMAIL) { - this.addMail(); - //$('#emaillist li:first-child').clone().appendTo($('#emaillist')).show(); - $('#emaillist li:last-child').data('checksum', this.data.EMAIL[mail]['checksum']) - $('#emaillist li:last-child').find('input[type="email"]').val(this.data.EMAIL[mail]['value']); - for(var param in this.data.EMAIL[mail]['parameters']) { - if(param.toUpperCase() == 'PREF') { - $('#emaillist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked') - } - else if(param.toUpperCase() == 'TYPE') { - for(etype in this.data.EMAIL[mail]['parameters'][param]) { - var et = this.data.EMAIL[mail]['parameters'][param][etype]; - $('#emaillist li:last-child').find('select option').each(function(){ - if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); - } - }); - } - } - } - } - if($('#emaillist li').length > 1) { - $('#emails').show(); - $('#contact_communication').show(); - } - - $('#emaillist li:last-child').find('input[type="text"]').focus(); - return false; - }, - addPhone:function() { - var phonelist = $('#phonelist'); - phonelist.find('li.template:first-child').clone(true).appendTo(phonelist); //.show(); - phonelist.find('li.template:last-child').find('select').addClass('contacts_property'); - phonelist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); - phonelist.find('li:last-child').find('input[type="text"]').focus(); - phonelist.find('li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - phonelist.find('li:last-child').show(); - return false; - }, - loadPhones:function() { - $('#phones').hide(); - $('#phonelist li.propertycontainer').remove(); - var phonelist = $('#phonelist'); - for(var phone in this.data.TEL) { - this.addPhone(); - phonelist.find('li:last-child').find('select').multiselect('destroy'); - phonelist.find('li:last-child').data('checksum', this.data.TEL[phone]['checksum']) - phonelist.find('li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); - for(var param in this.data.TEL[phone]['parameters']) { - if(param.toUpperCase() == 'PREF') { - phonelist.find('li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); - } - else if(param.toUpperCase() == 'TYPE') { - for(ptype in this.data.TEL[phone]['parameters'][param]) { - var pt = this.data.TEL[phone]['parameters'][param][ptype]; - phonelist.find('li:last-child').find('select option').each(function(){ - //if ($(this).val().toUpperCase() == pt.toUpperCase()) { - if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); - } - }); - } - } - } - phonelist.find('li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - } - if(phonelist.find('li').length > 1) { - $('#phones').show(); - $('#contact_communication').show(); - } - return false; - }, - }, - Addressbooks:{ - overview:function(){ - if($('#chooseaddressbook_dialog').dialog('isOpen') == true){ - $('#chooseaddressbook_dialog').dialog('moveToTop'); - }else{ - $('body').append('
    '); - $.getJSON(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){ - if(jsondata.status == 'success'){ - $('#addressbook_dialog').html(jsondata.data.page).find('#chooseaddressbook_dialog').dialog({ - minWidth : 600, - close : function(event, ui) { - $(this).dialog('destroy').remove(); - $('#addressbook_dialog').remove(); - } - }).css('overflow','visible'); - } else { - alert(jsondata.data.message); - $('#addressbook_dialog').remove(); - } - }); - } - return false; - }, - activation:function(checkbox, bookid){ - var active = checkbox.checked; - $.post(OC.filePath('contacts', 'ajax', 'activation.php'), {bookid: bookid, active: (active?1:0)}, function(jsondata) { - if (jsondata.status == 'success'){ - if(!active) { - $('#contacts h3[data-id="'+bookid+'"],#contacts ul[data-id="'+bookid+'"]').remove(); - } else { - Contacts.UI.Contacts.update(); - } - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - checkbox.checked = !active; - } - }); - }, - addAddressbook:function(name, description, cb) { - $.post(OC.filePath('contacts', 'ajax', 'addaddressbook.php'), { name: name, description: description, active: true }, - function(jsondata){ - if(jsondata.status == 'success'){ - if(cb) { - cb(jsondata.data); - } - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - return false; - } - }); - - }, - newAddressbook:function(object){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('contacts', 'ajax', 'addbook.php')); - $(object).closest('tr').after(tr).hide(); - }, - editAddressbook:function(object, bookid){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('contacts', 'ajax', 'editaddressbook.php') + "?bookid="+bookid); - $(object).closest('tr').after(tr).hide(); - }, - deleteAddressbook:function(obj, bookid){ - var check = confirm("Do you really want to delete this address book?"); - if(check == false){ - return false; - }else{ - $.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid}, - function(jsondata) { - if (jsondata.status == 'success'){ - $(obj).closest('tr').remove(); - $('#contacts h3[data-id="'+bookid+'"],#contacts ul[data-id="'+bookid+'"]').remove(); - Contacts.UI.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - }, - doImport:function(file, aid){ - $.post(OC.filePath('contacts', '', 'import.php'), { id: aid, file: file, fstype: 'OC_FilesystemView' }, - function(jsondata){ - if(jsondata.status != 'success'){ - Contacts.UI.notify({message:jsondata.data.message}); - } - }); - return false; - }, - submit:function(button, bookid){ - var displayname = $("#displayname_"+bookid).val().trim(); - var active = $("#edit_active_"+bookid+":checked").length; - var description = $("#description_"+bookid).val(); - - if(displayname.length == 0) { - OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error')); - return false; - } - var url; - if (bookid == 'new'){ - url = OC.filePath('contacts', 'ajax', 'createaddressbook.php'); - }else{ - url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php'); - } - $.post(url, { id: bookid, name: displayname, active: active, description: description }, - function(jsondata){ - if(jsondata.status == 'success'){ - $(button).closest('tr').prev().html(jsondata.page).show().next().remove(); - Contacts.UI.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - cancel:function(button, bookid){ - $(button).closest('tr').prev().show().next().remove(); - } - }, - Contacts:{ - contacts:{}, - batchnum:50, - getContact:function(id) { - if(!this.contacts[id]) { - this.contacts[id] = $('#contacts li[data-id="'+id+'"]'); - if(!this.contacts[id]) { - self = this; - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - self.contacts[id] = self.insertContact({data:jsondata.data}); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - } - return this.contacts[id]; - }, - drop:function(event, ui) { - var dragitem = ui.draggable, droptarget = $(this); - if(dragitem.is('li')) { - Contacts.UI.Contacts.dropContact(event, dragitem, droptarget); - } else { - Contacts.UI.Contacts.dropAddressbook(event, dragitem, droptarget); - } - }, - dropContact:function(event, dragitem, droptarget) { - if(dragitem.data('bookid') == droptarget.data('id')) { - return false; - } - var droplist = (droptarget.is('ul'))?droptarget:droptarget.next(); - $.post(OC.filePath('contacts', 'ajax', 'movetoaddressbook.php'), { ids: dragitem.data('id'), aid: droptarget.data('id') }, - function(jsondata){ - if(jsondata.status == 'success'){ - dragitem.attr('data-bookid', droptarget.data('id')) - dragitem.data('bookid', droptarget.data('id')); - Contacts.UI.Contacts.insertContact({ - contactlist:droplist, - contact:dragitem.detach() - }); - Contacts.UI.Contacts.scrollTo(dragitem.data('id')); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - dropAddressbook:function(event, dragitem, droptarget) { - alert('Dropping address books not implemented yet'); - }, - /** - * @params params An object with the properties 'contactlist':a jquery object of the ul to insert into, - * 'contacts':a jquery object of all items in the list and either 'data': an object with the properties - * id, addressbookid and displayname or 'contact': a listitem to be inserted directly. - * If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'. - */ - insertContact:function(params) { - var id, bookid; - if(!params.contactlist) { - // FIXME: Check if contact really exists. - bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); - id = params.data ? params.data.id : params.contact.data('id'); - params.contactlist = $('#contacts ul[data-id="'+bookid+'"]'); - } - if(!params.contacts) { - bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); - id = params.data ? params.data.id : params.contact.data('id'); - params.contacts = $('#contacts ul[data-id="'+bookid+'"] li'); - } - var contact = params.data - ? $('
  • '+params.data.displayname+'
  • ') - : params.contact; - var added = false; - var name = params.data ? params.data.displayname.toLowerCase() : contact.find('a').text().toLowerCase(); - if(params.contacts) { - params.contacts.each(function() { - if ($(this).text().toLowerCase() > name) { - $(this).before(contact); - added = true; - return false; - } - }); - } - if(!added || !params.contacts) { - params.contactlist.append(contact); - } - //this.contacts[id] = contact; - return contact; - }, - next:function(reverse) { - // TODO: Check if we're last-child/first-child and jump to next/prev address book. - var curlistitem = $('#contacts li[data-id="'+Contacts.UI.Card.id+'"]'); - var newlistitem = reverse ? curlistitem.prev('li') : curlistitem.next('li'); - if(newlistitem) { - curlistitem.removeClass('active'); - Contacts.UI.Card.update({ - cid:newlistitem.data('id'), - aid:newlistitem.data('bookid') - }); - } - }, - previous:function() { - this.next(true); - }, - // Reload the contacts list. - update:function(params){ - if(!params) { params = {}; } - if(!params.start) { - if(params.aid) { - $('#contacts h3[data-id="'+params.aid+'"],#contacts ul[data-id="'+params.aid+'"]').remove(); - } else { - $('#contacts').empty(); - } - } - self = this; - console.log('update: ' + params.cid + ' ' + params.aid + ' ' + params.start); - var firstrun = false; - var opts = {}; - opts['startat'] = (params.start?params.start:0); - if(params.aid) { - opts['aid'] = params.aid; - } - $.getJSON(OC.filePath('contacts', 'ajax', 'contacts.php'),opts,function(jsondata){ - if(jsondata.status == 'success'){ - var books = jsondata.data.entries; - $.each(books, function(b, book) { - if($('#contacts h3[data-id="'+b+'"]').length == 0) { - firstrun = true; - if($('#contacts h3').length == 0) { - $('#contacts').html('

    '+book.displayname+'

    '); - } else { - if(!$('#contacts h3[data-id="'+b+'"]').length) { - var item = $('

    '+book.displayname+'

    ') - var added = false; - $('#contacts h3').each(function(){ - if ($(this).text().toLowerCase() > book.displayname.toLowerCase()) { - $(this).before(item).fadeIn('fast'); - added = true; - return false; - } - }); - if(!added) { - $('#contacts').append(item); - } - - } - } - $('#contacts h3[data-id="'+b+'"]').on('click', function(event) { - $('#contacts h3').removeClass('active'); - $(this).addClass('active'); - $('#contacts ul[data-id="'+b+'"]').slideToggle(300); - return false; - }); - var accept = 'li:not([data-bookid="'+b+'"]),h3:not([data-id="'+b+'"])'; - $('#contacts h3[data-id="'+b+'"],#contacts ul[data-id="'+b+'"]').droppable({ - drop: Contacts.UI.Contacts.drop, - activeClass: 'ui-state-hover', - accept: accept - }); - } - var contactlist = $('#contacts ul[data-id="'+b+'"]'); - var contacts = $('#contacts ul[data-id="'+b+'"] li'); - for(var c in book.contacts) { - if(book.contacts[c].id == undefined) { continue; } - if(!$('#contacts li[data-id="'+book.contacts[c]['id']+'"]').length) { - var contact = Contacts.UI.Contacts.insertContact({contactlist:contactlist, contacts:contacts, data:book.contacts[c]}); - if(c == self.batchnum-10) { - contact.bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - $(this).unbind(event); - var bookid = $(this).data('bookid'); - var numsiblings = $('.contacts li[data-bookid="'+bookid+'"]').length; - if (isInView && numsiblings >= self.batchnum) { - console.log('This would be a good time to load more contacts.'); - Contacts.UI.Contacts.update({cid:params.cid, aid:bookid, start:$('#contacts li[data-bookid="'+bookid+'"]').length}); - } - }); - } - } - } - }); - if($('#contacts h3').length > 1) { - $('#contacts li,#contacts h3').draggable({ - distance: 10, - revert: 'invalid', - axis: 'y', containment: '#contacts', - scroll: true, scrollSensitivity: 40, - opacity: 0.7, helper: 'clone' - }); - } else { - $('#contacts h3').first().addClass('active'); - } - if(opts['startat'] == 0) { // only update card on first load. - Contacts.UI.Card.update(params); - } - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - refreshThumbnail:function(id){ - var item = $('.contacts li[data-id="'+id+'"]').find('a'); - item.html(Contacts.UI.Card.fn); - item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat'); - }, - scrollTo:function(id){ - var item = $('#contacts li[data-id="'+id+'"]'); - if(item && $.isNumeric(item.offset().top)) { - console.log('scrollTo ' + parseInt(item.offset().top)); - $('#contacts').animate({ - scrollTop: parseInt(item.offset()).top-40}, 'slow','swing'); - } - } - } - } -} -$(document).ready(function(){ - - OCCategories.changed = Contacts.UI.Card.categoriesChanged; - OCCategories.app = 'contacts'; - - $('#chooseaddressbook').on('click keydown', Contacts.UI.Addressbooks.overview); - $('#contacts_newcontact').on('click keydown', Contacts.UI.Card.editNew); - - var ninjahelp = $('#ninjahelp'); - - ninjahelp.find('.close').on('click keydown',function() { - ninjahelp.hide(); - }); - - $(document).on('keyup', function(event) { - console.log(event.which + ' ' + event.target.nodeName); - if(event.target.nodeName.toUpperCase() != 'BODY' - || $('#contacts li').length == 0 - || !Contacts.UI.Card.id) { - return; - } - /** - * To add: - * (Shift)n/p: next/prev addressbook - * u (85): hide/show leftcontent - * f (70): add field - */ - switch(event.which) { - case 27: // Esc - ninjahelp.hide(); - break; - case 46: - if(event.shiftKey) { - Contacts.UI.Card.delayedDelete(); - } - break; - case 32: // space - if(event.shiftKey) { - Contacts.UI.Contacts.previous(); - break; - } - case 40: // down - case 75: // k - Contacts.UI.Contacts.next(); - break; - case 65: // a - if(event.shiftKey) { - // add addressbook - Contacts.UI.notImplemented(); - break; - } - Contacts.UI.Card.editNew(); - break; - case 38: // up - case 74: // j - Contacts.UI.Contacts.previous(); - break; - case 78: // n - // next addressbook - Contacts.UI.notImplemented(); - break; - case 13: // Enter - case 79: // o - var aid = $('#contacts h3.active').first().data('id'); - if(aid) { - $('#contacts ul[data-id="'+aid+'"]').slideToggle(300); - } - break; - case 80: // p - // prev addressbook - Contacts.UI.notImplemented(); - break; - case 82: // r - Contacts.UI.Contacts.update({cid:Contacts.UI.Card.id}); - break; - case 191: // ? - ninjahelp.toggle('fast'); - break; - } - - }); - - // Load a contact. - $('.contacts').keydown(function(event) { - if(event.which == 13 || event.which == 32) { - $('.contacts').click(); - } - }); - $(document).on('click', '#contacts', function(event){ - var $tgt = $(event.target); - if ($tgt.is('li') || $tgt.is('a')) { - var item = $tgt.is('li')?$($tgt):($tgt).parent(); - var id = item.data('id'); - var bookid = item.data('bookid'); - item.addClass('active'); - var oldid = $('#rightcontent').data('id'); - if(oldid != 0){ - var olditem = $('.contacts li[data-id="'+oldid+'"]'); - var oldbookid = olditem.data('bookid'); - olditem.removeClass('active'); - if(oldbookid != bookid) { - $('#contacts h3[data-id="'+oldbookid+'"]').removeClass('active'); - $('#contacts h3[data-id="'+bookid+'"]').addClass('active'); - } - } - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data, bookid); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - return false; - }); - - $('.contacts_property').live('change', function(){ - Contacts.UI.Card.saveProperty(this); - }); - - $(function() { - // Upload function for dropped contact photos files. Should go in the Contacts class/object. - $.fileUpload = function(files){ - var file = files[0]; - if(file.size > $('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); - return; - } - if (file.type.indexOf("image") != 0) { - OC.dialogs.alert(t('contacts','Only image files can be used as profile picture.'), t('contacts','Wrong file type')); - return; - } - var xhr = new XMLHttpRequest(); - - if (!xhr.upload) { - OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'), t('contacts', 'Error')) - } - fileUpload = xhr.upload, - xhr.onreadystatechange = function() { - if (xhr.readyState == 4){ - response = $.parseJSON(xhr.responseText); - if(response.status == 'success') { - if(xhr.status == 200) { - Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp); - } else { - OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); - } - } else { - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - } - }; - - fileUpload.onprogress = function(e){ - if (e.lengthComputable){ - var _progress = Math.round((e.loaded * 100) / e.total); - //if (_progress != 100){ - //} - } - }; - xhr.open('POST', OC.filePath('contacts', 'ajax', 'uploadphoto.php')+'?id='+Contacts.UI.Card.id+'&requesttoken='+requesttoken+'&imagefile='+encodeURIComponent(file.name), true); - xhr.setRequestHeader('Cache-Control', 'no-cache'); - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - xhr.setRequestHeader('X_FILE_NAME', encodeURIComponent(file.name)); - xhr.setRequestHeader('X-File-Size', file.size); - xhr.setRequestHeader('Content-Type', file.type); - xhr.send(file); - } - }); - - $(document).bind('drop dragover', function (e) { - e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone - }); - - //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) - if(navigator.userAgent.search(/konqueror/i)==-1){ - $('#import_upload_start').attr('multiple','multiple') - } - // Import using jquery.fileupload - $(function() { - var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0; - var aid; - - $('#import_upload_start').fileupload({ - dropZone: $('#contacts'), // restrict dropZone to contacts list. - acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i, - add: function(e, data) { - var files = data.files; - var totalSize=0; - if(files) { - numfiles += files.length; uploadedfiles = 0; - for(var i=0;i$('#max_upload').val()){ - OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - return; - }else{ - if($.support.xhrFileUpload) { - for(var i=0;i 3) { - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - $('#uploadprogressbar').fadeOut(); - OC.dialogs.alert(t('contacts', 'Something went wrong with the upload, please retry.'), t('contacts', 'Error')); - return; - } - setTimeout(function() { // Just to let any uploads finish - importFiles(aid, uploadingFiles); - }, 1000); - } - $('#uploadprogressbar').progressbar('value',50); - var todo = uploadedfiles; - $.each(fileList, function(fileName, data) { - Contacts.UI.Addressbooks.doImport(fileName, aid); - delete fileList[fileName]; - numfiles -= 1; uploadedfiles -= 1; - $('#uploadprogressbar').progressbar('value',50+(50/(todo-uploadedfiles))); - }) - $('#uploadprogressbar').progressbar('value',100); - $('#uploadprogressbar').fadeOut(); - setTimeout(function() { - Contacts.UI.Contacts.update({aid:aid}); - numfiles = uploadedfiles = retries = aid = 0; - }, 1000); - } - if(!aid) { - // Either selected with filepicker or dropped outside of an address book. - $.getJSON(OC.filePath('contacts', 'ajax', 'selectaddressbook.php'),{},function(jsondata) { - if(jsondata.status == 'success') { - if($('#selectaddressbook_dialog').dialog('isOpen') == true) { - $('#selectaddressbook_dialog').dialog('moveToTop'); - } else { - $('#dialog_holder').html(jsondata.data.page).ready(function($) { - var select_dlg = $('#selectaddressbook_dialog'); - select_dlg.dialog({ - modal: true, height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - aid = select_dlg.find('input:checked').val(); - if(aid == 'new') { - var displayname = select_dlg.find('input.name').val(); - var description = select_dlg.find('input.desc').val(); - if(!displayname.trim()) { - OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error')); - return false; - } - $(this).dialog('close'); - Contacts.UI.Addressbooks.addAddressbook(displayname, description, function(addressbook){ - aid = addressbook.id; - setTimeout(function() { - importFiles(aid, uploadingFiles); - }, 500); - console.log('aid ' + aid); - }); - } else { - setTimeout(function() { - importFiles(aid, uploadingFiles); - }, 500); - console.log('aid ' + aid); - $(this).dialog('close'); - } - }, - 'Cancel':function() { - $(this).dialog('close'); - numfiles = uploadedfiles = retries = aid = 0; - uploadingFiles = {}; - $('#uploadprogressbar').fadeOut(); - } - }, - close: function(event, ui) { - // TODO: If numfiles != 0 delete tmp files after a timeout. - $(this).dialog('destroy').remove(); - } - }); - }); - } - } else { - $('#uploadprogressbar').fadeOut(); - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - // Dropped on an address book or it's list. - setTimeout(function() { // Just to let any uploads finish - importFiles(aid, uploadingFiles); - }, 1000); - } - if(data.dataType != 'iframe ') { - $('#upload input.stop').hide(); - } - } - }) - }); - - Contacts.UI.loadHandlers(); - Contacts.UI.Contacts.update({cid:id}); -}); diff --git a/apps/contacts/js/expanding.js b/apps/contacts/js/expanding.js deleted file mode 100644 index 17139f27ff..0000000000 --- a/apps/contacts/js/expanding.js +++ /dev/null @@ -1,118 +0,0 @@ -// Expanding Textareas -// https://github.com/bgrins/ExpandingTextareas - -(function(factory) { - // Add jQuery via AMD registration or browser globals - if (typeof define === 'function' && define.amd) { - define([ 'jquery' ], factory); - } - else { - factory(jQuery); - } -}(function ($) { - $.expandingTextarea = $.extend({ - autoInitialize: true, - initialSelector: "textarea.expanding", - opts: { - resize: function() { } - } - }, $.expandingTextarea || {}); - - var cloneCSSProperties = [ - 'lineHeight', 'textDecoration', 'letterSpacing', - 'fontSize', 'fontFamily', 'fontStyle', - 'fontWeight', 'textTransform', 'textAlign', - 'direction', 'wordSpacing', 'fontSizeAdjust', - 'wordWrap', - 'borderLeftWidth', 'borderRightWidth', - 'borderTopWidth','borderBottomWidth', - 'paddingLeft', 'paddingRight', - 'paddingTop','paddingBottom', - 'marginLeft', 'marginRight', - 'marginTop','marginBottom', - 'boxSizing', 'webkitBoxSizing', 'mozBoxSizing', 'msBoxSizing' - ]; - - var textareaCSS = { - position: "absolute", - height: "100%", - resize: "none" - }; - - var preCSS = { - visibility: "hidden", - border: "0 solid", - whiteSpace: "pre-wrap" - }; - - var containerCSS = { - position: "relative" - }; - - function resize() { - $(this).closest('.expandingText').find("div").text(this.value + ' '); - $(this).trigger("resize.expanding"); - } - - $.fn.expandingTextarea = function(o) { - - var opts = $.extend({ }, $.expandingTextarea.opts, o); - - if (o === "resize") { - return this.trigger("input.expanding"); - } - - if (o === "destroy") { - this.filter(".expanding-init").each(function() { - var textarea = $(this).removeClass('expanding-init'); - var container = textarea.closest('.expandingText'); - - container.before(textarea).remove(); - textarea - .attr('style', textarea.data('expanding-styles') || '') - .removeData('expanding-styles'); - }); - - return this; - } - - this.filter("textarea").not(".expanding-init").addClass("expanding-init").each(function() { - var textarea = $(this); - - textarea.wrap("
    "); - textarea.after("
    "); - - var container = textarea.parent().css(containerCSS); - var pre = container.find("pre").css(preCSS); - - // Store the original styles in case of destroying. - textarea.data('expanding-styles', textarea.attr('style')); - textarea.css(textareaCSS); - - $.each(cloneCSSProperties, function(i, p) { - var val = textarea.css(p); - - // Only set if different to prevent overriding percentage css values. - if (pre.css(p) !== val) { - pre.css(p, val); - } - }); - - textarea.bind("input.expanding propertychange.expanding", resize); - resize.apply(this); - - if (opts.resize) { - textarea.bind("resize.expanding", opts.resize); - } - }); - - return this; - }; - - $(function () { - if ($.expandingTextarea.autoInitialize) { - $($.expandingTextarea.initialSelector).expandingTextarea(); - } - }); - -})); diff --git a/apps/contacts/js/jquery.Jcrop.js b/apps/contacts/js/jquery.Jcrop.js deleted file mode 100644 index 36f9a0f08f..0000000000 --- a/apps/contacts/js/jquery.Jcrop.js +++ /dev/null @@ -1,1765 +0,0 @@ -/** - * jquery.Jcrop.js v0.9.9 {{{ - * - * jQuery Image Cropping Plugin - released under MIT License - * Author: Kelly Hallman - * http://github.com/tapmodo/Jcrop - * - * }}} - * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{ - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * }}} - */ - -(function ($) { - - $.Jcrop = function (obj, opt) { - var options = $.extend({}, $.Jcrop.defaults), - docOffset, lastcurs, ie6mode = false; - - // Internal Methods {{{ - function px(n) { - return parseInt(n, 10) + 'px'; - } - function cssClass(cl) { - return options.baseClass + '-' + cl; - } - function supportsColorFade() { - return $.fx.step.hasOwnProperty('backgroundColor'); - } - function getPos(obj) //{{{ - { - var pos = $(obj).offset(); - return [pos.left, pos.top]; - } - //}}} - function mouseAbs(e) //{{{ - { - return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])]; - } - //}}} - function setOptions(opt) //{{{ - { - if (typeof(opt) !== 'object') opt = {}; - options = $.extend(options, opt); - - $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) { - if (typeof(options[e]) !== 'function') options[e] = function () {}; - }); - } - //}}} - function startDragMode(mode, pos) //{{{ - { - docOffset = getPos($img); - Tracker.setCursor(mode === 'move' ? mode : mode + '-resize'); - - if (mode === 'move') { - return Tracker.activateHandlers(createMover(pos), doneSelect); - } - - var fc = Coords.getFixed(); - var opp = oppLockCorner(mode); - var opc = Coords.getCorner(oppLockCorner(opp)); - - Coords.setPressed(Coords.getCorner(opp)); - Coords.setCurrent(opc); - - Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect); - } - //}}} - function dragmodeHandler(mode, f) //{{{ - { - return function (pos) { - if (!options.aspectRatio) { - switch (mode) { - case 'e': - pos[1] = f.y2; - break; - case 'w': - pos[1] = f.y2; - break; - case 'n': - pos[0] = f.x2; - break; - case 's': - pos[0] = f.x2; - break; - } - } else { - switch (mode) { - case 'e': - pos[1] = f.y + 1; - break; - case 'w': - pos[1] = f.y + 1; - break; - case 'n': - pos[0] = f.x + 1; - break; - case 's': - pos[0] = f.x + 1; - break; - } - } - Coords.setCurrent(pos); - Selection.update(); - }; - } - //}}} - function createMover(pos) //{{{ - { - var lloc = pos; - KeyManager.watchKeys(); - - return function (pos) { - Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); - lloc = pos; - - Selection.update(); - }; - } - //}}} - function oppLockCorner(ord) //{{{ - { - switch (ord) { - case 'n': - return 'sw'; - case 's': - return 'nw'; - case 'e': - return 'nw'; - case 'w': - return 'ne'; - case 'ne': - return 'sw'; - case 'nw': - return 'se'; - case 'se': - return 'nw'; - case 'sw': - return 'ne'; - } - } - //}}} - function createDragger(ord) //{{{ - { - return function (e) { - if (options.disabled) { - return false; - } - if ((ord === 'move') && !options.allowMove) { - return false; - } - - // Fix position of crop area when dragged the very first time. - // Necessary when crop image is in a hidden element when page is loaded. - docOffset = getPos($img); - - btndown = true; - startDragMode(ord, mouseAbs(e)); - e.stopPropagation(); - e.preventDefault(); - return false; - }; - } - //}}} - function presize($obj, w, h) //{{{ - { - var nw = $obj.width(), - nh = $obj.height(); - if ((nw > w) && w > 0) { - nw = w; - nh = (w / $obj.width()) * $obj.height(); - } - if ((nh > h) && h > 0) { - nh = h; - nw = (h / $obj.height()) * $obj.width(); - } - xscale = $obj.width() / nw; - yscale = $obj.height() / nh; - $obj.width(nw).height(nh); - } - //}}} - function unscale(c) //{{{ - { - return { - x: parseInt(c.x * xscale, 10), - y: parseInt(c.y * yscale, 10), - x2: parseInt(c.x2 * xscale, 10), - y2: parseInt(c.y2 * yscale, 10), - w: parseInt(c.w * xscale, 10), - h: parseInt(c.h * yscale, 10) - }; - } - //}}} - function doneSelect(pos) //{{{ - { - var c = Coords.getFixed(); - if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) { - Selection.enableHandles(); - Selection.done(); - } else { - Selection.release(); - } - Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); - } - //}}} - function newSelection(e) //{{{ - { - if (options.disabled) { - return false; - } - if (!options.allowSelect) { - return false; - } - btndown = true; - docOffset = getPos($img); - Selection.disableHandles(); - Tracker.setCursor('crosshair'); - var pos = mouseAbs(e); - Coords.setPressed(pos); - Selection.update(); - Tracker.activateHandlers(selectDrag, doneSelect); - KeyManager.watchKeys(); - - e.stopPropagation(); - e.preventDefault(); - return false; - } - //}}} - function selectDrag(pos) //{{{ - { - Coords.setCurrent(pos); - Selection.update(); - } - //}}} - function newTracker() //{{{ - { - var trk = $('
    ').addClass(cssClass('tracker')); - if ($.browser.msie) { - trk.css({ - opacity: 0, - backgroundColor: 'white' - }); - } - return trk; - } - //}}} - - // }}} - // Initialization {{{ - // Sanitize some options {{{ - if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) { - ie6mode = true; - } - if (typeof(obj) !== 'object') { - obj = $(obj)[0]; - } - if (typeof(opt) !== 'object') { - opt = {}; - } - // }}} - setOptions(opt); - // Initialize some jQuery objects {{{ - // The values are SET on the image(s) for the interface - // If the original image has any of these set, they will be reset - // However, if you destroy() the Jcrop instance the original image's - // character in the DOM will be as you left it. - var img_css = { - border: 'none', - visibility: 'visible', - margin: 0, - padding: 0, - position: 'absolute', - top: 0, - left: 0 - }; - - var $origimg = $(obj), - img_mode = true; - - if (obj.tagName == 'IMG') { - // Fix size of crop image. - // Necessary when crop image is within a hidden element when page is loaded. - if ($origimg[0].width != 0 && $origimg[0].height != 0) { - // Obtain dimensions from contained img element. - $origimg.width($origimg[0].width); - $origimg.height($origimg[0].height); - } else { - // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). - var tempImage = new Image(); - tempImage.src = $origimg[0].src; - $origimg.width(tempImage.width); - $origimg.height(tempImage.height); - } - - var $img = $origimg.clone().removeAttr('id').css(img_css).show(); - - $img.width($origimg.width()); - $img.height($origimg.height()); - $origimg.after($img).hide(); - - } else { - $img = $origimg.css(img_css).show(); - img_mode = false; - if (options.shade === null) { options.shade = true; } - } - - presize($img, options.boxWidth, options.boxHeight); - - var boundx = $img.width(), - boundy = $img.height(), - - - $div = $('
    ').width(boundx).height(boundy).addClass(cssClass('holder')).css({ - position: 'relative', - backgroundColor: options.bgColor - }).insertAfter($origimg).append($img); - - if (options.addClass) { - $div.addClass(options.addClass); - } - - var $img2 = $('
    '), - - $img_holder = $('
    ') - .width('100%').height('100%').css({ - zIndex: 310, - position: 'absolute', - overflow: 'hidden' - }), - - $hdl_holder = $('
    ') - .width('100%').height('100%').css('zIndex', 320), - - $sel = $('
    ') - .css({ - position: 'absolute', - zIndex: 600 - }).dblclick(function(){ - var c = Coords.getFixed(); - options.onDblClick.call(api,c); - }).insertBefore($img).append($img_holder, $hdl_holder); - - if (img_mode) { - - $img2 = $('') - .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy), - - $img_holder.append($img2); - - } - - if (ie6mode) { - $sel.css({ - overflowY: 'hidden' - }); - } - - var bound = options.boundary; - var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({ - position: 'absolute', - top: px(-bound), - left: px(-bound), - zIndex: 290 - }).mousedown(newSelection); - - /* }}} */ - // Set more variables {{{ - var bgcolor = options.bgColor, - bgopacity = options.bgOpacity, - xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true, - btndown, animating, shift_down; - - docOffset = getPos($img); - // }}} - // }}} - // Internal Modules {{{ - // Touch Module {{{ - var Touch = (function () { - // Touch support detection function adapted (under MIT License) - // from code by Jeffrey Sambells - http://github.com/iamamused/ - function hasTouchSupport() { - var support = {}, - events = ['touchstart', 'touchmove', 'touchend'], - el = document.createElement('div'), i; - - try { - for(i=0; i x1 + ox) { - ox -= ox + x1; - } - if (0 > y1 + oy) { - oy -= oy + y1; - } - - if (boundy < y2 + oy) { - oy += boundy - (y2 + oy); - } - if (boundx < x2 + ox) { - ox += boundx - (x2 + ox); - } - - x1 += ox; - x2 += ox; - y1 += oy; - y2 += oy; - } - //}}} - function getCorner(ord) //{{{ - { - var c = getFixed(); - switch (ord) { - case 'ne': - return [c.x2, c.y]; - case 'nw': - return [c.x, c.y]; - case 'se': - return [c.x2, c.y2]; - case 'sw': - return [c.x, c.y2]; - } - } - //}}} - function getFixed() //{{{ - { - if (!options.aspectRatio) { - return getRect(); - } - // This function could use some optimization I think... - var aspect = options.aspectRatio, - min_x = options.minSize[0] / xscale, - - - //min_y = options.minSize[1]/yscale, - max_x = options.maxSize[0] / xscale, - max_y = options.maxSize[1] / yscale, - rw = x2 - x1, - rh = y2 - y1, - rwa = Math.abs(rw), - rha = Math.abs(rh), - real_ratio = rwa / rha, - xx, yy, w, h; - - if (max_x === 0) { - max_x = boundx * 10; - } - if (max_y === 0) { - max_y = boundy * 10; - } - if (real_ratio < aspect) { - yy = y2; - w = rha * aspect; - xx = rw < 0 ? x1 - w : w + x1; - - if (xx < 0) { - xx = 0; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h : h + y1; - } else if (xx > boundx) { - xx = boundx; - h = Math.abs((xx - x1) / aspect); - yy = rh < 0 ? y1 - h : h + y1; - } - } else { - xx = x2; - h = rwa / aspect; - yy = rh < 0 ? y1 - h : y1 + h; - if (yy < 0) { - yy = 0; - w = Math.abs((yy - y1) * aspect); - xx = rw < 0 ? x1 - w : w + x1; - } else if (yy > boundy) { - yy = boundy; - w = Math.abs(yy - y1) * aspect; - xx = rw < 0 ? x1 - w : w + x1; - } - } - - // Magic %-) - if (xx > x1) { // right side - if (xx - x1 < min_x) { - xx = x1 + min_x; - } else if (xx - x1 > max_x) { - xx = x1 + max_x; - } - if (yy > y1) { - yy = y1 + (xx - x1) / aspect; - } else { - yy = y1 - (xx - x1) / aspect; - } - } else if (xx < x1) { // left side - if (x1 - xx < min_x) { - xx = x1 - min_x; - } else if (x1 - xx > max_x) { - xx = x1 - max_x; - } - if (yy > y1) { - yy = y1 + (x1 - xx) / aspect; - } else { - yy = y1 - (x1 - xx) / aspect; - } - } - - if (xx < 0) { - x1 -= xx; - xx = 0; - } else if (xx > boundx) { - x1 -= xx - boundx; - xx = boundx; - } - - if (yy < 0) { - y1 -= yy; - yy = 0; - } else if (yy > boundy) { - y1 -= yy - boundy; - yy = boundy; - } - - return makeObj(flipCoords(x1, y1, xx, yy)); - } - //}}} - function rebound(p) //{{{ - { - if (p[0] < 0) { - p[0] = 0; - } - if (p[1] < 0) { - p[1] = 0; - } - - if (p[0] > boundx) { - p[0] = boundx; - } - if (p[1] > boundy) { - p[1] = boundy; - } - - return [p[0], p[1]]; - } - //}}} - function flipCoords(x1, y1, x2, y2) //{{{ - { - var xa = x1, - xb = x2, - ya = y1, - yb = y2; - if (x2 < x1) { - xa = x2; - xb = x1; - } - if (y2 < y1) { - ya = y2; - yb = y1; - } - return [Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb)]; - } - //}}} - function getRect() //{{{ - { - var xsize = x2 - x1, - ysize = y2 - y1, - delta; - - if (xlimit && (Math.abs(xsize) > xlimit)) { - x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); - } - if (ylimit && (Math.abs(ysize) > ylimit)) { - y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); - } - - if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) { - y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale); - } - if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) { - x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale); - } - - if (x1 < 0) { - x2 -= x1; - x1 -= x1; - } - if (y1 < 0) { - y2 -= y1; - y1 -= y1; - } - if (x2 < 0) { - x1 -= x2; - x2 -= x2; - } - if (y2 < 0) { - y1 -= y2; - y2 -= y2; - } - if (x2 > boundx) { - delta = x2 - boundx; - x1 -= delta; - x2 -= delta; - } - if (y2 > boundy) { - delta = y2 - boundy; - y1 -= delta; - y2 -= delta; - } - if (x1 > boundx) { - delta = x1 - boundy; - y2 -= delta; - y1 -= delta; - } - if (y1 > boundy) { - delta = y1 - boundy; - y2 -= delta; - y1 -= delta; - } - - return makeObj(flipCoords(x1, y1, x2, y2)); - } - //}}} - function makeObj(a) //{{{ - { - return { - x: a[0], - y: a[1], - x2: a[2], - y2: a[3], - w: a[2] - a[0], - h: a[3] - a[1] - }; - } - //}}} - - return { - flipCoords: flipCoords, - setPressed: setPressed, - setCurrent: setCurrent, - getOffset: getOffset, - moveOffset: moveOffset, - getCorner: getCorner, - getFixed: getFixed - }; - }()); - - //}}} - // Shade Module {{{ - var Shade = (function() { - var enabled = false, - holder = $('
    ').css({ - position: 'absolute', - zIndex: 240, - opacity: 0 - }), - shades = { - top: createShade(), - left: createShade().height(boundy), - right: createShade().height(boundy), - bottom: createShade() - }; - - function resizeShades(w,h) { - shades.left.css({ height: px(h) }); - shades.right.css({ height: px(h) }); - } - function updateAuto() - { - return updateShade(Coords.getFixed()); - } - function updateShade(c) - { - shades.top.css({ - left: px(c.x), - width: px(c.w), - height: px(c.y) - }); - shades.bottom.css({ - top: px(c.y2), - left: px(c.x), - width: px(c.w), - height: px(boundy-c.y2) - }); - shades.right.css({ - left: px(c.x2), - width: px(boundx-c.x2) - }); - shades.left.css({ - width: px(c.x) - }); - } - function createShade() { - return $('
    ').css({ - position: 'absolute', - backgroundColor: options.shadeColor||options.bgColor - }).appendTo(holder); - } - function enableShade() { - if (!enabled) { - enabled = true; - holder.insertBefore($img); - updateAuto(); - Selection.setBgOpacity(1,0,1); - $img2.hide(); - - setBgColor(options.shadeColor||options.bgColor,1); - if (Selection.isAwake()) - { - setOpacity(options.bgOpacity,1); - } - else setOpacity(1,1); - } - } - function setBgColor(color,now) { - colorChangeMacro(getShades(),color,now); - } - function disableShade() { - if (enabled) { - holder.remove(); - $img2.show(); - enabled = false; - if (Selection.isAwake()) { - Selection.setBgOpacity(options.bgOpacity,1,1); - } else { - Selection.setBgOpacity(1,1,1); - Selection.disableHandles(); - } - colorChangeMacro($div,0,1); - } - } - function setOpacity(opacity,now) { - if (enabled) { - if (options.bgFade && !now) { - holder.animate({ - opacity: 1-opacity - },{ - queue: false, - duration: options.fadeTime - }); - } - else holder.css({opacity:1-opacity}); - } - } - function refreshAll() { - options.shade ? enableShade() : disableShade(); - if (Selection.isAwake()) setOpacity(options.bgOpacity); - } - function getShades() { - return holder.children(); - } - - return { - update: updateAuto, - updateRaw: updateShade, - getShades: getShades, - setBgColor: setBgColor, - enable: enableShade, - disable: disableShade, - resize: resizeShades, - refresh: refreshAll, - opacity: setOpacity - }; - }()); - // }}} - // Selection Module {{{ - var Selection = (function () { - var awake, hdep = 370; - var borders = {}; - var handle = {}; - var seehandles = false; - var hhs = options.handleOffset; - - // Private Methods - function insertBorder(type) //{{{ - { - var jq = $('
    ').css({ - position: 'absolute', - opacity: options.borderOpacity - }).addClass(cssClass(type)); - $img_holder.append(jq); - return jq; - } - //}}} - function dragDiv(ord, zi) //{{{ - { - var jq = $('
    ').mousedown(createDragger(ord)).css({ - cursor: ord + '-resize', - position: 'absolute', - zIndex: zi - }).addClass('ord-'+ord); - - if (Touch.support) { - jq.bind('touchstart.jcrop', Touch.createDragger(ord)); - } - - $hdl_holder.append(jq); - return jq; - } - //}}} - function insertHandle(ord) //{{{ - { - var hs = options.handleSize; - return dragDiv(ord, hdep++).css({ - top: px(-hhs + 1), - left: px(-hhs + 1), - opacity: options.handleOpacity - }).width(hs).height(hs).addClass(cssClass('handle')); - } - //}}} - function insertDragbar(ord) //{{{ - { - var s = options.handleSize, - h = s, - w = s, - t = hhs, - l = hhs; - - switch (ord) { - case 'n': - case 's': - w = '100%'; - break; - case 'e': - case 'w': - h = '100%'; - break; - } - - return dragDiv(ord, hdep++).width(w).height(h).css({ - top: px(-t + 1), - left: px(-l + 1) - }); - } - //}}} - function createHandles(li) //{{{ - { - var i; - for (i = 0; i < li.length; i++) { - handle[li[i]] = insertHandle(li[i]); - } - } - //}}} - function moveHandles(c) //{{{ - { - var midvert = Math.round((c.h / 2) - hhs), - midhoriz = Math.round((c.w / 2) - hhs), - north = -hhs + 1, - west = -hhs + 1, - east = c.w - hhs, - south = c.h - hhs, - x, y; - - if (handle.e) { - handle.e.css({ - top: px(midvert), - left: px(east) - }); - handle.w.css({ - top: px(midvert) - }); - handle.s.css({ - top: px(south), - left: px(midhoriz) - }); - handle.n.css({ - left: px(midhoriz) - }); - } - if (handle.ne) { - handle.ne.css({ - left: px(east) - }); - handle.se.css({ - top: px(south), - left: px(east) - }); - handle.sw.css({ - top: px(south) - }); - } - if (handle.b) { - handle.b.css({ - top: px(south) - }); - handle.r.css({ - left: px(east) - }); - } - } - //}}} - function moveto(x, y) //{{{ - { - if (!options.shade) { - $img2.css({ - top: px(-y), - left: px(-x) - }); - } - $sel.css({ - top: px(y), - left: px(x) - }); - } - //}}} - function resize(w, h) //{{{ - { - $sel.width(w).height(h); - } - //}}} - function refresh() //{{{ - { - var c = Coords.getFixed(); - - Coords.setPressed([c.x, c.y]); - Coords.setCurrent([c.x2, c.y2]); - - updateVisible(); - } - //}}} - - // Internal Methods - function updateVisible(select) //{{{ - { - if (awake) { - return update(select); - } - } - //}}} - function update(select) //{{{ - { - var c = Coords.getFixed(); - - resize(c.w, c.h); - moveto(c.x, c.y); - if (options.shade) Shade.updateRaw(c); - - if (seehandles) { - moveHandles(c); - } - if (!awake) { - show(); - } - - if (select) { - options.onSelect.call(api, unscale(c)); - } else { - options.onChange.call(api, unscale(c)); - } - } - //}}} - function setBgOpacity(opacity,force,now) - { - if (!awake && !force) return; - if (options.bgFade && !now) { - $img.animate({ - opacity: opacity - },{ - queue: false, - duration: options.fadeTime - }); - } else { - $img.css('opacity', opacity); - } - } - function show() //{{{ - { - $sel.show(); - - if (options.shade) Shade.opacity(bgopacity); - else setBgOpacity(bgopacity,true); - - awake = true; - } - //}}} - function release() //{{{ - { - disableHandles(); - $sel.hide(); - - if (options.shade) Shade.opacity(1); - else setBgOpacity(1); - - awake = false; - options.onRelease.call(api); - } - //}}} - function showHandles() //{{{ - { - if (seehandles) { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - } - } - //}}} - function enableHandles() //{{{ - { - seehandles = true; - if (options.allowResize) { - moveHandles(Coords.getFixed()); - $hdl_holder.show(); - return true; - } - } - //}}} - function disableHandles() //{{{ - { - seehandles = false; - $hdl_holder.hide(); - } - //}}} - function animMode(v) //{{{ - { - if (animating === v) { - disableHandles(); - } else { - enableHandles(); - } - } - //}}} - function done() //{{{ - { - animMode(false); - refresh(); - } - //}}} - /* Insert draggable elements {{{*/ - - // Insert border divs for outline - if (options.drawBorders) { - borders = { - top: insertBorder('hline'), - bottom: insertBorder('hline bottom'), - left: insertBorder('vline'), - right: insertBorder('vline right') - }; - } - - // Insert handles on edges - if (options.dragEdges) { - handle.t = insertDragbar('n'); - handle.b = insertDragbar('s'); - handle.r = insertDragbar('e'); - handle.l = insertDragbar('w'); - } - - // Insert side and corner handles - if (options.sideHandles) { - createHandles(['n', 's', 'e', 'w']); - } - if (options.cornerHandles) { - createHandles(['sw', 'nw', 'ne', 'se']); - } - //}}} - - // This is a hack for iOS5 to support drag/move touch functionality - $(document).bind('touchstart.jcrop-ios',function(e) { - if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation(); - }); - - var $track = newTracker().mousedown(createDragger('move')).css({ - cursor: 'move', - position: 'absolute', - zIndex: 360 - }); - - if (Touch.support) { - $track.bind('touchstart.jcrop', Touch.createDragger('move')); - } - - $img_holder.append($track); - disableHandles(); - - return { - updateVisible: updateVisible, - update: update, - release: release, - refresh: refresh, - isAwake: function () { - return awake; - }, - setCursor: function (cursor) { - $track.css('cursor', cursor); - }, - enableHandles: enableHandles, - enableOnly: function () { - seehandles = true; - }, - showHandles: showHandles, - disableHandles: disableHandles, - animMode: animMode, - setBgOpacity: setBgOpacity, - done: done - }; - }()); - - //}}} - // Tracker Module {{{ - var Tracker = (function () { - var onMove = function () {}, - onDone = function () {}, - trackDoc = options.trackDocument; - - function toFront() //{{{ - { - $trk.css({ - zIndex: 450 - }); - if (Touch.support) { - $(document) - .bind('touchmove.jcrop', trackTouchMove) - .bind('touchend.jcrop', trackTouchEnd); - } - if (trackDoc) { - $(document) - .bind('mousemove.jcrop',trackMove) - .bind('mouseup.jcrop',trackUp); - } - } - //}}} - function toBack() //{{{ - { - $trk.css({ - zIndex: 290 - }); - $(document).unbind('.jcrop'); - } - //}}} - function trackMove(e) //{{{ - { - onMove(mouseAbs(e)); - return false; - } - //}}} - function trackUp(e) //{{{ - { - e.preventDefault(); - e.stopPropagation(); - - if (btndown) { - btndown = false; - - onDone(mouseAbs(e)); - - if (Selection.isAwake()) { - options.onSelect.call(api, unscale(Coords.getFixed())); - } - - toBack(); - onMove = function () {}; - onDone = function () {}; - } - - return false; - } - //}}} - function activateHandlers(move, done) //{{{ - { - btndown = true; - onMove = move; - onDone = done; - toFront(); - return false; - } - //}}} - function trackTouchMove(e) //{{{ - { - e.pageX = e.originalEvent.changedTouches[0].pageX; - e.pageY = e.originalEvent.changedTouches[0].pageY; - return trackMove(e); - } - //}}} - function trackTouchEnd(e) //{{{ - { - e.pageX = e.originalEvent.changedTouches[0].pageX; - e.pageY = e.originalEvent.changedTouches[0].pageY; - return trackUp(e); - } - //}}} - function setCursor(t) //{{{ - { - $trk.css('cursor', t); - } - //}}} - - if (!trackDoc) { - $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp); - } - - $img.before($trk); - return { - activateHandlers: activateHandlers, - setCursor: setCursor - }; - }()); - //}}} - // KeyManager Module {{{ - var KeyManager = (function () { - var $keymgr = $('').css({ - position: 'fixed', - left: '-120px', - width: '12px' - }), - $keywrap = $('
    ').css({ - position: 'absolute', - overflow: 'hidden' - }).append($keymgr); - - function watchKeys() //{{{ - { - if (options.keySupport) { - $keymgr.show(); - $keymgr.focus(); - } - } - //}}} - function onBlur(e) //{{{ - { - $keymgr.hide(); - } - //}}} - function doNudge(e, x, y) //{{{ - { - if (options.allowMove) { - Coords.moveOffset([x, y]); - Selection.updateVisible(true); - } - e.preventDefault(); - e.stopPropagation(); - } - //}}} - function parseKey(e) //{{{ - { - if (e.ctrlKey || e.metaKey) { - return true; - } - shift_down = e.shiftKey ? true : false; - var nudge = shift_down ? 10 : 1; - - switch (e.keyCode) { - case 37: - doNudge(e, -nudge, 0); - break; - case 39: - doNudge(e, nudge, 0); - break; - case 38: - doNudge(e, 0, -nudge); - break; - case 40: - doNudge(e, 0, nudge); - break; - case 27: - if (options.allowSelect) Selection.release(); - break; - case 9: - return true; - } - - return false; - } - //}}} - - if (options.keySupport) { - $keymgr.keydown(parseKey).blur(onBlur); - if (ie6mode || !options.fixedSupport) { - $keymgr.css({ - position: 'absolute', - left: '-20px' - }); - $keywrap.append($keymgr).insertBefore($img); - } else { - $keymgr.insertBefore($img); - } - } - - - return { - watchKeys: watchKeys - }; - }()); - //}}} - // }}} - // API methods {{{ - function setClass(cname) //{{{ - { - $div.removeClass().addClass(cssClass('holder')).addClass(cname); - } - //}}} - function animateTo(a, callback) //{{{ - { - var x1 = parseInt(a[0], 10) / xscale, - y1 = parseInt(a[1], 10) / yscale, - x2 = parseInt(a[2], 10) / xscale, - y2 = parseInt(a[3], 10) / yscale; - - if (animating) { - return; - } - - var animto = Coords.flipCoords(x1, y1, x2, y2), - c = Coords.getFixed(), - initcr = [c.x, c.y, c.x2, c.y2], - animat = initcr, - interv = options.animationDelay, - ix1 = animto[0] - initcr[0], - iy1 = animto[1] - initcr[1], - ix2 = animto[2] - initcr[2], - iy2 = animto[3] - initcr[3], - pcent = 0, - velocity = options.swingSpeed; - - x = animat[0]; - y = animat[1]; - x2 = animat[2]; - y2 = animat[3]; - - Selection.animMode(true); - var anim_timer; - - function queueAnimator() { - window.setTimeout(animator, interv); - } - var animator = (function () { - return function () { - pcent += (100 - pcent) / velocity; - - animat[0] = x + ((pcent / 100) * ix1); - animat[1] = y + ((pcent / 100) * iy1); - animat[2] = x2 + ((pcent / 100) * ix2); - animat[3] = y2 + ((pcent / 100) * iy2); - - if (pcent >= 99.8) { - pcent = 100; - } - if (pcent < 100) { - setSelectRaw(animat); - queueAnimator(); - } else { - Selection.done(); - if (typeof(callback) === 'function') { - callback.call(api); - } - } - }; - }()); - queueAnimator(); - } - //}}} - function setSelect(rect) //{{{ - { - setSelectRaw([parseInt(rect[0], 10) / xscale, parseInt(rect[1], 10) / yscale, parseInt(rect[2], 10) / xscale, parseInt(rect[3], 10) / yscale]); - options.onSelect.call(api, unscale(Coords.getFixed())); - Selection.enableHandles(); - } - //}}} - function setSelectRaw(l) //{{{ - { - Coords.setPressed([l[0], l[1]]); - Coords.setCurrent([l[2], l[3]]); - Selection.update(); - } - //}}} - function tellSelect() //{{{ - { - return unscale(Coords.getFixed()); - } - //}}} - function tellScaled() //{{{ - { - return Coords.getFixed(); - } - //}}} - function setOptionsNew(opt) //{{{ - { - setOptions(opt); - interfaceUpdate(); - } - //}}} - function disableCrop() //{{{ - { - options.disabled = true; - Selection.disableHandles(); - Selection.setCursor('default'); - Tracker.setCursor('default'); - } - //}}} - function enableCrop() //{{{ - { - options.disabled = false; - interfaceUpdate(); - } - //}}} - function cancelCrop() //{{{ - { - Selection.done(); - Tracker.activateHandlers(null, null); - } - //}}} - function destroy() //{{{ - { - $div.remove(); - $origimg.show(); - $(obj).removeData('Jcrop'); - } - //}}} - function setImage(src, callback) //{{{ - { - Selection.release(); - disableCrop(); - var img = new Image(); - img.onload = function () { - var iw = img.width; - var ih = img.height; - var bw = options.boxWidth; - var bh = options.boxHeight; - $img.width(iw).height(ih); - $img.attr('src', src); - $img2.attr('src', src); - presize($img, bw, bh); - boundx = $img.width(); - boundy = $img.height(); - $img2.width(boundx).height(boundy); - $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2)); - $div.width(boundx).height(boundy); - Shade.resize(boundx,boundy); - enableCrop(); - - if (typeof(callback) === 'function') { - callback.call(api); - } - }; - img.src = src; - } - //}}} - function colorChangeMacro($obj,color,now) { - var mycolor = color || options.bgColor; - if (options.bgFade && supportsColorFade() && options.fadeTime && !now) { - $obj.animate({ - backgroundColor: mycolor - }, { - queue: false, - duration: options.fadeTime - }); - } else { - $obj.css('backgroundColor', mycolor); - } - } - function interfaceUpdate(alt) //{{{ - // This method tweaks the interface based on options object. - // Called when options are changed and at end of initialization. - { - if (options.allowResize) { - if (alt) { - Selection.enableOnly(); - } else { - Selection.enableHandles(); - } - } else { - Selection.disableHandles(); - } - - Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); - Selection.setCursor(options.allowMove ? 'move' : 'default'); - - if (options.hasOwnProperty('trueSize')) { - xscale = options.trueSize[0] / boundx; - yscale = options.trueSize[1] / boundy; - } - - if (options.hasOwnProperty('setSelect')) { - setSelect(options.setSelect); - Selection.done(); - delete(options.setSelect); - } - - Shade.refresh(); - - if (options.bgColor != bgcolor) { - colorChangeMacro( - options.shade? Shade.getShades(): $div, - options.shade? - (options.shadeColor || options.bgColor): - options.bgColor - ); - bgcolor = options.bgColor; - } - - if (bgopacity != options.bgOpacity) { - bgopacity = options.bgOpacity; - if (options.shade) Shade.refresh(); - else Selection.setBgOpacity(bgopacity); - } - - xlimit = options.maxSize[0] || 0; - ylimit = options.maxSize[1] || 0; - xmin = options.minSize[0] || 0; - ymin = options.minSize[1] || 0; - - if (options.hasOwnProperty('outerImage')) { - $img.attr('src', options.outerImage); - delete(options.outerImage); - } - - Selection.refresh(); - } - //}}} - //}}} - - if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection); - - $hdl_holder.hide(); - interfaceUpdate(true); - - var api = { - setImage: setImage, - animateTo: animateTo, - setSelect: setSelect, - setOptions: setOptionsNew, - tellSelect: tellSelect, - tellScaled: tellScaled, - setClass: setClass, - - disable: disableCrop, - enable: enableCrop, - cancel: cancelCrop, - release: Selection.release, - destroy: destroy, - - focus: KeyManager.watchKeys, - - getBounds: function () { - return [boundx * xscale, boundy * yscale]; - }, - getWidgetSize: function () { - return [boundx, boundy]; - }, - getScaleFactor: function () { - return [xscale, yscale]; - }, - - ui: { - holder: $div, - selection: $sel - } - }; - - if ($.browser.msie) { - $div.bind('selectstart', function () { - return false; - }); - } - - $origimg.data('Jcrop', api); - return api; - }; - $.fn.Jcrop = function (options, callback) //{{{ - { - var api; - // Iterate over each object, attach Jcrop - this.each(function () { - // If we've already attached to this object - if ($(this).data('Jcrop')) { - // The API can be requested this way (undocumented) - if (options === 'api') return $(this).data('Jcrop'); - // Otherwise, we just reset the options... - else $(this).data('Jcrop').setOptions(options); - } - // If we haven't been attached, preload and attach - else { - if (this.tagName == 'IMG') - $.Jcrop.Loader(this,function(){ - $(this).css({display:'block',visibility:'hidden'}); - api = $.Jcrop(this, options); - if ($.isFunction(callback)) callback.call(api); - }); - else { - $(this).css({display:'block',visibility:'hidden'}); - api = $.Jcrop(this, options); - if ($.isFunction(callback)) callback.call(api); - } - } - }); - - // Return "this" so the object is chainable (jQuery-style) - return this; - }; - //}}} - // $.Jcrop.Loader - basic image loader {{{ - - $.Jcrop.Loader = function(imgobj,success,error){ - var $img = $(imgobj), img = $img[0]; - - function completeCheck(){ - if (img.complete) { - $img.unbind('.jcloader'); - if ($.isFunction(success)) success.call(img); - } - else window.setTimeout(completeCheck,50); - } - - $img - .bind('load.jcloader',completeCheck) - .bind('error.jcloader',function(e){ - $img.unbind('.jcloader'); - if ($.isFunction(error)) error.call(img); - }); - - if (img.complete && $.isFunction(success)){ - $img.unbind('.jcloader'); - success.call(img); - } - }; - - //}}} - // Global Defaults {{{ - $.Jcrop.defaults = { - - // Basic Settings - allowSelect: true, - allowMove: true, - allowResize: true, - - trackDocument: true, - - // Styling Options - baseClass: 'jcrop', - addClass: null, - bgColor: 'black', - bgOpacity: 0.6, - bgFade: false, - borderOpacity: 0.4, - handleOpacity: 0.5, - handleSize: 7, - handleOffset: 5, - - aspectRatio: 0, - keySupport: true, - cornerHandles: true, - sideHandles: true, - drawBorders: true, - dragEdges: true, - fixedSupport: true, - touchSupport: null, - - shade: null, - - boxWidth: 0, - boxHeight: 0, - boundary: 2, - fadeTime: 400, - animationDelay: 20, - swingSpeed: 3, - - minSelect: [0, 0], - maxSize: [0, 0], - minSize: [0, 0], - - // Callbacks / Event Handlers - onChange: function () {}, - onSelect: function () {}, - onDblClick: function () {}, - onRelease: function () {} - }; - - // }}} -}(jQuery)); diff --git a/apps/contacts/js/jquery.Jcrop.min.js b/apps/contacts/js/jquery.Jcrop.min.js deleted file mode 100644 index 0c05d67c22..0000000000 --- a/apps/contacts/js/jquery.Jcrop.min.js +++ /dev/null @@ -1,255 +0,0 @@ -/** - * jquery.Jcrop.min.js v0.9.9 {{{ (build:20120102) - * jQuery Image Cropping Plugin - released under MIT License - * Copyright (c) 2008-2012 Tapmodo Interactive LLC - * https://github.com/tapmodo/Jcrop - */ - -(function($){$.Jcrop=function(obj,opt){var options=$.extend({},$.Jcrop.defaults),docOffset,lastcurs,ie6mode=false;function px(n){return parseInt(n,10)+'px';} -function cssClass(cl){return options.baseClass+'-'+cl;} -function supportsColorFade(){return $.fx.step.hasOwnProperty('backgroundColor');} -function getPos(obj) -{var pos=$(obj).offset();return[pos.left,pos.top];} -function mouseAbs(e) -{return[(e.pageX-docOffset[0]),(e.pageY-docOffset[1])];} -function setOptions(opt) -{if(typeof(opt)!=='object')opt={};options=$.extend(options,opt);$.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e){if(typeof(options[e])!=='function')options[e]=function(){};});} -function startDragMode(mode,pos) -{docOffset=getPos($img);Tracker.setCursor(mode==='move'?mode:mode+'-resize');if(mode==='move'){return Tracker.activateHandlers(createMover(pos),doneSelect);} -var fc=Coords.getFixed();var opp=oppLockCorner(mode);var opc=Coords.getCorner(oppLockCorner(opp));Coords.setPressed(Coords.getCorner(opp));Coords.setCurrent(opc);Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);} -function dragmodeHandler(mode,f) -{return function(pos){if(!options.aspectRatio){switch(mode){case'e':pos[1]=f.y2;break;case'w':pos[1]=f.y2;break;case'n':pos[0]=f.x2;break;case's':pos[0]=f.x2;break;}}else{switch(mode){case'e':pos[1]=f.y+1;break;case'w':pos[1]=f.y+1;break;case'n':pos[0]=f.x+1;break;case's':pos[0]=f.x+1;break;}} -Coords.setCurrent(pos);Selection.update();};} -function createMover(pos) -{var lloc=pos;KeyManager.watchKeys();return function(pos){Coords.moveOffset([pos[0]-lloc[0],pos[1]-lloc[1]]);lloc=pos;Selection.update();};} -function oppLockCorner(ord) -{switch(ord){case'n':return'sw';case's':return'nw';case'e':return'nw';case'w':return'ne';case'ne':return'sw';case'nw':return'se';case'se':return'nw';case'sw':return'ne';}} -function createDragger(ord) -{return function(e){if(options.disabled){return false;} -if((ord==='move')&&!options.allowMove){return false;} -docOffset=getPos($img);btndown=true;startDragMode(ord,mouseAbs(e));e.stopPropagation();e.preventDefault();return false;};} -function presize($obj,w,h) -{var nw=$obj.width(),nh=$obj.height();if((nw>w)&&w>0){nw=w;nh=(w/$obj.width())*$obj.height();} -if((nh>h)&&h>0){nh=h;nw=(h/$obj.height())*$obj.width();} -xscale=$obj.width()/nw;yscale=$obj.height()/nh;$obj.width(nw).height(nh);} -function unscale(c) -{return{x:parseInt(c.x*xscale,10),y:parseInt(c.y*yscale,10),x2:parseInt(c.x2*xscale,10),y2:parseInt(c.y2*yscale,10),w:parseInt(c.w*xscale,10),h:parseInt(c.h*yscale,10)};} -function doneSelect(pos) -{var c=Coords.getFixed();if((c.w>options.minSelect[0])&&(c.h>options.minSelect[1])){Selection.enableHandles();Selection.done();}else{Selection.release();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');} -function newSelection(e) -{if(options.disabled){return false;} -if(!options.allowSelect){return false;} -btndown=true;docOffset=getPos($img);Selection.disableHandles();Tracker.setCursor('crosshair');var pos=mouseAbs(e);Coords.setPressed(pos);Selection.update();Tracker.activateHandlers(selectDrag,doneSelect);KeyManager.watchKeys();e.stopPropagation();e.preventDefault();return false;} -function selectDrag(pos) -{Coords.setCurrent(pos);Selection.update();} -function newTracker() -{var trk=$('
    ').addClass(cssClass('tracker'));if($.browser.msie){trk.css({opacity:0,backgroundColor:'white'});} -return trk;} -if($.browser.msie&&($.browser.version.split('.')[0]==='6')){ie6mode=true;} -if(typeof(obj)!=='object'){obj=$(obj)[0];} -if(typeof(opt)!=='object'){opt={};} -setOptions(opt);var img_css={border:'none',visibility:'visible',margin:0,padding:0,position:'absolute',top:0,left:0};var $origimg=$(obj),img_mode=true;if(obj.tagName=='IMG'){if($origimg[0].width!=0&&$origimg[0].height!=0){$origimg.width($origimg[0].width);$origimg.height($origimg[0].height);}else{var tempImage=new Image();tempImage.src=$origimg[0].src;$origimg.width(tempImage.width);$origimg.height(tempImage.height);} -var $img=$origimg.clone().removeAttr('id').css(img_css).show();$img.width($origimg.width());$img.height($origimg.height());$origimg.after($img).hide();}else{$img=$origimg.css(img_css).show();img_mode=false;if(options.shade===null){options.shade=true;}} -presize($img,options.boxWidth,options.boxHeight);var boundx=$img.width(),boundy=$img.height(),$div=$('
    ').width(boundx).height(boundy).addClass(cssClass('holder')).css({position:'relative',backgroundColor:options.bgColor}).insertAfter($origimg).append($img);if(options.addClass){$div.addClass(options.addClass);} -var $img2=$('
    '),$img_holder=$('
    ').width('100%').height('100%').css({zIndex:310,position:'absolute',overflow:'hidden'}),$hdl_holder=$('
    ').width('100%').height('100%').css('zIndex',320),$sel=$('
    ').css({position:'absolute',zIndex:600}).dblclick(function(){var c=Coords.getFixed();options.onDblClick.call(api,c);}).insertBefore($img).append($img_holder,$hdl_holder);if(img_mode){$img2=$('').attr('src',$img.attr('src')).css(img_css).width(boundx).height(boundy),$img_holder.append($img2);} -if(ie6mode){$sel.css({overflowY:'hidden'});} -var bound=options.boundary;var $trk=newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)).css({position:'absolute',top:px(-bound),left:px(-bound),zIndex:290}).mousedown(newSelection);var bgcolor=options.bgColor,bgopacity=options.bgOpacity,xlimit,ylimit,xmin,ymin,xscale,yscale,enabled=true,btndown,animating,shift_down;docOffset=getPos($img);var Touch=(function(){function hasTouchSupport(){var support={},events=['touchstart','touchmove','touchend'],el=document.createElement('div'),i;try{for(i=0;ix1+ox){ox-=ox+x1;} -if(0>y1+oy){oy-=oy+y1;} -if(boundyboundx){xx=boundx;h=Math.abs((xx-x1)/aspect);yy=rh<0?y1-h:h+y1;}}else{xx=x2;h=rwa/aspect;yy=rh<0?y1-h:y1+h;if(yy<0){yy=0;w=Math.abs((yy-y1)*aspect);xx=rw<0?x1-w:w+x1;}else if(yy>boundy){yy=boundy;w=Math.abs(yy-y1)*aspect;xx=rw<0?x1-w:w+x1;}} -if(xx>x1){if(xx-x1max_x){xx=x1+max_x;} -if(yy>y1){yy=y1+(xx-x1)/aspect;}else{yy=y1-(xx-x1)/aspect;}}else if(xxmax_x){xx=x1-max_x;} -if(yy>y1){yy=y1+(x1-xx)/aspect;}else{yy=y1-(x1-xx)/aspect;}} -if(xx<0){x1-=xx;xx=0;}else if(xx>boundx){x1-=xx-boundx;xx=boundx;} -if(yy<0){y1-=yy;yy=0;}else if(yy>boundy){y1-=yy-boundy;yy=boundy;} -return makeObj(flipCoords(x1,y1,xx,yy));} -function rebound(p) -{if(p[0]<0){p[0]=0;} -if(p[1]<0){p[1]=0;} -if(p[0]>boundx){p[0]=boundx;} -if(p[1]>boundy){p[1]=boundy;} -return[p[0],p[1]];} -function flipCoords(x1,y1,x2,y2) -{var xa=x1,xb=x2,ya=y1,yb=y2;if(x2xlimit)){x2=(xsize>0)?(x1+xlimit):(x1-xlimit);} -if(ylimit&&(Math.abs(ysize)>ylimit)){y2=(ysize>0)?(y1+ylimit):(y1-ylimit);} -if(ymin/yscale&&(Math.abs(ysize)0)?(y1+ymin/yscale):(y1-ymin/yscale);} -if(xmin/xscale&&(Math.abs(xsize)0)?(x1+xmin/xscale):(x1-xmin/xscale);} -if(x1<0){x2-=x1;x1-=x1;} -if(y1<0){y2-=y1;y1-=y1;} -if(x2<0){x1-=x2;x2-=x2;} -if(y2<0){y1-=y2;y2-=y2;} -if(x2>boundx){delta=x2-boundx;x1-=delta;x2-=delta;} -if(y2>boundy){delta=y2-boundy;y1-=delta;y2-=delta;} -if(x1>boundx){delta=x1-boundy;y2-=delta;y1-=delta;} -if(y1>boundy){delta=y1-boundy;y2-=delta;y1-=delta;} -return makeObj(flipCoords(x1,y1,x2,y2));} -function makeObj(a) -{return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]};} -return{flipCoords:flipCoords,setPressed:setPressed,setCurrent:setCurrent,getOffset:getOffset,moveOffset:moveOffset,getCorner:getCorner,getFixed:getFixed};}());var Shade=(function(){var enabled=false,holder=$('
    ').css({position:'absolute',zIndex:240,opacity:0}),shades={top:createShade(),left:createShade().height(boundy),right:createShade().height(boundy),bottom:createShade()};function resizeShades(w,h){shades.left.css({height:px(h)});shades.right.css({height:px(h)});} -function updateAuto() -{return updateShade(Coords.getFixed());} -function updateShade(c) -{shades.top.css({left:px(c.x),width:px(c.w),height:px(c.y)});shades.bottom.css({top:px(c.y2),left:px(c.x),width:px(c.w),height:px(boundy-c.y2)});shades.right.css({left:px(c.x2),width:px(boundx-c.x2)});shades.left.css({width:px(c.x)});} -function createShade(){return $('
    ').css({position:'absolute',backgroundColor:options.shadeColor||options.bgColor}).appendTo(holder);} -function enableShade(){if(!enabled){enabled=true;holder.insertBefore($img);updateAuto();Selection.setBgOpacity(1,0,1);$img2.hide();setBgColor(options.shadeColor||options.bgColor,1);if(Selection.isAwake()) -{setOpacity(options.bgOpacity,1);} -else setOpacity(1,1);}} -function setBgColor(color,now){colorChangeMacro(getShades(),color,now);} -function disableShade(){if(enabled){holder.remove();$img2.show();enabled=false;if(Selection.isAwake()){Selection.setBgOpacity(options.bgOpacity,1,1);}else{Selection.setBgOpacity(1,1,1);Selection.disableHandles();} -colorChangeMacro($div,0,1);}} -function setOpacity(opacity,now){if(enabled){if(options.bgFade&&!now){holder.animate({opacity:1-opacity},{queue:false,duration:options.fadeTime});} -else holder.css({opacity:1-opacity});}} -function refreshAll(){options.shade?enableShade():disableShade();if(Selection.isAwake())setOpacity(options.bgOpacity);} -function getShades(){return holder.children();} -return{update:updateAuto,updateRaw:updateShade,getShades:getShades,setBgColor:setBgColor,enable:enableShade,disable:disableShade,resize:resizeShades,refresh:refreshAll,opacity:setOpacity};}());var Selection=(function(){var awake,hdep=370;var borders={};var handle={};var seehandles=false;var hhs=options.handleOffset;function insertBorder(type) -{var jq=$('
    ').css({position:'absolute',opacity:options.borderOpacity}).addClass(cssClass(type));$img_holder.append(jq);return jq;} -function dragDiv(ord,zi) -{var jq=$('
    ').mousedown(createDragger(ord)).css({cursor:ord+'-resize',position:'absolute',zIndex:zi}).addClass('ord-'+ord);if(Touch.support){jq.bind('touchstart.jcrop',Touch.createDragger(ord));} -$hdl_holder.append(jq);return jq;} -function insertHandle(ord) -{var hs=options.handleSize;return dragDiv(ord,hdep++).css({top:px(-hhs+1),left:px(-hhs+1),opacity:options.handleOpacity}).width(hs).height(hs).addClass(cssClass('handle'));} -function insertDragbar(ord) -{var s=options.handleSize,h=s,w=s,t=hhs,l=hhs;switch(ord){case'n':case's':w='100%';break;case'e':case'w':h='100%';break;} -return dragDiv(ord,hdep++).width(w).height(h).css({top:px(-t+1),left:px(-l+1)});} -function createHandles(li) -{var i;for(i=0;i').css({position:'fixed',left:'-120px',width:'12px'}),$keywrap=$('
    ').css({position:'absolute',overflow:'hidden'}).append($keymgr);function watchKeys() -{if(options.keySupport){$keymgr.show();$keymgr.focus();}} -function onBlur(e) -{$keymgr.hide();} -function doNudge(e,x,y) -{if(options.allowMove){Coords.moveOffset([x,y]);Selection.updateVisible(true);} -e.preventDefault();e.stopPropagation();} -function parseKey(e) -{if(e.ctrlKey||e.metaKey){return true;} -shift_down=e.shiftKey?true:false;var nudge=shift_down?10:1;switch(e.keyCode){case 37:doNudge(e,-nudge,0);break;case 39:doNudge(e,nudge,0);break;case 38:doNudge(e,0,-nudge);break;case 40:doNudge(e,0,nudge);break;case 27:if(options.allowSelect)Selection.release();break;case 9:return true;} -return false;} -if(options.keySupport){$keymgr.keydown(parseKey).blur(onBlur);if(ie6mode||!options.fixedSupport){$keymgr.css({position:'absolute',left:'-20px'});$keywrap.append($keymgr).insertBefore($img);}else{$keymgr.insertBefore($img);}} -return{watchKeys:watchKeys};}());function setClass(cname) -{$div.removeClass().addClass(cssClass('holder')).addClass(cname);} -function animateTo(a,callback) -{var x1=parseInt(a[0],10)/xscale,y1=parseInt(a[1],10)/yscale,x2=parseInt(a[2],10)/xscale,y2=parseInt(a[3],10)/yscale;if(animating){return;} -var animto=Coords.flipCoords(x1,y1,x2,y2),c=Coords.getFixed(),initcr=[c.x,c.y,c.x2,c.y2],animat=initcr,interv=options.animationDelay,ix1=animto[0]-initcr[0],iy1=animto[1]-initcr[1],ix2=animto[2]-initcr[2],iy2=animto[3]-initcr[3],pcent=0,velocity=options.swingSpeed;x=animat[0];y=animat[1];x2=animat[2];y2=animat[3];Selection.animMode(true);var anim_timer;function queueAnimator(){window.setTimeout(animator,interv);} -var animator=(function(){return function(){pcent+=(100-pcent)/velocity;animat[0]=x+((pcent/100)*ix1);animat[1]=y+((pcent/100)*iy1);animat[2]=x2+((pcent/100)*ix2);animat[3]=y2+((pcent/100)*iy2);if(pcent>=99.8){pcent=100;} -if(pcent<100){setSelectRaw(animat);queueAnimator();}else{Selection.done();if(typeof(callback)==='function'){callback.call(api);}}};}());queueAnimator();} -function setSelect(rect) -{setSelectRaw([parseInt(rect[0],10)/xscale,parseInt(rect[1],10)/yscale,parseInt(rect[2],10)/xscale,parseInt(rect[3],10)/yscale]);options.onSelect.call(api,unscale(Coords.getFixed()));Selection.enableHandles();} -function setSelectRaw(l) -{Coords.setPressed([l[0],l[1]]);Coords.setCurrent([l[2],l[3]]);Selection.update();} -function tellSelect() -{return unscale(Coords.getFixed());} -function tellScaled() -{return Coords.getFixed();} -function setOptionsNew(opt) -{setOptions(opt);interfaceUpdate();} -function disableCrop() -{options.disabled=true;Selection.disableHandles();Selection.setCursor('default');Tracker.setCursor('default');} -function enableCrop() -{options.disabled=false;interfaceUpdate();} -function cancelCrop() -{Selection.done();Tracker.activateHandlers(null,null);} -function destroy() -{$div.remove();$origimg.show();$(obj).removeData('Jcrop');} -function setImage(src,callback) -{Selection.release();disableCrop();var img=new Image();img.onload=function(){var iw=img.width;var ih=img.height;var bw=options.boxWidth;var bh=options.boxHeight;$img.width(iw).height(ih);$img.attr('src',src);$img2.attr('src',src);presize($img,bw,bh);boundx=$img.width();boundy=$img.height();$img2.width(boundx).height(boundy);$trk.width(boundx+(bound*2)).height(boundy+(bound*2));$div.width(boundx).height(boundy);Shade.resize(boundx,boundy);enableCrop();if(typeof(callback)==='function'){callback.call(api);}};img.src=src;} -function colorChangeMacro($obj,color,now){var mycolor=color||options.bgColor;if(options.bgFade&&supportsColorFade()&&options.fadeTime&&!now){$obj.animate({backgroundColor:mycolor},{queue:false,duration:options.fadeTime});}else{$obj.css('backgroundColor',mycolor);}} -function interfaceUpdate(alt) -{if(options.allowResize){if(alt){Selection.enableOnly();}else{Selection.enableHandles();}}else{Selection.disableHandles();} -Tracker.setCursor(options.allowSelect?'crosshair':'default');Selection.setCursor(options.allowMove?'move':'default');if(options.hasOwnProperty('trueSize')){xscale=options.trueSize[0]/boundx;yscale=options.trueSize[1]/boundy;} -if(options.hasOwnProperty('setSelect')){setSelect(options.setSelect);Selection.done();delete(options.setSelect);} -Shade.refresh();if(options.bgColor!=bgcolor){colorChangeMacro(options.shade?Shade.getShades():$div,options.shade?(options.shadeColor||options.bgColor):options.bgColor);bgcolor=options.bgColor;} -if(bgopacity!=options.bgOpacity){bgopacity=options.bgOpacity;if(options.shade)Shade.refresh();else Selection.setBgOpacity(bgopacity);} -xlimit=options.maxSize[0]||0;ylimit=options.maxSize[1]||0;xmin=options.minSize[0]||0;ymin=options.minSize[1]||0;if(options.hasOwnProperty('outerImage')){$img.attr('src',options.outerImage);delete(options.outerImage);} -Selection.refresh();} -if(Touch.support)$trk.bind('touchstart.jcrop',Touch.newSelection);$hdl_holder.hide();interfaceUpdate(true);var api={setImage:setImage,animateTo:animateTo,setSelect:setSelect,setOptions:setOptionsNew,tellSelect:tellSelect,tellScaled:tellScaled,setClass:setClass,disable:disableCrop,enable:enableCrop,cancel:cancelCrop,release:Selection.release,destroy:destroy,focus:KeyManager.watchKeys,getBounds:function(){return[boundx*xscale,boundy*yscale];},getWidgetSize:function(){return[boundx,boundy];},getScaleFactor:function(){return[xscale,yscale];},ui:{holder:$div,selection:$sel}};if($.browser.msie){$div.bind('selectstart',function(){return false;});} -$origimg.data('Jcrop',api);return api;};$.fn.Jcrop=function(options,callback) -{var api;this.each(function(){if($(this).data('Jcrop')){if(options==='api')return $(this).data('Jcrop');else $(this).data('Jcrop').setOptions(options);} -else{if(this.tagName=='IMG') -$.Jcrop.Loader(this,function(){$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);});else{$(this).css({display:'block',visibility:'hidden'});api=$.Jcrop(this,options);if($.isFunction(callback))callback.call(api);}}});return this;};$.Jcrop.Loader=function(imgobj,success,error){var $img=$(imgobj),img=$img[0];function completeCheck(){if(img.complete){$img.unbind('.jcloader');if($.isFunction(success))success.call(img);} -else window.setTimeout(completeCheck,50);} -$img.bind('load.jcloader',completeCheck).bind('error.jcloader',function(e){$img.unbind('.jcloader');if($.isFunction(error))error.call(img);});if(img.complete&&$.isFunction(success)){$img.unbind('.jcloader');success.call(img);}};$.Jcrop.defaults={allowSelect:true,allowMove:true,allowResize:true,trackDocument:true,baseClass:'jcrop',addClass:null,bgColor:'black',bgOpacity:0.6,bgFade:false,borderOpacity:0.4,handleOpacity:0.5,handleSize:7,handleOffset:5,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,fixedSupport:true,touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}};}(jQuery)); \ No newline at end of file diff --git a/apps/contacts/js/jquery.combobox.js b/apps/contacts/js/jquery.combobox.js deleted file mode 100644 index d9959eb6cd..0000000000 --- a/apps/contacts/js/jquery.combobox.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Inspired by http://jqueryui.com/demos/autocomplete/#combobox - */ - -(function( $ ) { - $.widget('ui.combobox', { - options: { - id: null, - name: null, - showButton: false, - editable: true - }, - _create: function() { - var self = this, - select = this.element.hide(), - selected = select.children(':selected'), - value = selected.val() ? selected.text() : ''; - var input = this.input = $('') - .insertAfter( select ) - .val( value ) - .autocomplete({ - delay: 0, - minLength: 0, - source: function( request, response ) { - var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" ); - response( select.children('option').map(function() { - var text = $( this ).text(); - if ( this.value && ( !request.term || matcher.test(text) ) ) - return { - label: text.replace( - new RegExp( - '(?![^&;]+;)(?!<[^<>]*)(' + - $.ui.autocomplete.escapeRegex(request.term) + - ')(?![^<>]*>)(?![^&;]+;)', 'gi' - ), '$1'), - value: text, - option: this - }; - }) ); - }, - select: function( event, ui ) { - self.input.val($(ui.item.option).text()); - self.input.trigger('change'); - ui.item.option.selected = true; - self._trigger('selected', event, { - item: ui.item.option - }); - }, - change: function( event, ui ) { - if ( !ui.item ) { - var matcher = new RegExp( '^' + $.ui.autocomplete.escapeRegex( $(this).val() ) + '$', 'i' ), - valid = false; - self.input.val($(this).val()); - //self.input.trigger('change'); - select.children('option').each(function() { - if ( $( this ).text().match( matcher ) ) { - this.selected = valid = true; - return false; - } - }); - if ( !self.options['editable'] && !valid ) { - // remove invalid value, as it didn't match anything - $( this ).val( "" ); - select.val( "" ); - input.data('autocomplete').term = ''; - return false; - } - } - } - }) - .addClass('ui-widget ui-widget-content ui-corner-left'); - - input.data('autocomplete')._renderItem = function( ul, item ) { - return $('
  • ') - .data('item.autocomplete', item ) - .append('' + item.label + '') - .appendTo( ul ); - }; - $.each(this.options, function(key, value) { - self._setOption(key, value); - }); - - input.dblclick(function() { - // pass empty string as value to search for, displaying all results - input.autocomplete('search', ''); - }); - - if(this.options['showButton']) { - this.button = $('') - .attr('tabIndex', -1 ) - .attr('title', 'Show All Items') - .insertAfter( input ) - .addClass('svg') - .addClass('action') - .addClass('combo-button') - .click(function() { - // close if already visible - if ( input.autocomplete('widget').is(':visible') ) { - input.autocomplete('close'); - return; - } - - // work around a bug (likely same cause as #5265) - $( this ).blur(); - - // pass empty string as value to search for, displaying all results - input.autocomplete('search', ''); - input.focus(); - }); - } - }, - destroy: function() { - this.input.remove(); - //this.button.remove(); - this.element.show(); - $.Widget.prototype.destroy.call( this ); - }, - value: function(val) { - if(val != undefined) { - this.input.val(val); - } else { - return this.input.val(); - } - }, - _setOption: function( key, value ) { - switch( key ) { - case 'id': - this.options['id'] = value; - this.input.attr('id', value); - break; - case 'name': - this.options['name'] = value; - this.input.attr('name', value); - break; - case 'attributes': - var input = this.input; - $.each(this.options['attributes'], function(key, value) { - input.attr(key, value); - }); - break; - case 'classes': - var input = this.input; - $.each(this.options['classes'], function(key, value) { - input.addClass(value); - }); - break; - case 'editable': - case 'showButton': - this.options[key] = value; - break; - } - // In jQuery UI 1.8, you have to manually invoke the _setOption method from the base widget - $.Widget.prototype._setOption.apply( this, arguments ); - // In jQuery UI 1.9 and above, you use the _super method instead - //this._super( "_setOption", key, value ); - } - }); -})( jQuery ); diff --git a/apps/contacts/js/jquery.multi-autocomplete.js b/apps/contacts/js/jquery.multi-autocomplete.js deleted file mode 100644 index 5516a74b03..0000000000 --- a/apps/contacts/js/jquery.multi-autocomplete.js +++ /dev/null @@ -1,94 +0,0 @@ -/** - * Inspired by http://jqueryui.com/demos/autocomplete/#multiple - */ - -(function( $ ) { - $.widget('ui.multiple_autocomplete', { - _create: function() { - var self = this; - function split( val ) { - return val.split( /,\s*/ ); - } - function extractLast( term ) { - return split( term ).pop(); - } - function showOptions() { - if(!self.element.autocomplete('widget').is(':visible') && self.element.val().trim() == '') { - self.element.autocomplete('search', ''); - } - } - //console.log('_create: ' + this.options['id']); - this.element.bind('click', function( event ) { - showOptions(); - }); - this.element.bind('input', function( event ) { - showOptions(); - }); - this.element.bind('blur', function( event ) { - var tmp = self.element.val().trim(); - if(tmp[tmp.length-1] == ',') { - self.element.val(tmp.substring(0, tmp.length-1)); - } else { - self.element.val(tmp); - } - if(self.element.val().trim() != '') { - self.element.trigger('change'); // Changes wasn't saved when only using the dropdown. - } - }); - this.element.bind( "keydown", function( event ) { - if ( event.keyCode === $.ui.keyCode.TAB && - $( this ).data( "autocomplete" ).menu.active ) { - event.preventDefault(); - } - }) - .autocomplete({ - minLength: 0, - source: function( request, response ) { - // delegate back to autocomplete, but extract the last term - response( $.ui.autocomplete.filter( - self.options.source, extractLast( request.term ) ) ); - }, - focus: function() { - // prevent value inserted on focus - return false; - }, - select: function( event, ui ) { - var terms = split( this.value ); - // remove the current input - terms.pop(); - // add the selected item - terms.push( ui.item.value ); - // add placeholder to get the comma-and-space at the end - terms.push( "" ); - this.value = terms.join( ", " ); - return false; - } - }); - /*this.button = $( "" ) - .attr( "tabIndex", -1 ) - .attr( "title", "Show All Items" ) - .insertAfter( this.element ) - .addClass('svg') - .addClass('action') - .addClass('combo-button') - .click(function() { - // close if already visible - if ( self.element.autocomplete( "widget" ).is( ":visible" ) ) { - self.element.autocomplete( "close" ); - return; - } - - // work around a bug (likely same cause as #5265) - $( this ).blur(); - - var tmp = self.element.val().trim(); - if(tmp[tmp.length-1] != ',') { - self.element.val(tmp+', '); - } - // pass empty string as value to search for, displaying all results - self.element.autocomplete( "search", "" ); - self.element.focus(); - });*/ - }, - }); -})( jQuery ); diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js deleted file mode 100644 index 5bca0ab723..0000000000 --- a/apps/contacts/js/loader.js +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2012 Georg Ehrke - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -Contacts_Import={ - importdialog: function(filename){ - var path = $('#dir').val(); - $('body').append('
    '); - $('#contacts_import').load(OC.filePath('contacts', 'ajax', 'importdialog.php'), {filename:filename, path:path}, function(){Contacts_Import.initdialog(filename);}); - }, - initdialog: function(filename){ - $('#contacts_import_dialog').dialog({ - width : 500, - close : function() { - $(this).dialog('destroy').remove(); - $('#contacts_import').remove(); - } - }); - $('#import_done_button').click(function(){ - $('#contacts_import_dialog').dialog('destroy').remove(); - $('#contacts_import').remove(); - }); - $('#progressbar').progressbar({value: 0}); - $('#startimport').click(function(){ - var filename = $('#filename').val(); - var path = $('#path').val(); - var method = 'old'; - var addressbookid = $('#contacts option:selected').val(); - if($('#contacts option:selected').val() == 'newaddressbook'){ - var method = 'new'; - var addressbookname = $('#newaddressbook').val(); - var addressbookname = $.trim(addressbookname); - if(addressbookname == ''){ - $('#newaddressbook').css('background-color', '#FF2626'); - $('#newaddressbook').focus(function(){ - $('#newaddressbook').css('background-color', '#F8F8F8'); - }); - return false; - } - } - $('#newaddressbook').attr('readonly', 'readonly'); - $('#contacts').attr('disabled', 'disabled'); - var progresskey = $('#progresskey').val(); - $.post(OC.filePath('contacts', '', 'import.php') + '?progresskey='+progresskey, {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){ - if(jsondata.status == 'success'){ - $('#progressbar').progressbar('option', 'value', 100); - $('#import_done').find('p').html(t('contacts', 'Result: ') + jsondata.data.imported + t('contacts', ' imported, ') + jsondata.data.failed + t('contacts', ' failed.')); - } else { - $('#import_done').find('p').html(jsondata.message); - } - $('#import_done').show().find('p').addClass('bold'); - $('#progressbar').fadeOut('slow'); - }); - $('#form_container').css('display', 'none'); - $('#progressbar_container').css('display', 'block'); - window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500); - }); - $('#contacts').change(function(){ - if($('#contacts option:selected').val() == 'newaddressbook'){ - $('#newaddressbookform').slideDown('slow'); - }else{ - $('#newaddressbookform').slideUp('slow'); - } - }); - }, - getimportstatus: function(progresskey){ - $.get(OC.filePath('contacts', '', 'import.php') + '?progress=1&progresskey=' + progresskey, function(percent){ - $('#progressbar').progressbar('option', 'value', parseInt(percent)); - if(percent < 100){ - window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500); - }else{ - $('#import_done').css('display', 'block'); - } - }); - } -} -$(document).ready(function(){ - if(typeof FileActions !== 'undefined'){ - FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog); - FileActions.setDefault('text/vcard','importaddressbook'); - FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog); - FileActions.setDefault('text/x-vcard','importaddressbook'); - }; -}); \ No newline at end of file diff --git a/apps/contacts/l10n/ar.php b/apps/contacts/l10n/ar.php deleted file mode 100644 index 6bebda3b6a..0000000000 --- a/apps/contacts/l10n/ar.php +++ /dev/null @@ -1,58 +0,0 @@ - "خطء خلال توقيف كتاب العناوين.", -"There was an error adding the contact." => "خطء خلال اضافة معرفه جديده.", -"Cannot add empty property." => "لا يمكنك اضافه صفه خاليه.", -"At least one of the address fields has to be filled out." => "يجب ملء على الاقل خانه واحده من العنوان.", -"Error adding contact property." => "خطء خلال اضافة صفة المعرفه.", -"Error adding addressbook." => "خطء خلال اضافة كتاب عناوين.", -"Error activating addressbook." => "خطء خلال تفعيل كتاب العناوين.", -"Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة.", -"Error deleting contact property." => "خطء خلال محي الصفه.", -"Error updating contact property." => "خطء خلال تعديل الصفه.", -"Error updating addressbook." => "خطء خلال تعديل كتاب العناوين", -"Contacts" => "المعارف", -"This is not your addressbook." => "هذا ليس دفتر عناوينك.", -"Contact could not be found." => "لم يتم العثور على الشخص.", -"Address" => "عنوان", -"Telephone" => "الهاتف", -"Email" => "البريد الالكتروني", -"Organization" => "المؤسسة", -"Work" => "الوظيفة", -"Home" => "البيت", -"Mobile" => "الهاتف المحمول", -"Text" => "معلومات إضافية", -"Voice" => "صوت", -"Fax" => "الفاكس", -"Video" => "الفيديو", -"Pager" => "الرنان", -"Contact" => "معرفه", -"Add Contact" => "أضف شخص ", -"Addressbooks" => "كتب العناوين", -"New Address Book" => "كتاب عناوين جديد", -"CardDav Link" => "وصلة CardDav", -"Download" => "انزال", -"Edit" => "تعديل", -"Delete" => "حذف", -"Download contact" => "انزال المعرفه", -"Delete contact" => "امحي المعرفه", -"Birthday" => "تاريخ الميلاد", -"Preferred" => "مفضل", -"Phone" => "الهاتف", -"Type" => "نوع", -"PO Box" => "العنوان البريدي", -"Extended" => "إضافة", -"Street" => "شارع", -"City" => "المدينة", -"Region" => "المنطقة", -"Zipcode" => "رقم المنطقة", -"Country" => "البلد", -"Add" => "أدخل", -"Addressbook" => "كتاب العناوين", -"New Addressbook" => "كتاب عناوين جديد", -"Edit Addressbook" => "عدل كتاب العناوين", -"Displayname" => "الاسم المعروض", -"Active" => "فعال", -"Save" => "حفظ", -"Submit" => "ارسال", -"Cancel" => "الغاء" -); diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php deleted file mode 100644 index 0c95b83d5e..0000000000 --- a/apps/contacts/l10n/ca.php +++ /dev/null @@ -1,157 +0,0 @@ - "Error en (des)activar la llibreta d'adreces.", -"There was an error adding the contact." => "S'ha produït un error en afegir el contacte.", -"Cannot add empty property." => "No es pot afegir una propietat buida.", -"At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.", -"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:", -"Error adding contact property." => "Error en afegir la propietat del contacte.", -"No ID provided" => "No heu facilitat cap ID", -"Error setting checksum." => "Error en establir la suma de verificació.", -"No categories selected for deletion." => "No heu seleccionat les categories a eliminar.", -"No address books found." => "No s'han trobat llibretes d'adreces.", -"No contacts found." => "No s'han trobat contactes.", -"Missing ID" => "Falta la ID", -"Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"", -"Cannot add addressbook with an empty name." => "No es pot afegir una llibreta d'adreces amb un nom buit.", -"Error adding addressbook." => "Error en afegir la llibreta d'adreces.", -"Error activating addressbook." => "Error en activar la llibreta d'adreces.", -"No contact ID was submitted." => "No s'ha tramès cap ID de contacte.", -"Error reading contact photo." => "Error en llegir la foto del contacte.", -"Error saving temporary file." => "Error en desar el fitxer temporal.", -"The loading photo is not valid." => "La foto carregada no és vàlida.", -"id is not set." => "no s'ha establert la id.", -"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.", -"Error deleting contact property." => "Error en eliminar la propietat del contacte.", -"Contact ID is missing." => "falta la ID del contacte.", -"Missing contact id." => "Falta la id del contacte.", -"No photo path was submitted." => "No heu tramès el camí de la foto.", -"File doesn't exist:" => "El fitxer no existeix:", -"Error loading image." => "Error en carregar la imatge.", -"element name is not set." => "no s'ha establert el nom de l'element.", -"checksum is not set." => "no s'ha establert la suma de verificació.", -"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:", -"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.", -"Error updating contact property." => "Error en actualitzar la propietat del contacte.", -"Cannot update addressbook with an empty name." => "No es pot actualitzar la llibreta d'adreces amb un nom buit", -"Error updating addressbook." => "Error en actualitzar la llibreta d'adreces.", -"Error uploading contacts to storage." => "Error en carregar contactes a l'emmagatzemament.", -"There is no error, the file uploaded with success" => "No hi ha errors, el fitxer s'ha carregat correctament", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer carregat supera la directiva upload_max_filesize de php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El fitxer carregat supera la directiva MAX_FILE_SIZE especificada al formulari HTML", -"The uploaded file was only partially uploaded" => "El fitxer només s'ha carregat parcialment", -"No file was uploaded" => "No s'ha carregat cap fitxer", -"Missing a temporary folder" => "Falta un fitxer temporal", -"Contacts" => "Contactes", -"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.", -"Addressbook not found." => "No s'ha trobat la llibreta d'adreces.", -"This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces", -"Contact could not be found." => "No s'ha trobat el contacte.", -"Address" => "Adreça", -"Telephone" => "Telèfon", -"Email" => "Correu electrònic", -"Organization" => "Organització", -"Work" => "Feina", -"Home" => "Casa", -"Mobile" => "Mòbil", -"Text" => "Text", -"Voice" => "Veu", -"Message" => "Missatge", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Paginador", -"Internet" => "Internet", -"{name}'s Birthday" => "Aniversari de {name}", -"Contact" => "Contacte", -"Add Contact" => "Afegeix un contacte", -"Addressbooks" => "Llibretes d'adreces", -"Configure Address Books" => "Configura les llibretes d'adreces", -"New Address Book" => "Nova llibreta d'adreces", -"Import from VCF" => "Importa de VFC", -"CardDav Link" => "Enllaç CardDav", -"Download" => "Baixa", -"Edit" => "Edita", -"Delete" => "Suprimeix", -"Download contact" => "Baixa el contacte", -"Delete contact" => "Suprimeix el contacte", -"Drop photo to upload" => "Elimina la foto a carregar", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma", -"Edit name details" => "Edita detalls del nom", -"Nickname" => "Sobrenom", -"Enter nickname" => "Escriviu el sobrenom", -"Birthday" => "Aniversari", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grups", -"Separate groups with commas" => "Separeu els grups amb comes", -"Edit groups" => "Edita els grups", -"Preferred" => "Preferit", -"Please specify a valid email address." => "Especifiqueu una adreça de correu electrònic correcta", -"Enter email address" => "Escriviu una adreça de correu electrònic", -"Mail to address" => "Envia per correu electrònic a l'adreça", -"Delete email address" => "Elimina l'adreça de correu electrònic", -"Enter phone number" => "Escriviu el número de telèfon", -"Delete phone number" => "Elimina el número de telèfon", -"View on map" => "Visualitza al mapa", -"Edit address details" => "Edita els detalls de l'adreça", -"Add notes here." => "Afegiu notes aquí.", -"Add field" => "Afegeix un camp", -"Profile picture" => "Foto de perfil", -"Phone" => "Telèfon", -"Note" => "Nota", -"Delete current photo" => "Elimina la foto actual", -"Edit current photo" => "Edita la foto actual", -"Upload new photo" => "Carrega una foto nova", -"Select photo from ownCloud" => "Selecciona una foto de ownCloud", -"Edit address" => "Edita l'adreça", -"Type" => "Tipus", -"PO Box" => "Adreça postal", -"Extended" => "Addicional", -"Street" => "Carrer", -"City" => "Ciutat", -"Region" => "Comarca", -"Zipcode" => "Codi postal", -"Country" => "País", -"Edit categories" => "Edita categories", -"Add" => "Afegeix", -"Addressbook" => "Llibreta d'adreces", -"Hon. prefixes" => "Prefix honorífic:", -"Miss" => "Srta", -"Ms" => "Sra", -"Mr" => "Sr", -"Sir" => "Senyor", -"Mrs" => "Sra", -"Dr" => "Dr", -"Given name" => "Nom específic", -"Additional names" => "Noms addicionals", -"Family name" => "Nom de familia", -"Hon. suffixes" => "Sufix honorífic:", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Nova llibreta d'adreces", -"Edit Addressbook" => "Edita la llibreta d'adreces", -"Displayname" => "Nom a mostrar", -"Active" => "Actiu", -"Save" => "Desa", -"Submit" => "Envia", -"Cancel" => "Cancel·la", -"Import a contacts file" => "Importa un fitxer de contactes", -"Please choose the addressbook" => "Escolliu la llibreta d'adreces", -"create a new addressbook" => "crea una llibreta d'adreces nova", -"Name of new addressbook" => "Nom de la nova llibreta d'adreces", -"Import" => "Importa", -"Importing contacts" => "S'estan important contactes", -"Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:", -"Select from HD" => "Selecciona de HD", -"You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.", -"Add contact" => "Afegeix un contacte", -"Configure addressbooks" => "Configura les llibretes d'adreces", -"CardDAV syncing addresses" => "Adreces de sincronització CardDAV", -"more info" => "més informació", -"Primary address (Kontact et al)" => "Adreça primària (Kontact i al)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php deleted file mode 100644 index 391a62010b..0000000000 --- a/apps/contacts/l10n/cs_CZ.php +++ /dev/null @@ -1,157 +0,0 @@ - "Chyba při (de)aktivaci adresáře.", -"There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.", -"Cannot add empty property." => "Nelze přidat prazdný údaj.", -"At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů", -"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ", -"Error adding contact property." => "Chyba během přdávání údaje kontaktu.", -"No ID provided" => "ID nezadáno", -"Error setting checksum." => "Chyba při nastavování kontrolního součtu.", -"No categories selected for deletion." => "Žádné kategorie nebyly vybrány k smazání.", -"No address books found." => "Žádný adresář nenalezen.", -"No contacts found." => "Žádné kontakty nenalezeny.", -"Missing ID" => "Chybí ID", -"Error parsing VCard for ID: \"" => "Chyba při parsování VCard pro ID: \"", -"Cannot add addressbook with an empty name." => "Nelze přidat adresář s prázdným jménem.", -"Error adding addressbook." => "Chyba při přidávání adresáře.", -"Error activating addressbook." => "Chyba při aktivaci adresáře.", -"No contact ID was submitted." => "Nebylo nastaveno ID kontaktu.", -"Error reading contact photo." => "Chyba při načítání fotky kontaktu.", -"Error saving temporary file." => "Chyba při ukládání dočasného souboru.", -"The loading photo is not valid." => "Načítaná fotka je vadná.", -"id is not set." => "id neni nastaveno.", -"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Error deleting contact property." => "Chyba při odstraňování údaje kontaktu.", -"Contact ID is missing." => "Chybí ID kontaktu.", -"Missing contact id." => "Chybí id kontaktu.", -"No photo path was submitted." => "Žádná fotka nebyla nahrána.", -"File doesn't exist:" => "Soubor neexistuje:", -"Error loading image." => "Chyba při načítání obrázku.", -"element name is not set." => "jméno elementu není nastaveno.", -"checksum is not set." => "kontrolní součet není nastaven.", -"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Něco se pokazilo. ", -"Error updating contact property." => "Chyba při aktualizaci údaje kontaktu.", -"Cannot update addressbook with an empty name." => "Nelze aktualizovat adresář s prázdným jménem.", -"Error updating addressbook." => "Chyba při aktualizaci adresáře.", -"Error uploading contacts to storage." => "Chyba při nahrávání kontaktů do úložiště.", -"There is no error, the file uploaded with success" => "Nevyskytla se žádná chyba, soubor byl úspěšně nahrán", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahrávaný soubor překračuje nastavení upload_max_filesize directive v php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Nahrávaný soubor překračuje nastavení MAX_FILE_SIZE z voleb HTML formuláře", -"The uploaded file was only partially uploaded" => "Nahrávaný soubor se nahrál pouze z části", -"No file was uploaded" => "Žádný soubor nebyl nahrán", -"Missing a temporary folder" => "Chybí dočasný adresář", -"Contacts" => "Kontakty", -"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF", -"Addressbook not found." => "Adresář nenalezen.", -"This is not your addressbook." => "Toto není Váš adresář.", -"Contact could not be found." => "Kontakt nebyl nalezen.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizace", -"Work" => "Pracovní", -"Home" => "Domácí", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Hlas", -"Message" => "Zpráva", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Narozeniny {name}", -"Contact" => "Kontakt", -"Add Contact" => "Přidat kontakt", -"Addressbooks" => "Adresáře", -"Configure Address Books" => "Nastavit adresáře", -"New Address Book" => "Nový adresář", -"Import from VCF" => "Importovat z VCF", -"CardDav Link" => "CardDav odkaz", -"Download" => "Stažení", -"Edit" => "Editovat", -"Delete" => "Odstranit", -"Download contact" => "Stáhnout kontakt", -"Delete contact" => "Odstranit kontakt", -"Drop photo to upload" => "Přetáhněte sem fotku pro její nahrání", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami", -"Edit name details" => "Upravit podrobnosti jména", -"Nickname" => "Přezdívka", -"Enter nickname" => "Zadejte přezdívku", -"Birthday" => "Narozeniny", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupiny", -"Separate groups with commas" => "Oddělte skupiny čárkami", -"Edit groups" => "Upravit skupiny", -"Preferred" => "Preferovaný", -"Please specify a valid email address." => "Prosím zadejte platnou e-mailovou adresu", -"Enter email address" => "Zadat e-mailovou adresu", -"Mail to address" => "Odeslat na adresu", -"Delete email address" => "Smazat e-mail", -"Enter phone number" => "Zadat telefoní číslo", -"Delete phone number" => "Smazat telefoní číslo", -"View on map" => "Zobrazit na mapě", -"Edit address details" => "Upravit podrobnosti adresy", -"Add notes here." => "Zde můžete připsat poznámky.", -"Add field" => "Přidat políčko", -"Profile picture" => "Profilová fotka", -"Phone" => "Telefon", -"Note" => "Poznámka", -"Delete current photo" => "Smazat současnou fotku", -"Edit current photo" => "Upravit současnou fotku", -"Upload new photo" => "Nahrát novou fotku", -"Select photo from ownCloud" => "Vybrat fotku z ownCloudu", -"Edit address" => "Upravit adresu", -"Type" => "Typ", -"PO Box" => "PO box", -"Extended" => "Rozšířené", -"Street" => "Ulice", -"City" => "Město", -"Region" => "Kraj", -"Zipcode" => "PSČ", -"Country" => "Země", -"Edit categories" => "Upravit kategorie", -"Add" => "Přidat", -"Addressbook" => "Adresář", -"Hon. prefixes" => "Tituly před", -"Miss" => "Slečna", -"Ms" => "Ms", -"Mr" => "Pan", -"Sir" => "Sir", -"Mrs" => "Paní", -"Dr" => "Dr", -"Given name" => "Křestní jméno", -"Additional names" => "Další jména", -"Family name" => "Příjmení", -"Hon. suffixes" => "Tituly za", -"J.D." => "JUDr.", -"M.D." => "MUDr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "ml.", -"Sn." => "st.", -"New Addressbook" => "Nový adresář", -"Edit Addressbook" => "Editace adresáře", -"Displayname" => "Zobrazené jméno", -"Active" => "Aktivní", -"Save" => "Uložit", -"Submit" => "Potvrdit", -"Cancel" => "Storno", -"Import a contacts file" => "Importovat soubor kontaktů", -"Please choose the addressbook" => "Prosím zvolte adresář", -"create a new addressbook" => "vytvořit nový adresář", -"Name of new addressbook" => "Jméno nového adresáře", -"Import" => "Import", -"Importing contacts" => "Importování kontaktů", -"Select address book to import to:" => "Vyberte adresář do kterého chcete importovat:", -"Select from HD" => "Vybrat z disku", -"You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.", -"Add contact" => "Přidat kontakt", -"Configure addressbooks" => "Nastavit adresář", -"CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:", -"more info" => "víc informací", -"Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/da.php b/apps/contacts/l10n/da.php deleted file mode 100644 index 28753edda4..0000000000 --- a/apps/contacts/l10n/da.php +++ /dev/null @@ -1,157 +0,0 @@ - "Fejl ved (de)aktivering af adressebogen", -"There was an error adding the contact." => "Der opstod en fejl ved tilføjelse af kontaktpersonen.", -"Cannot add empty property." => "Kan ikke tilføje en egenskab uden indhold.", -"At least one of the address fields has to be filled out." => "Der skal udfyldes mindst et adressefelt.", -"Trying to add duplicate property: " => "Kan ikke tilføje overlappende element.", -"Error adding contact property." => "Fejl ved tilføjelse af egenskab.", -"No ID provided" => "Intet ID medsendt", -"Error setting checksum." => "Kunne ikke sætte checksum.", -"No categories selected for deletion." => "Der ikke valgt nogle grupper at slette.", -"No address books found." => "Der blev ikke fundet nogen adressebøger.", -"No contacts found." => "Der blev ikke fundet nogen kontaktpersoner.", -"Missing ID" => "Manglende ID", -"Error parsing VCard for ID: \"" => "Kunne ikke indlæse VCard med ID'en: \"", -"Cannot add addressbook with an empty name." => "Kan ikke tilføje adressebog uden et navn.", -"Error adding addressbook." => "Fejl ved tilføjelse af adressebog.", -"Error activating addressbook." => "Fejl ved aktivering af adressebog.", -"No contact ID was submitted." => "Ingen ID for kontakperson medsendt.", -"Error reading contact photo." => "Kunne ikke indlæse foto for kontakperson.", -"Error saving temporary file." => "Kunne ikke gemme midlertidig fil.", -"The loading photo is not valid." => "Billedet under indlæsning er ikke gyldigt.", -"id is not set." => "Intet ID medsendt.", -"Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.", -"Error deleting contact property." => "Fejl ved sletning af egenskab for kontaktperson.", -"Contact ID is missing." => "Kontaktperson ID mangler.", -"Missing contact id." => "Kontaktperson ID mangler.", -"No photo path was submitted." => "Der blev ikke medsendt en sti til fotoet.", -"File doesn't exist:" => "Filen eksisterer ikke:", -"Error loading image." => "Kunne ikke indlæse billede.", -"element name is not set." => "Element navnet er ikke medsendt.", -"checksum is not set." => "Checksum er ikke medsendt.", -"Information about vCard is incorrect. Please reload the page: " => "Informationen om dette VCard stemmer ikke. Genindlæs venligst siden: ", -"Something went FUBAR. " => "Noget gik grueligt galt. ", -"Error updating contact property." => "Fejl ved opdatering af egenskab for kontaktperson.", -"Cannot update addressbook with an empty name." => "Kan ikke opdatére adressebogen med et tomt navn.", -"Error updating addressbook." => "Fejl ved opdatering af adressebog", -"Error uploading contacts to storage." => "Kunne ikke uploade kontaktepersoner til midlertidig opbevaring.", -"There is no error, the file uploaded with success" => "Der skete ingen fejl, filen blev succesfuldt uploadet", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uploadede fil er større end upload_max_filesize indstillingen i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uploadede fil overstiger MAX_FILE_SIZE indstilingen, som specificeret i HTML formularen", -"The uploaded file was only partially uploaded" => "Filen blev kun delvist uploadet.", -"No file was uploaded" => "Ingen fil uploadet", -"Missing a temporary folder" => "Manglende midlertidig mappe.", -"Contacts" => "Kontaktpersoner", -"Drop a VCF file to import contacts." => "Drop en VCF fil for at importere kontaktpersoner.", -"Addressbook not found." => "Adressebogen blev ikke fundet.", -"This is not your addressbook." => "Dette er ikke din adressebog.", -"Contact could not be found." => "Kontaktperson kunne ikke findes.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organisation", -"Work" => "Arbejde", -"Home" => "Hjemme", -"Mobile" => "Mobil", -"Text" => "SMS", -"Voice" => "Telefonsvarer", -"Message" => "Besked", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Personsøger", -"Internet" => "Internet", -"{name}'s Birthday" => "{name}'s fødselsdag", -"Contact" => "Kontaktperson", -"Add Contact" => "Tilføj kontaktperson", -"Addressbooks" => "Adressebøger", -"Configure Address Books" => "Konfigurer adressebøger", -"New Address Book" => "Ny adressebog", -"Import from VCF" => "Importer fra VCF", -"CardDav Link" => "CardDav-link", -"Download" => "Download", -"Edit" => "Rediger", -"Delete" => "Slet", -"Download contact" => "Download kontaktperson", -"Delete contact" => "Slet kontaktperson", -"Drop photo to upload" => "Drop foto for at uploade", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn først med komma", -"Edit name details" => "Rediger navnedetaljer.", -"Nickname" => "Øgenavn", -"Enter nickname" => "Indtast øgenavn", -"Birthday" => "Fødselsdag", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Opdel gruppenavne med kommaer", -"Edit groups" => "Rediger grupper", -"Preferred" => "Foretrukken", -"Please specify a valid email address." => "Indtast venligst en gyldig email-adresse.", -"Enter email address" => "Indtast email-adresse", -"Mail to address" => "Send mail til adresse", -"Delete email address" => "Slet email-adresse", -"Enter phone number" => "Indtast telefonnummer", -"Delete phone number" => "Slet telefonnummer", -"View on map" => "Vis på kort", -"Edit address details" => "Rediger adresse detaljer", -"Add notes here." => "Tilføj noter her.", -"Add field" => "Tilfæj element", -"Profile picture" => "Profilbillede", -"Phone" => "Telefon", -"Note" => "Note", -"Delete current photo" => "Slet nuværende foto", -"Edit current photo" => "Rediger nuværende foto", -"Upload new photo" => "Upload nyt foto", -"Select photo from ownCloud" => "Vælg foto fra ownCloud", -"Edit address" => "Rediger adresse", -"Type" => "Type", -"PO Box" => "Postboks", -"Extended" => "Udvidet", -"Street" => "Vej", -"City" => "By", -"Region" => "Region", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Edit categories" => "Rediger grupper", -"Add" => "Tilføj", -"Addressbook" => "Adressebog", -"Hon. prefixes" => "Foranstillede titler", -"Miss" => "Frøken", -"Ms" => "Fru", -"Mr" => "Hr.", -"Sir" => "Sir", -"Mrs" => "Fru", -"Dr" => "Dr", -"Given name" => "Fornavn", -"Additional names" => "Mellemnavne", -"Family name" => "Efternavn", -"Hon. suffixes" => "Efterstillede titler", -"J.D." => "Cand. Jur.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Ny adressebog", -"Edit Addressbook" => "Rediger adressebog", -"Displayname" => "Vist navn", -"Active" => "Aktiv", -"Save" => "Gem", -"Submit" => "Gem", -"Cancel" => "Fortryd", -"Import a contacts file" => "Importer fil med kontaktpersoner", -"Please choose the addressbook" => "Vælg venligst adressebog", -"create a new addressbook" => "Opret ny adressebog", -"Name of new addressbook" => "Navn på ny adressebog", -"Import" => "Importer", -"Importing contacts" => "Importerer kontaktpersoner", -"Select address book to import to:" => "Vælg hvilken adressebog, der skal importeres til:", -"Select from HD" => "Vælg fra harddisk.", -"You have no contacts in your addressbook." => "Du har ingen kontaktpersoner i din adressebog.", -"Add contact" => "Tilføj kontaktpeson.", -"Configure addressbooks" => "Konfigurer adressebøger", -"CardDAV syncing addresses" => "CardDAV synkroniserings adresse", -"more info" => "mere info", -"Primary address (Kontact et al)" => "Primær adresse (Kontak m. fl.)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php deleted file mode 100644 index 3a1013eb4f..0000000000 --- a/apps/contacts/l10n/de.php +++ /dev/null @@ -1,157 +0,0 @@ - "(De-)Aktivierung des Adressbuches fehlgeschlagen", -"There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen", -"Cannot add empty property." => "Feld darf nicht leer sein.", -"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.", -"Trying to add duplicate property: " => "Versuche, doppelte Eigenschaft hinzuzufügen: ", -"Error adding contact property." => "Kontakt ändern fehlgeschlagen", -"No ID provided" => "Keine ID angegeben", -"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.", -"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.", -"No address books found." => "Keine Adressbücher gefunden.", -"No contacts found." => "Keine Kontakte gefunden.", -"Missing ID" => "Fehlende ID", -"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"", -"Cannot add addressbook with an empty name." => "Bitte einen Namen für das Adressbuch angeben.", -"Error adding addressbook." => "Adressbuch hinzufügen fehlgeschlagen", -"Error activating addressbook." => "Adressbuchaktivierung fehlgeschlagen", -"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.", -"Error reading contact photo." => "Fehler beim auslesen des Kontaktfotos.", -"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.", -"The loading photo is not valid." => "Das Kontaktfoto ist fehlerhaft.", -"id is not set." => "ID ist nicht angegeben.", -"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.", -"Error deleting contact property." => "Kontakteigenschaft löschen fehlgeschlagen", -"Contact ID is missing." => "Keine Kontakt-ID angegeben.", -"Missing contact id." => "Fehlende Kontakt-ID.", -"No photo path was submitted." => "Kein Foto-Pfad übermittelt.", -"File doesn't exist:" => "Datei existiert nicht: ", -"Error loading image." => "Fehler beim Laden des Bildes.", -"element name is not set." => "Kein Name für das Element angegeben.", -"checksum is not set." => "Keine Prüfsumme angegeben.", -"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ", -"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ", -"Error updating contact property." => "Kontakteigenschaft aktualisieren fehlgeschlagen", -"Cannot update addressbook with an empty name." => "Adressbuch kann nicht mir leeren Namen aktualisiert werden.", -"Error updating addressbook." => "Adressbuch aktualisieren fehlgeschlagen", -"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen", -"There is no error, the file uploaded with success" => "Alles bestens, Datei erfolgreich übertragen.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer als durch die upload_max_filesize Direktive in php.ini erlaubt", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist", -"The uploaded file was only partially uploaded" => "Datei konnte nur teilweise übertragen werden", -"No file was uploaded" => "Keine Datei konnte übertragen werden.", -"Missing a temporary folder" => "Kein temporärer Ordner vorhanden", -"Contacts" => "Kontakte", -"Drop a VCF file to import contacts." => "Zieh' eine VCF Datei hierher zum Kontaktimport", -"Addressbook not found." => "Adressbuch nicht gefunden.", -"This is not your addressbook." => "Dies ist nicht dein Adressbuch.", -"Contact could not be found." => "Kontakt konnte nicht gefunden werden.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organisation", -"Work" => "Arbeit", -"Home" => "Zuhause", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Anruf", -"Message" => "Mitteilung", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Geburtstag von {name}", -"Contact" => "Kontakt", -"Add Contact" => "Kontakt hinzufügen", -"Addressbooks" => "Adressbücher", -"Configure Address Books" => "Adressbücher konfigurieren", -"New Address Book" => "Neues Adressbuch", -"Import from VCF" => "Import von VCF Datei", -"CardDav Link" => "CardDav Link", -"Download" => "Herunterladen", -"Edit" => "Bearbeiten", -"Delete" => "Löschen", -"Download contact" => "Kontakt herunterladen", -"Delete contact" => "Kontakt löschen", -"Drop photo to upload" => "Zieh' ein Foto hierher zum hochladen", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts order Rückwärts mit Komma", -"Edit name details" => "Namen ändern", -"Nickname" => "Spitzname", -"Enter nickname" => "Spitznamen angeben", -"Birthday" => "Geburtstag", -"dd-mm-yyyy" => "TT-MM-JJJJ", -"Groups" => "Gruppen", -"Separate groups with commas" => "Gruppen mit Komma trennt", -"Edit groups" => "Gruppen editieren", -"Preferred" => "Bevorzugt", -"Please specify a valid email address." => "Bitte eine gültige E-Mail-Adresse angeben.", -"Enter email address" => "E-Mail-Adresse angeben.", -"Mail to address" => "E-Mail an diese Adresse schreiben", -"Delete email address" => "E-Mail-Adresse löschen", -"Enter phone number" => "Telefonnummer angeben", -"Delete phone number" => "Telefonnummer löschen", -"View on map" => "Auf Karte anzeigen", -"Edit address details" => "Adressinformationen ändern", -"Add notes here." => "Füge hier Notizen ein.", -"Add field" => "Feld hinzufügen", -"Profile picture" => "Profil Bild", -"Phone" => "Telefon", -"Note" => "Notiz", -"Delete current photo" => "Derzeitiges Foto löschen", -"Edit current photo" => "Foto ändern", -"Upload new photo" => "Neues Foto hochladen", -"Select photo from ownCloud" => "Foto aus ownCloud auswählen", -"Edit address" => "Adresse ändern", -"Type" => "Typ", -"PO Box" => "Postfach", -"Extended" => "Erweitert", -"Street" => "Straße", -"City" => "Stadt", -"Region" => "Region", -"Zipcode" => "Postleitzahl", -"Country" => "Land", -"Edit categories" => "Kategorie ändern", -"Add" => "Hinzufügen", -"Addressbook" => "Adressbuch", -"Hon. prefixes" => "Höflichkeitspräfixe", -"Miss" => "Frau", -"Ms" => "Frau", -"Mr" => "Herr", -"Sir" => "Herr", -"Mrs" => "Frau", -"Dr" => "Dr", -"Given name" => "Vorname", -"Additional names" => "Zusätzliche Namen", -"Family name" => "Familienname", -"Hon. suffixes" => "Höflichkeitssuffixe", -"J.D." => "Dr. Jur", -"M.D." => "Dr. med.", -"D.O." => "DGOM", -"D.C." => "MChiro", -"Ph.D." => "Dr.", -"Esq." => "Hochwohlgeborenen", -"Jr." => "Jr.", -"Sn." => "Senior", -"New Addressbook" => "Neues Adressbuch", -"Edit Addressbook" => "Adressbuch editieren", -"Displayname" => "Anzeigename", -"Active" => "Aktiv", -"Save" => "Speichern", -"Submit" => "Eintragen", -"Cancel" => "Abbrechen", -"Import a contacts file" => "Kontaktdatei importieren", -"Please choose the addressbook" => "Bitte Adressbuch auswählen", -"create a new addressbook" => "Neues Adressbuch erstellen", -"Name of new addressbook" => "Name des neuen Adressbuchs", -"Import" => "Importieren", -"Importing contacts" => "Kontakte werden importiert", -"Select address book to import to:" => "Adressbuch, in das importiert werden soll", -"Select from HD" => "Von der Festplatte auswählen", -"You have no contacts in your addressbook." => "Du hast keine Kontakte im Adressbuch.", -"Add contact" => "Kontakt hinzufügen", -"Configure addressbooks" => "Adressbücher konfigurieren", -"CardDAV syncing addresses" => "CardDAV Sync-Adressen", -"more info" => "mehr Info", -"Primary address (Kontact et al)" => "primäre Adresse (für Kontact o.ä. Programme)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php deleted file mode 100644 index f015f0ca36..0000000000 --- a/apps/contacts/l10n/el.php +++ /dev/null @@ -1,157 +0,0 @@ - "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων", -"There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.", -"Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.", -"At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.", -"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:", -"Error adding contact property." => "Σφάλμα προσθήκης ιδιότητας επαφής.", -"No ID provided" => "Δε δώθηκε ID", -"Error setting checksum." => "Λάθος κατά τον ορισμό checksum ", -"No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή", -"No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων", -"No contacts found." => "Δεν βρέθηκαν επαφές", -"Missing ID" => "Λείπει ID", -"Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"", -"Cannot add addressbook with an empty name." => "Δε μπορεί να προστεθεί βιβλίο διευθύνσεων με κενό όνομα", -"Error adding addressbook." => "Σφάλμα προσθήκης βιβλίου διευθύνσεων.", -"Error activating addressbook." => "Σφάλμα ενεργοποίησης βιβλίου διευθύνσεων", -"No contact ID was submitted." => "Δε υπεβλήθει ID επαφής", -"Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής", -"Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου", -"The loading photo is not valid." => "Η φορτωμένη φωτογραφία δεν είναι έγκυρη", -"id is not set." => "δεν ορίστηκε id", -"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.", -"Error deleting contact property." => "Σφάλμα διαγραφής ιδιότητας επαφής.", -"Contact ID is missing." => "Λείπει ID επαφής", -"Missing contact id." => "Απουσιαζει ID επαφής", -"No photo path was submitted." => "Δε δόθηκε διαδρομή εικόνας", -"File doesn't exist:" => "Το αρχείο δεν υπάρχει:", -"Error loading image." => "Σφάλμα φόρτωσης εικόνας", -"element name is not set." => "δεν ορίστηκε όνομα στοιχείου", -"checksum is not set." => "δε ορίστηκε checksum ", -"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα:", -"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο", -"Error updating contact property." => "Σφάλμα ενημέρωσης ιδιότητας επαφής.", -"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα", -"Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.", -"Error uploading contacts to storage." => "Σφάλμα κατά την αποθήκευση επαφών", -"There is no error, the file uploaded with success" => "Δεν υπάρχει σφάλμα, το αρχείο ανέβηκε με επιτυχία ", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το μέγεθος του αρχείου ξεπερνάει το upload_max_filesize του php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Το ανεβασμένο αρχείο υπερβαίνει το MAX_FILE_SIZE που ορίζεται στην HTML φόρμα", -"The uploaded file was only partially uploaded" => "Το αρχείο ανέβηκε μερικώς", -"No file was uploaded" => "Δεν ανέβηκε κάποιο αρχείο", -"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος", -"Contacts" => "Επαφές", -"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών", -"Addressbook not found." => "Δε βρέθηκε βιβλίο διευθύνσεων", -"This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.", -"Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.", -"Address" => "Διεύθυνση", -"Telephone" => "Τηλέφωνο", -"Email" => "Email", -"Organization" => "Οργανισμός", -"Work" => "Εργασία", -"Home" => "Σπίτι", -"Mobile" => "Κινητό", -"Text" => "Κείμενο", -"Voice" => "Ομιλία", -"Message" => "Μήνυμα ", -"Fax" => "Φαξ", -"Video" => "Βίντεο", -"Pager" => "Βομβητής", -"Internet" => "Διαδίκτυο", -"{name}'s Birthday" => "{name} έχει Γενέθλια", -"Contact" => "Επαφή", -"Add Contact" => "Προσθήκη επαφής", -"Addressbooks" => "Βιβλία διευθύνσεων", -"Configure Address Books" => "Ρυθμίστε το βιβλίο διευθύνσεων ", -"New Address Book" => "Νέο βιβλίο διευθύνσεων", -"Import from VCF" => "Εισαγωγή από VCF αρχείο", -"CardDav Link" => "Σύνδεσμος CardDav", -"Download" => "Λήψη", -"Edit" => "Επεξεργασία", -"Delete" => "Διαγραφή", -"Download contact" => "Λήψη επαφής", -"Delete contact" => "Διαγραφή επαφής", -"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα", -"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος", -"Nickname" => "Παρατσούκλι", -"Enter nickname" => "Εισάγεται παρατσούκλι", -"Birthday" => "Γενέθλια", -"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ", -"Groups" => "Ομάδες", -"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ", -"Edit groups" => "Επεξεργασία ομάδων", -"Preferred" => "Προτιμώμενο", -"Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", -"Enter email address" => "Εισήγαγε διεύθυνση ηλεκτρονικού ταχυδρομείου", -"Mail to address" => "Αποστολή σε διεύθυνση", -"Delete email address" => "Διαγραφή διεύθυνση email", -"Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου", -"Delete phone number" => "Διέγραψε αριθμό τηλεφώνου", -"View on map" => "Προβολή στο χάρτη", -"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης", -"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ", -"Add field" => "Προσθήκη πεδίου", -"Profile picture" => "Φωτογραφία προφίλ", -"Phone" => "Τηλέφωνο", -"Note" => "Σημείωση", -"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας", -"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας", -"Upload new photo" => "Ανέβασε νέα φωτογραφία", -"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud", -"Edit address" => "Επεξεργασία διεύθυνσης", -"Type" => "Τύπος", -"PO Box" => "Ταχ. Θυρίδα", -"Extended" => "Εκτεταμένη", -"Street" => "Οδός", -"City" => "Πόλη", -"Region" => "Περιοχή", -"Zipcode" => "Τ.Κ.", -"Country" => "Χώρα", -"Edit categories" => "Επεξεργασία κατηγορίας", -"Add" => "Προσθήκη", -"Addressbook" => "Βιβλίο διευθύνσεων", -"Hon. prefixes" => "προθέματα", -"Miss" => "Δις", -"Ms" => "Κα", -"Mr" => "Κα", -"Sir" => "Σερ", -"Mrs" => "Κα", -"Dr" => "Δρ.", -"Given name" => "Όνομα", -"Additional names" => "Επιπλέον ονόματα", -"Family name" => "Επώνυμο", -"Hon. suffixes" => "καταλήξεις", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Νέο βιβλίο διευθύνσεων", -"Edit Addressbook" => "Επεξεργασία βιβλίου διευθύνσεων", -"Displayname" => "Προβαλόμενο όνομα", -"Active" => "Ενεργό", -"Save" => "Αποθήκευση", -"Submit" => "Καταχώρηση", -"Cancel" => "Ακύρωση", -"Import a contacts file" => "Εισαγωγή αρχείου επαφών", -"Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων", -"create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων", -"Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων", -"Import" => "Εισαγωγή", -"Importing contacts" => "Εισαγωγή επαφών", -"Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:", -"Select from HD" => "Επιλογή από HD", -"You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων", -"Add contact" => "Προσθήκη επαφής", -"Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων", -"CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ", -"more info" => "περισσότερες πληροφορίες", -"Primary address (Kontact et al)" => "Κύρια διεύθυνση", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php deleted file mode 100644 index ffc885a41a..0000000000 --- a/apps/contacts/l10n/eo.php +++ /dev/null @@ -1,146 +0,0 @@ - "Eraro dum (mal)aktivigo de adresaro.", -"There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.", -"Cannot add empty property." => "Ne eblas aldoni malplenan propraĵon.", -"At least one of the address fields has to be filled out." => "Almenaŭ unu el la adreskampoj necesas pleniĝi.", -"Trying to add duplicate property: " => "Provante aldoni duobligitan propraĵon:", -"Error adding contact property." => "Eraro dum aldono de kontaktopropraĵo.", -"No ID provided" => "Neniu identigilo proviziĝis.", -"Error setting checksum." => "Eraro dum agordado de kontrolsumo.", -"No categories selected for deletion." => "Neniu kategorio elektiĝis por forigi.", -"No address books found." => "Neniu adresaro troviĝis.", -"No contacts found." => "Neniu kontakto troviĝis.", -"Missing ID" => "Mankas identigilo", -"Error parsing VCard for ID: \"" => "Eraro dum analizo de VCard por identigilo:", -"Cannot add addressbook with an empty name." => "Ne eblas aldoni adresaron kun malplena nomo.", -"Error adding addressbook." => "Eraro dum aldono de adresaro.", -"Error activating addressbook." => "Eraro dum aktivigo de adresaro.", -"No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.", -"Error reading contact photo." => "Eraro dum lego de kontakta foto.", -"Error saving temporary file." => "Eraro dum konservado de provizora dosiero.", -"The loading photo is not valid." => "La alŝutata foto ne validas.", -"id is not set." => "identigilo ne agordiĝis.", -"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.", -"Error deleting contact property." => "Eraro dum forigo de kontaktopropraĵo.", -"Contact ID is missing." => "Kontaktidentigilo mankas.", -"Missing contact id." => "Mankas kontaktidentigilo.", -"No photo path was submitted." => "Neniu vojo al foto sendiĝis.", -"File doesn't exist:" => "Dosiero ne ekzistas:", -"Error loading image." => "Eraro dum ŝargado de bildo.", -"element name is not set." => "eronomo ne agordiĝis.", -"checksum is not set." => "kontrolsumo ne agordiĝis.", -"Information about vCard is incorrect. Please reload the page: " => "Informo pri vCard malĝustas. Bonvolu reŝargi la paĝon:", -"Something went FUBAR. " => "Io FUBAR-is.", -"Error updating contact property." => "Eraro dum ĝisdatigo de kontaktopropraĵo.", -"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.", -"Error updating addressbook." => "Eraro dum ĝisdatigo de adresaro.", -"There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.", -"The uploaded file was only partially uploaded" => "la alŝutita dosiero nur parte alŝutiĝis", -"No file was uploaded" => "Neniu dosiero alŝutiĝis.", -"Missing a temporary folder" => "Mankas provizora dosierujo.", -"Contacts" => "Kontaktoj", -"Drop a VCF file to import contacts." => "Demetu VCF-dosieron por enporti kontaktojn.", -"Addressbook not found." => "Adresaro ne troviĝis.", -"This is not your addressbook." => "Ĉi tiu ne estas via adresaro.", -"Contact could not be found." => "Ne eblis trovi la kontakton.", -"Address" => "Adreso", -"Telephone" => "Telefono", -"Email" => "Retpoŝtadreso", -"Organization" => "Organizaĵo", -"Work" => "Laboro", -"Home" => "Hejmo", -"Mobile" => "Poŝtelefono", -"Text" => "Teksto", -"Voice" => "Voĉo", -"Message" => "Mesaĝo", -"Fax" => "Fakso", -"Video" => "Videaĵo", -"Pager" => "Televokilo", -"Internet" => "Interreto", -"{name}'s Birthday" => "Naskiĝtago de {name}", -"Contact" => "Kontakto", -"Add Contact" => "Aldoni kontakton", -"Addressbooks" => "Adresaroj", -"Configure Address Books" => "Agordi adresarojn", -"New Address Book" => "Nova adresaro", -"Import from VCF" => "Enporti el VCF", -"CardDav Link" => "CardDav-ligilo", -"Download" => "Elŝuti", -"Edit" => "Redakti", -"Delete" => "Forigi", -"Download contact" => "Elŝuti kontakton", -"Delete contact" => "Forigi kontakton", -"Drop photo to upload" => "Demeti foton por alŝuti", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo", -"Edit name details" => "Redakti detalojn de nomo", -"Nickname" => "Kromnomo", -"Enter nickname" => "Enigu kromnomon", -"Birthday" => "Naskiĝotago", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Grupoj", -"Separate groups with commas" => "Disigi grupojn per komoj", -"Edit groups" => "Redakti grupojn", -"Preferred" => "Preferata", -"Please specify a valid email address." => "Bonvolu specifi validan retpoŝtadreson.", -"Enter email address" => "Enigi retpoŝtadreson", -"Mail to address" => "Retpoŝtmesaĝo al adreso", -"Delete email address" => "Forigi retpoŝþadreson", -"Enter phone number" => "Enigi telefonnumeron", -"Delete phone number" => "Forigi telefonnumeron", -"View on map" => "Vidi en mapo", -"Edit address details" => "Redakti detalojn de adreso", -"Add notes here." => "Aldoni notojn ĉi tie.", -"Add field" => "Aldoni kampon", -"Profile picture" => "Profila bildo", -"Phone" => "Telefono", -"Note" => "Noto", -"Delete current photo" => "Forigi nunan foton", -"Edit current photo" => "Redakti nunan foton", -"Upload new photo" => "Alŝuti novan foton", -"Select photo from ownCloud" => "Elekti foton el ownCloud", -"Edit address" => "Redakti adreson", -"Type" => "Tipo", -"PO Box" => "Abonkesto", -"Extended" => "Etendita", -"Street" => "Strato", -"City" => "Urbo", -"Region" => "Regiono", -"Zipcode" => "Poŝtokodo", -"Country" => "Lando", -"Edit categories" => "Redakti kategoriojn", -"Add" => "Aldoni", -"Addressbook" => "Adresaro", -"Hon. prefixes" => "Honoraj antaŭmetaĵoj", -"Miss" => "f-ino", -"Ms" => "s-ino", -"Mr" => "s-ro", -"Sir" => "s-ro", -"Mrs" => "s-ino", -"Dr" => "d-ro", -"Given name" => "Persona nomo", -"Additional names" => "Pliaj nomoj", -"Family name" => "Familia nomo", -"Hon. suffixes" => "Honoraj postmetaĵoj", -"New Addressbook" => "Nova adresaro", -"Edit Addressbook" => "Redakti adresaron", -"Displayname" => "Montronomo", -"Active" => "Aktiva", -"Save" => "Konservi", -"Submit" => "Sendi", -"Cancel" => "Nuligi", -"Import a contacts file" => "Enporti kontaktodosieron", -"Please choose the addressbook" => "Bonvolu elekti adresaron", -"create a new addressbook" => "krei novan adresaron", -"Name of new addressbook" => "Nomo de nova adresaro", -"Import" => "Enporti", -"Importing contacts" => "Enportante kontaktojn", -"Select address book to import to:" => "Elektu adresaron kien enporti:", -"Select from HD" => "Elekti el malmoldisko", -"You have no contacts in your addressbook." => "Vi ne havas kontaktojn en via adresaro", -"Add contact" => "Aldoni kontakton", -"Configure addressbooks" => "Agordi adresarojn", -"CardDAV syncing addresses" => "adresoj por CardDAV-sinkronigo", -"more info" => "pli da informo", -"Primary address (Kontact et al)" => "Ĉefa adreso (por Kontakt kaj aliaj)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php deleted file mode 100644 index 2bdb300aa8..0000000000 --- a/apps/contacts/l10n/es.php +++ /dev/null @@ -1,157 +0,0 @@ - "Error al (des)activar libreta de direcciones.", -"There was an error adding the contact." => "Se ha producido un error al añadir el contacto.", -"Cannot add empty property." => "No se puede añadir una propiedad vacía.", -"At least one of the address fields has to be filled out." => "Al menos uno de los campos de direcciones se tiene que rellenar.", -"Trying to add duplicate property: " => "Intentando añadir una propiedad duplicada: ", -"Error adding contact property." => "Error al añadir una propiedad del contacto.", -"No ID provided" => "No se ha proporcionado una ID", -"Error setting checksum." => "Error al establecer la suma de verificación.", -"No categories selected for deletion." => "No se seleccionaron categorías para borrar.", -"No address books found." => "No se encontraron libretas de direcciones.", -"No contacts found." => "No se encontraron contactos.", -"Missing ID" => "Falta la ID", -"Error parsing VCard for ID: \"" => "Error al analizar el VCard para la ID: \"", -"Cannot add addressbook with an empty name." => "No se puede añadir una libreta de direcciones sin nombre", -"Error adding addressbook." => "Error al añadir la libreta de direcciones.", -"Error activating addressbook." => "Error al activar la libreta de direcciones.", -"No contact ID was submitted." => "No se ha mandado ninguna ID de contacto.", -"Error reading contact photo." => "Error leyendo fotografía del contacto.", -"Error saving temporary file." => "Error al guardar archivo temporal.", -"The loading photo is not valid." => "La foto que se estaba cargando no es válida.", -"id is not set." => "no se ha puesto ninguna ID.", -"Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.", -"Error deleting contact property." => "Error al borrar una propiedad del contacto.", -"Contact ID is missing." => "Falta la ID del contacto.", -"Missing contact id." => "Falta la id del contacto.", -"No photo path was submitted." => "No se ha introducido la ruta de la foto.", -"File doesn't exist:" => "Archivo inexistente:", -"Error loading image." => "Error cargando imagen.", -"element name is not set." => "no se ha puesto ningún nombre de elemento.", -"checksum is not set." => "no se ha puesto ninguna suma de comprobación.", -"Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recarga la página:", -"Something went FUBAR. " => "Plof. Algo ha fallado.", -"Error updating contact property." => "Error al actualizar una propiedad del contacto.", -"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.", -"Error updating addressbook." => "Error al actualizar la libreta de direcciones.", -"Error uploading contacts to storage." => "Error al subir contactos al almacenamiento.", -"There is no error, the file uploaded with success" => "No hay ningún error, el archivo se ha subido con éxito", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo subido sobrepasa la directiva upload_max_filesize de php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "El archivo subido sobrepasa la directiva MAX_FILE_SIZE especificada en el formulario HTML", -"The uploaded file was only partially uploaded" => "El archivo se ha subido parcialmente", -"No file was uploaded" => "No se ha subido ningún archivo", -"Missing a temporary folder" => "Falta la carpeta temporal", -"Contacts" => "Contactos", -"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.", -"Addressbook not found." => "Libreta de direcciones no encontrada.", -"This is not your addressbook." => "Esta no es tu agenda de contactos.", -"Contact could not be found." => "No se ha podido encontrar el contacto.", -"Address" => "Dirección", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", -"Work" => "Trabajo", -"Home" => "Particular", -"Mobile" => "Móvil", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensaje", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Localizador", -"Internet" => "Internet", -"{name}'s Birthday" => "Cumpleaños de {name}", -"Contact" => "Contacto", -"Add Contact" => "Añadir contacto", -"Addressbooks" => "Libretas de direcciones", -"Configure Address Books" => "Configurar libretas de direcciones", -"New Address Book" => "Nueva libreta de direcciones", -"Import from VCF" => "Importar desde VCF", -"CardDav Link" => "Enlace CardDav", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Borrar", -"Download contact" => "Descargar contacto", -"Delete contact" => "Eliminar contacto", -"Drop photo to upload" => "Suelta una foto para subirla", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma", -"Edit name details" => "Editar los detalles del nombre", -"Nickname" => "Alias", -"Enter nickname" => "Introduce un alias", -"Birthday" => "Cumpleaños", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grupos", -"Separate groups with commas" => "Separa los grupos con comas", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor especifica una dirección de correo electrónico válida.", -"Enter email address" => "Introduce una dirección de correo electrónico", -"Mail to address" => "Enviar por correo a la dirección", -"Delete email address" => "Eliminar dirección de correo electrónico", -"Enter phone number" => "Introduce un número de teléfono", -"Delete phone number" => "Eliminar número de teléfono", -"View on map" => "Ver en el mapa", -"Edit address details" => "Editar detalles de la dirección", -"Add notes here." => "Añade notas aquí.", -"Add field" => "Añadir campo", -"Profile picture" => "Foto del perfil", -"Phone" => "Teléfono", -"Note" => "Nota", -"Delete current photo" => "Eliminar fotografía actual", -"Edit current photo" => "Editar fotografía actual", -"Upload new photo" => "Subir nueva fotografía", -"Select photo from ownCloud" => "Seleccionar fotografía desde ownCloud", -"Edit address" => "Editar dirección", -"Type" => "Tipo", -"PO Box" => "Código postal", -"Extended" => "Extendido", -"Street" => "Calle", -"City" => "Ciudad", -"Region" => "Región", -"Zipcode" => "Código postal", -"Country" => "País", -"Edit categories" => "Editar categorías", -"Add" => "Añadir", -"Addressbook" => "Libreta de direcciones", -"Hon. prefixes" => "Prefijos honoríficos", -"Miss" => "Srta", -"Ms" => "Sra.", -"Mr" => "Sr.", -"Sir" => "Señor", -"Mrs" => "Sra", -"Dr" => "Dr", -"Given name" => "Nombre", -"Additional names" => "Nombres adicionales", -"Family name" => "Apellido", -"Hon. suffixes" => "Sufijos honoríficos", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Dr", -"Esq." => "Don", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Nueva libreta de direcciones", -"Edit Addressbook" => "Editar libreta de direcciones", -"Displayname" => "Nombre a mostrar", -"Active" => "Activo", -"Save" => "Guardar", -"Submit" => "Aceptar", -"Cancel" => "Cancelar", -"Import a contacts file" => "Importar archivo de contactos", -"Please choose the addressbook" => "Por favor escoge la agenda", -"create a new addressbook" => "crear una nueva agenda", -"Name of new addressbook" => "Nombre de la nueva agenda", -"Import" => "Importar", -"Importing contacts" => "Importando contactos", -"Select address book to import to:" => "Selecciona una agenda para importar a:", -"Select from HD" => "Seleccionar del disco duro", -"You have no contacts in your addressbook." => "No hay contactos en tu agenda.", -"Add contact" => "Añadir contacto", -"Configure addressbooks" => "Configurar agenda", -"CardDAV syncing addresses" => "Sincronizando direcciones", -"more info" => "más información", -"Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php deleted file mode 100644 index 39a287c961..0000000000 --- a/apps/contacts/l10n/et_EE.php +++ /dev/null @@ -1,157 +0,0 @@ - "Viga aadressiraamatu (de)aktiveerimisel.", -"There was an error adding the contact." => "Konktakti lisamisel tekkis viga.", -"Cannot add empty property." => "Tühja omadust ei saa lisada.", -"At least one of the address fields has to be filled out." => "Vähemalt üks aadressiväljadest peab olema täidetud.", -"Trying to add duplicate property: " => "Proovitakse lisada topeltomadust: ", -"Error adding contact property." => "Viga konktakti korralikul lisamisel.", -"No ID provided" => "ID-d pole sisestatud", -"Error setting checksum." => "Viga kontrollsumma määramisel.", -"No categories selected for deletion." => "Kustutamiseks pole valitud ühtegi kategooriat.", -"No address books found." => "Ei leitud ühtegi aadressiraamatut.", -"No contacts found." => "Ühtegi kontakti ei leitud.", -"Missing ID" => "Puudub ID", -"Error parsing VCard for ID: \"" => "Viga VCard-ist ID parsimisel: \"", -"Cannot add addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa lisada.", -"Error adding addressbook." => "Viga aadressiraamatu lisamisel.", -"Error activating addressbook." => "Viga aadressiraamatu aktiveerimisel.", -"No contact ID was submitted." => "Kontakti ID-d pole sisestatud.", -"Error reading contact photo." => "Viga kontakti foto lugemisel.", -"Error saving temporary file." => "Viga ajutise faili salvestamisel.", -"The loading photo is not valid." => "Laetav pilt pole korrektne pildifail.", -"id is not set." => "ID on määramata.", -"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.", -"Error deleting contact property." => "Viga konktaki korralikul kustutamisel.", -"Contact ID is missing." => "Kontakti ID puudub.", -"Missing contact id." => "Puuduv kontakti ID.", -"No photo path was submitted." => "Foto asukohta pole määratud.", -"File doesn't exist:" => "Faili pole olemas:", -"Error loading image." => "Viga pildi laadimisel.", -"element name is not set." => "elemendi nime pole määratud.", -"checksum is not set." => "kontrollsummat pole määratud.", -"Information about vCard is incorrect. Please reload the page: " => "vCard info pole korrektne. Palun lae lehekülg uuesti: ", -"Something went FUBAR. " => "Midagi läks tõsiselt metsa.", -"Error updating contact property." => "Viga konktaki korralikul uuendamisel.", -"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.", -"Error updating addressbook." => "Viga aadressiraamatu uuendamisel.", -"Error uploading contacts to storage." => "Viga kontaktide üleslaadimisel kettale.", -"There is no error, the file uploaded with success" => "Ühtegi tõrget polnud, fail on üles laetud", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Üleslaetud fail ületab php.ini failis määratud upload_max_filesize suuruse", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Üleslaetud fail ületab MAX_FILE_SIZE suuruse, mis on HTML vormi jaoks määratud", -"The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt", -"No file was uploaded" => "Ühtegi faili ei laetud üles", -"Missing a temporary folder" => "Ajutiste failide kaust puudub", -"Contacts" => "Kontaktid", -"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.", -"Addressbook not found." => "Aadressiraamatut ei leitud", -"This is not your addressbook." => "See pole sinu aadressiraamat.", -"Contact could not be found." => "Kontakti ei leitud.", -"Address" => "Aadress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisatsioon", -"Work" => "Töö", -"Home" => "Kodu", -"Mobile" => "Mobiil", -"Text" => "Tekst", -"Voice" => "Hääl", -"Message" => "Sõnum", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Piipar", -"Internet" => "Internet", -"{name}'s Birthday" => "{name} sünnipäev", -"Contact" => "Kontakt", -"Add Contact" => "Lisa kontakt", -"Addressbooks" => "Aadressiraamatud", -"Configure Address Books" => "Seadista aadressiraamatut", -"New Address Book" => "Uus aadressiraamat", -"Import from VCF" => "Impordi VCF-ist", -"CardDav Link" => "CardDav link", -"Download" => "Lae alla", -"Edit" => "Muuda", -"Delete" => "Kustuta", -"Download contact" => "Lae kontakt alla", -"Delete contact" => "Kustuta kontakt", -"Drop photo to upload" => "Lohista üleslaetav foto siia", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega", -"Edit name details" => "Muuda nime üksikasju", -"Nickname" => "Hüüdnimi", -"Enter nickname" => "Sisesta hüüdnimi", -"Birthday" => "Sünnipäev", -"dd-mm-yyyy" => "dd.mm.yyyy", -"Groups" => "Grupid", -"Separate groups with commas" => "Eralda grupid komadega", -"Edit groups" => "Muuda gruppe", -"Preferred" => "Eelistatud", -"Please specify a valid email address." => "Palun sisesta korrektne e-posti aadress.", -"Enter email address" => "Sisesta e-posti aadress", -"Mail to address" => "Kiri aadressile", -"Delete email address" => "Kustuta e-posti aadress", -"Enter phone number" => "Sisesta telefoninumber", -"Delete phone number" => "Kustuta telefoninumber", -"View on map" => "Vaata kaardil", -"Edit address details" => "Muuda aaressi infot", -"Add notes here." => "Lisa märkmed siia.", -"Add field" => "Lisa väli", -"Profile picture" => "Profiili pilt", -"Phone" => "Telefon", -"Note" => "Märkus", -"Delete current photo" => "Kustuta praegune foto", -"Edit current photo" => "Muuda praegust pilti", -"Upload new photo" => "Lae üles uus foto", -"Select photo from ownCloud" => "Vali foto ownCloudist", -"Edit address" => "Muuda aadressi", -"Type" => "Tüüp", -"PO Box" => "Postkontori postkast", -"Extended" => "Laiendatud", -"Street" => "Tänav", -"City" => "Linn", -"Region" => "Piirkond", -"Zipcode" => "Postiindeks", -"Country" => "Riik", -"Edit categories" => "Muuda kategooriat", -"Add" => "Lisa", -"Addressbook" => "Aadressiraamat", -"Hon. prefixes" => "Eesliited", -"Miss" => "Preili", -"Ms" => "Pr", -"Mr" => "Hr", -"Sir" => "Härra", -"Mrs" => "Proua", -"Dr" => "Dr", -"Given name" => "Eesnimi", -"Additional names" => "Lisanimed", -"Family name" => "Perekonnanimi", -"Hon. suffixes" => "Järelliited", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Senior.", -"New Addressbook" => "Uus aadressiraamat", -"Edit Addressbook" => "Muuda aadressiraamatut", -"Displayname" => "Näidatav nimi", -"Active" => "Aktiivne", -"Save" => "Salvesta", -"Submit" => "Saada", -"Cancel" => "Loobu", -"Import a contacts file" => "Impordi kontaktifail", -"Please choose the addressbook" => "Palun vali aadressiraamat", -"create a new addressbook" => "loo uus aadressiraamat", -"Name of new addressbook" => "Uue aadressiraamatu nimi", -"Import" => "Impordi", -"Importing contacts" => "Kontaktide importimine", -"Select address book to import to:" => "Vali aadressiraamat, millesse importida:", -"Select from HD" => "Vali kõvakettalt", -"You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.", -"Add contact" => "Lisa kontakt", -"Configure addressbooks" => "Seadista aadressiraamatuid", -"CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid", -"more info" => "lisainfo", -"Primary address (Kontact et al)" => "Peamine aadress", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php deleted file mode 100644 index 6dfbf0a7b2..0000000000 --- a/apps/contacts/l10n/eu.php +++ /dev/null @@ -1,124 +0,0 @@ - "Errore bat egon da helbide-liburua (des)gaitzen", -"There was an error adding the contact." => "Errore bat egon da kontaktua gehitzerakoan", -"Cannot add empty property." => "Ezin da propieta hutsa gehitu.", -"At least one of the address fields has to be filled out." => "Behintzat helbide eremuetako bat bete behar da.", -"Error adding contact property." => "Errorea kontaktu propietatea gehitzean.", -"No ID provided" => "Ez da IDrik eman", -"No categories selected for deletion." => "Ez dira ezabatzeko kategoriak hautatu.", -"No address books found." => "Ez da helbide libururik aurkitu.", -"No contacts found." => "Ez da kontakturik aurkitu.", -"Missing ID" => "ID falta da", -"Error adding addressbook." => "Errore bat egon da helbide liburua gehitzean.", -"Error activating addressbook." => "Errore bat egon da helbide-liburua aktibatzen.", -"Error reading contact photo." => "Errore bat izan da kontaktuaren argazkia igotzerakoan.", -"The loading photo is not valid." => "Kargatzen ari den argazkia ez da egokia.", -"id is not set." => "IDa ez da ezarri.", -"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", -"Error deleting contact property." => "Errorea kontaktu propietatea ezabatzean.", -"Contact ID is missing." => "Kontaktuaren IDa falta da.", -"Missing contact id." => "Kontaktuaren IDa falta da.", -"File doesn't exist:" => "Fitxategia ez da existitzen:", -"Error loading image." => "Errore bat izan da irudia kargatzearkoan.", -"element name is not set." => "elementuaren izena ez da ezarri.", -"Error updating contact property." => "Errorea kontaktu propietatea eguneratzean.", -"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.", -"Error updating addressbook." => "Errore bat egon da helbide liburua eguneratzen.", -"Error uploading contacts to storage." => "Errore bat egon da kontaktuak biltegira igotzerakoan.", -"There is no error, the file uploaded with success" => "Ez da errorerik egon, fitxategia ongi igo da", -"The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat bakarrik igo da", -"No file was uploaded" => "Ez da fitxategirik igo", -"Contacts" => "Kontaktuak", -"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.", -"Addressbook not found." => "Helbide liburua ez da aurkitu", -"This is not your addressbook." => "Hau ez da zure helbide liburua.", -"Contact could not be found." => "Ezin izan da kontaktua aurkitu.", -"Address" => "Helbidea", -"Telephone" => "Telefonoa", -"Email" => "Eposta", -"Organization" => "Erakundea", -"Work" => "Lana", -"Home" => "Etxea", -"Mobile" => "Mugikorra", -"Text" => "Testua", -"Voice" => "Ahotsa", -"Message" => "Mezua", -"Fax" => "Fax-a", -"Video" => "Bideoa", -"Pager" => "Bilagailua", -"Internet" => "Internet", -"{name}'s Birthday" => "{name}ren jaioteguna", -"Contact" => "Kontaktua", -"Add Contact" => "Gehitu kontaktua", -"Addressbooks" => "Helbide Liburuak", -"Configure Address Books" => "Konfiguratu Helbide Liburuak", -"New Address Book" => "Helbide-liburu berria", -"Import from VCF" => "VCFtik inportatu", -"CardDav Link" => "CardDav lotura", -"Download" => "Deskargatu", -"Edit" => "Editatu", -"Delete" => "Ezabatu", -"Download contact" => "Deskargatu kontaktua", -"Delete contact" => "Ezabatu kontaktua", -"Drop photo to upload" => "Askatu argazkia igotzeko", -"Edit name details" => "Editatu izenaren zehaztasunak", -"Nickname" => "Ezizena", -"Enter nickname" => "Sartu ezizena", -"Birthday" => "Jaioteguna", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Taldeak", -"Separate groups with commas" => "Banatu taldeak komekin", -"Edit groups" => "Editatu taldeak", -"Preferred" => "Hobetsia", -"Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat", -"Enter email address" => "Sartu eposta helbidea", -"Mail to address" => "Bidali helbidera", -"Delete email address" => "Ezabatu eposta helbidea", -"Enter phone number" => "Sartu telefono zenbakia", -"Delete phone number" => "Ezabatu telefono zenbakia", -"View on map" => "Ikusi mapan", -"Edit address details" => "Editatu helbidearen zehaztasunak", -"Add notes here." => "Gehitu oharrak hemen.", -"Add field" => "Gehitu eremua", -"Profile picture" => "Profilaren irudia", -"Phone" => "Telefonoa", -"Note" => "Oharra", -"Delete current photo" => "Ezabatu oraingo argazkia", -"Edit current photo" => "Editatu oraingo argazkia", -"Upload new photo" => "Igo argazki berria", -"Select photo from ownCloud" => "Hautatu argazki bat ownCloudetik", -"Edit address" => "Editatu helbidea", -"Type" => "Mota", -"PO Box" => "Posta kutxa", -"Extended" => "Hedatua", -"Street" => "Kalea", -"City" => "Hiria", -"Region" => "Eskualdea", -"Zipcode" => "Posta kodea", -"Country" => "Herrialdea", -"Edit categories" => "Editatu kategoriak", -"Add" => "Gehitu", -"Addressbook" => "Helbide-liburua", -"New Addressbook" => "Helbide-liburu berria", -"Edit Addressbook" => "Editatu helbide-liburua", -"Displayname" => "Bistaratzeko izena", -"Active" => "Aktibo", -"Save" => "Gorde", -"Submit" => "Bidali", -"Cancel" => "Ezeztatu", -"Import a contacts file" => "Inporatu kontaktuen fitxategia", -"Please choose the addressbook" => "Mesedez, aukeratu helbide liburua", -"create a new addressbook" => "sortu helbide liburu berria", -"Name of new addressbook" => "Helbide liburuaren izena", -"Import" => "Inportatu", -"Importing contacts" => "Kontaktuak inportatzen", -"Select address book to import to:" => "Hautau helburuko helbide liburua:", -"Select from HD" => "Hautatu disko gogorretik", -"You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.", -"Add contact" => "Gehitu kontaktua", -"Configure addressbooks" => "Konfiguratu helbide liburuak", -"CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak", -"more info" => "informazio gehiago", -"Primary address (Kontact et al)" => "Helbide nagusia", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/fa.php b/apps/contacts/l10n/fa.php deleted file mode 100644 index 9278975c40..0000000000 --- a/apps/contacts/l10n/fa.php +++ /dev/null @@ -1,157 +0,0 @@ - "خطا در (غیر) فعال سازی کتابچه نشانه ها", -"There was an error adding the contact." => "یک خطا در افزودن اطلاعات شخص مورد نظر", -"Cannot add empty property." => "نمیتوان یک خاصیت خالی ایجاد کرد", -"At least one of the address fields has to be filled out." => "At least one of the address fields has to be filled out. ", -"Trying to add duplicate property: " => "امتحان کردن برای وارد کردن مشخصات تکراری", -"Error adding contact property." => "خطا درهنگام افزودن ویژگی", -"No ID provided" => "هیچ شناسه ای ارائه نشده", -"Error setting checksum." => "خطا در تنظیم checksum", -"No categories selected for deletion." => "هیچ گروهی برای حذف شدن در نظر گرفته نشده", -"No address books found." => "هیچ کتابچه نشانی پیدا نشد", -"No contacts found." => "هیچ شخصی پیدا نشد", -"Missing ID" => "نشانی گم شده", -"Error parsing VCard for ID: \"" => "خطا در تجزیه کارت ویزا برای شناسه:", -"Cannot add addressbook with an empty name." => "نمیتوانید یک نام خالی را به کتابچه نشانی ها افزود", -"Error adding addressbook." => "خطا درهنگام افزودن کتابچه نشانی ها", -"Error activating addressbook." => "خطا درهنگام فعال سازیکتابچه نشانی ها", -"No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده", -"Error reading contact photo." => "خطا در خواندن اطلاعات تصویر", -"Error saving temporary file." => "خطا در ذخیره پرونده موقت", -"The loading photo is not valid." => "بارگزاری تصویر امکان پذیر نیست", -"id is not set." => "شناسه تعیین نشده", -"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید", -"Error deleting contact property." => "خطا در هنگام پاک کرد ویژگی", -"Contact ID is missing." => "اطلاعات شناسه گم شده", -"Missing contact id." => "شما اطلاعات شناسه را فراموش کرده اید", -"No photo path was submitted." => "هیچ نشانی از تصویرارسال نشده", -"File doesn't exist:" => "پرونده وجود ندارد", -"Error loading image." => "خطا در بارگزاری تصویر", -"element name is not set." => "نام اصلی تنظیم نشده است", -"checksum is not set." => "checksum تنظیم شده نیست", -"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید", -"Something went FUBAR. " => "چند چیز به FUBAR رفتند", -"Error updating contact property." => "خطا در هنگام بروزرسانی اطلاعات شخص مورد نظر", -"Cannot update addressbook with an empty name." => "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید", -"Error updating addressbook." => "خطا در هنگام بروزرسانی کتابچه نشانی ها", -"Error uploading contacts to storage." => "خطا در هنگام بارگذاری و ذخیره سازی", -"There is no error, the file uploaded with success" => "هیچ خطایی نیست بارگذاری پرونده موفقیت آمیز بود", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم آپلود از طریق Php.ini تعیین می شود", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حداکثر حجم قابل بار گذاری از طریق HTML MAX_FILE_SIZE است", -"The uploaded file was only partially uploaded" => "پرونده بارگذاری شده فقط تاحدودی بارگذاری شده", -"No file was uploaded" => "هیچ پروندهای بارگذاری نشده", -"Missing a temporary folder" => "یک پوشه موقت گم شده", -"Contacts" => "اشخاص", -"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند", -"Addressbook not found." => "کتابچه نشانی ها یافت نشد", -"This is not your addressbook." => "این کتابچه ی نشانه های شما نیست", -"Contact could not be found." => "اتصال ویا تماسی یافت نشد", -"Address" => "نشانی", -"Telephone" => "تلفن", -"Email" => "نشانی پست الکترنیک", -"Organization" => "نهاد(ارگان)", -"Work" => "کار", -"Home" => "خانه", -"Mobile" => "موبایل", -"Text" => "متن", -"Voice" => "صدا", -"Message" => "پیغام", -"Fax" => "دورنگار:", -"Video" => "رسانه تصویری", -"Pager" => "صفحه", -"Internet" => "اینترنت", -"{name}'s Birthday" => "روز تولد {name} است", -"Contact" => "اشخاص", -"Add Contact" => "افزودن اطلاعات شخص مورد نظر", -"Addressbooks" => "کتابچه ی نشانی ها", -"Configure Address Books" => "پیکر بندی کتابچه نشانی ها", -"New Address Book" => "کتابچه نشانه های جدید", -"Import from VCF" => "وارد شده از VCF", -"CardDav Link" => "CardDav Link", -"Download" => "بارگیری", -"Edit" => "ویرایش", -"Delete" => "پاک کردن", -"Download contact" => "دانلود مشخصات اشخاص", -"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", -"Drop photo to upload" => "تصویر را به اینجا بکشید تا بار گذازی شود", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", -"Edit name details" => "ویرایش نام جزئیات", -"Nickname" => "نام مستعار", -"Enter nickname" => "یک نام مستعار وارد کنید", -"Birthday" => "روزتولد", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "گروه ها", -"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما", -"Edit groups" => "ویرایش گروه ها", -"Preferred" => "مقدم", -"Please specify a valid email address." => "لطفا یک پست الکترونیکی معتبر وارد کنید", -"Enter email address" => "یک پست الکترونیکی وارد کنید", -"Mail to address" => "به نشانی ارسال شد", -"Delete email address" => "پاک کردن نشانی پست الکترونیکی", -"Enter phone number" => "شماره تلفن راوارد کنید", -"Delete phone number" => "پاک کردن شماره تلفن", -"View on map" => "دیدن روی نقشه", -"Edit address details" => "ویرایش جزئیات نشانی ها", -"Add notes here." => "اینجا یادداشت ها را بیافزایید", -"Add field" => "اضافه کردن فیلد", -"Profile picture" => "تصویر پروفایل", -"Phone" => "شماره تلفن", -"Note" => "یادداشت", -"Delete current photo" => "پاک کردن تصویر کنونی", -"Edit current photo" => "ویرایش تصویر کنونی", -"Upload new photo" => "بار گذاری یک تصویر جدید", -"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما", -"Edit address" => "ویرایش نشانی", -"Type" => "نوع", -"PO Box" => "صندوق پستی", -"Extended" => "تمدید شده", -"Street" => "خیابان", -"City" => "شهر", -"Region" => "ناحیه", -"Zipcode" => "کد پستی", -"Country" => "کشور", -"Edit categories" => "ویرایش گروه", -"Add" => "افزودن", -"Addressbook" => "کتابچه ی نشانی ها", -"Hon. prefixes" => "پیشوند های محترمانه", -"Miss" => "خانم", -"Ms" => "خانم", -"Mr" => "آقا", -"Sir" => "آقا", -"Mrs" => "خانم", -"Dr" => "دکتر", -"Given name" => "نام معلوم", -"Additional names" => "نام های دیگر", -"Family name" => "نام خانوادگی", -"Hon. suffixes" => "پسوند های محترم", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "دکتری", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "کتابچه نشانی جدید", -"Edit Addressbook" => "ویرایش کتابچه نشانی", -"Displayname" => "نام برای نمایش", -"Active" => "فعال", -"Save" => "ذخیره سازی", -"Submit" => "ارسال", -"Cancel" => "انصراف", -"Import a contacts file" => "وارد کردن پرونده حاوی اطلاعات", -"Please choose the addressbook" => "لطفا یک کتابچه نشانی انتخاب کنید", -"create a new addressbook" => "یک کتابچه نشانی بسازید", -"Name of new addressbook" => "نام کتابچه نشانی جدید", -"Import" => "وارد کردن", -"Importing contacts" => "وارد کردن اشخاص", -"Select address book to import to:" => "یک کتابچه نشانی انتخاب کنید تا وارد شود", -"Select from HD" => "انتخاب از دیسک سخت", -"You have no contacts in your addressbook." => "شماهیچ شخصی در کتابچه نشانی خود ندارید", -"Add contact" => "افزودن اطلاعات شخص مورد نظر", -"Configure addressbooks" => "پیکربندی کتابچه ی نشانی ها", -"CardDAV syncing addresses" => "CardDAV syncing addresses ", -"more info" => "اطلاعات بیشتر", -"Primary address (Kontact et al)" => "نشانی اولیه", -"iOS/OS X" => "iOS/OS X " -); diff --git a/apps/contacts/l10n/fi_FI.php b/apps/contacts/l10n/fi_FI.php deleted file mode 100644 index 2e3e91611b..0000000000 --- a/apps/contacts/l10n/fi_FI.php +++ /dev/null @@ -1,109 +0,0 @@ - "Virhe yhteystietoa lisättäessä.", -"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.", -"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.", -"Error adding contact property." => "Virhe lisättäessä ominaisuutta yhteystietoon.", -"No categories selected for deletion." => "Luokkia ei ole valittu poistettavaksi.", -"No address books found." => "Osoitekirjoja ei löytynyt.", -"No contacts found." => "Yhteystietoja ei löytynyt.", -"Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"", -"Cannot add addressbook with an empty name." => "Ilman nimeä olevaa osoitekirjaa ei voi lisätä.", -"Error adding addressbook." => "Virhe lisättäessä osoitekirjaa.", -"Error activating addressbook." => "Virhe aktivoitaessa osoitekirjaa.", -"Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.", -"Error deleting contact property." => "Virhe poistettaessa yhteystiedon ominaisuutta.", -"File doesn't exist:" => "Tiedostoa ei ole olemassa:", -"Error loading image." => "Virhe kuvaa ladatessa.", -"Error updating contact property." => "Virhe päivitettäessä yhteystiedon ominaisuutta.", -"Error updating addressbook." => "Virhe päivitettäessä osoitekirjaa.", -"There is no error, the file uploaded with success" => "Ei virhettä, tiedosto lähetettiin onnistuneesti", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lähetetyn tiedoston koko ylittää upload_max_filesize-asetuksen arvon php.ini-tiedostossa", -"The uploaded file was only partially uploaded" => "Lähetetty tiedosto lähetettiin vain osittain", -"No file was uploaded" => "Tiedostoa ei lähetetty", -"Missing a temporary folder" => "Tilapäiskansio puuttuu", -"Contacts" => "Yhteystiedot", -"Addressbook not found." => "Osoitekirjaa ei löytynyt.", -"This is not your addressbook." => "Tämä ei ole osoitekirjasi.", -"Contact could not be found." => "Yhteystietoa ei löytynyt.", -"Address" => "Osoite", -"Telephone" => "Puhelin", -"Email" => "Sähköposti", -"Organization" => "Organisaatio", -"Work" => "Työ", -"Home" => "Koti", -"Mobile" => "Mobiili", -"Text" => "Teksti", -"Voice" => "Ääni", -"Message" => "Viesti", -"Fax" => "Faksi", -"Video" => "Video", -"Pager" => "Hakulaite", -"Internet" => "Internet", -"{name}'s Birthday" => "Henkilön {name} syntymäpäivä", -"Contact" => "Yhteystieto", -"Add Contact" => "Lisää yhteystieto", -"Addressbooks" => "Osoitekirjat", -"Configure Address Books" => "Muokkaa osoitekirjoja", -"New Address Book" => "Uusi osoitekirja", -"Import from VCF" => "Tuo VCF-tiedostosta", -"CardDav Link" => "CardDav-linkki", -"Download" => "Lataa", -"Edit" => "Muokkaa", -"Delete" => "Poista", -"Download contact" => "Lataa yhteystieto", -"Delete contact" => "Poista yhteystieto", -"Nickname" => "Kutsumanimi", -"Enter nickname" => "Anna kutsumanimi", -"Birthday" => "Syntymäpäivä", -"Groups" => "Ryhmät", -"Separate groups with commas" => "Erota ryhmät pilkuilla", -"Edit groups" => "Muokkaa ryhmiä", -"Please specify a valid email address." => "Anna kelvollinen sähköpostiosoite.", -"Enter email address" => "Anna sähköpostiosoite", -"Delete email address" => "Poista sähköpostiosoite", -"Enter phone number" => "Anna puhelinnumero", -"Delete phone number" => "Poista puhelinnumero", -"View on map" => "Näytä kartalla", -"Add notes here." => "Lisää huomiot tähän.", -"Add field" => "Lisää kenttä", -"Profile picture" => "Profiilikuva", -"Phone" => "Puhelin", -"Note" => "Huomio", -"Delete current photo" => "Poista nykyinen valokuva", -"Edit current photo" => "Muokkaa nykyistä valokuvaa", -"Upload new photo" => "Lähetä uusi valokuva", -"Select photo from ownCloud" => "Valitse valokuva ownCloudista", -"Edit address" => "Muokkaa osoitetta", -"Type" => "Tyyppi", -"PO Box" => "Postilokero", -"Extended" => "Laajennettu", -"Street" => "Katuosoite", -"City" => "Paikkakunta", -"Region" => "Alue", -"Zipcode" => "Postinumero", -"Country" => "Maa", -"Edit categories" => "Muokkaa luokkia", -"Add" => "Lisää", -"Addressbook" => "Osoitekirja", -"Given name" => "Etunimi", -"Additional names" => "Lisänimet", -"Family name" => "Sukunimi", -"New Addressbook" => "Uusi osoitekirja", -"Edit Addressbook" => "Muokkaa osoitekirjaa", -"Active" => "Aktiivinen", -"Save" => "Tallenna", -"Submit" => "Lähetä", -"Cancel" => "Peru", -"Import a contacts file" => "Tuo yhteystiedon sisältävä tiedosto", -"Please choose the addressbook" => "Valitse osoitekirja", -"create a new addressbook" => "luo uusi osoitekirja", -"Name of new addressbook" => "Uuden osoitekirjan nimi", -"Import" => "Tuo", -"Importing contacts" => "Tuodaan yhteystietoja", -"Select address book to import to:" => "Valitse osoitekirja, johon yhteystiedot tuodaan:", -"You have no contacts in your addressbook." => "Osoitekirjassasi ei ole yhteystietoja.", -"Add contact" => "Lisää yhteystieto", -"Configure addressbooks" => "Muokkaa osoitekirjoja", -"CardDAV syncing addresses" => "CardDAV-synkronointiosoitteet", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php deleted file mode 100644 index 0a2a4e58b9..0000000000 --- a/apps/contacts/l10n/fr.php +++ /dev/null @@ -1,149 +0,0 @@ - "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses.", -"There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.", -"Cannot add empty property." => "Impossible d'ajouter un champ vide.", -"At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.", -"Trying to add duplicate property: " => "Ajout d'une propriété en double:", -"Error adding contact property." => "Erreur lors de l'ajout du champ.", -"No ID provided" => "Aucun ID fourni", -"Error setting checksum." => "Erreur lors du paramétrage du hachage.", -"No categories selected for deletion." => "Pas de catégories sélectionnées pour la suppression.", -"No address books found." => "Pas de carnet d'adresses trouvé.", -"No contacts found." => "Aucun contact trouvé.", -"Missing ID" => "ID manquant", -"Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"", -"Cannot add addressbook with an empty name." => "Ne peut être ajouté avec un nom vide.", -"Error adding addressbook." => "Erreur lors de l'ajout du carnet d'adresses.", -"Error activating addressbook." => "Erreur lors de l'activation du carnet d'adresses.", -"No contact ID was submitted." => "Aucun ID de contact envoyé", -"Error reading contact photo." => "Erreur de lecture de la photo du contact.", -"Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.", -"The loading photo is not valid." => "La photo chargée est invalide.", -"id is not set." => "L'ID n'est pas défini.", -"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.", -"Error deleting contact property." => "Erreur lors de la suppression du champ.", -"Contact ID is missing." => "L'ID du contact est manquant.", -"Missing contact id." => "ID contact manquant.", -"No photo path was submitted." => "Le chemin de la photo n'a pas été envoyé.", -"File doesn't exist:" => "Fichier inexistant:", -"Error loading image." => "Erreur lors du chargement de l'image.", -"element name is not set." => "Le champ Nom n'est pas défini.", -"checksum is not set." => "L'hachage n'est pas défini.", -"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:", -"Something went FUBAR. " => "Quelque chose est FUBAR.", -"Error updating contact property." => "Erreur lors de la mise à jour du champ.", -"Cannot update addressbook with an empty name." => "Impossible de mettre à jour le carnet d'adresses avec un nom vide.", -"Error updating addressbook." => "Erreur lors de la mise à jour du carnet d'adresses.", -"Error uploading contacts to storage." => "Erreur lors de l'envoi des contacts vers le stockage.", -"There is no error, the file uploaded with success" => "Il n'y a pas d'erreur, le fichier a été envoyé avec succes.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier envoyé dépasse la directive upload_max_filesize dans php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Le fichier envoyé dépasse la directive MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", -"The uploaded file was only partially uploaded" => "Le fichier envoyé n'a été que partiellement envoyé.", -"No file was uploaded" => "Pas de fichier envoyé.", -"Missing a temporary folder" => "Absence de dossier temporaire.", -"Contacts" => "Contacts", -"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.", -"Addressbook not found." => "Carnet d'adresses introuvable.", -"This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.", -"Contact could not be found." => "Ce contact n'a pu être trouvé.", -"Address" => "Adresse", -"Telephone" => "Téléphone", -"Email" => "E-mail", -"Organization" => "Société", -"Work" => "Travail", -"Home" => "Maison", -"Mobile" => "Mobile", -"Text" => "Texte", -"Voice" => "Voix", -"Message" => "Message", -"Fax" => "Fax", -"Video" => "Vidéo", -"Pager" => "Bipeur", -"Internet" => "Internet", -"{name}'s Birthday" => "Anniversaire de {name}", -"Contact" => "Contact", -"Add Contact" => "Ajouter un Contact", -"Addressbooks" => "Carnets d'adresses", -"Configure Address Books" => "Paramétrer carnet d'adresses", -"New Address Book" => "Nouveau Carnet d'adresses", -"Import from VCF" => "Importer depuis VCF", -"CardDav Link" => "Lien CardDav", -"Download" => "Télécharger", -"Edit" => "Modifier", -"Delete" => "Supprimer", -"Download contact" => "Télécharger le contact", -"Delete contact" => "Supprimer le contact", -"Drop photo to upload" => "Glisser une photo pour l'envoi", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule", -"Edit name details" => "Editer les noms", -"Nickname" => "Surnom", -"Enter nickname" => "Entrer un surnom", -"Birthday" => "Anniversaire", -"dd-mm-yyyy" => "jj-mm-aaaa", -"Groups" => "Groupes", -"Separate groups with commas" => "Séparer les groupes avec des virgules", -"Edit groups" => "Editer les groupes", -"Preferred" => "Préféré", -"Please specify a valid email address." => "Merci d'entrer une adresse e-mail valide.", -"Enter email address" => "Entrer une adresse e-mail", -"Delete email address" => "Supprimer l'adresse e-mail", -"Enter phone number" => "Entrer un numéro de téléphone", -"Delete phone number" => "Supprimer le numéro de téléphone", -"View on map" => "Voir sur une carte", -"Edit address details" => "Editer les adresses", -"Add notes here." => "Ajouter des notes ici.", -"Add field" => "Ajouter un champ.", -"Profile picture" => "Photo de profil", -"Phone" => "Téléphone", -"Note" => "Note", -"Delete current photo" => "Supprimer la photo actuelle", -"Edit current photo" => "Editer la photo actuelle", -"Upload new photo" => "Envoyer une nouvelle photo", -"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud", -"Edit address" => "Editer l'adresse", -"Type" => "Type", -"PO Box" => "Boîte postale", -"Extended" => "Étendu", -"Street" => "Rue", -"City" => "Ville", -"Region" => "Région", -"Zipcode" => "Code postal", -"Country" => "Pays", -"Edit categories" => "Editer les catégories", -"Add" => "Ajouter", -"Addressbook" => "Carnet d'adresses", -"Hon. prefixes" => "Préfixe hon.", -"Miss" => "Mlle", -"Ms" => "Mme", -"Mr" => "M.", -"Sir" => "Sir", -"Mrs" => "Mme", -"Dr" => "Dr", -"Given name" => "Prénom", -"Additional names" => "Nom supplémentaires", -"Family name" => "Nom de famille", -"Hon. suffixes" => "Suffixes hon.", -"Ph.D." => "Dr", -"New Addressbook" => "Nouveau carnet d'adresses", -"Edit Addressbook" => "Éditer le carnet d'adresses", -"Displayname" => "Nom", -"Active" => "Carnet actif", -"Save" => "Sauvegarder", -"Submit" => "Envoyer", -"Cancel" => "Annuler", -"Import a contacts file" => "Importer un fichier de contacts", -"Please choose the addressbook" => "Choisissez le carnet d'adresses SVP", -"create a new addressbook" => "Créer un nouveau carnet d'adresses", -"Name of new addressbook" => "Nom du nouveau carnet d'adresses", -"Import" => "Importer", -"Importing contacts" => "Importation des contacts", -"Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:", -"Select from HD" => "Selectionner depuis le disque dur", -"You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.", -"Add contact" => "Ajouter un contact", -"Configure addressbooks" => "Paramétrer carnet d'adresses", -"CardDAV syncing addresses" => "Synchronisation des contacts CardDAV", -"more info" => "Plus d'infos", -"Primary address (Kontact et al)" => "Adresse principale", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/gl.php b/apps/contacts/l10n/gl.php deleted file mode 100644 index bc3ec7449c..0000000000 --- a/apps/contacts/l10n/gl.php +++ /dev/null @@ -1,58 +0,0 @@ - "Produciuse un erro (des)activando a axenda.", -"There was an error adding the contact." => "Produciuse un erro engadindo o contacto.", -"Cannot add empty property." => "Non se pode engadir unha propiedade baleira.", -"At least one of the address fields has to be filled out." => "Polo menos un dos campos do enderezo ten que ser cuberto.", -"Error adding contact property." => "Produciuse un erro engadindo unha propiedade do contacto.", -"Error adding addressbook." => "Produciuse un erro engadindo a axenda.", -"Error activating addressbook." => "Produciuse un erro activando a axenda.", -"Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina.", -"Error deleting contact property." => "Produciuse un erro borrando a propiedade do contacto.", -"Error updating contact property." => "Produciuse un erro actualizando a propiedade do contacto.", -"Error updating addressbook." => "Produciuse un erro actualizando a axenda.", -"Contacts" => "Contactos", -"This is not your addressbook." => "Esta non é a súa axenda.", -"Contact could not be found." => "Non se atopou o contacto.", -"Address" => "Enderezo", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", -"Work" => "Traballo", -"Home" => "Casa", -"Mobile" => "Móbil", -"Text" => "Texto", -"Voice" => "Voz", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Paxinador", -"Contact" => "Contacto", -"Add Contact" => "Engadir contacto", -"Addressbooks" => "Axendas", -"New Address Book" => "Nova axenda", -"CardDav Link" => "Ligazón CardDav", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Eliminar", -"Download contact" => "Descargar contacto", -"Delete contact" => "Borrar contacto", -"Birthday" => "Aniversario", -"Preferred" => "Preferido", -"Phone" => "Teléfono", -"Type" => "Escribir", -"PO Box" => "Apartado de correos", -"Extended" => "Ampliado", -"Street" => "Rúa", -"City" => "Cidade", -"Region" => "Autonomía", -"Zipcode" => "Código postal", -"Country" => "País", -"Add" => "Engadir", -"Addressbook" => "Axenda", -"New Addressbook" => "Nova axenda", -"Edit Addressbook" => "Editar axenda", -"Displayname" => "Nome a mostrar", -"Active" => "Activo", -"Save" => "Gardar", -"Submit" => "Enviar", -"Cancel" => "Cancelar" -); diff --git a/apps/contacts/l10n/he.php b/apps/contacts/l10n/he.php deleted file mode 100644 index 6e40ad71e1..0000000000 --- a/apps/contacts/l10n/he.php +++ /dev/null @@ -1,65 +0,0 @@ - "שגיאה בהפעלה או בנטרול פנקס הכתובות.", -"There was an error adding the contact." => "אירעה שגיאה בעת הוספת איש הקשר.", -"Cannot add empty property." => "לא ניתן להוסיף מאפיין ריק.", -"At least one of the address fields has to be filled out." => "יש למלא לפחות אחד משדות הכתובת.", -"Trying to add duplicate property: " => "ניסיון להוספת מאפיין כפול: ", -"Error adding contact property." => "שגיאה בהוספת מאפיין לאיש הקשר.", -"No ID provided" => "לא צוין מזהה", -"Error setting checksum." => "שגיאה בהגדרת נתוני הביקורת.", -"No categories selected for deletion." => "לא נבחור קטגוריות למחיקה.", -"No address books found." => "לא נמצאו פנקסי כתובות.", -"No contacts found." => "לא נמצאו אנשי קשר.", -"Missing ID" => "מזהה חסר", -"Error adding addressbook." => "שגיאה בהוספת פנקס הכתובות.", -"Error activating addressbook." => "שגיאה בהפעלת פנקס הכתובות.", -"Information about vCard is incorrect. Please reload the page." => "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף.", -"Error deleting contact property." => "שגיאה במחיקת מאפיין של איש הקשר.", -"Error updating contact property." => "שגיאה בעדכון המאפיין של איש הקשר.", -"Error updating addressbook." => "שגיאה בעדכון פנקס הכתובות.", -"Contacts" => "אנשי קשר", -"This is not your addressbook." => "זהו אינו ספר הכתובות שלך", -"Contact could not be found." => "לא ניתן לאתר איש קשר", -"Address" => "כתובת", -"Telephone" => "טלפון", -"Email" => "דואר אלקטרוני", -"Organization" => "ארגון", -"Work" => "עבודה", -"Home" => "בית", -"Mobile" => "נייד", -"Text" => "טקסט", -"Voice" => "קולי", -"Fax" => "פקס", -"Video" => "וידאו", -"Pager" => "זימונית", -"Contact" => "איש קשר", -"Add Contact" => "הוספת איש קשר", -"Addressbooks" => "פנקסי כתובות", -"New Address Book" => "פנקס כתובות חדש", -"CardDav Link" => "קישור ", -"Download" => "הורדה", -"Edit" => "עריכה", -"Delete" => "מחיקה", -"Download contact" => "הורדת איש קשר", -"Delete contact" => "מחיקת איש קשר", -"Birthday" => "יום הולדת", -"Preferred" => "מועדף", -"Phone" => "טלפון", -"Type" => "סוג", -"PO Box" => "תא דואר", -"Extended" => "מורחב", -"Street" => "רחוב", -"City" => "עיר", -"Region" => "אזור", -"Zipcode" => "מיקוד", -"Country" => "מדינה", -"Add" => "הוספה", -"Addressbook" => "פנקס כתובות", -"New Addressbook" => "פנקס כתובות חדש", -"Edit Addressbook" => "עריכת פנקס הכתובות", -"Displayname" => "שם התצוגה", -"Active" => "פעיל", -"Save" => "שמירה", -"Submit" => "ביצוע", -"Cancel" => "ביטול" -); diff --git a/apps/contacts/l10n/hr.php b/apps/contacts/l10n/hr.php deleted file mode 100644 index d381bf4fa9..0000000000 --- a/apps/contacts/l10n/hr.php +++ /dev/null @@ -1,63 +0,0 @@ - "Informacija o vCard je neispravna. Osvježite stranicu.", -"File doesn't exist:" => "Datoteka ne postoji:", -"Contacts" => "Kontakti", -"This is not your addressbook." => "Ovo nije vaš adresar.", -"Contact could not be found." => "Kontakt ne postoji.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", -"Work" => "Posao", -"Home" => "Kuća", -"Mobile" => "Mobitel", -"Text" => "Tekst", -"Voice" => "Glasovno", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Contact" => "Kontakt", -"Add Contact" => "Dodaj kontakt", -"Addressbooks" => "Adresari", -"New Address Book" => "Novi adresar", -"CardDav Link" => "CardDav poveznica", -"Download" => "Preuzimanje", -"Edit" => "Uredi", -"Delete" => "Obriši", -"Download contact" => "Preuzmi kontakt", -"Delete contact" => "Izbriši kontakt", -"Edit name details" => "Uredi detalje imena", -"Nickname" => "Nadimak", -"Enter nickname" => "Unesi nadimank", -"Birthday" => "Rođendan", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Grupe", -"Edit groups" => "Uredi grupe", -"Enter email address" => "Unesi email adresu", -"Enter phone number" => "Unesi broj telefona", -"View on map" => "Prikaži na karti", -"Edit address details" => "Uredi detalje adrese", -"Add notes here." => "Dodaj bilješke ovdje.", -"Add field" => "Dodaj polje", -"Phone" => "Telefon", -"Note" => "Bilješka", -"Edit current photo" => "Uredi trenutnu sliku", -"Edit address" => "Uredi adresu", -"Type" => "Tip", -"PO Box" => "Poštanski Pretinac", -"Extended" => "Prošireno", -"Street" => "Ulica", -"City" => "Grad", -"Region" => "Regija", -"Zipcode" => "Poštanski broj", -"Country" => "Država", -"Edit categories" => "Uredi kategorije", -"Add" => "Dodaj", -"Addressbook" => "Adresar", -"New Addressbook" => "Novi adresar", -"Edit Addressbook" => "Uredi adresar", -"Save" => "Spremi", -"Submit" => "Pošalji", -"Cancel" => "Prekini", -"Import" => "Uvezi" -); diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php deleted file mode 100644 index 68f7b2607e..0000000000 --- a/apps/contacts/l10n/hu_HU.php +++ /dev/null @@ -1,157 +0,0 @@ - "Címlista (de)aktiválása sikertelen", -"There was an error adding the contact." => "Hiba a kapcsolat hozzáadásakor", -"Cannot add empty property." => "Nem adható hozzá üres tulajdonság", -"At least one of the address fields has to be filled out." => "Legalább egy címmező kitöltendő", -"Trying to add duplicate property: " => "Kísérlet dupla tulajdonság hozzáadására: ", -"Error adding contact property." => "Hiba a kapcsolat-tulajdonság hozzáadásakor", -"No ID provided" => "Nincs ID megadva", -"Error setting checksum." => "Hiba az ellenőrzőösszeg beállításakor", -"No categories selected for deletion." => "Nincs kiválasztva törlendő kategória", -"No address books found." => "Nem található címlista", -"No contacts found." => "Nem található kontakt", -"Missing ID" => "Hiányzó ID", -"Error parsing VCard for ID: \"" => "VCard elemzése sikertelen a következő ID-hoz: \"", -"Cannot add addressbook with an empty name." => "Nem adható hozzá névtelen címlista", -"Error adding addressbook." => "Hiba a címlista hozzáadásakor", -"Error activating addressbook." => "Címlista aktiválása sikertelen", -"No contact ID was submitted." => "Nincs ID megadva a kontakthoz", -"Error reading contact photo." => "A kontakt képének beolvasása sikertelen", -"Error saving temporary file." => "Ideiglenes fájl mentése sikertelen", -"The loading photo is not valid." => "A kép érvénytelen", -"id is not set." => "ID nincs beállítva", -"Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.", -"Error deleting contact property." => "Hiba a kapcsolat-tulajdonság törlésekor", -"Contact ID is missing." => "Hiányzik a kapcsolat ID", -"Missing contact id." => "Hiányzik a kontakt ID", -"No photo path was submitted." => "Nincs fénykép-útvonal megadva", -"File doesn't exist:" => "A fájl nem létezik:", -"Error loading image." => "Kép betöltése sikertelen", -"element name is not set." => "az elem neve nincs beállítva", -"checksum is not set." => "az ellenőrzőösszeg nincs beállítva", -"Information about vCard is incorrect. Please reload the page: " => "Helytelen információ a vCardról. Töltse újra az oldalt: ", -"Something went FUBAR. " => "Valami balul sült el.", -"Error updating contact property." => "Hiba a kapcsolat-tulajdonság frissítésekor", -"Cannot update addressbook with an empty name." => "Üres névvel nem frissíthető a címlista", -"Error updating addressbook." => "Hiba a címlista frissítésekor", -"Error uploading contacts to storage." => "Hiba a kapcsolatok feltöltésekor", -"There is no error, the file uploaded with success" => "Nincs hiba, a fájl sikeresen feltöltődött", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött fájl mérete meghaladja az upload_max_filesize értéket a php.ini-ben", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "A feltöltött fájl mérete meghaladja a HTML form-ban megadott MAX_FILE_SIZE értéket", -"The uploaded file was only partially uploaded" => "A fájl csak részlegesen lett feltöltve", -"No file was uploaded" => "Nincs feltöltött fájl", -"Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár", -"Contacts" => "Kapcsolatok", -"Drop a VCF file to import contacts." => "Húzza ide a VCF fájlt a kapcsolatok importálásához", -"Addressbook not found." => "Címlista nem található", -"This is not your addressbook." => "Ez nem a te címjegyzéked.", -"Contact could not be found." => "Kapcsolat nem található.", -"Address" => "Cím", -"Telephone" => "Telefonszám", -"Email" => "E-mail", -"Organization" => "Szervezet", -"Work" => "Munkahelyi", -"Home" => "Otthoni", -"Mobile" => "Mobiltelefonszám", -"Text" => "Szöveg", -"Voice" => "Hang", -"Message" => "Üzenet", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Személyhívó", -"Internet" => "Internet", -"{name}'s Birthday" => "{name} születésnapja", -"Contact" => "Kapcsolat", -"Add Contact" => "Kapcsolat hozzáadása", -"Addressbooks" => "Címlisták", -"Configure Address Books" => "Címlisták beállítása", -"New Address Book" => "Új címlista", -"Import from VCF" => "Importálás VCF-ből", -"CardDav Link" => "CardDav hivatkozás", -"Download" => "Letöltés", -"Edit" => "Szerkesztés", -"Delete" => "Törlés", -"Download contact" => "Kapcsolat letöltése", -"Delete contact" => "Kapcsolat törlése", -"Drop photo to upload" => "Húzza ide a feltöltendő képet", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel", -"Edit name details" => "Név részleteinek szerkesztése", -"Nickname" => "Becenév", -"Enter nickname" => "Becenév megadása", -"Birthday" => "Születésnap", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "Csoportok", -"Separate groups with commas" => "Vesszővel válassza el a csoportokat", -"Edit groups" => "Csoportok szerkesztése", -"Preferred" => "Előnyben részesített", -"Please specify a valid email address." => "Adjon meg érvényes email címet", -"Enter email address" => "Adja meg az email címet", -"Mail to address" => "Postai cím", -"Delete email address" => "Email cím törlése", -"Enter phone number" => "Adja meg a telefonszámot", -"Delete phone number" => "Telefonszám törlése", -"View on map" => "Megtekintés a térképen", -"Edit address details" => "Cím részleteinek szerkesztése", -"Add notes here." => "Megjegyzések", -"Add field" => "Mező hozzáadása", -"Profile picture" => "Profilkép", -"Phone" => "Telefonszám", -"Note" => "Jegyzet", -"Delete current photo" => "Aktuális kép törlése", -"Edit current photo" => "Aktuális kép szerkesztése", -"Upload new photo" => "Új kép feltöltése", -"Select photo from ownCloud" => "Kép kiválasztása ownCloud-ból", -"Edit address" => "Cím szerkesztése", -"Type" => "Típus", -"PO Box" => "Postafiók", -"Extended" => "Kiterjesztett", -"Street" => "Utca", -"City" => "Város", -"Region" => "Megye", -"Zipcode" => "Irányítószám", -"Country" => "Ország", -"Edit categories" => "Kategóriák szerkesztése", -"Add" => "Hozzáad", -"Addressbook" => "Címlista", -"Hon. prefixes" => "Előtag", -"Miss" => "Miss", -"Ms" => "Ms", -"Mr" => "Mr", -"Sir" => "Sir", -"Mrs" => "Mrs", -"Dr" => "Dr.", -"Given name" => "Teljes név", -"Additional names" => "További nevek", -"Family name" => "Családnév", -"Hon. suffixes" => "Utótag", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Ifj.", -"Sn." => "Id.", -"New Addressbook" => "Új Címlista", -"Edit Addressbook" => "Címlista szerkesztése", -"Displayname" => "Megjelenített név", -"Active" => "Aktív", -"Save" => "Mentés", -"Submit" => "Elküld", -"Cancel" => "Mégsem", -"Import a contacts file" => "Kapcsolat-fájl importálása", -"Please choose the addressbook" => "Válassza ki a címlistát", -"create a new addressbook" => "Címlista létrehozása", -"Name of new addressbook" => "Új címlista neve", -"Import" => "Import", -"Importing contacts" => "Kapcsolatok importálása", -"Select address book to import to:" => "Melyik címlistába történjen az importálás:", -"Select from HD" => "Kiválasztás merevlemezről", -"You have no contacts in your addressbook." => "Nincsenek kapcsolatok a címlistában", -"Add contact" => "Kapcsolat hozzáadása", -"Configure addressbooks" => "Címlisták beállítása", -"CardDAV syncing addresses" => "CardDAV szinkronizációs címek", -"more info" => "további információ", -"Primary address (Kontact et al)" => "Elsődleges cím", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php deleted file mode 100644 index f420b48d84..0000000000 --- a/apps/contacts/l10n/ia.php +++ /dev/null @@ -1,94 +0,0 @@ - "Non pote adder proprietate vacue.", -"No address books found." => "Nulle adressario trovate", -"No contacts found." => "Nulle contactos trovate.", -"Error adding addressbook." => "Error durante que il addeva le adressario.", -"Error activating addressbook." => "Error in activar adressario", -"Error saving temporary file." => "Error durante le scriptura in le file temporari", -"Error loading image." => "Il habeva un error durante le cargamento del imagine.", -"No file was uploaded" => "Nulle file esseva incargate.", -"Missing a temporary folder" => "Manca un dossier temporari", -"Contacts" => "Contactos", -"Addressbook not found." => "Adressario non trovate.", -"This is not your addressbook." => "Iste non es tu libro de adresses", -"Contact could not be found." => "Contacto non poterea esser legite", -"Address" => "Adresse", -"Telephone" => "Telephono", -"Email" => "E-posta", -"Organization" => "Organisation", -"Work" => "Travalio", -"Home" => "Domo", -"Mobile" => "Mobile", -"Text" => "Texto", -"Voice" => "Voce", -"Message" => "Message", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"Contact" => "Contacto", -"Add Contact" => "Adder contacto", -"Addressbooks" => "Adressarios", -"New Address Book" => "Nove adressario", -"CardDav Link" => "Ligamine CardDav", -"Download" => "Discargar", -"Edit" => "Modificar", -"Delete" => "Deler", -"Download contact" => "Discargar contacto", -"Delete contact" => "Deler contacto", -"Nickname" => "Pseudonymo", -"Enter nickname" => "Inserer pseudonymo", -"Birthday" => "Anniversario", -"Groups" => "Gruppos", -"Edit groups" => "Modificar gruppos", -"Preferred" => "Preferite", -"Enter email address" => "Entrar un adresse de e-posta", -"Delete email address" => "Deler adresse de E-posta", -"Enter phone number" => "Entrar un numero de telephono", -"Delete phone number" => "Deler numero de telephono", -"View on map" => "Vider in un carta", -"Add notes here." => "Adder notas hic", -"Add field" => "Adder campo", -"Profile picture" => "Imagine de profilo", -"Phone" => "Phono", -"Note" => "Nota", -"Delete current photo" => "Deler photo currente", -"Edit current photo" => "Modificar photo currente", -"Upload new photo" => "Incargar nove photo", -"Select photo from ownCloud" => "Seliger photo ex ownCloud", -"Edit address" => "Modificar adresses", -"Type" => "Typo", -"PO Box" => "Cassa postal", -"Extended" => "Extendite", -"Street" => "Strata", -"City" => "Citate", -"Region" => "Region", -"Zipcode" => "Codice postal", -"Country" => "Pais", -"Edit categories" => "Modificar categorias", -"Add" => "Adder", -"Addressbook" => "Adressario", -"Hon. prefixes" => "Prefixos honorific", -"Miss" => "Senioretta", -"Mr" => "Sr.", -"Mrs" => "Sra.", -"Dr" => "Dr.", -"Given name" => "Nomine date", -"Additional names" => "Nomines additional", -"Family name" => "Nomine de familia", -"Hon. suffixes" => "Suffixos honorific", -"New Addressbook" => "Nove adressario", -"Edit Addressbook" => "Modificar adressario", -"Active" => "Active", -"Save" => "Salveguardar", -"Submit" => "Submitter", -"Cancel" => "Cancellar", -"Import a contacts file" => "Importar un file de contactos", -"Please choose the addressbook" => "Per favor selige le adressario", -"create a new addressbook" => "Crear un nove adressario", -"Name of new addressbook" => "Nomine del nove gruppo:", -"Import" => "Importar", -"Add contact" => "Adder adressario", -"more info" => "plus info", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php deleted file mode 100644 index 2a5478e6c4..0000000000 --- a/apps/contacts/l10n/it.php +++ /dev/null @@ -1,157 +0,0 @@ - "Errore nel (dis)attivare la rubrica.", -"There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.", -"Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.", -"At least one of the address fields has to be filled out." => "Deve essere riempito almeno un indirizzo.", -"Trying to add duplicate property: " => "P", -"Error adding contact property." => "Errore durante l'aggiunta della proprietà del contatto.", -"No ID provided" => "Nessun ID fornito", -"Error setting checksum." => "Errore di impostazione del codice di controllo.", -"No categories selected for deletion." => "Nessuna categoria selezionata per l'eliminazione.", -"No address books found." => "Nessuna rubrica trovata.", -"No contacts found." => "Nessun contatto trovato.", -"Missing ID" => "ID mancante", -"Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"", -"Cannot add addressbook with an empty name." => "Impossibile aggiungere una rubrica senza nome.", -"Error adding addressbook." => "Errore durante l'aggiunta della rubrica.", -"Error activating addressbook." => "Errore durante l'attivazione della rubrica.", -"No contact ID was submitted." => "Nessun ID di contatto inviato.", -"Error reading contact photo." => "Errore di lettura della foto del contatto.", -"Error saving temporary file." => "Errore di salvataggio del file temporaneo.", -"The loading photo is not valid." => "La foto caricata non è valida.", -"id is not set." => "ID non impostato.", -"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.", -"Error deleting contact property." => "Errore durante l'eliminazione della proprietà del contatto.", -"Contact ID is missing." => "Manca l'ID del contatto.", -"Missing contact id." => "ID di contatto mancante.", -"No photo path was submitted." => "Non è stato inviato alcun percorso a una foto.", -"File doesn't exist:" => "Il file non esiste:", -"Error loading image." => "Errore di caricamento immagine.", -"element name is not set." => "il nome dell'elemento non è impostato.", -"checksum is not set." => "il codice di controllo non è impostato.", -"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ", -"Something went FUBAR. " => "Qualcosa è andato storto. ", -"Error updating contact property." => "Errore durante l'aggiornamento della proprietà del contatto.", -"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.", -"Error updating addressbook." => "Errore durante l'aggiornamento della rubrica.", -"Error uploading contacts to storage." => "Errore di invio dei contatti in archivio.", -"There is no error, the file uploaded with success" => "Non ci sono errori, il file è stato inviato correttamente", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file inviato supera la direttiva upload_max_filesize nel php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", -"The uploaded file was only partially uploaded" => "Il file è stato inviato solo parzialmente", -"No file was uploaded" => "Nessun file è stato inviato", -"Missing a temporary folder" => "Manca una cartella temporanea", -"Contacts" => "Contatti", -"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.", -"Addressbook not found." => "Rubrica non trovata.", -"This is not your addressbook." => "Questa non è la tua rubrica.", -"Contact could not be found." => "Il contatto non può essere trovato.", -"Address" => "Indirizzo", -"Telephone" => "Telefono", -"Email" => "Email", -"Organization" => "Organizzazione", -"Work" => "Lavoro", -"Home" => "Casa", -"Mobile" => "Cellulare", -"Text" => "Testo", -"Voice" => "Voce", -"Message" => "Messaggio", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Cercapersone", -"Internet" => "Internet", -"{name}'s Birthday" => "Data di nascita di {name}", -"Contact" => "Contatto", -"Add Contact" => "Aggiungi contatto", -"Addressbooks" => "Rubriche", -"Configure Address Books" => "Configura rubrica", -"New Address Book" => "Nuova rubrica", -"Import from VCF" => "Importa da VCF", -"CardDav Link" => "Link CardDav", -"Download" => "Scarica", -"Edit" => "Modifica", -"Delete" => "Elimina", -"Download contact" => "Scarica contatto", -"Delete contact" => "Elimina contatto", -"Drop photo to upload" => "Rilascia una foto da inviare", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola", -"Edit name details" => "Modifica dettagli del nome", -"Nickname" => "Pseudonimo", -"Enter nickname" => "Inserisci pseudonimo", -"Birthday" => "Compleanno", -"dd-mm-yyyy" => "gg-mm-aaaa", -"Groups" => "Gruppi", -"Separate groups with commas" => "Separa i gruppi con virgole", -"Edit groups" => "Modifica gruppi", -"Preferred" => "Preferito", -"Please specify a valid email address." => "Specifica un indirizzo email valido", -"Enter email address" => "Inserisci indirizzo email", -"Mail to address" => "Invia per email", -"Delete email address" => "Elimina l'indirizzo email", -"Enter phone number" => "Inserisci il numero di telefono", -"Delete phone number" => "Elimina il numero di telefono", -"View on map" => "Visualizza sulla mappa", -"Edit address details" => "Modifica dettagli dell'indirizzo", -"Add notes here." => "Aggiungi qui le note.", -"Add field" => "Aggiungi campo", -"Profile picture" => "Immagine del profilo", -"Phone" => "Telefono", -"Note" => "Nota", -"Delete current photo" => "Elimina la foto corrente", -"Edit current photo" => "Modifica la foto corrente", -"Upload new photo" => "Invia una nuova foto", -"Select photo from ownCloud" => "Seleziona la foto da ownCloud", -"Edit address" => "Modifica indirizzo", -"Type" => "Tipo", -"PO Box" => "Casella postale", -"Extended" => "Esteso", -"Street" => "Via", -"City" => "Città", -"Region" => "Regione", -"Zipcode" => "CAP", -"Country" => "Stato", -"Edit categories" => "Modifica categorie", -"Add" => "Aggiungi", -"Addressbook" => "Rubrica", -"Hon. prefixes" => "Prefissi onorifici", -"Miss" => "Sig.na", -"Ms" => "Sig.ra", -"Mr" => "Sig.", -"Sir" => "Sig.", -"Mrs" => "Sig.ra", -"Dr" => "Dott.", -"Given name" => "Nome", -"Additional names" => "Nomi aggiuntivi", -"Family name" => "Cognome", -"Hon. suffixes" => "Suffissi onorifici", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Nuova rubrica", -"Edit Addressbook" => "Modifica rubrica", -"Displayname" => "Nome visualizzato", -"Active" => "Attiva", -"Save" => "Salva", -"Submit" => "Invia", -"Cancel" => "Annulla", -"Import a contacts file" => "Importa un file di contatti", -"Please choose the addressbook" => "Scegli la rubrica", -"create a new addressbook" => "crea una nuova rubrica", -"Name of new addressbook" => "Nome della nuova rubrica", -"Import" => "Importa", -"Importing contacts" => "Importazione contatti", -"Select address book to import to:" => "Seleziona la rubrica di destinazione:", -"Select from HD" => "Seleziona da disco", -"You have no contacts in your addressbook." => "Non hai contatti nella rubrica.", -"Add contact" => "Aggiungi contatto", -"Configure addressbooks" => "Configura rubriche", -"CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV", -"more info" => "altre informazioni", -"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/ja_JP.php b/apps/contacts/l10n/ja_JP.php deleted file mode 100644 index d98e58f94d..0000000000 --- a/apps/contacts/l10n/ja_JP.php +++ /dev/null @@ -1,152 +0,0 @@ - "アドレスブックの有効/無効化に失敗しました。", -"There was an error adding the contact." => "連絡先の追加でエラーが発生しました。", -"Cannot add empty property." => "項目の新規追加に失敗しました。", -"At least one of the address fields has to be filled out." => "住所の項目のうち1つは入力して下さい。", -"Error adding contact property." => "連絡先の追加に失敗しました。", -"No ID provided" => "IDが提供されていません", -"Error setting checksum." => "チェックサムの設定エラー。", -"No categories selected for deletion." => "削除するカテゴリが選択されていません。", -"No address books found." => "アドレスブックが見つかりません。", -"No contacts found." => "連絡先が見つかりません。", -"Error parsing VCard for ID: \"" => "VCardからIDの抽出エラー: \"", -"Cannot add addressbook with an empty name." => "名前を空白にしたままでアドレスブックを追加することはできません。", -"Error adding addressbook." => "アドレスブックの追加に失敗しました。", -"Error activating addressbook." => "アドレスブックの有効化に失敗しました。", -"No contact ID was submitted." => "連絡先IDは登録されませんでした。", -"Error reading contact photo." => "連絡先写真の読み込みエラー。", -"Error saving temporary file." => "一時ファイルの保存エラー。", -"The loading photo is not valid." => "写真の読み込みは無効です。", -"id is not set." => "idが設定されていません。", -"Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。", -"Error deleting contact property." => "連絡先の削除に失敗しました。", -"Contact ID is missing." => "コンタクトIDが見つかりません。", -"Missing contact id." => "コンタクトIDが設定されていません。", -"No photo path was submitted." => "写真のパスが登録されていません。", -"File doesn't exist:" => "ファイルが存在しません:", -"Error loading image." => "画像の読み込みエラー。", -"element name is not set." => "要素名が設定されていません。", -"checksum is not set." => "チェックサムが設定されていません。", -"Information about vCard is incorrect. Please reload the page: " => "vCardの情報が正しくありません。ページを再読み込みしてください: ", -"Error updating contact property." => "連絡先の更新に失敗しました。", -"Cannot update addressbook with an empty name." => "空白の名前でアドレスブックを更新することはできません。", -"Error updating addressbook." => "アドレスブックの更新に失敗しました。", -"Error uploading contacts to storage." => "ストレージへの連絡先のアップロードエラー。", -"There is no error, the file uploaded with success" => "エラーはありません。ファイルのアップロードは成功しました", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "アップロードファイルは php.ini 内の upload_max_filesize の制限を超えています", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "アップロードファイルはHTMLフォームで指定された MAX_FILE_SIZE の制限を超えています", -"The uploaded file was only partially uploaded" => "アップロードファイルは一部分だけアップロードされました", -"No file was uploaded" => "ファイルはアップロードされませんでした", -"Missing a temporary folder" => "一時保存フォルダが見つかりません", -"Contacts" => "連絡先", -"Drop a VCF file to import contacts." => "連絡先をインポートするVCFファイルをドロップしてください。", -"Addressbook not found." => "アドレスブックが見つかりませんでした。", -"This is not your addressbook." => "これはあなたの電話帳ではありません。", -"Contact could not be found." => "連絡先を見つける事ができません。", -"Address" => "住所", -"Telephone" => "電話番号", -"Email" => "メールアドレス", -"Organization" => "所属", -"Work" => "勤務先", -"Home" => "住居", -"Mobile" => "携帯電話", -"Text" => "TTY TDD", -"Voice" => "音声番号", -"Message" => "メッセージ", -"Fax" => "FAX", -"Video" => "テレビ電話", -"Pager" => "ポケベル", -"Internet" => "インターネット", -"{name}'s Birthday" => "{name}の誕生日", -"Contact" => "連絡先", -"Add Contact" => "連絡先の追加", -"Addressbooks" => "電話帳", -"Configure Address Books" => "アドレスブックを設定", -"New Address Book" => "新規電話帳", -"Import from VCF" => "VCFからインポート", -"CardDav Link" => "CardDAVリンク", -"Download" => "ダウンロード", -"Edit" => "編集", -"Delete" => "削除", -"Download contact" => "連絡先のダウンロード", -"Delete contact" => "連絡先の削除", -"Drop photo to upload" => "写真をドロップしてアップロード", -"Edit name details" => "名前の詳細を編集", -"Nickname" => "ニックネーム", -"Enter nickname" => "ニックネームを入力", -"Birthday" => "誕生日", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "グループ", -"Separate groups with commas" => "コンマでグループを分割", -"Edit groups" => "グループを編集", -"Preferred" => "推奨", -"Please specify a valid email address." => "連絡先を追加", -"Enter email address" => "メールアドレスを入力", -"Mail to address" => "アドレスへメールを送る", -"Delete email address" => "メールアドレスを削除", -"Enter phone number" => "電話番号を入力", -"Delete phone number" => "電話番号を削除", -"View on map" => "地図で表示", -"Edit address details" => "住所の詳細を編集", -"Add notes here." => "ここにメモを追加。", -"Add field" => "項目を追加", -"Profile picture" => "プロフィール写真", -"Phone" => "電話番号", -"Note" => "メモ", -"Delete current photo" => "現在の写真を削除", -"Edit current photo" => "現在の写真を編集", -"Upload new photo" => "新しい写真をアップロード", -"Select photo from ownCloud" => "ownCloudから写真を選択", -"Edit address" => "住所を編集", -"Type" => "種類", -"PO Box" => "私書箱", -"Extended" => "番地2", -"Street" => "番地1", -"City" => "都市", -"Region" => "都道府県", -"Zipcode" => "郵便番号", -"Country" => "国名", -"Edit categories" => "カテゴリを編集", -"Add" => "追加", -"Addressbook" => "アドレスブック", -"Miss" => "Miss", -"Ms" => "Ms", -"Mr" => "Mr", -"Sir" => "Sir", -"Mrs" => "Mrs", -"Dr" => "Dr", -"Given name" => "名", -"Additional names" => "ミドルネーム", -"Family name" => "姓", -"Hon. suffixes" => "ストレージへの連絡先のアップロードエラー。", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "アドレスブックの新規作成", -"Edit Addressbook" => "アドレスブックを編集", -"Displayname" => "表示名", -"Active" => "アクティブ", -"Save" => "保存", -"Submit" => "送信", -"Cancel" => "取り消し", -"Import a contacts file" => "コンタクトファイルをインポート", -"Please choose the addressbook" => "アドレスブックを選択してください", -"create a new addressbook" => "新しいアドレスブックを作成", -"Name of new addressbook" => "新しいアドレスブックの名前", -"Import" => "インポート", -"Importing contacts" => "コンタクトをインポート", -"Select address book to import to:" => "インポートするアドレスブックを選択:", -"Select from HD" => "HDから選択", -"You have no contacts in your addressbook." => "アドレスブックに連絡先が登録されていません。", -"Add contact" => "連絡先を追加", -"Configure addressbooks" => "アドレス帳を設定", -"CardDAV syncing addresses" => "CardDAV同期アドレス", -"more info" => "詳細情報", -"Primary address (Kontact et al)" => "プライマリアドレス(Kontact 他)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/ko.php b/apps/contacts/l10n/ko.php deleted file mode 100644 index fcdc1d08c6..0000000000 --- a/apps/contacts/l10n/ko.php +++ /dev/null @@ -1,92 +0,0 @@ - "주소록을 (비)활성화하는 데 실패했습니다.", -"There was an error adding the contact." => "연락처를 추가하는 중 오류가 발생하였습니다.", -"Cannot add empty property." => "빈 속성을 추가할 수 없습니다.", -"At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.", -"Error adding contact property." => "연락처 속성을 추가할 수 없습니다.", -"No ID provided" => "제공되는 아이디 없음", -"Error setting checksum." => "오류 검사합계 설정", -"No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다. ", -"No address books found." => "주소록을 찾을 수 없습니다.", -"No contacts found." => "연락처를 찾을 수 없습니다.", -"Missing ID" => "아이디 분실", -"Cannot add addressbook with an empty name." => "성명란이 비어 주소록에 추가 할 수 없습니다.", -"Error adding addressbook." => "주소록을 추가할 수 없습니다.", -"Error activating addressbook." => "주소록을 활성화할 수 없습니다.", -"No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.", -"Error reading contact photo." => "사진 읽기 오류", -"Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ", -"The loading photo is not valid." => "로딩 사진이 유효하지 않습니다. ", -"id is not set." => "아이디가 설정되어 있지 않습니다. ", -"Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.", -"Error deleting contact property." => "연락처 속성을 삭제할 수 없습니다.", -"Contact ID is missing." => "접속 아이디가 없습니다. ", -"Missing contact id." => "접속 아이디 분실", -"File doesn't exist:" => "파일이 존재하지 않습니다. ", -"Error loading image." => "로딩 이미지 오류입니다.", -"Error updating contact property." => "연락처 속성을 업데이트할 수 없습니다.", -"Error updating addressbook." => "주소록을 업데이트할 수 없습니다.", -"No file was uploaded" => "파일이 업로드 되어있지 않습니다", -"Missing a temporary folder" => "임시 폴더 분실", -"Contacts" => "연락처", -"Addressbook not found." => "주소록을 찾을 수 없습니다.", -"This is not your addressbook." => "내 주소록이 아닙니다.", -"Contact could not be found." => "연락처를 찾을 수 없습니다.", -"Address" => "주소", -"Telephone" => "전화 번호", -"Email" => "전자 우편", -"Organization" => "조직", -"Work" => "직장", -"Home" => "자택", -"Mobile" => "휴대폰", -"Text" => "문자 번호", -"Voice" => "음성 번호", -"Message" => "메세지", -"Fax" => "팩스 번호", -"Video" => "영상 번호", -"Pager" => "호출기", -"Internet" => "인터넷", -"{name}'s Birthday" => "{이름}의 생일", -"Contact" => "연락처", -"Add Contact" => "연락처 추가", -"Addressbooks" => "주소록", -"Configure Address Books" => "주소록 구성", -"New Address Book" => "새 주소록", -"Import from VCF" => "VCF에서 가져오기", -"CardDav Link" => "CardDav 링크", -"Download" => "다운로드", -"Edit" => "편집", -"Delete" => "삭제", -"Download contact" => "연락처 다운로드", -"Delete contact" => "연락처 삭제", -"Drop photo to upload" => "Drop photo to upload", -"Edit name details" => "이름 세부사항을 편집합니다. ", -"Nickname" => "별명", -"Enter nickname" => "별명 입력", -"Birthday" => "생일", -"dd-mm-yyyy" => "일-월-년", -"Groups" => "그룹", -"Separate groups with commas" => "쉼표로 그룹 구분", -"Edit groups" => "그룹 편집", -"Preferred" => "선호함", -"Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.", -"Enter email address" => "이메일 주소 입력", -"Phone" => "전화 번호", -"Type" => "종류", -"PO Box" => "사서함", -"Extended" => "확장", -"Street" => "거리", -"City" => "도시", -"Region" => "지역", -"Zipcode" => "우편 번호", -"Country" => "국가", -"Add" => "추가", -"Addressbook" => "주소록", -"New Addressbook" => "새 주소록", -"Edit Addressbook" => "주소록 편집", -"Displayname" => "표시 이름", -"Active" => "활성", -"Save" => "저장", -"Submit" => "보내기", -"Cancel" => "취소" -); diff --git a/apps/contacts/l10n/lb.php b/apps/contacts/l10n/lb.php deleted file mode 100644 index 361e1cb93e..0000000000 --- a/apps/contacts/l10n/lb.php +++ /dev/null @@ -1,44 +0,0 @@ - "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei.", -"This is not your addressbook." => "Dat do ass net däin Adressbuch.", -"Contact could not be found." => "Konnt den Kontakt net fannen.", -"Address" => "Adress", -"Telephone" => "Telefon's Nummer", -"Email" => "Email", -"Organization" => "Firma", -"Work" => "Aarbecht", -"Home" => "Doheem", -"Mobile" => "GSM", -"Text" => "SMS", -"Voice" => "Voice", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Contact" => "Kontakt", -"Add Contact" => "Kontakt bäisetzen", -"Addressbooks" => "Adressbicher ", -"New Address Book" => "Neit Adressbuch", -"CardDav Link" => "CardDav Link", -"Download" => "Download", -"Edit" => "Editéieren", -"Delete" => "Läschen", -"Delete contact" => "Kontakt läschen", -"Birthday" => "Gebuertsdag", -"Phone" => "Telefon", -"Type" => "Typ", -"PO Box" => "Postleetzuel", -"Extended" => "Erweidert", -"Street" => "Strooss", -"City" => "Staat", -"Region" => "Regioun", -"Zipcode" => "Postleetzuel", -"Country" => "Land", -"Add" => "Dobäisetzen", -"Addressbook" => "Adressbuch", -"New Addressbook" => "Neit Adressbuch", -"Edit Addressbook" => "Adressbuch editéieren", -"Displayname" => "Ugewisene Numm", -"Save" => "Späicheren", -"Submit" => "Fortschécken", -"Cancel" => "Ofbriechen" -); diff --git a/apps/contacts/l10n/lt_LT.php b/apps/contacts/l10n/lt_LT.php deleted file mode 100644 index 435927a247..0000000000 --- a/apps/contacts/l10n/lt_LT.php +++ /dev/null @@ -1,49 +0,0 @@ - "Klaida (de)aktyvuojant adresų knygą.", -"There was an error adding the contact." => "Pridedant kontaktą įvyko klaida.", -"Error adding addressbook." => "Klaida pridedant adresų knygą.", -"Error activating addressbook." => "Klaida aktyvuojant adresų knygą.", -"Information about vCard is incorrect. Please reload the page." => "Informacija apie vCard yra neteisinga. ", -"Contacts" => "Kontaktai", -"This is not your addressbook." => "Tai ne jūsų adresų knygelė.", -"Contact could not be found." => "Kontaktas nerastas", -"Address" => "Adresas", -"Telephone" => "Telefonas", -"Email" => "El. paštas", -"Organization" => "Organizacija", -"Work" => "Darbo", -"Home" => "Namų", -"Mobile" => "Mobilusis", -"Text" => "Žinučių", -"Voice" => "Balso", -"Fax" => "Faksas", -"Video" => "Vaizdo", -"Pager" => "Pranešimų gaviklis", -"Contact" => "Kontaktas", -"Add Contact" => "Pridėti kontaktą", -"Addressbooks" => "Adresų knygos", -"New Address Book" => "Nauja adresų knyga", -"CardDav Link" => "CardDAV nuoroda", -"Download" => "Atsisiųsti", -"Edit" => "Keisti", -"Delete" => "Trinti", -"Download contact" => "Atsisųsti kontaktą", -"Delete contact" => "Ištrinti kontaktą", -"Birthday" => "Gimtadienis", -"Phone" => "Telefonas", -"Type" => "Tipas", -"PO Box" => "Pašto dėžutė", -"Street" => "Gatvė", -"City" => "Miestas", -"Region" => "Regionas", -"Zipcode" => "Pašto indeksas", -"Country" => "Šalis", -"Add" => "Pridėti", -"Addressbook" => "Adresų knyga", -"New Addressbook" => "Nauja adresų knyga", -"Edit Addressbook" => "Redaguoti adresų knygą", -"Displayname" => "Rodomas vardas", -"Active" => "Aktyvus", -"Save" => "Išsaugoti", -"Cancel" => "Atšaukti" -); diff --git a/apps/contacts/l10n/mk.php b/apps/contacts/l10n/mk.php deleted file mode 100644 index 2b81a5d877..0000000000 --- a/apps/contacts/l10n/mk.php +++ /dev/null @@ -1,157 +0,0 @@ - "Грешка (де)активирање на адресарот.", -"There was an error adding the contact." => "Имаше грешка при додавање на контактот.", -"Cannot add empty property." => "Неможе да се додаде празна вредност.", -"At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.", -"Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:", -"Error adding contact property." => "Грешка при додавање на вредност за контактот.", -"No ID provided" => "Нема доставено ИД", -"Error setting checksum." => "Грешка во поставување сума за проверка.", -"No categories selected for deletion." => "Нема избрано категории за бришење.", -"No address books found." => "Не се најдени адресари.", -"No contacts found." => "Не се најдени контакти.", -"Missing ID" => "Недостасува ИД", -"Error parsing VCard for ID: \"" => "Грешка при парсирање VCard за ИД: \"", -"Cannot add addressbook with an empty name." => "Неможе да се внесе адресар со празно име.", -"Error adding addressbook." => "Грешки при додавање на адресарот.", -"Error activating addressbook." => "Грешка при активирање на адресарот.", -"No contact ID was submitted." => "Не беше доставено ИД за контакт.", -"Error reading contact photo." => "Грешка во читање на контакт фотографија.", -"Error saving temporary file." => "Грешка во снимање на привремена датотека.", -"The loading photo is not valid." => "Фотографијата која се вчитува е невалидна.", -"id is not set." => "ид не е поставено.", -"Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.", -"Error deleting contact property." => "Греш при бришење на вредноста за контакт.", -"Contact ID is missing." => "ИД за контакт недостасува.", -"Missing contact id." => "Недостасува ид за контакт.", -"No photo path was submitted." => "Не беше поднесена патека за фотографија.", -"File doesn't exist:" => "Не постои датотеката:", -"Error loading image." => "Грешка во вчитување на слика.", -"element name is not set." => "име за елементот не е поставена.", -"checksum is not set." => "сумата за проверка не е поставена.", -"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:", -"Something went FUBAR. " => "Нешто се расипа.", -"Error updating contact property." => "Грешка при ажурирање на вредноста за контакт.", -"Cannot update addressbook with an empty name." => "Неможе да се ажурира адресар со празно име.", -"Error updating addressbook." => "Грешка при ажурирање на адресарот.", -"Error uploading contacts to storage." => "Грешка во снимање на контактите на диск.", -"There is no error, the file uploaded with success" => "Датотеката беше успешно подигната.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Големината на датотеката ја надминува upload_max_filesize директивата во php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата", -"The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.", -"No file was uploaded" => "Не беше подигната датотека.", -"Missing a temporary folder" => "Недостасува привремена папка", -"Contacts" => "Контакти", -"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.", -"Addressbook not found." => "Адресарот не е најден.", -"This is not your addressbook." => "Ова не е во Вашиот адресар.", -"Contact could not be found." => "Контактот неможе да биде најден.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-пошта", -"Organization" => "Организација", -"Work" => "Работа", -"Home" => "Дома", -"Mobile" => "Мобилен", -"Text" => "Текст", -"Voice" => "Глас", -"Message" => "Порака", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пејџер", -"Internet" => "Интернет", -"{name}'s Birthday" => "Роденден на {name}", -"Contact" => "Контакт", -"Add Contact" => "Додади контакт", -"Addressbooks" => "Адресари", -"Configure Address Books" => "Конфигурирај адресар", -"New Address Book" => "Нов адресар", -"Import from VCF" => "Внеси од VCF", -"CardDav Link" => "Врска за CardDav", -"Download" => "Преземи", -"Edit" => "Уреди", -"Delete" => "Избриши", -"Download contact" => "Преземи го контактот", -"Delete contact" => "Избриши го контактот", -"Drop photo to upload" => "Довлечкај фотографија за да се подигне", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка", -"Edit name details" => "Уреди детали за име", -"Nickname" => "Прекар", -"Enter nickname" => "Внеси прекар", -"Birthday" => "Роденден", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Групи", -"Separate groups with commas" => "Одвоете ги групите со запирка", -"Edit groups" => "Уреди групи", -"Preferred" => "Претпочитано", -"Please specify a valid email address." => "Ве молам внесете правилна адреса за е-пошта.", -"Enter email address" => "Внесете е-пошта", -"Mail to address" => "Прати порака до адреса", -"Delete email address" => "Избриши адреса за е-пошта", -"Enter phone number" => "Внесете телефонски број", -"Delete phone number" => "Избриши телефонски број", -"View on map" => "Погледајте на мапа", -"Edit address details" => "Уреди детали за адреса", -"Add notes here." => "Внесете забелешки тука.", -"Add field" => "Додади поле", -"Profile picture" => "Фотографија за профил", -"Phone" => "Телефон", -"Note" => "Забелешка", -"Delete current photo" => "Избриши моментална фотографија", -"Edit current photo" => "Уреди моментална фотографија", -"Upload new photo" => "Подигни нова фотографија", -"Select photo from ownCloud" => "Изберете фотографија од ownCloud", -"Edit address" => "Уреди адреса", -"Type" => "Тип", -"PO Box" => "Поштенски фах", -"Extended" => "Дополнително", -"Street" => "Улица", -"City" => "Град", -"Region" => "Регион", -"Zipcode" => "Поштенски код", -"Country" => "Држава", -"Edit categories" => "Уреди категории", -"Add" => "Додади", -"Addressbook" => "Адресар", -"Hon. prefixes" => "Префикси за титула", -"Miss" => "Г-ца", -"Ms" => "Г-ѓа", -"Mr" => "Г-дин", -"Sir" => "Сер", -"Mrs" => "Г-ѓа", -"Dr" => "Др", -"Given name" => "Лично име", -"Additional names" => "Дополнителни имиња", -"Family name" => "Презиме", -"Hon. suffixes" => "Суфикси за титула", -"J.D." => "J.D.", -"M.D." => "Д.М.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Д-р", -"Esq." => "Esq.", -"Jr." => "Помлад.", -"Sn." => "Постар.", -"New Addressbook" => "Нов адресар", -"Edit Addressbook" => "Уреди адресар", -"Displayname" => "Прикажано име", -"Active" => "Активно", -"Save" => "Сними", -"Submit" => "Прати", -"Cancel" => "Откажи", -"Import a contacts file" => "Внеси датотека со контакти", -"Please choose the addressbook" => "Ве молам изберете адресар", -"create a new addressbook" => "креирај нов адресар", -"Name of new addressbook" => "Име на новиот адресар", -"Import" => "Внеси", -"Importing contacts" => "Внесување контакти", -"Select address book to import to:" => "Изберете адресар да се внесе:", -"Select from HD" => "Изберете од хард диск", -"You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.", -"Add contact" => "Додади контакт", -"Configure addressbooks" => "Уреди адресари", -"CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV", -"more info" => "повеќе информации", -"Primary address (Kontact et al)" => "Примарна адреса", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/ms_MY.php b/apps/contacts/l10n/ms_MY.php deleted file mode 100644 index 7d8a4c7d12..0000000000 --- a/apps/contacts/l10n/ms_MY.php +++ /dev/null @@ -1,58 +0,0 @@ - "Ralat nyahaktif buku alamat.", -"There was an error adding the contact." => "Terdapat masalah menambah maklumat.", -"Cannot add empty property." => "Tidak boleh menambah ruang kosong.", -"At least one of the address fields has to be filled out." => "Sekurangnya satu ruangan alamat perlu diisikan.", -"Error adding contact property." => "Terdapat masalah menambah maklumat.", -"Error adding addressbook." => "Masalah menambah buku alamat.", -"Error activating addressbook." => "Masalah mengaktifkan buku alamat.", -"Information about vCard is incorrect. Please reload the page." => "Maklumat vCard tidak tepat. Sila reload semula halaman ini.", -"Error deleting contact property." => "Masalah memadam maklumat.", -"Error updating contact property." => "Masalah mengemaskini maklumat.", -"Error updating addressbook." => "Masalah mengemaskini buku alamat.", -"Contacts" => "Hubungan-hubungan", -"This is not your addressbook." => "Ini bukan buku alamat anda.", -"Contact could not be found." => "Hubungan tidak dapat ditemui", -"Address" => "Alamat", -"Telephone" => "Telefon", -"Email" => "Emel", -"Organization" => "Organisasi", -"Work" => "Kerja", -"Home" => "Rumah", -"Mobile" => "Mudah alih", -"Text" => "Teks", -"Voice" => "Suara", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Alat Kelui", -"Contact" => "Hubungan", -"Add Contact" => "Tambah kenalan", -"Addressbooks" => "Senarai Buku Alamat", -"New Address Book" => "Buku Alamat Baru", -"CardDav Link" => "Sambungan CardDav", -"Download" => "Muat naik", -"Edit" => "Sunting", -"Delete" => "Padam", -"Download contact" => "Muat turun hubungan", -"Delete contact" => "Padam hubungan", -"Birthday" => "Hari lahir", -"Preferred" => "Pilihan", -"Phone" => "Telefon", -"Type" => "Jenis", -"PO Box" => "Peti surat", -"Extended" => "Sambungan", -"Street" => "Jalan", -"City" => "bandar", -"Region" => "Wilayah", -"Zipcode" => "Poskod", -"Country" => "Negara", -"Add" => "Tambah", -"Addressbook" => "Buku alamat", -"New Addressbook" => "Buku Alamat Baru", -"Edit Addressbook" => "Kemaskini Buku Alamat", -"Displayname" => "Paparan nama", -"Active" => "Aktif", -"Save" => "Simpan", -"Submit" => "Hantar", -"Cancel" => "Batal" -); diff --git a/apps/contacts/l10n/nb_NO.php b/apps/contacts/l10n/nb_NO.php deleted file mode 100644 index 3f7731bede..0000000000 --- a/apps/contacts/l10n/nb_NO.php +++ /dev/null @@ -1,135 +0,0 @@ - "Et problem oppsto med å (de)aktivere adresseboken.", -"There was an error adding the contact." => "Et problem oppsto med å legge til kontakten.", -"Cannot add empty property." => "Kan ikke legge til tomt felt.", -"At least one of the address fields has to be filled out." => "Minst en av adressefeltene må oppgis.", -"Error adding contact property." => "Et problem oppsto med å legge til kontaktfeltet.", -"No ID provided" => "Ingen ID angitt", -"No categories selected for deletion." => "Ingen kategorier valgt for sletting.", -"No address books found." => "Ingen adressebok funnet.", -"No contacts found." => "Ingen kontakter funnet.", -"Missing ID" => "Manglende ID", -"Cannot add addressbook with an empty name." => "Kan ikke legge til en adressebok uten navn.", -"Error adding addressbook." => "Et problem oppsto med å legge til adresseboken.", -"Error activating addressbook." => "Et problem oppsto med å aktivere adresseboken.", -"Error reading contact photo." => "Klarte ikke å lese kontaktbilde.", -"Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.", -"The loading photo is not valid." => "Bildet som lastes inn er ikke gyldig.", -"id is not set." => "id er ikke satt.", -"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.", -"Error deleting contact property." => "Et problem oppsto med å fjerne kontaktfeltet.", -"Missing contact id." => "Mangler kontakt-id.", -"No photo path was submitted." => "Ingen filsti ble lagt inn.", -"File doesn't exist:" => "Filen eksisterer ikke:", -"Error loading image." => "Klarte ikke å laste bilde.", -"Something went FUBAR. " => "Noe gikk fryktelig galt.", -"Error updating contact property." => "Et problem oppsto med å legge til kontaktfeltet.", -"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.", -"Error updating addressbook." => "Et problem oppsto med å oppdatere adresseboken.", -"There is no error, the file uploaded with success" => "Pust ut, ingen feil. Filen ble lastet opp problemfritt", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Filen du prøvde å laste opp var større enn grensen upload_max_filesize i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Filen du prøvde å laste opp var større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet.", -"The uploaded file was only partially uploaded" => "Filen du prøvde å laste opp ble kun delvis lastet opp", -"No file was uploaded" => "Ingen filer ble lastet opp", -"Missing a temporary folder" => "Mangler midlertidig mappe", -"Contacts" => "Kontakter", -"Addressbook not found." => "Adresseboken ble ikke funnet.", -"This is not your addressbook." => "Dette er ikke dine adressebok.", -"Contact could not be found." => "Kontakten ble ikke funnet.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisasjon", -"Work" => "Arbeid", -"Home" => "Hjem", -"Mobile" => "Mobil", -"Text" => "Tekst", -"Voice" => "Svarer", -"Message" => "Melding", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internett", -"{name}'s Birthday" => "bursdagen til {name}", -"Contact" => "Kontakt", -"Add Contact" => "Ny kontakt", -"Addressbooks" => "Adressebøker", -"Configure Address Books" => "Konfigurer adressebok", -"New Address Book" => "Ny adressebok", -"Import from VCF" => "Importer fra VDF", -"CardDav Link" => "CardDAV-lenke", -"Download" => "Hent ned", -"Edit" => "Rediger", -"Delete" => "Slett", -"Download contact" => "Hend ned kontakten", -"Delete contact" => "Slett kontakt", -"Drop photo to upload" => "Dra bilder hit for å laste opp", -"Edit name details" => "Endre detaljer rundt navn", -"Nickname" => "Kallenavn", -"Enter nickname" => "Skriv inn kallenavn", -"Birthday" => "Bursdag", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Skill gruppene med komma", -"Edit groups" => "Endre grupper", -"Preferred" => "Foretrukket", -"Please specify a valid email address." => "Vennligst angi en gyldig e-postadresse.", -"Enter email address" => "Skriv inn e-postadresse", -"Mail to address" => "Send e-post til adresse", -"Delete email address" => "Fjern e-postadresse", -"Enter phone number" => "Skriv inn telefonnummer", -"Delete phone number" => "Fjern telefonnummer", -"View on map" => "Se på kart", -"Edit address details" => "Endre detaljer rundt adresse", -"Add notes here." => "Legg inn notater her.", -"Add field" => "Legg til felt", -"Profile picture" => "Profilbilde", -"Phone" => "Telefon", -"Note" => "Notat", -"Delete current photo" => "Fjern nåværende bilde", -"Edit current photo" => "Rediger nåværende bilde", -"Upload new photo" => "Last opp nytt bilde", -"Select photo from ownCloud" => "Velg bilde fra ownCloud", -"Edit address" => "Endre adresse", -"Type" => "Type", -"PO Box" => "Postboks", -"Extended" => "Utvidet", -"Street" => "Gate", -"City" => "By", -"Region" => "Området", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Edit categories" => "Endre kategorier", -"Add" => "Ny", -"Addressbook" => "Adressebok", -"Miss" => "Frøken", -"Mr" => "Herr", -"Mrs" => "Fru", -"Dr" => "Dr", -"Given name" => "Fornavn", -"Additional names" => "Ev. mellomnavn", -"Family name" => "Etternavn", -"Hon. suffixes" => "Titler", -"Ph.D." => "Stipendiat", -"Jr." => "Jr.", -"Sn." => "Sr.", -"New Addressbook" => "Ny adressebok", -"Edit Addressbook" => "Endre adressebok", -"Displayname" => "Visningsnavn", -"Active" => "Aktiv", -"Save" => "Lagre", -"Submit" => "Lagre", -"Cancel" => "Avbryt", -"Import a contacts file" => "Importer en fil med kontakter.", -"Please choose the addressbook" => "Vennligst velg adressebok", -"create a new addressbook" => "Lag ny adressebok", -"Name of new addressbook" => "Navn på ny adressebok", -"Import" => "Importer", -"Importing contacts" => "Importerer kontakter", -"You have no contacts in your addressbook." => "Du har ingen kontakter i din adressebok", -"Add contact" => "Ny kontakt", -"Configure addressbooks" => "Konfigurer adressebøker", -"CardDAV syncing addresses" => "Synkroniseringsadresse for CardDAV", -"more info" => "mer info", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php deleted file mode 100644 index fd7e50ba4d..0000000000 --- a/apps/contacts/l10n/nl.php +++ /dev/null @@ -1,142 +0,0 @@ - "Fout bij het (de)activeren van het adresboek.", -"There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.", -"Cannot add empty property." => "Kan geen lege eigenschap toevoegen.", -"At least one of the address fields has to be filled out." => "Minstens één van de adresvelden moet ingevuld worden.", -"Trying to add duplicate property: " => "Eigenschap bestaat al: ", -"Error adding contact property." => "Fout bij het toevoegen van de contacteigenschap.", -"No ID provided" => "Geen ID opgegeven", -"Error setting checksum." => "Instellen controlegetal mislukt", -"No categories selected for deletion." => "Geen categorieën geselecteerd om te verwijderen.", -"No address books found." => "Geen adresboek gevonden", -"No contacts found." => "Geen contracten gevonden", -"Missing ID" => "Ontbrekend ID", -"Error parsing VCard for ID: \"" => "Fout bij inlezen VCard voor ID: \"", -"Cannot add addressbook with an empty name." => "Kan geen adresboek toevoegen zonder naam.", -"Error adding addressbook." => "Fout bij het toevoegen van het adresboek.", -"Error activating addressbook." => "Fout bij het activeren van het adresboek.", -"No contact ID was submitted." => "Geen contact ID opgestuurd.", -"Error reading contact photo." => "Lezen van contact foto mislukt.", -"Error saving temporary file." => "Tijdelijk bestand opslaan mislukt.", -"The loading photo is not valid." => "De geladen foto is niet goed.", -"id is not set." => "id is niet ingesteld.", -"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.", -"Error deleting contact property." => "Fout bij het verwijderen van de contacteigenschap.", -"Contact ID is missing." => "Contact ID ontbreekt.", -"Missing contact id." => "Ontbrekende contact id.", -"No photo path was submitted." => "Geen fotopad opgestuurd.", -"File doesn't exist:" => "Bestand bestaat niet:", -"Error loading image." => "Fout bij laden plaatje.", -"element name is not set." => "onderdeel naam is niet opgegeven.", -"checksum is not set." => "controlegetal is niet opgegeven.", -"Information about vCard is incorrect. Please reload the page: " => "Informatie over vCard is fout. Herlaad de pagina: ", -"Something went FUBAR. " => "Er ging iets totaal verkeerd. ", -"Error updating contact property." => "Fout bij het updaten van de contacteigenschap.", -"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen", -"Error updating addressbook." => "Fout bij het updaten van het adresboek.", -"Error uploading contacts to storage." => "Fout bij opslaan van contacten.", -"There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het bestand overschrijdt de upload_max_filesize instelling in php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Het bestand overschrijdt de MAX_FILE_SIZE instelling dat is opgegeven in het HTML formulier", -"The uploaded file was only partially uploaded" => "Het bestand is gedeeltelijk geüpload", -"No file was uploaded" => "Er is geen bestand geüpload", -"Missing a temporary folder" => "Er ontbreekt een tijdelijke map", -"Contacts" => "Contacten", -"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.", -"Addressbook not found." => "Adresboek niet gevonden.", -"This is not your addressbook." => "Dit is niet uw adresboek.", -"Contact could not be found." => "Contact kon niet worden gevonden.", -"Address" => "Adres", -"Telephone" => "Telefoon", -"Email" => "E-mail", -"Organization" => "Organisatie", -"Work" => "Werk", -"Home" => "Thuis", -"Mobile" => "Mobiel", -"Text" => "Tekst", -"Voice" => "Stem", -"Message" => "Bericht", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pieper", -"Internet" => "Internet", -"{name}'s Birthday" => "{name}'s verjaardag", -"Contact" => "Contact", -"Add Contact" => "Contact toevoegen", -"Addressbooks" => "Adresboeken", -"Configure Address Books" => "Instellen adresboeken", -"New Address Book" => "Nieuw Adresboek", -"Import from VCF" => "Importeer uit VCF", -"CardDav Link" => "CardDav Link", -"Download" => "Download", -"Edit" => "Bewerken", -"Delete" => "Verwijderen", -"Download contact" => "Download contact", -"Delete contact" => "Verwijder contact", -"Drop photo to upload" => "Verwijder foto uit upload", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma", -"Edit name details" => "Wijzig naam gegevens", -"Nickname" => "Roepnaam", -"Enter nickname" => "Voer roepnaam in", -"Birthday" => "Verjaardag", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Groepen", -"Separate groups with commas" => "Gebruik komma bij meerder groepen", -"Edit groups" => "Wijzig groepen", -"Preferred" => "Voorkeur", -"Please specify a valid email address." => "Geef een geldig email adres op.", -"Enter email address" => "Voer email adres in", -"Mail to address" => "Mail naar adres", -"Delete email address" => "Verwijder email adres", -"Enter phone number" => "Voer telefoonnummer in", -"Delete phone number" => "Verwijdere telefoonnummer", -"View on map" => "Bekijk op een kaart", -"Edit address details" => "Wijzig adres gegevens", -"Add notes here." => "Voeg notitie toe", -"Add field" => "Voeg veld toe", -"Profile picture" => "Profiel foto", -"Phone" => "Telefoon", -"Note" => "Notitie", -"Delete current photo" => "Verwijdere huidige foto", -"Edit current photo" => "Wijzig huidige foto", -"Upload new photo" => "Upload nieuwe foto", -"Select photo from ownCloud" => "Selecteer foto uit ownCloud", -"Edit address" => "Wijzig adres", -"Type" => "Type", -"PO Box" => "Postbus", -"Extended" => "Uitgebreide", -"Street" => "Straat", -"City" => "Stad", -"Region" => "Regio", -"Zipcode" => "Postcode", -"Country" => "Land", -"Edit categories" => "Wijzig categorieën", -"Add" => "Voeg toe", -"Addressbook" => "Adresboek", -"Hon. prefixes" => "Hon. prefixes", -"Given name" => "Voornaam", -"Additional names" => "Extra namen", -"Family name" => "Achternaam", -"New Addressbook" => "Nieuw adresboek", -"Edit Addressbook" => "Wijzig adresboek", -"Displayname" => "Weergavenaam", -"Active" => "Actief", -"Save" => "Opslaan", -"Submit" => "Opslaan", -"Cancel" => "Anuleren", -"Import a contacts file" => "Importeer een contacten bestand", -"Please choose the addressbook" => "Kies een adresboek", -"create a new addressbook" => "Maak een nieuw adresboek", -"Name of new addressbook" => "Naam van nieuw adresboek", -"Import" => "Importeer", -"Importing contacts" => "Importeren van contacten", -"Select address book to import to:" => "Selecteer adresboek voor import:", -"Select from HD" => "Selecteer van schijf", -"You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek", -"Add contact" => "Contactpersoon toevoegen", -"Configure addressbooks" => "Bewerken adresboeken", -"CardDAV syncing addresses" => "CardDAV synchroniseert de adressen", -"more info" => "meer informatie", -"Primary address (Kontact et al)" => "Standaardadres", -"iOS/OS X" => "IOS/OS X" -); diff --git a/apps/contacts/l10n/nn_NO.php b/apps/contacts/l10n/nn_NO.php deleted file mode 100644 index 5b3fc5b1ab..0000000000 --- a/apps/contacts/l10n/nn_NO.php +++ /dev/null @@ -1,58 +0,0 @@ - "Ein feil oppstod ved (de)aktivering av adressebok.", -"There was an error adding the contact." => "Det kom ei feilmelding då kontakta vart lagt til.", -"Cannot add empty property." => "Kan ikkje leggja til tomt felt.", -"At least one of the address fields has to be filled out." => "Minst eit av adressefelta må fyllast ut.", -"Error adding contact property." => "Eit problem oppstod ved å leggja til kontakteltet.", -"Error adding addressbook." => "Eit problem oppstod ved å leggja til adresseboka.", -"Error activating addressbook." => "Eit problem oppstod ved aktivering av adresseboka.", -"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt.", -"Error deleting contact property." => "Eit problem oppstod ved å slette kontaktfeltet.", -"Error updating contact property." => "Eit problem oppstod ved å endre kontaktfeltet.", -"Error updating addressbook." => "Eit problem oppstod ved å oppdatere adresseboka.", -"Contacts" => "Kotaktar", -"This is not your addressbook." => "Dette er ikkje di adressebok.", -"Contact could not be found." => "Fann ikkje kontakten.", -"Address" => "Adresse", -"Telephone" => "Telefonnummer", -"Email" => "Epost", -"Organization" => "Organisasjon", -"Work" => "Arbeid", -"Home" => "Heime", -"Mobile" => "Mobil", -"Text" => "Tekst", -"Voice" => "Tale", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Personsøkjar", -"Contact" => "Kontakt", -"Add Contact" => "Legg til kontakt", -"Addressbooks" => "Adressebøker", -"New Address Book" => "Ny adressebok", -"CardDav Link" => "CardDav lenkje", -"Download" => "Last ned", -"Edit" => "Endra", -"Delete" => "Slett", -"Download contact" => "Last ned kontakt", -"Delete contact" => "Slett kontakt", -"Birthday" => "Bursdag", -"Preferred" => "Føretrekt", -"Phone" => "Telefonnummer", -"Type" => "Skriv", -"PO Box" => "Postboks", -"Extended" => "Utvida", -"Street" => "Gate", -"City" => "Stad", -"Region" => "Region/fylke", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Add" => "Legg til", -"Addressbook" => "Adressebok", -"New Addressbook" => "Ny adressebok", -"Edit Addressbook" => "Endre adressebok", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", -"Save" => "Lagre", -"Submit" => "Send", -"Cancel" => "Kanseller" -); diff --git a/apps/contacts/l10n/pl.php b/apps/contacts/l10n/pl.php deleted file mode 100644 index a99f190695..0000000000 --- a/apps/contacts/l10n/pl.php +++ /dev/null @@ -1,157 +0,0 @@ - "Błąd (de)aktywowania książki adresowej.", -"There was an error adding the contact." => "Wystąpił błąd podczas dodawania kontaktu.", -"Cannot add empty property." => "Nie można dodać pustego elementu.", -"At least one of the address fields has to be filled out." => "Należy wypełnić przynajmniej jedno pole adresu.", -"Trying to add duplicate property: " => "Próba dodania z duplikowanej właściwości:", -"Error adding contact property." => "Błąd dodawania elementu.", -"No ID provided" => "Brak opatrzonego ID ", -"Error setting checksum." => "Błąd ustawień sumy kontrolnej", -"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia", -"No address books found." => "Nie znaleziono książek adresowych", -"No contacts found." => "Nie znaleziono kontaktów.", -"Missing ID" => "Brak ID", -"Error parsing VCard for ID: \"" => "Wystąpił błąd podczas przetwarzania VCard ID: \"", -"Cannot add addressbook with an empty name." => "Nie można dodać książki adresowej z pusta nazwą", -"Error adding addressbook." => "Błąd dodawania książki adresowej.", -"Error activating addressbook." => "Błąd aktywowania książki adresowej.", -"No contact ID was submitted." => "ID kontaktu nie został utworzony.", -"Error reading contact photo." => "Błąd odczytu zdjęcia kontaktu.", -"Error saving temporary file." => "Wystąpił błąd podczas zapisywania pliku tymczasowego.", -"The loading photo is not valid." => "Wczytywane zdjęcie nie jest poprawne.", -"id is not set." => "id nie ustawione.", -"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.", -"Error deleting contact property." => "Błąd usuwania elementu.", -"Contact ID is missing." => "Brak kontaktu id.", -"Missing contact id." => "Brak kontaktu id.", -"No photo path was submitted." => "Ścieżka do zdjęcia nie została podana.", -"File doesn't exist:" => "Plik nie istnieje:", -"Error loading image." => "Błąd ładowania obrazu.", -"element name is not set." => "nazwa elementu nie jest ustawiona.", -"checksum is not set." => "checksum-a nie ustawiona", -"Information about vCard is incorrect. Please reload the page: " => "Informacje na temat vCard są niepoprawne. Proszę przeładuj stronę:", -"Something went FUBAR. " => "Gdyby coś poszło FUBAR.", -"Error updating contact property." => "Błąd uaktualniania elementu.", -"Cannot update addressbook with an empty name." => "Nie można zaktualizować książki adresowej z pustą nazwą.", -"Error updating addressbook." => "Błąd uaktualniania książki adresowej.", -"Error uploading contacts to storage." => "Wystąpił błąd podczas wysyłania kontaktów do magazynu.", -"There is no error, the file uploaded with success" => "Nie było błędów, plik wyczytano poprawnie.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Załadowany plik przekracza wielkość upload_max_filesize w php.ini ", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Wczytywany plik przekracza wielkość MAX_FILE_SIZE, która została określona w formularzu HTML", -"The uploaded file was only partially uploaded" => "Załadowany plik tylko częściowo został wysłany.", -"No file was uploaded" => "Plik nie został załadowany", -"Missing a temporary folder" => "Brak folderu tymczasowego", -"Contacts" => "Kontakty", -"Drop a VCF file to import contacts." => "Upuść plik VCF do importu kontaktów.", -"Addressbook not found." => "Nie znaleziono książki adresowej", -"This is not your addressbook." => "To nie jest Twoja książka adresowa.", -"Contact could not be found." => "Nie można odnaleźć kontaktu.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacja", -"Work" => "Praca", -"Home" => "Dom", -"Mobile" => "Komórka", -"Text" => "Połączenie tekstowe", -"Voice" => "Połączenie głosowe", -"Message" => "Wiadomość", -"Fax" => "Faks", -"Video" => "Połączenie wideo", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "{name} Urodzony", -"Contact" => "Kontakt", -"Add Contact" => "Dodaj kontakt", -"Addressbooks" => "Książki adresowe", -"Configure Address Books" => "Konfiguruj książkę adresową", -"New Address Book" => "Nowa książka adresowa", -"Import from VCF" => "Importuj z VFC", -"CardDav Link" => "Wyświetla odnośnik CardDav", -"Download" => "Pobiera książkę adresową", -"Edit" => "Edytuje książkę adresową", -"Delete" => "Usuwa książkę adresową", -"Download contact" => "Pobiera kontakt", -"Delete contact" => "Usuwa kontakt", -"Drop photo to upload" => "Upuść fotografię aby załadować", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format niestandardowy, krótkie nazwy, imię i nazwisko, Odwracać lub Odwrócić z przecinkiem", -"Edit name details" => "Edytuj szczegóły nazwy", -"Nickname" => "Nazwa", -"Enter nickname" => "Wpisz nazwę", -"Birthday" => "Urodziny", -"dd-mm-yyyy" => "dd-mm-rrrr", -"Groups" => "Grupy", -"Separate groups with commas" => "Oddziel grupy przecinkami", -"Edit groups" => "Edytuj grupy", -"Preferred" => "Preferowane", -"Please specify a valid email address." => "Określ prawidłowy adres e-mail.", -"Enter email address" => "Wpisz adres email", -"Mail to address" => "Mail na adres", -"Delete email address" => "Usuń adres mailowy", -"Enter phone number" => "Wpisz numer telefonu", -"Delete phone number" => "Usuń numer telefonu", -"View on map" => "Zobacz na mapie", -"Edit address details" => "Edytuj szczegóły adresu", -"Add notes here." => "Dodaj notatkę tutaj.", -"Add field" => "Dodaj pole", -"Profile picture" => "Zdjęcie profilu", -"Phone" => "Telefon", -"Note" => "Uwaga", -"Delete current photo" => "Usuń aktualne zdjęcie", -"Edit current photo" => "Edytuj aktualne zdjęcie", -"Upload new photo" => "Wczytaj nowe zdjęcie", -"Select photo from ownCloud" => "Wybierz zdjęcie z ownCloud", -"Edit address" => "Edytuj adres", -"Type" => "Typ", -"PO Box" => "Skrzynka pocztowa", -"Extended" => "Rozszerzony", -"Street" => "Ulica", -"City" => "Miasto", -"Region" => "Region", -"Zipcode" => "Kod pocztowy", -"Country" => "Kraj", -"Edit categories" => "Edytuj kategorie", -"Add" => "Dodaj", -"Addressbook" => "Książka adresowa", -"Hon. prefixes" => "Prefiksy Hon.", -"Miss" => "Panna", -"Ms" => "Ms", -"Mr" => "Pan", -"Sir" => "Sir", -"Mrs" => "Pani", -"Dr" => "Dr", -"Given name" => "Podaj imię", -"Additional names" => "Dodatkowe nazwy", -"Family name" => "Nazwa rodziny", -"Hon. suffixes" => "Sufiksy Hon.", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Nowa książka adresowa", -"Edit Addressbook" => "Edytowanie książki adresowej", -"Displayname" => "Wyświetlana nazwa", -"Active" => "Aktywna", -"Save" => "Zapisz", -"Submit" => "Potwierdź", -"Cancel" => "Anuluj", -"Import a contacts file" => "Importuj plik z kontaktami", -"Please choose the addressbook" => "Proszę wybrać książkę adresową", -"create a new addressbook" => "utwórz nową książkę adresową", -"Name of new addressbook" => "Nazwa nowej książki adresowej", -"Import" => "Import", -"Importing contacts" => "importuj kontakty", -"Select address book to import to:" => "Zaznacz książkę adresową do importu do:", -"Select from HD" => "Wybierz z HD", -"You have no contacts in your addressbook." => "Nie masz żadnych kontaktów w swojej książce adresowej.", -"Add contact" => "Dodaj kontakt", -"Configure addressbooks" => "Konfiguruj książkę adresową", -"CardDAV syncing addresses" => "adres do synchronizacji CardDAV", -"more info" => "więcej informacji", -"Primary address (Kontact et al)" => "Pierwszy adres", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php deleted file mode 100644 index e0da0a771a..0000000000 --- a/apps/contacts/l10n/pt_BR.php +++ /dev/null @@ -1,157 +0,0 @@ - "Erro ao (des)ativar agenda.", -"There was an error adding the contact." => "Ocorreu um erro ao adicionar o contato.", -"Cannot add empty property." => "Não é possível adicionar propriedade vazia.", -"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço tem que ser preenchido.", -"Trying to add duplicate property: " => "Tentando adiciona propriedade duplicada:", -"Error adding contact property." => "Erro ao adicionar propriedade de contato.", -"No ID provided" => "Nenhum ID fornecido", -"Error setting checksum." => "Erro ajustando checksum.", -"No categories selected for deletion." => "Nenhum categoria selecionada para remoção.", -"No address books found." => "Nenhuma agenda de endereços encontrada.", -"No contacts found." => "Nenhum contato encontrado.", -"Missing ID" => "Faltando ID", -"Error parsing VCard for ID: \"" => "Erro de identificação VCard para ID:", -"Cannot add addressbook with an empty name." => "Não é possivel adicionar uma agenda de endereços com o nome em branco.", -"Error adding addressbook." => "Erro ao adicionar agenda.", -"Error activating addressbook." => "Erro ao ativar agenda.", -"No contact ID was submitted." => "Nenhum ID do contato foi submetido.", -"Error reading contact photo." => "Erro de leitura na foto do contato.", -"Error saving temporary file." => "Erro ao salvar arquivo temporário.", -"The loading photo is not valid." => "Foto carregada não é válida.", -"id is not set." => "ID não definido.", -"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.", -"Error deleting contact property." => "Erro ao excluir propriedade de contato.", -"Contact ID is missing." => "ID do contato está faltando.", -"Missing contact id." => "Faltando ID do contato.", -"No photo path was submitted." => "Nenhum caminho para foto foi submetido.", -"File doesn't exist:" => "Arquivo não existe:", -"Error loading image." => "Erro ao carregar imagem.", -"element name is not set." => "nome do elemento não definido.", -"checksum is not set." => "checksum não definido.", -"Information about vCard is incorrect. Please reload the page: " => "Informação sobre vCard incorreto. Por favor, recarregue a página:", -"Something went FUBAR. " => "Something went FUBAR. ", -"Error updating contact property." => "Erro ao atualizar propriedades do contato.", -"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.", -"Error updating addressbook." => "Erro ao atualizar agenda.", -"Error uploading contacts to storage." => "Erro enviando contatos para armazenamento.", -"There is no error, the file uploaded with success" => "Arquivo enviado com sucesso", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O arquivo enviado excede a diretiva upload_max_filesize em php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O arquivo carregado excede o argumento MAX_FILE_SIZE especificado no formulário HTML", -"The uploaded file was only partially uploaded" => "O arquivo foi parcialmente carregado", -"No file was uploaded" => "Nenhum arquivo carregado", -"Missing a temporary folder" => "Diretório temporário não encontrado", -"Contacts" => "Contatos", -"Drop a VCF file to import contacts." => "Arraste um arquivo VCF para importar contatos.", -"Addressbook not found." => "Lista de endereços não encontrado.", -"This is not your addressbook." => "Esta não é a sua agenda de endereços.", -"Contact could not be found." => "Contato não pôde ser encontrado.", -"Address" => "Endereço", -"Telephone" => "Telefone", -"Email" => "E-mail", -"Organization" => "Organização", -"Work" => "Trabalho", -"Home" => "Home", -"Mobile" => "Móvel", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensagem", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Aniversário de {name}", -"Contact" => "Contato", -"Add Contact" => "Adicionar Contato", -"Addressbooks" => "Agendas de Endereço", -"Configure Address Books" => "Configurar Livro de Endereços", -"New Address Book" => "Nova agenda", -"Import from VCF" => "Importar de VCF", -"CardDav Link" => "Link CardDav", -"Download" => "Baixar", -"Edit" => "Editar", -"Delete" => "Excluir", -"Download contact" => "Baixar contato", -"Delete contact" => "Apagar contato", -"Drop photo to upload" => "Arraste a foto para ser carregada", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter com vírgula", -"Edit name details" => "Editar detalhes do nome", -"Nickname" => "Apelido", -"Enter nickname" => "Digite o apelido", -"Birthday" => "Aniversário", -"dd-mm-yyyy" => "dd-mm-aaaa", -"Groups" => "Grupos", -"Separate groups with commas" => "Separe grupos por virgula", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor, especifique um email válido.", -"Enter email address" => "Digite um endereço de email", -"Mail to address" => "Correio para endereço", -"Delete email address" => "Remover endereço de email", -"Enter phone number" => "Digite um número de telefone", -"Delete phone number" => "Remover número de telefone", -"View on map" => "Visualizar no mapa", -"Edit address details" => "Editar detalhes de endereço", -"Add notes here." => "Adicionar notas", -"Add field" => "Adicionar campo", -"Profile picture" => "Imagem do Perfil", -"Phone" => "Telefone", -"Note" => "Nota", -"Delete current photo" => "Deletar imagem atual", -"Edit current photo" => "Editar imagem atual", -"Upload new photo" => "Carregar nova foto", -"Select photo from ownCloud" => "Selecionar foto do OwnCloud", -"Edit address" => "Editar endereço", -"Type" => "Digite", -"PO Box" => "Caixa Postal", -"Extended" => "Estendido", -"Street" => "Rua", -"City" => "Cidade", -"Region" => "Região", -"Zipcode" => "CEP", -"Country" => "País", -"Edit categories" => "Editar categorias", -"Add" => "Adicionar", -"Addressbook" => "Agenda de Endereço", -"Hon. prefixes" => "Exmo. Prefixos ", -"Miss" => "Senhorita", -"Ms" => "Srta.", -"Mr" => "Sr.", -"Sir" => "Senhor", -"Mrs" => "Sra.", -"Dr" => "Dr", -"Given name" => "Primeiro Nome", -"Additional names" => "Segundo Nome", -"Family name" => "Sobrenome", -"Hon. suffixes" => "Exmo. Sufixos", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Nova Agenda de Endereço", -"Edit Addressbook" => "Editar Agenda de Endereço", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Save" => "Salvar", -"Submit" => "Enviar", -"Cancel" => "Cancelar", -"Import a contacts file" => "Importar arquivos de contato.", -"Please choose the addressbook" => "Por favor, selecione uma agenda de endereços", -"create a new addressbook" => "Criar nova agenda de endereços", -"Name of new addressbook" => "Nome da nova agenda de endereços", -"Import" => "Importar", -"Importing contacts" => "Importar contatos", -"Select address book to import to:" => "Selecione agenda de endereços para importar ao destino:", -"Select from HD" => "Selecione do disco rigído", -"You have no contacts in your addressbook." => "Voce não tem contatos em sua agenda de endereços.", -"Add contact" => "Adicionar contatos", -"Configure addressbooks" => "Configurar agenda de endereços", -"CardDAV syncing addresses" => "Sincronizando endereços CardDAV", -"more info" => "leia mais", -"Primary address (Kontact et al)" => "Endereço primário(Kontact et al)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/pt_PT.php b/apps/contacts/l10n/pt_PT.php deleted file mode 100644 index 7a4861abf9..0000000000 --- a/apps/contacts/l10n/pt_PT.php +++ /dev/null @@ -1,129 +0,0 @@ - "Erro a (des)ativar o livro de endereços", -"There was an error adding the contact." => "Erro ao adicionar contato", -"Cannot add empty property." => "Não é possivel adicionar uma propriedade vazia", -"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço precisa de estar preenchido", -"Trying to add duplicate property: " => "A tentar adicionar propriedade duplicada: ", -"Error adding contact property." => "Erro ao adicionar propriedade do contato", -"No ID provided" => "Nenhum ID inserido", -"Error setting checksum." => "Erro a definir checksum.", -"No categories selected for deletion." => "Nenhuma categoria selecionada para eliminar.", -"No address books found." => "Nenhum livro de endereços encontrado.", -"No contacts found." => "Nenhum contacto encontrado.", -"Missing ID" => "Falta ID", -"Error parsing VCard for ID: \"" => "Erro a analisar VCard para o ID: \"", -"Cannot add addressbook with an empty name." => "Não é possivel adicionar Livro de endereços com nome vazio.", -"Error adding addressbook." => "Erro ao adicionar livro de endereços", -"Error activating addressbook." => "Erro ao ativar livro de endereços", -"No contact ID was submitted." => "Nenhum ID de contacto definido.", -"Error reading contact photo." => "Erro a ler a foto do contacto.", -"Error saving temporary file." => "Erro a guardar ficheiro temporário.", -"The loading photo is not valid." => "A foto carregada não é valida.", -"id is not set." => "id não está definido", -"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", -"Error deleting contact property." => "Erro ao apagar propriedade do contato", -"Contact ID is missing." => "Falta o ID do contacto.", -"Missing contact id." => "Falta o ID do contacto.", -"No photo path was submitted." => "Nenhum caminho da foto definido.", -"File doesn't exist:" => "O ficheiro não existe:", -"Error loading image." => "Erro a carregar a imagem.", -"element name is not set." => "o nome do elemento não está definido.", -"checksum is not set." => "Checksum não está definido.", -"Information about vCard is incorrect. Please reload the page: " => "A informação sobre o VCard está incorrecta. Por favor refresque a página: ", -"Something went FUBAR. " => "Algo provocou um FUBAR. ", -"Error updating contact property." => "Erro ao atualizar propriedade do contato", -"Cannot update addressbook with an empty name." => "Não é possivel actualizar o livro de endereços com o nome vazio.", -"Error updating addressbook." => "Erro a atualizar o livro de endereços", -"Error uploading contacts to storage." => "Erro a carregar os contactos para o armazenamento.", -"There is no error, the file uploaded with success" => "Não ocorreu erros, o ficheiro foi submetido com sucesso", -"No file was uploaded" => "Nenhum ficheiro foi submetido", -"Contacts" => "Contactos", -"Addressbook not found." => "Livro de endereços não encontrado.", -"This is not your addressbook." => "Esta não é a sua lista de contactos", -"Contact could not be found." => "O contacto não foi encontrado", -"Address" => "Morada", -"Telephone" => "Telefone", -"Email" => "Email", -"Organization" => "Organização", -"Work" => "Emprego", -"Home" => "Casa", -"Mobile" => "Telemovel", -"Text" => "Texto", -"Voice" => "Voz", -"Message" => "Mensagem", -"Fax" => "Fax", -"Video" => "Vídeo", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Aniversário de {name}", -"Contact" => "Contacto", -"Add Contact" => "Adicionar Contacto", -"Addressbooks" => "Livros de endereços", -"Configure Address Books" => "Configurar livros de endereços", -"New Address Book" => "Novo livro de endereços", -"Import from VCF" => "Importar de VCF", -"CardDav Link" => "Endereço CardDav", -"Download" => "Transferir", -"Edit" => "Editar", -"Delete" => "Apagar", -"Download contact" => "Transferir contacto", -"Delete contact" => "Apagar contato", -"Edit name details" => "Editar detalhes do nome", -"Nickname" => "Alcunha", -"Enter nickname" => "Introduza alcunha", -"Birthday" => "Aniversário", -"dd-mm-yyyy" => "dd-mm-aaaa", -"Groups" => "Grupos", -"Separate groups with commas" => "Separe os grupos usando virgulas", -"Edit groups" => "Editar grupos", -"Preferred" => "Preferido", -"Please specify a valid email address." => "Por favor indique um endereço de correio válido", -"Enter email address" => "Introduza endereço de email", -"Mail to address" => "Enviar correio para o endereço", -"Delete email address" => "Eliminar o endereço de correio", -"Enter phone number" => "Insira o número de telefone", -"Delete phone number" => "Eliminar o número de telefone", -"View on map" => "Ver no mapa", -"Edit address details" => "Editar os detalhes do endereço", -"Add notes here." => "Insira notas aqui.", -"Add field" => "Adicionar campo", -"Profile picture" => "Foto do perfil", -"Phone" => "Telefone", -"Note" => "Nota", -"Delete current photo" => "Eliminar a foto actual", -"Edit current photo" => "Editar a foto actual", -"Select photo from ownCloud" => "Selecionar uma foto da ownCloud", -"Edit address" => "Editar endereço", -"Type" => "Tipo", -"PO Box" => "Apartado", -"Extended" => "Extendido", -"Street" => "Rua", -"City" => "Cidade", -"Region" => "Região", -"Zipcode" => "Código Postal", -"Country" => "País", -"Edit categories" => "Editar categorias", -"Add" => "Adicionar", -"Addressbook" => "Livro de endereços", -"Ms" => "Sra", -"Mr" => "Sr", -"Sir" => "Sr", -"Dr" => "Dr", -"Additional names" => "Nomes adicionais", -"Family name" => "Nome de familia", -"New Addressbook" => "Novo livro de endereços", -"Edit Addressbook" => "Editar livro de endereços", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Save" => "Guardar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", -"Import a contacts file" => "Importar um ficheiro de contactos", -"Please choose the addressbook" => "Por favor seleccione o livro de endereços", -"create a new addressbook" => "Criar um novo livro de endereços", -"Import" => "Importar", -"Importing contacts" => "A importar os contactos", -"Add contact" => "Adicionar contacto", -"more info" => "mais informação", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/ro.php b/apps/contacts/l10n/ro.php deleted file mode 100644 index 0160975671..0000000000 --- a/apps/contacts/l10n/ro.php +++ /dev/null @@ -1,92 +0,0 @@ - "(Dez)activarea agendei a întâmpinat o eroare.", -"There was an error adding the contact." => "O eroare a împiedicat adăugarea contactului.", -"Cannot add empty property." => "Nu se poate adăuga un câmp gol.", -"At least one of the address fields has to be filled out." => "Cel puțin unul din câmpurile adresei trebuie completat.", -"Error adding contact property." => "Contactul nu a putut fi adăugat.", -"No ID provided" => "Nici un ID nu a fost furnizat", -"Error setting checksum." => "Eroare la stabilirea sumei de control", -"No categories selected for deletion." => "Nici o categorie selectată pentru ștergere", -"No address books found." => "Nici o carte de adrese găsită", -"No contacts found." => "Nici un contact găsit", -"Missing ID" => "ID lipsă", -"Error parsing VCard for ID: \"" => "Eroare la prelucrarea VCard-ului pentru ID:\"", -"Cannot add addressbook with an empty name." => "Nu e posibil de adăugat o carte de adrese fără nume", -"Error adding addressbook." => "Agenda nu a putut fi adăugată.", -"Error activating addressbook." => "Eroare la activarea agendei.", -"No contact ID was submitted." => "Nici un ID de contact nu a fost transmis", -"Error reading contact photo." => "Eroare la citerea fotografiei de contact", -"Error saving temporary file." => "Eroare la salvarea fișierului temporar.", -"The loading photo is not valid." => "Fotografia care se încarcă nu este validă.", -"id is not set." => "ID-ul nu este stabilit", -"Information about vCard is incorrect. Please reload the page." => "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina.", -"Error deleting contact property." => "Eroare la ștergerea proprietăților contactului.", -"Contact ID is missing." => "ID-ul de contact lipsește.", -"Missing contact id." => "ID de contact lipsă.", -"No photo path was submitted." => "Nici o adresă către fotografie nu a fost transmisă", -"File doesn't exist:" => "Fișierul nu există:", -"Error loading image." => "Eroare la încărcarea imaginii.", -"element name is not set." => "numele elementului nu este stabilit.", -"checksum is not set." => "suma de control nu este stabilită.", -"Error updating contact property." => "Eroare la actualizarea proprietăților contactului.", -"Error updating addressbook." => "Eroare la actualizarea agendei.", -"Contacts" => "Contacte", -"This is not your addressbook." => "Nu se găsește în agendă.", -"Contact could not be found." => "Contactul nu a putut fi găsit.", -"Address" => "Adresă", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizație", -"Work" => "Servicu", -"Home" => "Acasă", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Voce", -"Message" => "Mesaj", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Ziua de naștere a {name}", -"Contact" => "Contact", -"Add Contact" => "Adaugă contact", -"Addressbooks" => "Agende", -"New Address Book" => "Agendă nouă", -"CardDav Link" => "Legătură CardDev", -"Download" => "Descarcă", -"Edit" => "Editează", -"Delete" => "Șterge", -"Download contact" => "Descarcă acest contact", -"Delete contact" => "Șterge contact", -"Edit name details" => "Introdu detalii despre nume", -"Nickname" => "Pseudonim", -"Enter nickname" => "Introdu pseudonim", -"Birthday" => "Zi de naștere", -"dd-mm-yyyy" => "zz-ll-aaaa", -"Groups" => "Grupuri", -"Separate groups with commas" => "Separă grupurile cu virgule", -"Edit groups" => "Editează grupuri", -"Preferred" => "Preferat", -"Please specify a valid email address." => "Te rog să specifici un e-mail corect", -"Enter email address" => "Introdu adresa de e-mail", -"Mail to address" => "Trimite mesaj la e-mail", -"Delete email address" => "Șterge e-mail", -"Phone" => "Telefon", -"Type" => "Tip", -"PO Box" => "CP", -"Extended" => "Extins", -"Street" => "Stradă", -"City" => "Oraș", -"Region" => "Regiune", -"Zipcode" => "Cod poștal", -"Country" => "Țară", -"Add" => "Adaugă", -"Addressbook" => "Agendă", -"New Addressbook" => "Agendă nouă", -"Edit Addressbook" => "Modifică agenda", -"Displayname" => "Nume afișat", -"Active" => "Activ", -"Save" => "Salvează", -"Submit" => "Trimite", -"Cancel" => "Anulează" -); diff --git a/apps/contacts/l10n/ru.php b/apps/contacts/l10n/ru.php deleted file mode 100644 index 01a0e2642b..0000000000 --- a/apps/contacts/l10n/ru.php +++ /dev/null @@ -1,127 +0,0 @@ - "Ошибка (де)активации адресной книги.", -"There was an error adding the contact." => "Произошла ошибка при добавлении контакта.", -"Cannot add empty property." => "Невозможно добавить пустой параметр.", -"At least one of the address fields has to be filled out." => "Как минимум одно поле адреса должно быть заполнено.", -"Error adding contact property." => "Ошибка добавления информации к контакту.", -"No ID provided" => "ID не предоставлен", -"Error setting checksum." => "Ошибка установки контрольной суммы.", -"No categories selected for deletion." => "Категории для удаления не установлены.", -"No address books found." => "Адресные книги не найдены.", -"No contacts found." => "Контакты не найдены.", -"Missing ID" => "Отсутствует ID", -"Error parsing VCard for ID: \"" => "Ошибка обработки VCard для ID: \"", -"Cannot add addressbook with an empty name." => "Нельзя добавить адресную книгу без имени.", -"Error adding addressbook." => "Ошибка добавления адресной книги.", -"Error activating addressbook." => "Ошибка активации адресной книги.", -"Error reading contact photo." => "Ошибка чтения фотографии контакта.", -"Error saving temporary file." => "Ошибка сохранения временного файла.", -"The loading photo is not valid." => "Загружаемая фотография испорчена.", -"id is not set." => "id не установлен.", -"Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", -"Error deleting contact property." => "Ошибка удаления информации из контакта.", -"Contact ID is missing." => "ID контакта отсутствует.", -"File doesn't exist:" => "Файл не существует:", -"Error loading image." => "Ошибка загрузки картинки.", -"element name is not set." => "имя элемента не установлено.", -"checksum is not set." => "контрольная сумма не установлена.", -"Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", -"Error updating contact property." => "Ошибка обновления информации контакта.", -"Cannot update addressbook with an empty name." => "Нельзя обновить адресную книгу с пустым именем.", -"Error updating addressbook." => "Ошибка обновления адресной книги.", -"Error uploading contacts to storage." => "Ошибка загрузки контактов в хранилище.", -"There is no error, the file uploaded with success" => "Файл загружен успешно.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Загружаемый файл первосходит значение переменной upload_max_filesize, установленно в php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Загружаемый файл превосходит значение переменной MAX_FILE_SIZE, указанной в форме HTML", -"The uploaded file was only partially uploaded" => "Файл загружен частично", -"No file was uploaded" => "Файл не был загружен", -"Missing a temporary folder" => "Отсутствует временная папка", -"Contacts" => "Контакты", -"Addressbook not found." => "Адресная книга не найдена.", -"This is not your addressbook." => "Это не ваша адресная книга.", -"Contact could not be found." => "Контакт не найден.", -"Address" => "Адрес", -"Telephone" => "Телефон", -"Email" => "Ящик эл. почты", -"Organization" => "Организация", -"Work" => "Рабочий", -"Home" => "Домашний", -"Mobile" => "Мобильный", -"Text" => "Текст", -"Voice" => "Голос", -"Message" => "Сообщение", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пейджер", -"Internet" => "Интернет", -"{name}'s Birthday" => "День рождения {name}", -"Contact" => "Контакт", -"Add Contact" => "Добавить Контакт", -"Addressbooks" => "Адресные книги", -"Configure Address Books" => "Настроить Адресную книгу", -"New Address Book" => "Новая адресная книга", -"Import from VCF" => "Импортировать из VCF", -"CardDav Link" => "Ссылка CardDAV", -"Download" => "Скачать", -"Edit" => "Редактировать", -"Delete" => "Удалить", -"Download contact" => "Скачать контакт", -"Delete contact" => "Удалить контакт", -"Drop photo to upload" => "Перетяните фотографии для загрузки", -"Nickname" => "Псевдоним", -"Enter nickname" => "Введите псевдоним", -"Birthday" => "День рождения", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "Группы", -"Edit groups" => "Редактировать группы", -"Preferred" => "Предпочитаемый", -"Please specify a valid email address." => "Укажите действительный адрес электронной почты.", -"Enter email address" => "Укажите адрес электронной почты", -"Mail to address" => "Написать по адресу", -"Delete email address" => "Удалить адрес электронной почты", -"Enter phone number" => "Ввести номер телефона", -"Delete phone number" => "Удалить номер телефона", -"View on map" => "Показать на карте", -"Edit address details" => "Ввести детали адреса", -"Add notes here." => "Добавьте заметки здесь.", -"Add field" => "Добавить поле", -"Profile picture" => "Фото профиля", -"Phone" => "Телефон", -"Note" => "Заметка", -"Delete current photo" => "Удалить текущую фотографию", -"Edit current photo" => "Редактировать текущую фотографию", -"Upload new photo" => "Загрузить новую фотографию", -"Select photo from ownCloud" => "Выбрать фотографию из ownCloud", -"Edit address" => "Редактировать адрес", -"Type" => "Тип", -"PO Box" => "АО", -"Extended" => "Расширенный", -"Street" => "Улица", -"City" => "Город", -"Region" => "Область", -"Zipcode" => "Почтовый индекс", -"Country" => "Страна", -"Edit categories" => "Редактировать категрии", -"Add" => "Добавить", -"Addressbook" => "Адресная книга", -"Given name" => "Имя", -"Additional names" => "Дополнительные имена (отчество)", -"Family name" => "Фамилия", -"New Addressbook" => "Новая адресная книга", -"Edit Addressbook" => "Редактировать адресную книгу", -"Displayname" => "Отображаемое имя", -"Active" => "Активно", -"Save" => "Сохранить", -"Submit" => "Отправить", -"Cancel" => "Отменить", -"Import a contacts file" => "Загрузить файл контактов", -"Please choose the addressbook" => "Выберите адресную книгу", -"create a new addressbook" => "создать новую адресную книгу", -"Name of new addressbook" => "Имя новой адресной книги", -"Import" => "Импорт", -"Importing contacts" => "Импорт контактов", -"You have no contacts in your addressbook." => "В адресной книге есть контакты.", -"Add contact" => "Добавить контакт", -"Configure addressbooks" => "Настроить адресную книгу", -"more info" => "дополнительная информация" -); diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php deleted file mode 100644 index 6e5ebe3bd3..0000000000 --- a/apps/contacts/l10n/sk_SK.php +++ /dev/null @@ -1,155 +0,0 @@ - "Chyba (de)aktivácie adresára.", -"There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.", -"Cannot add empty property." => "Nemôžem pridať prázdny údaj.", -"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.", -"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:", -"Error adding contact property." => "Chyba pridania údaju kontaktu", -"No ID provided" => "ID nezadané", -"Error setting checksum." => "Chyba pri nastavovaní kontrolného súčtu.", -"No categories selected for deletion." => "Žiadne kategórie neboli vybraté na odstránenie.", -"No address books found." => "Žiadny adresár nenájdený.", -"No contacts found." => "Žiadne kontakty nenájdené.", -"Missing ID" => "Chýba ID", -"Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:", -"Cannot add addressbook with an empty name." => "Nedá sa pridať adresár s prázdnym menom.", -"Error adding addressbook." => "Chyba počas pridávania adresára.", -"Error activating addressbook." => "Chyba aktivovania adresára.", -"No contact ID was submitted." => "Nebolo nastavené ID kontaktu.", -"Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.", -"Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.", -"The loading photo is not valid." => "Načítaná fotka je vadná.", -"id is not set." => "ID nie je nastavené.", -"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.", -"Error deleting contact property." => "Chyba odstránenia údaju kontaktu.", -"Contact ID is missing." => "Chýba ID kontaktu.", -"Missing contact id." => "Chýba ID kontaktu.", -"No photo path was submitted." => "Žiadna fotka nebola poslaná.", -"File doesn't exist:" => "Súbor neexistuje:", -"Error loading image." => "Chyba pri nahrávaní obrázka.", -"element name is not set." => "meno elementu nie je nastavené.", -"checksum is not set." => "kontrolný súčet nie je nastavený.", -"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Niečo sa pokazilo.", -"Error updating contact property." => "Chyba aktualizovania údaju kontaktu.", -"Cannot update addressbook with an empty name." => "Nedá sa upraviť adresár s prázdnym menom.", -"Error updating addressbook." => "Chyba aktualizácie adresára.", -"Error uploading contacts to storage." => "Chyba pri ukladaní kontaktov na úložisko.", -"There is no error, the file uploaded with success" => "Nevyskytla sa žiadna chyba, súbor úspešne uložené.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ukladaný súbor prekračuje nastavenie upload_max_filesize v php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Ukladaný súbor prekračuje nastavenie MAX_FILE_SIZE z volieb HTML formulára.", -"The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne", -"No file was uploaded" => "Žiadny súbor nebol uložený", -"Missing a temporary folder" => "Chýba dočasný priečinok", -"Contacts" => "Kontakty", -"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.", -"Addressbook not found." => "Adresár sa nenašiel.", -"This is not your addressbook." => "Toto nie je váš adresár.", -"Contact could not be found." => "Kontakt nebol nájdený.", -"Address" => "Adresa", -"Telephone" => "Telefón", -"Email" => "E-mail", -"Organization" => "Organizácia", -"Work" => "Práca", -"Home" => "Domov", -"Mobile" => "Mobil", -"Text" => "SMS", -"Voice" => "Odkazová schránka", -"Message" => "Správa", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Pager", -"Internet" => "Internet", -"{name}'s Birthday" => "Narodeniny {name}", -"Contact" => "Kontakt", -"Add Contact" => "Pridať Kontakt.", -"Addressbooks" => "Adresáre", -"Configure Address Books" => "Nastaviť adresáre", -"New Address Book" => "Nový adresár", -"Import from VCF" => "Importovať z VCF", -"CardDav Link" => "CardDav odkaz", -"Download" => "Stiahnuť", -"Edit" => "Upraviť", -"Delete" => "Odstrániť", -"Download contact" => "Stiahnuť kontakt", -"Delete contact" => "Odstrániť kontakt", -"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami", -"Edit name details" => "Upraviť podrobnosti mena", -"Nickname" => "Prezývka", -"Enter nickname" => "Zadajte prezývku", -"Birthday" => "Narodeniny", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupiny", -"Separate groups with commas" => "Oddelte skupiny čiarkami", -"Edit groups" => "Úprava skupín", -"Preferred" => "Uprednostňované", -"Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.", -"Enter email address" => "Zadajte e-mailové adresy", -"Mail to address" => "Odoslať na adresu", -"Delete email address" => "Odstrániť e-mailové adresy", -"Enter phone number" => "Zadajte telefónne číslo", -"Delete phone number" => "Odstrániť telefónne číslo", -"View on map" => "Zobraziť na mape", -"Edit address details" => "Upraviť podrobnosti adresy", -"Add notes here." => "Tu môžete pridať poznámky.", -"Add field" => "Pridať pole", -"Profile picture" => "Profilová fotka", -"Phone" => "Telefón", -"Note" => "Poznámka", -"Delete current photo" => "Odstrániť súčasnú fotku", -"Edit current photo" => "Upraviť súčasnú fotku", -"Upload new photo" => "Nahrať novú fotku", -"Select photo from ownCloud" => "Vybrať fotku z ownCloud", -"Edit address" => "Upraviť adresu", -"Type" => "Typ", -"PO Box" => "PO Box", -"Extended" => "Rozšírené", -"Street" => "Ulica", -"City" => "Mesto", -"Region" => "Región", -"Zipcode" => "PSČ", -"Country" => "Krajina", -"Edit categories" => "Upraviť kategórie", -"Add" => "Pridať", -"Addressbook" => "Adresár", -"Hon. prefixes" => "Tituly pred", -"Miss" => "Slečna", -"Ms" => "Pani", -"Mr" => "Pán", -"Sir" => "Sir", -"Mrs" => "Pani", -"Dr" => "Dr.", -"Given name" => "Krstné meno", -"Additional names" => "Ďalšie mená", -"Family name" => "Priezvisko", -"Hon. suffixes" => "Tituly za", -"J.D." => "JUDr.", -"M.D." => "MUDr.", -"Ph.D." => "Ph.D.", -"Esq." => "Esq.", -"Jr." => "ml.", -"Sn." => "st.", -"New Addressbook" => "Nový Adresár", -"Edit Addressbook" => "Upraviť Adresár", -"Displayname" => "Zobrazené meno", -"Active" => "Aktívny", -"Save" => "Uložiť", -"Submit" => "Odoslať", -"Cancel" => "Zrušiť", -"Import a contacts file" => "Importovať súbor kontaktu", -"Please choose the addressbook" => "Prosím zvolte adresár", -"create a new addressbook" => "vytvoriť nový adresár", -"Name of new addressbook" => "Meno nového adresára", -"Import" => "Importovať", -"Importing contacts" => "Importovanie kontaktov", -"Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:", -"Select from HD" => "Vyberte z pevného disku", -"You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.", -"Add contact" => "Pridať kontakt", -"Configure addressbooks" => "Nastaviť adresáre", -"CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV", -"more info" => "viac informácií", -"Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php deleted file mode 100644 index bfba23fabc..0000000000 --- a/apps/contacts/l10n/sl.php +++ /dev/null @@ -1,157 +0,0 @@ - "Napaka med (de)aktivacijo imenika.", -"There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake", -"Cannot add empty property." => "Ne morem dodati prazne lastnosti.", -"At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.", -"Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:", -"Error adding contact property." => "Napaka pri dodajanju informacije o stiku.", -"No ID provided" => "ID ni bil podan", -"Error setting checksum." => "Napaka pri nastavljanju nadzorne vsote.", -"No categories selected for deletion." => "Nobena kategorija ni bila izbrana za izbris.", -"No address books found." => "Ni bilo najdenih imenikov.", -"No contacts found." => "Ni bilo najdenih stikov.", -"Missing ID" => "Manjkajoč ID", -"Error parsing VCard for ID: \"" => "Napaka pri razčlenjevanju VCard za ID: \"", -"Cannot add addressbook with an empty name." => "Ne morem dodati imenika s praznim imenom.", -"Error adding addressbook." => "Napaka pri dodajanju imenika.", -"Error activating addressbook." => "Napaka pri aktiviranju imenika.", -"No contact ID was submitted." => "ID stika ni bil poslan.", -"Error reading contact photo." => "Napaka pri branju slike stika.", -"Error saving temporary file." => "Napaka pri shranjevanju začasne datoteke.", -"The loading photo is not valid." => "Slika, ki se nalaga ni veljavna.", -"id is not set." => "id ni nastavljen.", -"Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.", -"Error deleting contact property." => "Napaka pri brisanju lastnosti stika.", -"Contact ID is missing." => "Manjka ID stika.", -"Missing contact id." => "Manjka id stika.", -"No photo path was submitted." => "Pot slike ni bila poslana.", -"File doesn't exist:" => "Datoteka ne obstaja:", -"Error loading image." => "Napaka pri nalaganju slike.", -"element name is not set." => "ime elementa ni nastavljeno.", -"checksum is not set." => "nadzorna vsota ni nastavljena.", -"Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ", -"Something went FUBAR. " => "Nekaj je šlo v franže. ", -"Error updating contact property." => "Napaka pri posodabljanju lastnosti stika.", -"Cannot update addressbook with an empty name." => "Ne morem posodobiti imenika s praznim imenom.", -"Error updating addressbook." => "Napaka pri posodabljanju imenika.", -"Error uploading contacts to storage." => "Napaka pri nalaganju stikov v hrambo.", -"There is no error, the file uploaded with success" => "Datoteka je bila uspešno naložena.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Naložena datoteka presega velikost, ki jo določa parameter MAX_FILE_SIZE v HTML obrazcu", -"The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena", -"No file was uploaded" => "Nobena datoteka ni bila naložena", -"Missing a temporary folder" => "Manjka začasna mapa", -"Contacts" => "Stiki", -"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.", -"Addressbook not found." => "Imenik ni bil najden.", -"This is not your addressbook." => "To ni vaš imenik.", -"Contact could not be found." => "Stika ni bilo mogoče najti.", -"Address" => "Naslov", -"Telephone" => "Telefon", -"Email" => "E-pošta", -"Organization" => "Organizacija", -"Work" => "Delo", -"Home" => "Doma", -"Mobile" => "Mobilni telefon", -"Text" => "Besedilo", -"Voice" => "Glas", -"Message" => "Sporočilo", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pozivnik", -"Internet" => "Internet", -"{name}'s Birthday" => "{name} - rojstni dan", -"Contact" => "Stik", -"Add Contact" => "Dodaj stik", -"Addressbooks" => "Imeniki", -"Configure Address Books" => "Nastavi imenike", -"New Address Book" => "Nov imenik", -"Import from VCF" => "Uvozi iz VCF", -"CardDav Link" => "CardDav povezava", -"Download" => "Prenesi", -"Edit" => "Uredi", -"Delete" => "Izbriši", -"Download contact" => "Prenesi stik", -"Delete contact" => "Izbriši stik", -"Drop photo to upload" => "Spustite sliko tukaj, da bi jo naložili", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico", -"Edit name details" => "Uredite podrobnosti imena", -"Nickname" => "Vzdevek", -"Enter nickname" => "Vnesite vzdevek", -"Birthday" => "Rojstni dan", -"dd-mm-yyyy" => "dd. mm. yyyy", -"Groups" => "Skupine", -"Separate groups with commas" => "Skupine ločite z vejicami", -"Edit groups" => "Uredi skupine", -"Preferred" => "Prednosten", -"Please specify a valid email address." => "Prosimo, če navedete veljaven e-poštni naslov.", -"Enter email address" => "Vnesite e-poštni naslov", -"Mail to address" => "E-pošta naslovnika", -"Delete email address" => "Izbriši e-poštni naslov", -"Enter phone number" => "Vpiši telefonsko številko", -"Delete phone number" => "Izbriši telefonsko številko", -"View on map" => "Prikaz na zemljevidu", -"Edit address details" => "Uredi podrobnosti", -"Add notes here." => "Opombe dodajte tukaj.", -"Add field" => "Dodaj polje", -"Profile picture" => "Slika profila", -"Phone" => "Telefon", -"Note" => "Opomba", -"Delete current photo" => "Izbriši trenutno sliko", -"Edit current photo" => "Uredi trenutno sliko", -"Upload new photo" => "Naloži novo sliko", -"Select photo from ownCloud" => "Izberi sliko iz ownCloud", -"Edit address" => "Uredi naslov", -"Type" => "Vrsta", -"PO Box" => "Poštni predal", -"Extended" => "Razširjeno", -"Street" => "Ulica", -"City" => "Mesto", -"Region" => "Regija", -"Zipcode" => "Poštna št.", -"Country" => "Dežela", -"Edit categories" => "Uredi kategorije", -"Add" => "Dodaj", -"Addressbook" => "Imenik", -"Hon. prefixes" => "Predpone", -"Miss" => "gdč.", -"Ms" => "ga.", -"Mr" => "g.", -"Sir" => "g.", -"Mrs" => "ga.", -"Dr" => "dr.", -"Given name" => "Ime", -"Additional names" => "Dodatna imena", -"Family name" => "Priimek", -"Hon. suffixes" => "Pripone", -"J.D." => "univ. dipl. prav.", -"M.D." => "dr. med.", -"D.O." => "dr. med., spec. spl. med.", -"D.C." => "dr. med., spec. kiropraktike", -"Ph.D." => "dr.", -"Esq." => "Esq.", -"Jr." => "mlajši", -"Sn." => "starejši", -"New Addressbook" => "Nov imenik", -"Edit Addressbook" => "Uredi imenik", -"Displayname" => "Ime za prikaz", -"Active" => "Aktiven", -"Save" => "Shrani", -"Submit" => "Potrdi", -"Cancel" => "Prekliči", -"Import a contacts file" => "Uvozi datoteko s stiki", -"Please choose the addressbook" => "Prosimo, če izberete imenik", -"create a new addressbook" => "Ustvari nov imenik", -"Name of new addressbook" => "Ime novega imenika", -"Import" => "Uvozi", -"Importing contacts" => "Uvažam stike", -"Select address book to import to:" => "Izberite imenik v katerega boste uvažali:", -"Select from HD" => "Izberi iz HD", -"You have no contacts in your addressbook." => "V vašem imeniku ni stikov.", -"Add contact" => "Dodaj stik", -"Configure addressbooks" => "Nastavi imenike", -"CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo", -"more info" => "več informacij", -"Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/sr.php b/apps/contacts/l10n/sr.php deleted file mode 100644 index aad88f3603..0000000000 --- a/apps/contacts/l10n/sr.php +++ /dev/null @@ -1,47 +0,0 @@ - "Подаци о вКарти су неисправни. Поново учитајте страницу.", -"Contacts" => "Контакти", -"This is not your addressbook." => "Ово није ваш адресар.", -"Contact could not be found." => "Контакт се не може наћи.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-маил", -"Organization" => "Организација", -"Work" => "Посао", -"Home" => "Кућа", -"Mobile" => "Мобилни", -"Text" => "Текст", -"Voice" => "Глас", -"Fax" => "Факс", -"Video" => "Видео", -"Pager" => "Пејџер", -"Contact" => "Контакт", -"Add Contact" => "Додај контакт", -"Addressbooks" => "Адресар", -"New Address Book" => "Нови адресар", -"Download" => "Преузимање", -"Edit" => "Уреди", -"Delete" => "Обриши", -"Download contact" => "Преузми контакт", -"Delete contact" => "Обриши контакт", -"Birthday" => "Рођендан", -"Preferred" => "Пожељан", -"Phone" => "Телефон", -"Type" => "Тип", -"PO Box" => "Поштански број", -"Extended" => "Прошири", -"Street" => "Улица", -"City" => "Град", -"Region" => "Регија", -"Zipcode" => "Зип код", -"Country" => "Земља", -"Add" => "Додај", -"Addressbook" => "Адресар", -"New Addressbook" => "Нови адресар", -"Edit Addressbook" => "Уреди адресар", -"Displayname" => "Приказано име", -"Active" => "Активан", -"Save" => "Сними", -"Submit" => "Пошаљи", -"Cancel" => "Откажи" -); diff --git a/apps/contacts/l10n/sr@latin.php b/apps/contacts/l10n/sr@latin.php deleted file mode 100644 index a76c104790..0000000000 --- a/apps/contacts/l10n/sr@latin.php +++ /dev/null @@ -1,29 +0,0 @@ - "Podaci o vKarti su neispravni. Ponovo učitajte stranicu.", -"This is not your addressbook." => "Ovo nije vaš adresar.", -"Contact could not be found." => "Kontakt se ne može naći.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", -"Work" => "Posao", -"Home" => "Kuća", -"Mobile" => "Mobilni", -"Text" => "Tekst", -"Voice" => "Glas", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Pejdžer", -"Add Contact" => "Dodaj kontakt", -"Edit" => "Uredi", -"Delete" => "Obriši", -"Birthday" => "Rođendan", -"Phone" => "Telefon", -"PO Box" => "Poštanski broj", -"Extended" => "Proširi", -"Street" => "Ulica", -"City" => "Grad", -"Region" => "Regija", -"Zipcode" => "Zip kod", -"Country" => "Zemlja" -); diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php deleted file mode 100644 index 8d5d37d248..0000000000 --- a/apps/contacts/l10n/sv.php +++ /dev/null @@ -1,143 +0,0 @@ - "Fel när (av)aktivera adressbok", -"There was an error adding the contact." => "Det uppstod ett fel när kontakt skulle läggas till", -"Cannot add empty property." => "Kan inte lägga till en tom egenskap", -"At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i", -"Error adding contact property." => "Fel när kontaktegenskap skulle läggas till", -"No ID provided" => "Inget ID angett", -"Error setting checksum." => "Fel uppstod när kontrollsumma skulle sättas.", -"No categories selected for deletion." => "Inga kategorier valda för borttaging", -"No address books found." => "Ingen adressbok funnen.", -"No contacts found." => "Inga kontakter funna.", -"Missing ID" => "ID saknas", -"Cannot add addressbook with an empty name." => "Kan inte lägga till adressbok med ett tomt namn.", -"Error adding addressbook." => "Fel när adressbok skulle läggas till", -"Error activating addressbook." => "Fel uppstod när adressbok skulle aktiveras", -"No contact ID was submitted." => "Inget kontakt-ID angavs.", -"Error reading contact photo." => "Fel uppstod när ", -"Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.", -"The loading photo is not valid." => "Det laddade fotot är inte giltigt.", -"id is not set." => "ID är inte satt.", -"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.", -"Error deleting contact property." => "Fel uppstod när kontaktegenskap skulle tas bort", -"Contact ID is missing." => "Kontakt-ID saknas.", -"Missing contact id." => "Saknar kontakt-ID.", -"No photo path was submitted." => "Ingen sökväg till foto angavs.", -"File doesn't exist:" => "Filen existerar inte.", -"Error loading image." => "Fel uppstod när bild laddades.", -"checksum is not set." => "kontrollsumma är inte satt.", -"Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:", -"Error updating contact property." => "Fel uppstod när kontaktegenskap skulle uppdateras", -"Cannot update addressbook with an empty name." => "Kan inte uppdatera adressboken med ett tomt namn.", -"Error updating addressbook." => "Fel uppstod när adressbok skulle uppdateras", -"Error uploading contacts to storage." => "Fel uppstod när kontakt skulle lagras.", -"There is no error, the file uploaded with success" => "Inga fel uppstod. Filen laddades upp utan problem.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överskrider MAX_FILE_SIZE direktivet som har angetts i HTML formuläret", -"The uploaded file was only partially uploaded" => "Den uppladdade filen var bara delvist uppladdad", -"No file was uploaded" => "Ingen fil laddades upp", -"Missing a temporary folder" => "En temporär mapp saknas", -"Contacts" => "Kontakter", -"Drop a VCF file to import contacts." => "Släpp en VCF-fil för att importera kontakter.", -"Addressbook not found." => "Hittade inte adressboken", -"This is not your addressbook." => "Det här är inte din adressbok.", -"Contact could not be found." => "Kontakt kunde inte hittas.", -"Address" => "Adress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisation", -"Work" => "Arbete", -"Home" => "Hem", -"Mobile" => "Mobil", -"Text" => "Text", -"Voice" => "Röst", -"Message" => "Meddelande", -"Fax" => "Fax", -"Video" => "Video", -"Pager" => "Personsökare", -"Internet" => "Internet", -"{name}'s Birthday" => "{name}'s födelsedag", -"Contact" => "Kontakt", -"Add Contact" => "Lägg till kontakt", -"Addressbooks" => "Adressböcker", -"Configure Address Books" => "Konfigurera adressböcker", -"New Address Book" => "Ny adressbok", -"Import from VCF" => "Importera från VCF", -"CardDav Link" => "CardDAV länk", -"Download" => "Nedladdning", -"Edit" => "Redigera", -"Delete" => "Radera", -"Download contact" => "Ladda ner kontakt", -"Delete contact" => "Radera kontakt", -"Drop photo to upload" => "Släpp foto för att ladda upp", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma", -"Edit name details" => "Redigera detaljer för namn", -"Nickname" => "Smeknamn", -"Enter nickname" => "Ange smeknamn", -"Birthday" => "Födelsedag", -"dd-mm-yyyy" => "dd-mm-åååå", -"Groups" => "Grupper", -"Separate groups with commas" => "Separera grupperna med kommatecken", -"Edit groups" => "Editera grupper", -"Preferred" => "Föredragen", -"Please specify a valid email address." => "Vänligen ange en giltig e-postadress", -"Enter email address" => "Ange e-postadress", -"Mail to address" => "Posta till adress.", -"Delete email address" => "Ta bort e-postadress", -"Enter phone number" => "Ange ett telefonnummer", -"Delete phone number" => "Ta bort telefonnummer", -"View on map" => "Visa på karta", -"Edit address details" => "Redigera detaljer för adress", -"Add notes here." => "Lägg till noteringar här.", -"Add field" => "Lägg till fält", -"Profile picture" => "Profilbild", -"Phone" => "Telefon", -"Note" => "Notering", -"Delete current photo" => "Ta bort aktuellt foto", -"Edit current photo" => "Redigera aktuellt foto", -"Upload new photo" => "Ladda upp ett nytt foto", -"Select photo from ownCloud" => "Välj foto från ownCloud", -"Edit address" => "Editera adress", -"Type" => "Typ", -"PO Box" => "Postbox", -"Extended" => "Utökad", -"Street" => "Gata", -"City" => "Stad", -"Region" => "Län", -"Zipcode" => "Postnummer", -"Country" => "Land", -"Edit categories" => "Editera kategorier", -"Add" => "Ny", -"Addressbook" => "Adressbok", -"Miss" => "Herr", -"Ms" => "Ingen adressbok funnen.", -"Mr" => "Fru", -"Mrs" => "Fröken", -"Dr" => "Dr", -"Given name" => "Förnamn", -"Additional names" => "Mellannamn", -"Family name" => "Efternamn", -"Ph.D." => "Fil.dr.", -"New Addressbook" => "Ny adressbok", -"Edit Addressbook" => "Redigera adressbok", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", -"Save" => "Spara", -"Submit" => "Skicka in", -"Cancel" => "Avbryt", -"Import a contacts file" => "Importera en kontaktfil", -"Please choose the addressbook" => "Vänligen välj adressboken", -"create a new addressbook" => "skapa en ny adressbok", -"Name of new addressbook" => "Namn för ny adressbok", -"Import" => "Importera", -"Importing contacts" => "Importerar kontakter", -"Select address book to import to:" => "Importera till adressbok:", -"Select from HD" => "Välj från hårddisk", -"You have no contacts in your addressbook." => "Du har inga kontakter i din adressbok.", -"Add contact" => "Lägg till en kontakt", -"Configure addressbooks" => "Konfigurera adressböcker", -"CardDAV syncing addresses" => "CardDAV synkningsadresser", -"more info" => "mera information", -"Primary address (Kontact et al)" => "Primär adress (Kontakt o.a.)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/th_TH.php b/apps/contacts/l10n/th_TH.php deleted file mode 100644 index acf382c6a4..0000000000 --- a/apps/contacts/l10n/th_TH.php +++ /dev/null @@ -1,157 +0,0 @@ - "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่", -"There was an error adding the contact." => "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่", -"Cannot add empty property." => "ไม่สามารถเพิ่มรายละเอียดที่ไม่มีข้อมูลได้", -"At least one of the address fields has to be filled out." => "อย่างน้อยที่สุดช่องข้อมูลที่อยู่จะต้องถูกกรอกลงไป", -"Trying to add duplicate property: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ", -"Error adding contact property." => "เกิดข้อผิดพลาดในการเพิ่มรายละเอียดการติดต่อ", -"No ID provided" => "ยังไม่ได้ใส่รหัส", -"Error setting checksum." => "เกิดข้อผิดพลาดในการตั้งค่า checksum", -"No categories selected for deletion." => "ยังไม่ได้เลือกหมวดหมู่ที่ต้องการลบ", -"No address books found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", -"No contacts found." => "ไม่พบข้อมูลการติดต่อที่ต้องการ", -"Missing ID" => "รหัสสูญหาย", -"Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"", -"Cannot add addressbook with an empty name." => "ไม่สามารถเพิ่มสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", -"Error adding addressbook." => "เกิดข้อผิดพลาดในการเพิ่มสมุดบันทึกที่อยู่ใหม่", -"Error activating addressbook." => "เกิดข้อผิดพลาดในการเปิดใช้งานสมุดบันทึกที่อยู่", -"No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา", -"Error reading contact photo." => "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ", -"Error saving temporary file." => "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว", -"The loading photo is not valid." => "โหลดรูปภาพไม่ถูกต้อง", -"id is not set." => "ยังไม่ได้กำหนดรหัส", -"Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง", -"Error deleting contact property." => "เกิดข้อผิดพลาดในการลบรายละเอียดการติดต่อ", -"Contact ID is missing." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย", -"Missing contact id." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย", -"No photo path was submitted." => "ไม่พบตำแหน่งพาธของรูปภาพ", -"File doesn't exist:" => "ไม่มีไฟล์ดังกล่าว", -"Error loading image." => "เกิดข้อผิดพลาดในการโหลดรูปภาพ", -"element name is not set." => "ยังไม่ได้กำหนดชื่อ", -"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum", -"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ", -"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ", -"Error updating contact property." => "เกิดข้อผิดพลาดในการอัพเดทข้อมูลการติดต่อ", -"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", -"Error updating addressbook." => "เกิดข้อผิดพลาดในการอัพเดทสมุดบันทึกที่อยู่", -"Error uploading contacts to storage." => "เกิดข้อผิดพลาดในการอัพโหลดข้อมูลการติดต่อไปยังพื้นที่จัดเก็บข้อมูล", -"There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง MAX_FILE_SIZE ที่ถูกระบุไว้ในรูปแบบของ HTML", -"The uploaded file was only partially uploaded" => "ไฟล์ถูกอัพโหลดได้เพียงบางส่วนเท่านั้น", -"No file was uploaded" => "ไม่มีไฟล์ที่ถูกอัพโหลด", -"Missing a temporary folder" => "โฟลเดอร์ชั่วคราวเกิดการสูญหาย", -"Contacts" => "ข้อมูลการติดต่อ", -"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ", -"Addressbook not found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", -"This is not your addressbook." => "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ", -"Contact could not be found." => "ไม่พบข้อมูลการติดต่อ", -"Address" => "ที่อยู่", -"Telephone" => "โทรศัพท์", -"Email" => "อีเมล์", -"Organization" => "หน่วยงาน", -"Work" => "ที่ทำงาน", -"Home" => "บ้าน", -"Mobile" => "มือถือ", -"Text" => "ข้อความ", -"Voice" => "เสียงพูด", -"Message" => "ข้อความ", -"Fax" => "โทรสาร", -"Video" => "วีดีโอ", -"Pager" => "เพจเจอร์", -"Internet" => "อินเทอร์เน็ต", -"{name}'s Birthday" => "วันเกิดของ {name}", -"Contact" => "ข้อมูลการติดต่อ", -"Add Contact" => "เพิ่มรายชื่อผู้ติดต่อใหม่", -"Addressbooks" => "สมุดบันทึกที่อยู่", -"Configure Address Books" => "กำหนดค่าสมุดบันทึกที่อยู่", -"New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่", -"Import from VCF" => "นำเข้าจาก VCF", -"CardDav Link" => "ลิงค์ CardDav", -"Download" => "ดาวน์โหลด", -"Edit" => "แก้ไข", -"Delete" => "ลบ", -"Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", -"Delete contact" => "ลบข้อมูลการติดต่อ", -"Drop photo to upload" => "วางรูปภาพที่ต้องการอัพโหลด", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง", -"Edit name details" => "แก้ไขรายละเอียดของชื่อ", -"Nickname" => "ชื่อเล่น", -"Enter nickname" => "กรอกชื่อเล่น", -"Birthday" => "วันเกิด", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "กลุ่ม", -"Separate groups with commas" => "คั่นระหว่างรายชื่อกลุ่มด้วยเครื่องหมายจุลภาีคหรือคอมม่า", -"Edit groups" => "แก้ไขกลุ่ม", -"Preferred" => "พิเศษ", -"Please specify a valid email address." => "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง", -"Enter email address" => "กรอกที่อยู่อีเมล", -"Mail to address" => "ส่งอีเมลไปที่", -"Delete email address" => "ลบที่อยู่อีเมล", -"Enter phone number" => "กรอกหมายเลขโทรศัพท์", -"Delete phone number" => "ลบหมายเลขโทรศัพท์", -"View on map" => "ดูบนแผนที่", -"Edit address details" => "แก้ไขรายละเอียดที่อยู่", -"Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่", -"Add field" => "เพิ่มช่องรับข้อมูล", -"Profile picture" => "รูปภาพโปรไฟล์", -"Phone" => "โทรศัพท์", -"Note" => "หมายเหตุ", -"Delete current photo" => "ลบรูปภาพปัจจุบัน", -"Edit current photo" => "แก้ไขรูปภาพปัจจุบัน", -"Upload new photo" => "อัพโหลดรูปภาพใหม่", -"Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud", -"Edit address" => "แก้ไขที่อยู่", -"Type" => "ประเภท", -"PO Box" => "ตู้ ปณ.", -"Extended" => "เพิ่ม", -"Street" => "ถนน", -"City" => "เมือง", -"Region" => "ภูมิภาค", -"Zipcode" => "รหัสไปรษณีย์", -"Country" => "ประเทศ", -"Edit categories" => "แก้ไขหมวดหมู่", -"Add" => "เพิ่ม", -"Addressbook" => "สมุดบันทึกที่อยู่", -"Hon. prefixes" => "คำนำหน้าชื่อคนรัก", -"Miss" => "นางสาว", -"Ms" => "น.ส.", -"Mr" => "นาย", -"Sir" => "คุณ", -"Mrs" => "นาง", -"Dr" => "ดร.", -"Given name" => "ชื่อที่ใช้", -"Additional names" => "ชื่ออื่นๆ", -"Family name" => "ชื่อครอบครัว", -"Hon. suffixes" => "คำแนบท้ายชื่อคนรัก", -"J.D." => "J.D.", -"M.D." => "M.D.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "ปริญญาเอก", -"Esq." => "Esq.", -"Jr." => "จูเนียร์", -"Sn." => "ซีเนียร์", -"New Addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", -"Edit Addressbook" => "แก้ไขสมุดบันทึกที่อยู่", -"Displayname" => "ชื่อที่ต้องการให้แสดง", -"Active" => "เปิดใช้", -"Save" => "บันทึก", -"Submit" => "ส่งข้อมูล", -"Cancel" => "ยกเลิก", -"Import a contacts file" => "นำเข้าไฟล์ข้อมูลการติดต่อ", -"Please choose the addressbook" => "กรุณาเลือกสมุดบันทึกที่อยู่", -"create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", -"Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่", -"Import" => "นำเข้า", -"Importing contacts" => "นำเข้าข้อมูลการติดต่อ", -"Select address book to import to:" => "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:", -"Select from HD" => "เลือกจากฮาร์ดดิส", -"You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ", -"Add contact" => "เพิ่มชื่อผู้ติดต่อ", -"Configure addressbooks" => "กำหนดค่าสมุดบันทึกที่อยู่", -"CardDAV syncing addresses" => "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV", -"more info" => "ข้อมูลเพิ่มเติม", -"Primary address (Kontact et al)" => "ที่อยู่หลัก (สำหรับติดต่อ)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php deleted file mode 100644 index 65e8e34c30..0000000000 --- a/apps/contacts/l10n/tr.php +++ /dev/null @@ -1,157 +0,0 @@ - "Adres defteri etkisizleştirilirken hata oluştu.", -"There was an error adding the contact." => "Kişi eklenirken hata oluştu.", -"Cannot add empty property." => "Boş özellik eklenemiyor.", -"At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.", -"Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ", -"Error adding contact property." => "Kişi özelliği eklenirken hata oluştu.", -"No ID provided" => "ID verilmedi", -"Error setting checksum." => "İmza oluşturulurken hata.", -"No categories selected for deletion." => "Silmek için bir kategori seçilmedi.", -"No address books found." => "Adres defteri bulunamadı.", -"No contacts found." => "Bağlantı bulunamadı.", -"Missing ID" => "Eksik ID", -"Error parsing VCard for ID: \"" => "ID için VCard ayrıştırılamadı:\"", -"Cannot add addressbook with an empty name." => "Adres defterini isimsiz ekleyemezsiniz.", -"Error adding addressbook." => "Adres defteri eklenirken hata oluştu.", -"Error activating addressbook." => "Adres defteri etkinleştirilirken hata oluştu.", -"No contact ID was submitted." => "Bağlantı ID'si girilmedi.", -"Error reading contact photo." => "Bağlantı fotoğrafı okunamadı.", -"Error saving temporary file." => "Geçici dosya kaydetme hatası.", -"The loading photo is not valid." => "Yüklenecek fotograf geçerli değil.", -"id is not set." => "id atanmamış.", -"Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.", -"Error deleting contact property." => "Kişi özelliği silinirken hata oluştu.", -"Contact ID is missing." => "Bağlantı ID'si eksik.", -"Missing contact id." => "Eksik bağlantı id'si.", -"No photo path was submitted." => "Fotoğraf girilmedi.", -"File doesn't exist:" => "Dosya mevcut değil:", -"Error loading image." => "İmaj yükleme hatası.", -"element name is not set." => "eleman ismi atanmamış.", -"checksum is not set." => "checksum atanmamış.", -"Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ", -"Something went FUBAR. " => "Bir şey FUBAR gitti.", -"Error updating contact property." => "Kişi özelliği güncellenirken hata oluştu.", -"Cannot update addressbook with an empty name." => "Adres defterini boş bir isimle güncelleyemezsiniz.", -"Error updating addressbook." => "Adres defteri güncellenirken hata oluştu.", -"Error uploading contacts to storage." => "Bağlantıları depoya yükleme hatası", -"There is no error, the file uploaded with success" => "Dosya başarıyla yüklendi, hata oluşmadı", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Dosyanın boyutu php.ini dosyasındaki upload_max_filesize limitini aşıyor", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Yüklenecek dosyanın boyutu HTML formunda belirtilen MAX_FILE_SIZE limitini aşıyor", -"The uploaded file was only partially uploaded" => "Dosya kısmen karşıya yüklenebildi", -"No file was uploaded" => "Hiç dosya gönderilmedi", -"Missing a temporary folder" => "Geçici dizin eksik", -"Contacts" => "Kişiler", -"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.", -"Addressbook not found." => "Adres defteri bulunamadı.", -"This is not your addressbook." => "Bu sizin adres defteriniz değil.", -"Contact could not be found." => "Kişi bulunamadı.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "Eposta", -"Organization" => "Organizasyon", -"Work" => "İş", -"Home" => "Ev", -"Mobile" => "Mobil", -"Text" => "Metin", -"Voice" => "Ses", -"Message" => "mesaj", -"Fax" => "Faks", -"Video" => "Video", -"Pager" => "Sayfalayıcı", -"Internet" => "İnternet", -"{name}'s Birthday" => "{name}'nin Doğumgünü", -"Contact" => "Kişi", -"Add Contact" => "Kişi Ekle", -"Addressbooks" => "Adres defterleri", -"Configure Address Books" => "Adres Defterlerini Yapılandır", -"New Address Book" => "Yeni Adres Defteri", -"Import from VCF" => "VCF'den içeri aktar", -"CardDav Link" => "CardDav Bağlantısı", -"Download" => "İndir", -"Edit" => "Düzenle", -"Delete" => "Sil", -"Download contact" => "Kişiyi indir", -"Delete contact" => "Kişiyi sil", -"Drop photo to upload" => "Fotoğrafı yüklenmesi için bırakın", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters", -"Edit name details" => "İsim detaylarını düzenle", -"Nickname" => "Takma ad", -"Enter nickname" => "Takma adı girin", -"Birthday" => "Doğum günü", -"dd-mm-yyyy" => "gg-aa-yyyy", -"Groups" => "Gruplar", -"Separate groups with commas" => "Grupları birbirinden virgülle ayırın", -"Edit groups" => "Grupları düzenle", -"Preferred" => "Tercih edilen", -"Please specify a valid email address." => "Lütfen geçerli bir eposta adresi belirtin.", -"Enter email address" => "Eposta adresini girin", -"Mail to address" => "Eposta adresi", -"Delete email address" => "Eposta adresini sil", -"Enter phone number" => "Telefon numarasını gir", -"Delete phone number" => "Telefon numarasını sil", -"View on map" => "Haritada gör", -"Edit address details" => "Adres detaylarını düzenle", -"Add notes here." => "Notları buraya ekleyin.", -"Add field" => "Alan ekle", -"Profile picture" => "Profil resmi", -"Phone" => "Telefon", -"Note" => "Not", -"Delete current photo" => "Mevcut fotoğrafı sil", -"Edit current photo" => "Mevcut fotoğrafı düzenle", -"Upload new photo" => "Yeni fotoğraf yükle", -"Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç", -"Edit address" => "Adresi düzenle", -"Type" => "Tür", -"PO Box" => "Posta Kutusu", -"Extended" => "Uzatılmış", -"Street" => "Sokak", -"City" => "Şehir", -"Region" => "Bölge", -"Zipcode" => "Posta kodu", -"Country" => "Ülke", -"Edit categories" => "Kategorileri düzenle", -"Add" => "Ekle", -"Addressbook" => "Adres defteri", -"Hon. prefixes" => "Kısaltmalar", -"Miss" => "Bayan", -"Ms" => "Bayan", -"Mr" => "Bay", -"Sir" => "Bay", -"Mrs" => "Bayan", -"Dr" => "Dr", -"Given name" => "Verilen isim", -"Additional names" => "İlave isimler", -"Family name" => "Soyad", -"Hon. suffixes" => "Kısaltmalar", -"J.D." => "J.D.", -"M.D." => "Dr.", -"D.O." => "D.O.", -"D.C." => "D.C.", -"Ph.D." => "Dr.", -"Esq." => "Esq.", -"Jr." => "Jr.", -"Sn." => "Sn.", -"New Addressbook" => "Yeni Adres defteri", -"Edit Addressbook" => "Adres Defterini Düzenle", -"Displayname" => "Görünen adı", -"Active" => "Aktif", -"Save" => "Kaydet", -"Submit" => "Gönder", -"Cancel" => "İptal", -"Import a contacts file" => "Bağlantı dosyasını içeri aktar", -"Please choose the addressbook" => "Yeni adres defterini seç", -"create a new addressbook" => "Yeni adres defteri oluştur", -"Name of new addressbook" => "Yeni adres defteri için isim", -"Import" => "İçe aktar", -"Importing contacts" => "Bağlantıları içe aktar", -"Select address book to import to:" => "İçe aktarılacak adres defterini seçin:", -"Select from HD" => "HD'den seç", -"You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.", -"Add contact" => "Bağlatı ekle", -"Configure addressbooks" => "Adres defterini yapılandır", -"CardDAV syncing addresses" => "CardDAV adresleri eşzamanlıyor", -"more info" => "daha fazla bilgi", -"Primary address (Kontact et al)" => "Birincil adres (Bağlantı ve arkadaşları)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/uk.php b/apps/contacts/l10n/uk.php deleted file mode 100644 index 4c27acf543..0000000000 --- a/apps/contacts/l10n/uk.php +++ /dev/null @@ -1,29 +0,0 @@ - "Має бути заповнено щонайменше одне поле.", -"Error adding addressbook." => "Помилка при додаванні адресної книги.", -"This is not your addressbook." => "Це не ваша адресна книга.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Ел.пошта", -"Organization" => "Організація", -"Mobile" => "Мобільний", -"Text" => "Текст", -"Voice" => "Голос", -"Fax" => "Факс", -"Video" => "Відео", -"Pager" => "Пейджер", -"Add Contact" => "Додати контакт", -"New Address Book" => "Нова адресна книга", -"Download" => "Завантажити", -"Delete" => "Видалити", -"Delete contact" => "Видалити контакт", -"Birthday" => "День народження", -"Phone" => "Телефон", -"Extended" => "Розширено", -"Street" => "Вулиця", -"City" => "Місто", -"Zipcode" => "Поштовий індекс", -"Country" => "Країна", -"Add" => "Додати", -"Displayname" => "Відображуване ім'я" -); diff --git a/apps/contacts/l10n/xgettextfiles b/apps/contacts/l10n/xgettextfiles deleted file mode 100644 index e291074fba..0000000000 --- a/apps/contacts/l10n/xgettextfiles +++ /dev/null @@ -1,18 +0,0 @@ -../appinfo/app.php -../ajax/activation.php -../ajax/addbook.php -../ajax/addproperty.php -../ajax/createaddressbook.php -../ajax/deletebook.php -../ajax/deleteproperty.php -../ajax/contactdetails.php -../ajax/saveproperty.php -../ajax/updateaddressbook.php -../lib/app.php -../templates/index.php -../templates/part.chooseaddressbook.php -../templates/part.chooseaddressbook.rowfields.php -../templates/part.editaddressbook.php -../templates/part.property.php -../templates/part.setpropertyform.php -../templates/settings.php diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php deleted file mode 100644 index dcf9b99bc8..0000000000 --- a/apps/contacts/l10n/zh_CN.php +++ /dev/null @@ -1,127 +0,0 @@ - "(取消)激活地址簿错误。", -"There was an error adding the contact." => "添加联系人时出错。", -"Cannot add empty property." => "无法添加空属性。", -"At least one of the address fields has to be filled out." => "至少需要填写一项地址。", -"Trying to add duplicate property: " => "试图添加重复属性: ", -"Error adding contact property." => "添加联系人属性错误。", -"No ID provided" => "未提供 ID", -"Error setting checksum." => "设置校验值错误。", -"No categories selected for deletion." => "未选中要删除的分类。", -"No address books found." => "找不到地址簿。", -"No contacts found." => "找不到联系人。", -"Missing ID" => "缺少 ID", -"Error parsing VCard for ID: \"" => "无法解析如下ID的 VCard:“", -"Cannot add addressbook with an empty name." => "无法无姓名的地址簿。", -"Error adding addressbook." => "添加地址簿错误。", -"Error activating addressbook." => "激活地址簿错误。", -"No contact ID was submitted." => "未提交联系人 ID。", -"Error reading contact photo." => "读取联系人照片错误。", -"Error saving temporary file." => "保存临时文件错误。", -"The loading photo is not valid." => "装入的照片不正确。", -"id is not set." => "没有设置 id。", -"Information about vCard is incorrect. Please reload the page." => "vCard 的信息不正确。请重新加载页面。", -"Error deleting contact property." => "删除联系人属性错误。", -"Contact ID is missing." => "缺少联系人 ID。", -"Missing contact id." => "缺少联系人 ID。", -"No photo path was submitted." => "未提供照片路径。", -"File doesn't exist:" => "文件不存在:", -"Error loading image." => "加载图片错误。", -"checksum is not set." => "未设置校验值。", -"Error updating contact property." => "更新联系人属性错误。", -"Error updating addressbook." => "更新地址簿错误", -"The uploaded file was only partially uploaded" => "已上传文件只上传了部分", -"No file was uploaded" => "没有文件被上传", -"Missing a temporary folder" => "缺少临时目录", -"Contacts" => "联系人", -"Addressbook not found." => "未找到地址簿。", -"This is not your addressbook." => "这不是您的地址簿。", -"Contact could not be found." => "无法找到联系人。", -"Address" => "地址", -"Telephone" => "电话", -"Email" => "电子邮件", -"Organization" => "组织", -"Work" => "工作", -"Home" => "家庭", -"Mobile" => "移动电话", -"Text" => "文本", -"Voice" => "语音", -"Message" => "消息", -"Fax" => "传真", -"Video" => "视频", -"Pager" => "传呼机", -"Internet" => "互联网", -"{name}'s Birthday" => "{name} 的生日", -"Contact" => "联系人", -"Add Contact" => "添加联系人", -"Addressbooks" => "地址簿", -"Configure Address Books" => "配置地址簿", -"New Address Book" => "新建地址簿", -"Import from VCF" => "从 VCF 导入", -"CardDav Link" => "CardDav 链接", -"Download" => "下载", -"Edit" => "编辑", -"Delete" => "删除", -"Download contact" => "下载联系人", -"Delete contact" => "删除联系人", -"Drop photo to upload" => "拖拽图片进行上传", -"Edit name details" => "编辑名称详情", -"Nickname" => "昵称", -"Enter nickname" => "输入昵称", -"Birthday" => "生日", -"dd-mm-yyyy" => "yyyy-mm-dd", -"Groups" => "分组", -"Separate groups with commas" => "用逗号隔开分组", -"Edit groups" => "编辑分组", -"Preferred" => "偏好", -"Please specify a valid email address." => "请指定合法的电子邮件地址", -"Enter email address" => "输入电子邮件地址", -"Mail to address" => "发送邮件到地址", -"Delete email address" => "删除电子邮件地址", -"Enter phone number" => "输入电话号码", -"Delete phone number" => "删除电话号码", -"View on map" => "在地图上显示", -"Edit address details" => "编辑地址细节。", -"Add notes here." => "添加注释。", -"Add field" => "添加字段", -"Profile picture" => "联系人图片", -"Phone" => "电话", -"Note" => "注释", -"Delete current photo" => "删除当前照片", -"Edit current photo" => "编辑当前照片", -"Upload new photo" => "上传新照片", -"Select photo from ownCloud" => "从 ownCloud 选择照片", -"Edit address" => "编辑地址", -"Type" => "类型", -"PO Box" => "邮箱", -"Extended" => "扩展", -"Street" => "街道", -"City" => "城市", -"Region" => "地区", -"Zipcode" => "邮编", -"Country" => "国家", -"Edit categories" => "编辑分类", -"Add" => "添加", -"Addressbook" => "地址簿", -"Given name" => "名", -"Family name" => "姓", -"New Addressbook" => "新建地址簿", -"Edit Addressbook" => "编辑地址簿", -"Displayname" => "显示名称", -"Active" => "激活", -"Save" => "保存", -"Submit" => "提交", -"Cancel" => "取消", -"Import a contacts file" => "导入联系人文件", -"Please choose the addressbook" => "请选择地址簿", -"create a new addressbook" => "创建新地址簿", -"Name of new addressbook" => "新地址簿名称", -"Import" => "导入", -"Importing contacts" => "导入联系人", -"Add contact" => "添加联系人", -"Configure addressbooks" => "配置地址簿", -"CardDAV syncing addresses" => "CardDAV 同步地址", -"more info" => "更多信息", -"Primary address (Kontact et al)" => "首选地址 (Kontact 等)", -"iOS/OS X" => "iOS/OS X" -); diff --git a/apps/contacts/l10n/zh_TW.php b/apps/contacts/l10n/zh_TW.php deleted file mode 100644 index d4c2efc47a..0000000000 --- a/apps/contacts/l10n/zh_TW.php +++ /dev/null @@ -1,93 +0,0 @@ - "在啟用或關閉電話簿時發生錯誤", -"There was an error adding the contact." => "添加通訊錄發生錯誤", -"Cannot add empty property." => "不可添加空白內容", -"At least one of the address fields has to be filled out." => "至少必須填寫一欄地址", -"Error adding contact property." => "添加通訊錄內容中發生錯誤", -"No ID provided" => "未提供 ID", -"No contacts found." => "沒有找到聯絡人", -"Missing ID" => "遺失ID", -"Error adding addressbook." => "添加電話簿中發生錯誤", -"Error activating addressbook." => "啟用電話簿中發生錯誤", -"Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。", -"Error deleting contact property." => "刪除通訊錄內容中發生錯誤", -"Error updating contact property." => "更新通訊錄內容中發生錯誤", -"Error updating addressbook." => "電話簿更新中發生錯誤", -"No file was uploaded" => "沒有已上傳的檔案", -"Contacts" => "通訊錄", -"Addressbook not found." => "找不到通訊錄", -"This is not your addressbook." => "這不是你的電話簿", -"Contact could not be found." => "通訊錄未發現", -"Address" => "地址", -"Telephone" => "電話", -"Email" => "電子郵件", -"Organization" => "組織", -"Work" => "公司", -"Home" => "住宅", -"Mobile" => "行動電話", -"Text" => "文字", -"Voice" => "語音", -"Message" => "訊息", -"Fax" => "傳真", -"Video" => "影片", -"Pager" => "呼叫器", -"Internet" => "網際網路", -"{name}'s Birthday" => "{name}的生日", -"Contact" => "通訊錄", -"Add Contact" => "添加通訊錄", -"Addressbooks" => "電話簿", -"Configure Address Books" => "設定通訊錄", -"New Address Book" => "新電話簿", -"Import from VCF" => "從VCF匯入", -"CardDav Link" => "CardDav 聯結", -"Download" => "下載", -"Edit" => "編輯", -"Delete" => "刪除", -"Download contact" => "下載通訊錄", -"Delete contact" => "刪除通訊錄", -"Edit name details" => "編輯姓名詳細資訊", -"Nickname" => "綽號", -"Enter nickname" => "輸入綽號", -"Birthday" => "生日", -"dd-mm-yyyy" => "dd-mm-yyyy", -"Groups" => "群組", -"Separate groups with commas" => "用逗號分隔群組", -"Edit groups" => "編輯群組", -"Preferred" => "首選", -"Please specify a valid email address." => "註填入合法的電子郵件住址", -"Enter email address" => "輸入電子郵件地址", -"Mail to address" => "寄送住址", -"Delete email address" => "刪除電子郵件住址", -"Enter phone number" => "輸入電話號碼", -"Delete phone number" => "刪除電話號碼", -"Edit address details" => "電子郵件住址詳細資訊", -"Add notes here." => "在這裡新增註解", -"Add field" => "新增欄位", -"Profile picture" => "個人資料照片", -"Phone" => "電話", -"Note" => "註解", -"Type" => "類型", -"PO Box" => "通訊地址", -"Extended" => "分機", -"Street" => "街道", -"City" => "城市", -"Region" => "地區", -"Zipcode" => "郵遞區號", -"Country" => "國家", -"Add" => "添加", -"Addressbook" => "電話簿", -"Mr" => "先生", -"Sir" => "先生", -"Mrs" => "小姐", -"Dr" => "博士(醫生)", -"Given name" => "給定名(名)", -"Additional names" => "額外名", -"Family name" => "家族名(姓)", -"New Addressbook" => "新電話簿", -"Edit Addressbook" => "編輯電話簿", -"Displayname" => "顯示名稱", -"Active" => "作用中", -"Save" => "儲存", -"Submit" => "提出", -"Cancel" => "取消" -); diff --git a/apps/contacts/lib/VCFExportPlugin.php b/apps/contacts/lib/VCFExportPlugin.php deleted file mode 100644 index 9a64c964b0..0000000000 --- a/apps/contacts/lib/VCFExportPlugin.php +++ /dev/null @@ -1,100 +0,0 @@ -server = $server; - $this->server->subscribeEvent('beforeMethod', array($this,'beforeMethod'), 90); - - } - - /** - * 'beforeMethod' event handles. This event handles intercepts GET requests ending - * with ?export - * - * @param string $method - * @param string $uri - * @return bool - */ - public function beforeMethod($method, $uri) { - - if ($method!='GET') return; - if ($this->server->httpRequest->getQueryString()!='export') return; - - // splitting uri - list($uri) = explode('?', $uri, 2); - - $node = $this->server->tree->getNodeForPath($uri); - - if (!($node instanceof Sabre_CardDAV_IAddressBook)) return; - - // Checking ACL, if available. - if ($aclPlugin = $this->server->getPlugin('acl')) { - $aclPlugin->checkPrivileges($uri, '{DAV:}read'); - } - - $this->server->httpResponse->setHeader('Content-Type', 'text/directory'); - $this->server->httpResponse->sendStatus(200); - - $nodes = $this->server->getPropertiesForPath($uri, array( - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data', - ), 1); - - $this->server->httpResponse->sendBody($this->generateVCF($nodes)); - - // Returning false to break the event chain - return false; - - } - - /** - * Merges all vcard objects, and builds one big vcf export - * - * @param array $nodes - * @return string - */ - public function generateVCF(array $nodes) { - $objects = array(); - - foreach($nodes as $node) { - - if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) { - continue; - } - $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data']; - $objects[] = $nodeData; - - } - - return implode("\r\n", $objects); - - } - -} diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php deleted file mode 100644 index eb61b6dbce..0000000000 --- a/apps/contacts/lib/addressbook.php +++ /dev/null @@ -1,327 +0,0 @@ -. - * - */ -/* - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE contacts_addressbooks ( - * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * userid VARCHAR(255) NOT NULL, - * displayname VARCHAR(255), - * uri VARCHAR(100), - * description TEXT, - * ctag INT(11) UNSIGNED NOT NULL DEFAULT '1' - * ); - * - */ -/** - * This class manages our addressbooks. - */ -class OC_Contacts_Addressbook { - /** - * @brief Returns the list of addressbooks for a specific user. - * @param string $uid - * @param boolean $active Only return addressbooks with this $active state, default(=false) is don't care - * @return array or false. - */ - public static function all($uid, $active=false) { - $values = array($uid); - $active_where = ''; - if ($active) { - $active_where = ' AND active = ?'; - $values[] = 1; - } - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' . $active_where . ' ORDER BY displayname' ); - $result = $stmt->execute($values); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); - return false; - } - - $addressbooks = array(); - while( $row = $result->fetchRow()) { - $addressbooks[] = $row; - } - if(!$active && !count($addressbooks)) { - self::addDefault($uid); - } - - return $addressbooks; - } - - /** - * @brief Get active addressbook IDs for a user. - * @param integer $uid User id. If null current user will be used. - * @return array - */ - public static function activeIds($uid = null) { - if(is_null($uid)) { - $uid = OCP\USER::getUser(); - } - $activeaddressbooks = self::all($uid, true); - $ids = array(); - foreach($activeaddressbooks as $addressbook) { - $ids[] = $addressbook['id']; - } - return $ids; - } - - /** - * @brief Returns the list of active addressbooks for a specific user. - * @param string $uid - * @return array - */ - public static function active($uid) { - return self::all($uid, true); - } - - /** - * @brief Returns the list of addressbooks for a principal (DAV term of user) - * @param string $principaluri - * @return array - */ - public static function allWherePrincipalURIIs($principaluri){ - $uid = self::extractUserID($principaluri); - return self::all($uid); - } - - /** - * @brief Gets the data of one address book - * @param integer $id - * @return associative array or false. - */ - public static function find($id) { - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); - $result = $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief Adds default address book - * @return $id ID of the newly created addressbook or false on error. - */ - public static function addDefault($uid = null) { - if(is_null($uid)) { - $uid = OCP\USER::getUser(); - } - $id = self::add($uid, 'Contacts', 'Default Address Book'); - if($id !== false) { - self::setActive($id, true); - } - return $id; - } - - /** - * @brief Creates a new address book - * @param string $userid - * @param string $name - * @param string $description - * @return insertid - */ - public static function add($uid,$name,$description='') { - try { - $stmt = OCP\DB::prepare( 'SELECT uri FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' ); - $result = $stmt->execute(array($uid)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); - return false; - } - $uris = array(); - while($row = $result->fetchRow()){ - $uris[] = $row['uri']; - } - - $uri = self::createURI($name, $uris ); - try { - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($uid,$name,$uri,$description,1)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); - return false; - } - - return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - } - - /** - * @brief Creates a new address book from the data sabredav provides - * @param string $principaluri - * @param string $uri - * @param string $name - * @param string $description - * @return insertid or false - */ - public static function addFromDAVData($principaluri,$uri,$name,$description) { - $uid = self::extractUserID($principaluri); - - try { - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)'); - $result = $stmt->execute(array($uid,$name,$uri,$description,1)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uri: '.$uri, OCP\Util::DEBUG); - return false; - } - - return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); - } - - /** - * @brief Edits an addressbook - * @param integer $id - * @param string $name - * @param string $description - * @return boolean - */ - public static function edit($id,$name,$description) { - // Need these ones for checking uri - $addressbook = self::find($id); - - if(is_null($name)) { - $name = $addressbook['name']; - } - if(is_null($description)) { - $description = $addressbook['description']; - } - - try { - $stmt = OCP\DB::prepare('UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?'); - $result = $stmt->execute(array($name,$description,$id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); - return false; - } - - return true; - } - - /** - * @brief Activates an addressbook - * @param integer $id - * @param boolean $active - * @return boolean - */ - public static function setActive($id,$active) { - $sql = 'UPDATE *PREFIX*contacts_addressbooks SET active = ? WHERE id = ?'; - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id.', active: '.intval($active), OCP\Util::ERROR); - try { - $stmt = OCP\DB::prepare($sql); - $stmt->execute(array(intval($active), $id)); - return true; - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); - return false; - } - } - - /** - * @brief Checks if an addressbook is active. - * @param integer $id ID of the address book. - * @return boolean - */ - public static function isActive($id) { - $sql = 'SELECT active FROM *PREFIX*contacts_addressbooks WHERE id = ?'; - try { - $stmt = OCP\DB::prepare( $sql ); - $result = $stmt->execute(array($id)); - $row = $result->fetchRow(); - return (bool)$row['active']; - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - } - } - - /** - * @brief removes an address book - * @param integer $id - * @return boolean - */ - public static function delete($id) { - self::setActive($id, false); - try { - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); - $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); - return false; - } - - $cards = OC_Contacts_VCard::all($id); - foreach($cards as $card){ - OC_Contacts_VCard::delete($card['id']); - } - - return true; - } - - /** - * @brief Updates ctag for addressbook - * @param integer $id - * @return boolean - */ - public static function touch($id) { - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET ctag = ctag + 1 WHERE id = ?' ); - $stmt->execute(array($id)); - - return true; - } - - /** - * @brief Creates a URI for Addressbook - * @param string $name name of the addressbook - * @param array $existing existing addressbook URIs - * @return string new name - */ - public static function createURI($name,$existing) { - $name = str_replace(' ', '_', strtolower($name)); - $newname = $name; - $i = 1; - while(in_array($newname, $existing)) { - $newname = $name.$i; - $i = $i + 1; - } - return $newname; - } - - /** - * @brief gets the userid from a principal path - * @return string - */ - public static function extractUserID($principaluri) { - list($prefix, $userid) = Sabre_DAV_URLUtil::splitPath($principaluri); - return $userid; - } -} diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php deleted file mode 100644 index 689149367f..0000000000 --- a/apps/contacts/lib/app.php +++ /dev/null @@ -1,230 +0,0 @@ - array( 'message' => self::$l10n->t('Addressbook not found.')))); - } - else { - OCP\Util::writeLog('contacts', 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), OCP\Util::ERROR); - OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('This is not your addressbook.')))); - } - exit(); - } - return $addressbook; - } - - public static function getContactObject($id) { - $card = OC_Contacts_VCard::find( $id ); - if( $card === false ) { - OCP\Util::writeLog('contacts', 'Contact could not be found: '.$id, OCP\Util::ERROR); - OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('Contact could not be found.').' '.print_r($id, true)))); - exit(); - } - - self::getAddressbook( $card['addressbookid'] );//access check - return $card; - } - - /** - * @brief Gets the VCard as an OC_VObject - * @returns The card or null if the card could not be parsed. - */ - public static function getContactVCard($id) { - $card = self::getContactObject( $id ); - - $vcard = OC_VObject::parse($card['carddata']); - // Try to fix cards with missing 'N' field from pre ownCloud 4. Hot damn, this is ugly... - if(!is_null($vcard) && !$vcard->__isset('N')) { - $version = OCP\App::getAppVersion('contacts'); - if($version >= 5) { - OCP\Util::writeLog('contacts', 'OC_Contacts_App::getContactVCard. Deprecated check for missing N field', OCP\Util::DEBUG); - } - OCP\Util::writeLog('contacts', 'getContactVCard, Missing N field', OCP\Util::DEBUG); - if($vcard->__isset('FN')) { - OCP\Util::writeLog('contacts', 'getContactVCard, found FN field: '.$vcard->__get('FN'), OCP\Util::DEBUG); - $n = implode(';', array_reverse(array_slice(explode(' ', $vcard->__get('FN')), 0, 2))).';;;'; - $vcard->setString('N', $n); - OC_Contacts_VCard::edit( $id, $vcard); - } else { // Else just add an empty 'N' field :-P - $vcard->setString('N', 'Unknown;Name;;;'); - } - } - if (!is_null($vcard) && !isset($vcard->REV)) { - $rev = new DateTime('@'.$card['lastmodified']); - $vcard->setString('REV', $rev->format(DateTime::W3C)); - } - return $vcard; - } - - public static function getPropertyLineByChecksum($vcard, $checksum) { - $line = null; - for($i=0;$ichildren);$i++) { - if(md5($vcard->children[$i]->serialize()) == $checksum ) { - $line = $i; - break; - } - } - return $line; - } - - /** - * @return array of vcard prop => label - */ - public static function getAddPropertyOptions() { - $l10n = self::$l10n; - return array( - 'ADR' => $l10n->t('Address'), - 'TEL' => $l10n->t('Telephone'), - 'EMAIL' => $l10n->t('Email'), - 'ORG' => $l10n->t('Organization'), - ); - } - - /** - * @return types for property $prop - */ - public static function getTypesOfProperty($prop) { - $l = self::$l10n; - switch($prop) { - case 'ADR': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - ); - case 'TEL': - return array( - 'HOME' => $l->t('Home'), - 'CELL' => $l->t('Mobile'), - 'WORK' => $l->t('Work'), - 'TEXT' => $l->t('Text'), - 'VOICE' => $l->t('Voice'), - 'MSG' => $l->t('Message'), - 'FAX' => $l->t('Fax'), - 'VIDEO' => $l->t('Video'), - 'PAGER' => $l->t('Pager'), - ); - case 'EMAIL': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - 'INTERNET' => $l->t('Internet'), - ); - } - } - - /** - * @brief returns the vcategories object of the user - * @return (object) $vcategories - */ - protected static function getVCategories() { - if (is_null(self::$categories)) { - self::$categories = new OC_VCategories('contacts', null, self::getDefaultCategories()); - } - return self::$categories; - } - - /** - * @brief returns the categories for the user - * @return (Array) $categories - */ - public static function getCategories() { - $categories = self::getVCategories()->categories(); - if(count($categories) == 0) { - self::scanCategories(); - $categories = self::$categories->categories(); - } - return ($categories ? $categories : self::getDefaultCategories()); - } - - /** - * @brief returns the default categories of ownCloud - * @return (array) $categories - */ - public static function getDefaultCategories(){ - return array( - (string)self::$l10n->t('Birthday'), - (string)self::$l10n->t('Business'), - (string)self::$l10n->t('Call'), - (string)self::$l10n->t('Clients'), - (string)self::$l10n->t('Deliverer'), - (string)self::$l10n->t('Holidays'), - (string)self::$l10n->t('Ideas'), - (string)self::$l10n->t('Journey'), - (string)self::$l10n->t('Jubilee'), - (string)self::$l10n->t('Meeting'), - (string)self::$l10n->t('Other'), - (string)self::$l10n->t('Personal'), - (string)self::$l10n->t('Projects'), - (string)self::$l10n->t('Questions'), - (string)self::$l10n->t('Work'), - ); - } - - /** - * scan vcards for categories. - * @param $vccontacts VCards to scan. null to check all vcards for the current user. - */ - public static function scanCategories($vccontacts = null) { - if (is_null($vccontacts)) { - $vcaddressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); - if(count($vcaddressbooks) > 0) { - $vcaddressbookids = array(); - foreach($vcaddressbooks as $vcaddressbook) { - $vcaddressbookids[] = $vcaddressbook['id']; - } - $start = 0; - $batchsize = 10; - while($vccontacts = OC_Contacts_VCard::all($vcaddressbookids, $start, $batchsize)){ - $cards = array(); - foreach($vccontacts as $vccontact) { - $cards[] = $vccontact['carddata']; - } - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', scanning: '.$batchsize.' starting from '.$start, OCP\Util::DEBUG); - // only reset on first batch. - self::getVCategories()->rescan($cards, true, ($start == 0 ? true : false)); - $start += $batchsize; - } - } - } - } - - /** - * check VCard for new categories. - * @see OC_VCategories::loadFromVObject - */ - public static function loadCategoriesFromVCard(OC_VObject $contact) { - self::getVCategories()->loadFromVObject($contact, true); - } - - public static function setLastModifiedHeader($contact) { - $rev = $contact->getAsString('REV'); - if ($rev) { - $rev = DateTime::createFromFormat(DateTime::W3C, $rev); - OCP\Response::setLastModifiedHeader($rev); - } - } -} diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/connector_sabre.php deleted file mode 100644 index 9fcfff08fa..0000000000 --- a/apps/contacts/lib/connector_sabre.php +++ /dev/null @@ -1,198 +0,0 @@ -. - * - */ - -/** - * This CardDAV backend uses PDO to store addressbooks - */ -class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { - /** - * Returns the list of addressbooks for a specific user. - * - * @param string $principaluri - * @return array - */ - public function getAddressBooksForUser($principaluri) { - $data = OC_Contacts_Addressbook::allWherePrincipalURIIs($principaluri); - $addressbooks = array(); - - foreach($data as $i) { - $addressbooks[] = array( - 'id' => $i['id'], - 'uri' => $i['uri'], - 'principaluri' => 'principals/'.$i['userid'], - '{DAV:}displayname' => $i['displayname'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $i['description'], - '{http://calendarserver.org/ns/}getctag' => $i['ctag'], - ); - } - - return $addressbooks; - } - - - /** - * Updates an addressbook's properties - * - * See Sabre_DAV_IProperties for a description of the mutations array, as - * well as the return value. - * - * @param mixed $addressbookid - * @param array $mutations - * @see Sabre_DAV_IProperties::updateProperties - * @return bool|array - */ - public function updateAddressBook($addressbookid, array $mutations) { - $name = null; - $description = null; - - foreach($mutations as $property=>$newvalue) { - switch($property) { - case '{DAV:}displayname' : - $name = $newvalue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $description = $newvalue; - break; - default : - // If any unsupported values were being updated, we must - // let the entire request fail. - return false; - } - } - - OC_Contacts_Addressbook::edit($addressbookid, $name, $description); - - return true; - - } - - /** - * Creates a new address book - * - * @param string $principaluri - * @param string $url Just the 'basename' of the url. - * @param array $properties - * @return void - */ - public function createAddressBook($principaluri, $url, array $properties) { - - $displayname = null; - $description = null; - - foreach($properties as $property=>$newvalue) { - - switch($property) { - case '{DAV:}displayname' : - $displayname = $newvalue; - break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : - $description = $newvalue; - break; - default : - throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); - } - - } - - OC_Contacts_Addressbook::addFromDAVData($principaluri, $url, $name, $description); - } - - /** - * Deletes an entire addressbook and all its contents - * - * @param int $addressbookid - * @return void - */ - public function deleteAddressBook($addressbookid) { - OC_Contacts_Addressbook::delete($addressbookid); - } - - /** - * Returns all cards for a specific addressbook id. - * - * @param mixed $addressbookid - * @return array - */ - public function getCards($addressbookid) { - $data = OC_Contacts_VCard::all($addressbookid); - $cards = array(); - foreach($data as $i){ - $cards[] = array( - 'id' => $i['id'], - //'carddata' => $i['carddata'], - 'size' => strlen($i['carddata']), - 'etag' => md5($i['carddata']), - 'uri' => $i['uri'], - 'lastmodified' => $i['lastmodified'] ); - } - - return $cards; - } - - /** - * Returns a specfic card - * - * @param mixed $addressbookid - * @param string $carduri - * @return array - */ - public function getCard($addressbookid, $carduri) { - return OC_Contacts_VCard::findWhereDAVDataIs($addressbookid, $carduri); - - } - - /** - * Creates a new card - * - * @param mixed $addressbookid - * @param string $carduri - * @param string $carddata - * @return bool - */ - public function createCard($addressbookid, $carduri, $carddata) { - OC_Contacts_VCard::addFromDAVData($addressbookid, $carduri, $carddata); - return true; - } - - /** - * Updates a card - * - * @param mixed $addressbookid - * @param string $carduri - * @param string $carddata - * @return bool - */ - public function updateCard($addressbookid, $carduri, $carddata) { - return OC_Contacts_VCard::editFromDAVData($addressbookid, $carduri, $carddata); - } - - /** - * Deletes a card - * - * @param mixed $addressbookid - * @param string $carduri - * @return bool - */ - public function deleteCard($addressbookid, $carduri) { - return OC_Contacts_VCard::deleteFromDAVData($addressbookid, $carduri); - } -} diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php deleted file mode 100644 index 3344e3d693..0000000000 --- a/apps/contacts/lib/hooks.php +++ /dev/null @@ -1,116 +0,0 @@ -. - * - */ - -/** - * The following signals are being emitted: - * - * OC_Contacts_VCard::post_moveToAddressbook(array('aid' => $aid, 'id' => $id)) - * OC_Contacts_VCard::pre_deleteVCard(array('aid' => $aid, 'id' => $id, 'uri' = $uri)); (NOTE: the values can be null depending on which method emits them) - * OC_Contacts_VCard::post_updateVCard($id) - * OC_Contacts_VCard::post_createVCard($newid) - */ - -/** - * This class contains all hooks. - */ -class OC_Contacts_Hooks{ - /** - * @brief Add default Addressbook for a certain user - * @param paramters parameters from postCreateUser-Hook - * @return array - */ - static public function createUser($parameters) { - OC_Contacts_Addressbook::addDefault($parameters['uid']); - return true; - } - - /** - * @brief Deletes all Addressbooks of a certain user - * @param paramters parameters from postDeleteUser-Hook - * @return array - */ - static public function deleteUser($parameters) { - $addressbooks = OC_Contacts_Addressbook::all($parameters['uid']); - - foreach($addressbooks as $addressbook) { - OC_Contacts_Addressbook::delete($addressbook['id']); - } - - return true; - } - - static public function getCalenderSources($parameters) { - $base_url = OCP\Util::linkTo('calendar', 'ajax/events.php').'?calendar_id='; - foreach(OC_Contacts_Addressbook::all(OCP\USER::getUser()) as $addressbook) { - $parameters['sources'][] - = array( - 'url' => $base_url.'birthday_'. $addressbook['id'], - 'backgroundColor' => '#cccccc', - 'borderColor' => '#888', - 'textColor' => 'black', - 'cache' => true, - 'editable' => false, - ); - } - } - - static public function getBirthdayEvents($parameters) { - $name = $parameters['calendar_id']; - if (strpos($name, 'birthday_') != 0) { - return; - } - $info = explode('_', $name); - $aid = $info[1]; - OC_Contacts_App::getAddressbook($aid); - foreach(OC_Contacts_VCard::all($aid) as $card){ - $vcard = OC_VObject::parse($card['carddata']); - if (!$vcard) { - continue; - } - $birthday = $vcard->BDAY; - if ($birthday) { - $date = new DateTime($birthday); - $vevent = new OC_VObject('VEVENT'); - //$vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV)); - $vevent->setDateTime('DTSTART', $date, - Sabre_VObject_Element_DateTime::DATE); - $vevent->setString('DURATION', 'P1D'); - $vevent->setString('UID', substr(md5(rand().time()), 0, 10)); - // DESCRIPTION? - $vevent->setString('RRULE', 'FREQ=YEARLY'); - $title = str_replace('{name}', - $vcard->getAsString('FN'), - OC_Contacts_App::$l10n->t('{name}\'s Birthday')); - $parameters['events'][] = array( - 'id' => 0,//$card['id'], - 'vevent' => $vevent, - 'repeating' => true, - 'summary' => $title, - 'calendardata' => "BEGIN:VCALENDAR\nVERSION:2.0\n" - . "PRODID:ownCloud Contacts " - . OCP\App::getAppVersion('contacts') . "\n" - . $vevent->serialize() . "END:VCALENDAR" - ); - } - } - } -} diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php deleted file mode 100644 index 53aa2b4849..0000000000 --- a/apps/contacts/lib/search.php +++ /dev/null @@ -1,21 +0,0 @@ - 0) { - $link = OCP\Util::linkTo('contacts', 'index.php').'&id='.urlencode($vcard['id']); - $results[]=new OC_Search_Result($vcard['fullname'], '', $link, (string)$l->t('Contact'));//$name,$text,$link,$type - } - } - } - return $results; - } -} diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php deleted file mode 100644 index ca171e792f..0000000000 --- a/apps/contacts/lib/vcard.php +++ /dev/null @@ -1,621 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ -/* - * - * The following SQL statement is just a help for developers and will not be - * executed! - * - * CREATE TABLE contacts_cards ( - * id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, - * addressbookid INT(11) UNSIGNED NOT NULL, - * fullname VARCHAR(255), - * carddata TEXT, - * uri VARCHAR(100), - * lastmodified INT(11) UNSIGNED - * ); - */ - -/** - * This class manages our vCards - */ -class OC_Contacts_VCard{ - /** - * @brief Returns all cards of an address book - * @param integer $id - * @return array|false - * - * The cards are associative arrays. You'll find the original vCard in - * ['carddata'] - */ - public static function all($id, $start=null, $num=null){ - $limitsql = ''; - if(!is_null($num)) { - $limitsql = ' LIMIT '.$num; - } - if(!is_null($start) && !is_null($num)) { - $limitsql .= ' OFFSET '.$start.' '; - } - $result = null; - if(is_array($id) && count($id)) { - $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid IN ('.$id_sql.') ORDER BY fullname '.$limitsql; - try { - $stmt = OCP\DB::prepare( $prep ); - $result = $stmt->execute($id); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'SQL:'.$prep, OCP\Util::DEBUG); - return false; - } - } elseif(is_int($id) || is_string($id)) { - try { - $sql = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? ORDER BY fullname'.$limitsql; - $stmt = OCP\DB::prepare( $sql ); - $result = $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '. $id, OCP\Util::DEBUG); - return false; - } - } else { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'. Addressbook id(s) argument is empty: '. $id, OCP\Util::DEBUG); - return false; - } - $cards = array(); - if(!is_null($result)) { - while( $row = $result->fetchRow()){ - $cards[] = $row; - } - } - - return $cards; - } - - /** - * @brief Returns a card - * @param integer $id - * @return associative array or false. - */ - public static function find($id){ - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE id = ?' ); - $result = $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '. $id, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief finds a card by its DAV Data - * @param integer $aid Addressbook id - * @param string $uri the uri ('filename') - * @return associative array or false. - */ - public static function findWhereDAVDataIs($aid,$uri){ - try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); - $result = $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); - return false; - } - - return $result->fetchRow(); - } - - /** - * @brief Format property TYPE parameters for upgrading from v. 2.1 - * @param $property Reference to a Sabre_VObject_Property. - * In version 2.1 e.g. a phone can be formatted like: TEL;HOME;CELL:123456789 - * This has to be changed to either TEL;TYPE=HOME,CELL:123456789 or TEL;TYPE=HOME;TYPE=CELL:123456789 - both are valid. - */ - public static function formatPropertyTypes(&$property) { - foreach($property->parameters as $key=>&$parameter){ - $types = OC_Contacts_App::getTypesOfProperty($property->name); - if(is_array($types) && in_array(strtoupper($parameter->name), array_keys($types)) || strtoupper($parameter->name) == 'PREF') { - $property->parameters[] = new Sabre_VObject_Parameter('TYPE', $parameter->name); - } - unset($property->parameters[$key]); - } - } - - /** - * @brief Decode properties for upgrading from v. 2.1 - * @param $property Reference to a Sabre_VObject_Property. - * The only encoding allowed in version 3.0 is 'b' for binary. All encoded strings - * must therefor be decoded and the parameters removed. - */ - public static function decodeProperty(&$property) { - // Check out for encoded string and decode them :-[ - foreach($property->parameters as $key=>&$parameter){ - if(strtoupper($parameter->name) == 'ENCODING') { - if(strtoupper($parameter->value) == 'QUOTED-PRINTABLE') { // what kind of other encodings could be used? - $property->value = quoted_printable_decode($property->value); - unset($property->parameters[$key]); - } - } elseif(strtoupper($parameter->name) == 'CHARSET') { - unset($property->parameters[$key]); - } - } - } - - /** - * @brief Checks if a contact with the same UID already exist in the address book. - * @param $aid Address book ID. - * @param $uid UID (passed by reference). - * @returns true if the UID has been changed. - */ - protected static function trueUID($aid, &$uid) { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); - $uri = $uid.'.vcf'; - try { - $result = $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG); - return false; - } - if($result->numRows() > 0) { - while(true) { - $tmpuid = substr(md5(rand().time()), 0, 10); - $uri = $tmpuid.'.vcf'; - $result = $stmt->execute(array($aid, $uri)); - if($result->numRows() > 0) { - continue; - } else { - $uid = $tmpuid; - return true; - } - } - } else { - return false; - } - } - - /** - * @brief Tries to update imported VCards to adhere to rfc2426 (VERSION: 3.0) and add mandatory fields if missing. - * @param aid Address book id. - * @param vcard An OC_VObject of type VCARD (passed by reference). - */ - protected static function updateValuesFromAdd($aid, &$vcard) { // any suggestions for a better method name? ;-) - $stringprops = array('N', 'FN', 'ORG', 'NICK', 'ADR', 'NOTE'); - $typeprops = array('ADR', 'TEL', 'EMAIL'); - $upgrade = false; - $fn = $n = $uid = $email = $org = null; - $version = $vcard->getAsString('VERSION'); - // Add version if needed - if($version && $version < '3.0') { - $upgrade = true; - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Updating from version: '.$version, OCP\Util::DEBUG); - } - foreach($vcard->children as &$property){ - // Decode string properties and remove obsolete properties. - if($upgrade && in_array($property->name, $stringprops)) { - self::decodeProperty($property); - } - $property->value = str_replace("\r\n", "\n", iconv(mb_detect_encoding($property->value, 'UTF-8, ISO-8859-1'), 'utf-8', $property->value)); - if(in_array($property->name, $stringprops)) { - $property->value = strip_tags($property->value); - } - // Fix format of type parameters. - if($upgrade && in_array($property->name, $typeprops)) { - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. before: '.$property->serialize(), OCP\Util::DEBUG); - self::formatPropertyTypes($property); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. after: '.$property->serialize(), OCP\Util::DEBUG); - } - if($property->name == 'FN') { - $fn = $property->value; - } - if($property->name == 'N') { - $n = $property->value; - } - if($property->name == 'UID') { - $uid = $property->value; - } - if($property->name == 'ORG') { - $org = $property->value; - } - if($property->name == 'EMAIL' && is_null($email)) { // only use the first email as substitute for missing N or FN. - $email = $property->value; - } - } - // Check for missing 'N', 'FN' and 'UID' properties - if(!$fn) { - if($n && $n != ';;;;') { - $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); - } elseif($email) { - $fn = $email; - } elseif($org) { - $fn = $org; - } else { - $fn = 'Unknown Name'; - } - $vcard->setString('FN', $fn); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'FN\' field: '.$fn, OCP\Util::DEBUG); - } - if(!$n || $n == ';;;;') { // Fix missing 'N' field. Ugly hack ahead ;-) - $slice = array_reverse(array_slice(explode(' ', $fn), 0, 2)); // Take 2 first name parts of 'FN' and reverse. - if(count($slice) < 2) { // If not enought, add one more... - $slice[] = ""; - } - $n = implode(';', $slice).';;;'; - $vcard->setString('N', $n); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'N\' field: '.$n, OCP\Util::DEBUG); - } - if(!$uid) { - $vcard->setUID(); - $uid = $vcard->getAsString('UID'); - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'UID\' field: '.$uid, OCP\Util::DEBUG); - } - if(self::trueUID($aid, $uid)) { - $vcard->setString('UID', $uid); - } - $now = new DateTime; - $vcard->setString('REV', $now->format(DateTime::W3C)); - } - - /** - * @brief Adds a card - * @param integer $aid Addressbook id - * @param OC_VObject $card vCard file - * @param string $uri the uri of the card, default based on the UID - * @return insertid on success or false. - */ - public static function add($aid, OC_VObject $card, $uri=null, $isnew=false){ - if(is_null($card)) { - OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::add. No vCard supplied', OCP\Util::ERROR); - return null; - }; - - if(!$isnew) { - OC_Contacts_App::loadCategoriesFromVCard($card); - self::updateValuesFromAdd($aid, $card); - } - - $card->setString('VERSION', '3.0'); - // Add product ID is missing. - $prodid = trim($card->getAsString('PRODID')); - if(!$prodid) { - $appinfo = OCP\App::getAppInfo('contacts'); - $appversion = OCP\App::getAppVersion('contacts'); - $prodid = '-//ownCloud//NONSGML '.$appinfo['name'].' '.$appversion.'//EN'; - $card->setString('PRODID', $prodid); - } - - $fn = $card->getAsString('FN'); - if (empty($fn)) { - $fn = ''; - } - - if (!$uri) { - $uid = $card->getAsString('UID'); - $uri = $uid.'.vcf'; - } - - $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); - try { - $result = $stmt->execute(array($aid,$fn,$data,$uri,time())); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); - return false; - } - $newid = OCP\DB::insertid('*PREFIX*contacts_cards'); - - OC_Contacts_Addressbook::touch($aid); - OC_Hook::emit('OC_Contacts_VCard', 'post_createVCard', $newid); - return $newid; - } - - /** - * @brief Adds a card with the data provided by sabredav - * @param integer $id Addressbook id - * @param string $uri the uri the card will have - * @param string $data vCard file - * @return insertid - */ - public static function addFromDAVData($id,$uri,$data){ - $card = OC_VObject::parse($data); - return self::add($id, $card, $uri); - } - - /** - * @brief Mass updates an array of cards - * @param array $objects An array of [id, carddata]. - */ - public static function updateDataByID($objects){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET carddata = ?, lastmodified = ? WHERE id = ?' ); - $now = new DateTime; - foreach($objects as $object) { - $vcard = OC_VObject::parse($object[1]); - if(!is_null($vcard)) { - $vcard->setString('REV', $now->format(DateTime::W3C)); - $data = $vcard->serialize(); - try { - $result = $stmt->execute(array($data,time(),$object[0])); - //OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0].': '.$object[1],OCP\Util::DEBUG); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$object[0], OCP\Util::DEBUG); - } - } - } - } - - /** - * @brief edits a card - * @param integer $id id of card - * @param OC_VObject $card vCard file - * @return boolean - */ - public static function edit($id, OC_VObject $card){ - $oldcard = self::find($id); - - if(is_null($card)) { - return false; - } - - OC_Contacts_App::loadCategoriesFromVCard($card); - - $fn = $card->getAsString('FN'); - if (empty($fn)) { - $fn = null; - } - - $now = new DateTime; - $card->setString('REV', $now->format(DateTime::W3C)); - - $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); - try { - $result = $stmt->execute(array($fn,$data,time(),$id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id'.$id, OCP\Util::DEBUG); - return false; - } - - OC_Contacts_Addressbook::touch($oldcard['addressbookid']); - OC_Hook::emit('OC_Contacts_VCard', 'post_updateVCard', $id); - return true; - } - - /** - * @brief edits a card with the data provided by sabredav - * @param integer $id Addressbook id - * @param string $uri the uri of the card - * @param string $data vCard file - * @return boolean - */ - public static function editFromDAVData($aid, $uri, $data){ - $oldcard = self::findWhereDAVDataIs($aid, $uri); - $card = OC_VObject::parse($data); - if(!$card) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', Unable to parse VCARD, uri: '.$uri, OCP\Util::ERROR); - return false; - } - return self::edit($oldcard['id'], $card); - } - - /** - * @brief deletes a card - * @param integer $id id of card - * @return boolean - */ - public static function delete($id){ - OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => null, 'id' => $id, 'uri' => null)); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); - try { - $stmt->execute(array($id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); - return false; - } - - return true; - } - - /** - * @brief deletes a card with the data provided by sabredav - * @param integer $aid Addressbook id - * @param string $uri the uri of the card - * @return boolean - */ - public static function deleteFromDAVData($aid,$uri){ - OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => $aid, 'id' => null, 'uri' => $uri)); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri=?' ); - try { - $stmt->execute(array($aid,$uri)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG); - return false; - } - OC_Contacts_Addressbook::touch($aid); - - return true; - } - - /** - * @brief Escapes delimiters from an array and returns a string. - * @param array $value - * @param char $delimiter - * @return string - */ - public static function escapeDelimiters($value, $delimiter=';') { - foreach($value as &$i ) { - $i = implode("\\$delimiter", explode($delimiter, $i)); - } - return implode($delimiter, $value); - } - - - /** - * @brief Creates an array out of a multivalue property - * @param string $value - * @param char $delimiter - * @return array - */ - public static function unescapeDelimiters($value, $delimiter=';') { - $array = explode($delimiter, $value); - for($i=0;$ichildren as $property){ - $temp = self::structureProperty($property); - if(!is_null($temp)) { - if(array_key_exists($property->name, $details)) { - $details[$property->name][] = $temp; - } - else{ - $details[$property->name] = array($temp); - } - } - } - return $details; - } - - /** - * @brief Data structure of properties - * @param object $property - * @return associative array - * - * returns an associative array with - * ['name'] name of property - * ['value'] htmlspecialchars escaped value of property - * ['parameters'] associative array name=>value - * ['checksum'] checksum of whole property - * NOTE: $value is not escaped anymore. It shouldn't make any difference - * but we should look out for any problems. - */ - public static function structureProperty($property) { - $value = $property->value; - //$value = htmlspecialchars($value); - if($property->name == 'ADR' || $property->name == 'N') { - $value = self::unescapeDelimiters($value); - } elseif($property->name == 'BDAY') { - if(strpos($value, '-') === false) { - if(strlen($value) >= 8) { - $value = substr($value, 0, 4).'-'.substr($value, 4, 2).'-'.substr($value, 6, 2); - } else { - return null; // Badly malformed :-( - } - } - } - $temp = array( - 'name' => $property->name, - 'value' => $value, - 'parameters' => array(), - 'checksum' => md5($property->serialize())); - foreach($property->parameters as $parameter){ - // Faulty entries by kaddressbook - // Actually TYPE=PREF is correct according to RFC 2426 - // but this way is more handy in the UI. Tanghus. - if($parameter->name == 'TYPE' && $parameter->value == 'PREF') { - $parameter->name = 'PREF'; - $parameter->value = '1'; - } - // NOTE: Apparently Sabre_VObject_Reader can't always deal with value list parameters - // like TYPE=HOME,CELL,VOICE. Tanghus. - if (in_array($property->name, array('TEL', 'EMAIL')) && $parameter->name == 'TYPE') { - if (isset($temp['parameters'][$parameter->name])) { - $temp['parameters'][$parameter->name][] = $parameter->value; - } - else { - $temp['parameters'][$parameter->name] = array($parameter->value); - } - } - else{ - $temp['parameters'][$parameter->name] = $parameter->value; - } - } - return $temp; - } - - /** - * @brief Move card(s) to an address book - * @param integer $aid Address book id - * @param $id Array or integer of cards to be moved. - * @return boolean - * - */ - public static function moveToAddressBook($aid, $id) { - OC_Contacts_App::getAddressbook($aid); // check for user ownership. - if(is_array($id)) { - $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id IN ('.$id_sql.')'; - try { - $stmt = OCP\DB::prepare( $prep ); - //$aid = array($aid); - $vals = array_merge((array)$aid, $id); - $result = $stmt->execute($vals); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '.join(',', $vals), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', SQL:'.$prep, OCP\Util::DEBUG); - return false; - } - } else { - try { - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id = ?' ); - $result = $stmt->execute(array($aid, $id)); - } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' id: '.$id, OCP\Util::DEBUG); - return false; - } - } - OC_Hook::emit('OC_Contacts_VCard', 'post_moveToAddressbook', array('aid' => $aid, 'id' => $id)); - OC_Contacts_Addressbook::touch($aid); - return true; - } -} diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php deleted file mode 100644 index efdf157cd9..0000000000 --- a/apps/contacts/photo.php +++ /dev/null @@ -1,73 +0,0 @@ - - * Copyright (c) 2011, 2012 Bart Visscher - * Copyright (c) 2011 Jakob Sack mail@jakobsack.de - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -// Init owncloud - -OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); - -function getStandardImage() { - //OCP\Response::setExpiresHeader('P10D'); - OCP\Response::enableCaching(); - OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person_large.png')); -} - -$id = isset($_GET['id']) ? $_GET['id'] : null; -$caching = isset($_GET['refresh']) ? 0 : null; - -if(is_null($id)) { - getStandardImage(); -} - -if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts', - 'photo.php. GD module not installed', OCP\Util::DEBUG); - getStandardImage(); -} - -$contact = OC_Contacts_App::getContactVCard($id); -$image = new OC_Image(); -if (!$image) { - getStandardImage(); -} -// invalid vcard -if (is_null($contact)) { - OCP\Util::writeLog('contacts', - 'photo.php. The VCard for ID ' . $id . ' is not RFC compatible', - OCP\Util::ERROR); -} else { - OCP\Response::enableCaching($caching); - OC_Contacts_App::setLastModifiedHeader($contact); - - // Photo :-) - if ($image->loadFromBase64($contact->getAsString('PHOTO'))) { - // OK - OCP\Response::setETagHeader(md5($contact->getAsString('PHOTO'))); - } - else - // Logo :-/ - if ($image->loadFromBase64($contact->getAsString('LOGO'))) { - // OK - OCP\Response::setETagHeader(md5($contact->getAsString('LOGO'))); - } - if ($image->valid()) { - $max_size = 200; - if ($image->width() > $max_size || $image->height() > $max_size) { - $image->resize($max_size); - } - } -} -if (!$image->valid()) { - // Not found :-( - getStandardImage(); -} -header('Content-Type: '.$image->mimeType()); -$image->show(); - diff --git a/apps/contacts/settings.php b/apps/contacts/settings.php deleted file mode 100644 index a079499381..0000000000 --- a/apps/contacts/settings.php +++ /dev/null @@ -1,6 +0,0 @@ -assign('addressbooks', OC_Contacts_Addressbook::all(OCP\USER::getUser()), false); - -return $tmpl->fetchPage(); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php deleted file mode 100644 index b2dde12684..0000000000 --- a/apps/contacts/templates/index.php +++ /dev/null @@ -1,74 +0,0 @@ -
    - -
    - -
    -
    -
    -
    -
    - - - - <?php echo $l->t('Import'); ?> - - - -
    - -
    -
    -
    - inc('part.contact'); - } - else{ - echo $this->inc('part.no_contacts'); - } - ?> - -
    - -
    - - - - - diff --git a/apps/contacts/templates/part.chooseaddressbook.php b/apps/contacts/templates/part.chooseaddressbook.php deleted file mode 100644 index caed67736c..0000000000 --- a/apps/contacts/templates/part.chooseaddressbook.php +++ /dev/null @@ -1,24 +0,0 @@ -
    "> - -"; - $tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); - $tmpl->assign('addressbook', $option_addressbooks[$i]); - $tmpl->assign('active', OC_Contacts_Addressbook::isActive($option_addressbooks[$i]['id'])); - $tmpl->printpage(); - echo ""; -} -?> - - - - - - -
    - t('New Address Book') ?> -
    -

    ">

    -
    diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php deleted file mode 100644 index 2988bb44c5..0000000000 --- a/apps/contacts/templates/part.chooseaddressbook.rowfields.php +++ /dev/null @@ -1,18 +0,0 @@ - - " type="checkbox" onClick="Contacts.UI.Addressbooks.activation(this, )" > - - - - - - " class="svg action globe"> - - - " title="t("Download"); ?>" class="svg action download"> - - - " class="svg action edit" onclick="Contacts.UI.Addressbooks.editAddressbook(this, );"> - - - );" title="t("Delete"); ?>" class="svg action delete"> - diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php deleted file mode 100644 index 4233bffede..0000000000 --- a/apps/contacts/templates/part.contact.php +++ /dev/null @@ -1,129 +0,0 @@ - -
    -
    - - - - - -
    - -
    - - -
    - -
    - -
    - -
    -
    - - -
    - - - - -
    - - - - - - - - - - -
    -
    -
    -
    - - -
    -
    - -
    -
      - -
    -
    - - -
    -
      - -
    -
    - - - -
    -
    - -
    -
    -
    - -
    -
    -
    - - - -
    -
    -
    -
    diff --git a/apps/contacts/templates/part.cropphoto.php b/apps/contacts/templates/part.cropphoto.php deleted file mode 100644 index 3f5817622b..0000000000 --- a/apps/contacts/templates/part.cropphoto.php +++ /dev/null @@ -1,67 +0,0 @@ - - - - -
    - - - - -
    - - - - - - -
    - -
    -t('The temporary image has been removed from cache.'); -} -?> diff --git a/apps/contacts/templates/part.edit_address_dialog.php b/apps/contacts/templates/part.edit_address_dialog.php deleted file mode 100644 index d5ea95ba46..0000000000 --- a/apps/contacts/templates/part.edit_address_dialog.php +++ /dev/null @@ -1,62 +0,0 @@ - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - -
    diff --git a/apps/contacts/templates/part.edit_name_dialog.php b/apps/contacts/templates/part.edit_name_dialog.php deleted file mode 100644 index f984c232a3..0000000000 --- a/apps/contacts/templates/part.edit_name_dialog.php +++ /dev/null @@ -1,58 +0,0 @@ - -
    -
    -
    -
    - - - -
    -
    - -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -
    -
    diff --git a/apps/contacts/templates/part.editaddressbook.php b/apps/contacts/templates/part.editaddressbook.php deleted file mode 100644 index c1c585687c..0000000000 --- a/apps/contacts/templates/part.editaddressbook.php +++ /dev/null @@ -1,31 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -t("Edit Addressbook"); ?>" colspan="6"> - - - - - - - - - - - -
    t('Displayname') ?> - -
    - > - -
    -);" value="t("Save") : $l->t("Submit"); ?>"> -);" value="t("Cancel"); ?>"> - diff --git a/apps/contacts/templates/part.import.php b/apps/contacts/templates/part.import.php deleted file mode 100644 index 32c8dc50dd..0000000000 --- a/apps/contacts/templates/part.import.php +++ /dev/null @@ -1,27 +0,0 @@ -
    "> -
    - - - -

    t('Please choose the addressbook'); ?>

    - - - !" id="startimport"> -
    - -
    \ No newline at end of file diff --git a/apps/contacts/templates/part.no_contacts.php b/apps/contacts/templates/part.no_contacts.php deleted file mode 100644 index 5faa481bc3..0000000000 --- a/apps/contacts/templates/part.no_contacts.php +++ /dev/null @@ -1,7 +0,0 @@ -
    - t('You have no contacts in your addressbook.') ?> -
    - - -
    -
    diff --git a/apps/contacts/templates/part.selectaddressbook.php b/apps/contacts/templates/part.selectaddressbook.php deleted file mode 100644 index c54ddaf2e6..0000000000 --- a/apps/contacts/templates/part.selectaddressbook.php +++ /dev/null @@ -1,27 +0,0 @@ -
    "> -
    - - $addressbook) { ?> - - - - - - - - - - - -
    - > - - -
    - - - " /> - " />
    -
    -
    - diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php deleted file mode 100644 index f520559d14..0000000000 --- a/apps/contacts/templates/settings.php +++ /dev/null @@ -1,19 +0,0 @@ -
    -
    - t('Contacts'); ?> - t('CardDAV syncing addresses'); ?> (t('more info'); ?>) -
    -
    t('Primary address (Kontact et al)'); ?>
    -
    -
    t('iOS/OS X'); ?>
    -
    principals//
    -
    t('Read only vCard directory link(s)'); ?>
    -
    - -
    - -
    -
    - Powered by geonames.org webservice -
    -
    diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php deleted file mode 100644 index 6deb5ca379..0000000000 --- a/apps/contacts/thumbnail.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -OCP\JSON::checkLoggedIn(); -//OCP\User::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -session_write_close(); - -function getStandardImage() { - //OCP\Response::setExpiresHeader('P10D'); - OCP\Response::enableCaching(); - OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person.png')); -} - -if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts', - 'thumbnail.php. GD module not installed', OCP\Util::DEBUG); - getStandardImage(); - exit(); -} - -$id = $_GET['id']; -$caching = isset($_GET['refresh']) ? 0 : null; - -$contact = OC_Contacts_App::getContactVCard($id); - -// invalid vcard -if(is_null($contact)) { - OCP\Util::writeLog('contacts', - 'thumbnail.php. The VCard for ID ' . $id . ' is not RFC compatible', - OCP\Util::ERROR); - getStandardImage(); - exit(); -} -OCP\Response::enableCaching($caching); -OC_Contacts_App::setLastModifiedHeader($contact); - -$thumbnail_size = 23; - -// Find the photo from VCard. -$image = new OC_Image(); -$photo = $contact->getAsString('PHOTO'); -if($photo) { - OCP\Response::setETagHeader(md5($photo)); - if($image->loadFromBase64($photo)) { - if($image->centerCrop()) { - if($image->resize($thumbnail_size)) { - if($image->show()) { - exit(); - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t display thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t resize thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - }else{ - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t crop thumbnail for ID ' . $id, - OCP\Util::ERROR); - } - } else { - OCP\Util::writeLog('contacts', - 'thumbnail.php. Couldn\'t load image string for ID ' . $id, - OCP\Util::ERROR); - } -} -getStandardImage(); diff --git a/apps/contacts/tmpphoto.php b/apps/contacts/tmpphoto.php deleted file mode 100644 index 156d5c8030..0000000000 --- a/apps/contacts/tmpphoto.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see . - * - */ - -$tmpkey = $_GET['tmpkey']; -$maxsize = isset($_GET['maxsize']) ? $_GET['maxsize'] : -1; -header("Cache-Control: no-cache, no-store, must-revalidate"); - -OCP\Util::writeLog('contacts', 'tmpphoto.php: tmpkey: '.$tmpkey, OCP\Util::DEBUG); - -$image = new OC_Image(); -$image->loadFromData(OC_Cache::get($tmpkey)); -if($maxsize != -1) { - $image->resize($maxsize); -} -$image(); diff --git a/apps/external/ajax/setsites.php b/apps/external/ajax/setsites.php deleted file mode 100644 index 0f9e061d0e..0000000000 --- a/apps/external/ajax/setsites.php +++ /dev/null @@ -1,25 +0,0 @@ -. - * - */ - -OC::$CLASSPATH['OC_External'] = 'apps/external/lib/external.php'; -OCP\Util::addStyle( 'external', 'style'); - -OCP\App::registerAdmin('external', 'settings'); - -$sites = OC_External::getSites(); -for ($i = 0; $i < sizeof($sites); $i++) { - OCP\App::addNavigationEntry( - array('id' => 'external_index' . ($i + 1), 'order' => 80 + $i, 'href' => OCP\Util::linkTo('external', 'index.php') . '?id=' . ($i + 1), 'icon' => OCP\Util::imagePath('external', 'external.png'), 'name' => $sites[$i][0])); -} diff --git a/apps/external/appinfo/info.xml b/apps/external/appinfo/info.xml deleted file mode 100644 index c4d0b55481..0000000000 --- a/apps/external/appinfo/info.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - external - External - Show external Application in the ownCloud menu - AGPL - Frank Karlitschek - 4 - true - diff --git a/apps/external/appinfo/version b/apps/external/appinfo/version deleted file mode 100644 index 9f8e9b69a3..0000000000 --- a/apps/external/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0 \ No newline at end of file diff --git a/apps/external/css/style.css b/apps/external/css/style.css deleted file mode 100644 index f891cb4bc5..0000000000 --- a/apps/external/css/style.css +++ /dev/null @@ -1,14 +0,0 @@ -/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- / -/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */ - -.site_url { - width: 250px; -} - -.delete_button { - display: none; -} - -.external_sites { - width: 450px; -} diff --git a/apps/external/img/external.png b/apps/external/img/external.png deleted file mode 100644 index 75d1366326..0000000000 Binary files a/apps/external/img/external.png and /dev/null differ diff --git a/apps/external/img/external.svg b/apps/external/img/external.svg deleted file mode 100644 index b47305fbd0..0000000000 --- a/apps/external/img/external.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/external/index.php b/apps/external/index.php deleted file mode 100644 index 3b6f06e1bf..0000000000 --- a/apps/external/index.php +++ /dev/null @@ -1,42 +0,0 @@ -. - * - */ - -require_once('lib/external.php'); - -OCP\User::checkLoggedIn(); - -if (isset($_GET['id'])) { - - $id = $_GET['id']; - $id = (int) $id; - - $sites = OC_External::getSites(); - if (sizeof($sites) >= $id) { - $url = $sites[$id - 1][1]; - OCP\App::setActiveNavigationEntry('external_index' . $id); - - $tmpl = new OCP\Template('external', 'frame', 'user'); - $tmpl->assign('url', $url); - $tmpl->printPage(); - } -} diff --git a/apps/external/js/admin.js b/apps/external/js/admin.js deleted file mode 100644 index 0caaabd0b9..0000000000 --- a/apps/external/js/admin.js +++ /dev/null @@ -1,57 +0,0 @@ -$(document).ready(function(){ - newSiteHtml = '
  • \n\ - \n\ -
  • '; - - // Handler functions - function addSiteEventHandler(event) { - event.preventDefault(); - - saveSites(); - } - - function deleteButtonEventHandler(event) { - event.preventDefault(); - - $(this).tipsy('hide'); - $(this).parent().remove(); - - saveSites(); - } - - function saveSites() { - var post = $('#external').serialize(); - $.post( OC.filePath('external','ajax','setsites.php') , post, function(data) { - // OC.msg.finishedSaving('#site_name .msg', data); - }); - } - - function showDeleteButton(event) { - $(this).find('img.delete_button').fadeIn(100); - } - - function hideDeleteButton(event) { - $(this).find('img.delete_button').fadeOut(100); - } - - // Initialize events - $('input[name^=site_]').change(addSiteEventHandler); - $('img.delete_button').click(deleteButtonEventHandler); - $('img.delete_button').tipsy(); - - $('#external li').hover(showDeleteButton, hideDeleteButton); - - $('#add_external_site').click(function(event) { - event.preventDefault(); - $('#external ul').append(newSiteHtml); - - $('input.site_url:last').prev('input.site_name').andSelf().change(addSiteEventHandler); - $('img.delete_button').click(deleteButtonEventHandler); - $('img.delete_button:last').tipsy(); - $('#external li:last').hover(showDeleteButton, hideDeleteButton); - - }); - -}); - - diff --git a/apps/external/lib/external.php b/apps/external/lib/external.php deleted file mode 100644 index d13a7cf6dd..0000000000 --- a/apps/external/lib/external.php +++ /dev/null @@ -1,34 +0,0 @@ -. - * - */ - -class OC_External { - - public static function getSites() { - if (($sites = json_decode(OCP\Config::getAppValue("external", "sites", ''))) != NULL) { - return $sites; - } - - return array(); - } - -} diff --git a/apps/external/settings.php b/apps/external/settings.php deleted file mode 100644 index 488444c119..0000000000 --- a/apps/external/settings.php +++ /dev/null @@ -1,9 +0,0 @@ -fetchPage(); diff --git a/apps/external/templates/frame.php b/apps/external/templates/frame.php deleted file mode 100644 index 38b4008353..0000000000 --- a/apps/external/templates/frame.php +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - diff --git a/apps/external/templates/settings.php b/apps/external/templates/settings.php deleted file mode 100644 index b8139727eb..0000000000 --- a/apps/external/templates/settings.php +++ /dev/null @@ -1,21 +0,0 @@ -
    -
    - External Sites
    -
      - - - - - '; - } - ?> - -
    - - - -
    -
    diff --git a/apps/files/admin.php b/apps/files/admin.php index d05eb7267b..a8f2deffc9 100644 --- a/apps/files/admin.php +++ b/apps/files/admin.php @@ -23,7 +23,7 @@ // Init owncloud - + OCP\User::checkAdminUser(); @@ -33,7 +33,7 @@ $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize') $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); $maxUploadFilesize = OCP\Util::humanFileSize(min($upload_max_filesize, $post_max_size)); if($_POST) { - if(isset($_POST['maxUploadSize'])){ + if(isset($_POST['maxUploadSize'])) { if(($setMaxSize = OC_Files::setUploadLimit(OCP\Util::computerFileSize($_POST['maxUploadSize']))) !== false) { $maxUploadFilesize = OCP\Util::humanFileSize($setMaxSize); } diff --git a/apps/files/ajax/autocomplete.php b/apps/files/ajax/autocomplete.php index e504bb24bf..fae38368a8 100644 --- a/apps/files/ajax/autocomplete.php +++ b/apps/files/ajax/autocomplete.php @@ -11,20 +11,20 @@ OCP\JSON::checkLoggedIn(); $query = $_GET['term']; $dirOnly=(isset($_GET['dironly']))?($_GET['dironly']=='true'):false; -if($query[0]!='/'){ +if($query[0]!='/') { $query='/'.$query; } -if(substr($query,-1,1)=='/'){ +if(substr($query, -1, 1)=='/') { $base=$query; -}else{ +} else { $base=dirname($query); } -$query=substr($query,strlen($base)); +$query=substr($query, strlen($base)); -if($base!='/'){ - $query=substr($query,1); +if($base!='/') { + $query=substr($query, 1); } $queryLen=strlen($query); $query=strtolower($query); @@ -33,17 +33,17 @@ $query=strtolower($query); $files=array(); -if(OC_Filesystem::file_exists($base) and OC_Filesystem::is_dir($base)){ +if(OC_Filesystem::file_exists($base) and OC_Filesystem::is_dir($base)) { $dh = OC_Filesystem::opendir($base); - if($dh){ - if(substr($base,-1,1)!='/'){ + if($dh) { + if(substr($base, -1, 1)!='/') { $base=$base.'/'; } while (($file = readdir($dh)) !== false) { - if ($file != "." && $file != ".."){ - if(substr(strtolower($file),0,$queryLen)==$query){ + if ($file != "." && $file != "..") { + if(substr(strtolower($file), 0, $queryLen)==$query) { $item=$base.$file; - if((!$dirOnly or OC_Filesystem::is_dir($item))){ + if((!$dirOnly or OC_Filesystem::is_dir($item))) { $files[]=(object)array('id'=>$item,'label'=>$item,'name'=>$item); } } diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php index 695f803884..e9bcea1893 100644 --- a/apps/files/ajax/delete.php +++ b/apps/files/ajax/delete.php @@ -15,7 +15,7 @@ $filesWithError = ''; $success = true; //Now delete foreach($files as $file) { - if( !OC_Files::delete( $dir, $file )){ + if( !OC_Files::delete( $dir, $file )) { $filesWithError .= $file . "\n"; $success = false; } diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index dae0c1a828..568fe754c0 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -14,25 +14,25 @@ $doBreadcrumb = isset( $_GET['breadcrumb'] ) ? true : false; $data = array(); // Make breadcrumb -if($doBreadcrumb){ +if($doBreadcrumb) { $breadcrumb = array(); $pathtohere = "/"; - foreach( explode( "/", $dir ) as $i ){ - if( $i != "" ){ + foreach( explode( "/", $dir ) as $i ) { + if( $i != "" ) { $pathtohere .= "$i/"; $breadcrumb[] = array( "dir" => $pathtohere, "name" => $i ); } } - + $breadcrumbNav = new OCP\Template( "files", "part.breadcrumb", "" ); $breadcrumbNav->assign( "breadcrumb", $breadcrumb ); - + $data['breadcrumb'] = $breadcrumbNav->fetchPage(); } // make filelist $files = array(); -foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ +foreach( OC_Files::getdirectorycontent( $dir ) as $i ) { $i["date"] = OCP\Util::formatDate($i["mtime"] ); $files[] = $i; } diff --git a/apps/files/ajax/mimeicon.php b/apps/files/ajax/mimeicon.php index 80d50f8452..dbb8b60112 100644 --- a/apps/files/ajax/mimeicon.php +++ b/apps/files/ajax/mimeicon.php @@ -1,9 +1,3 @@ array( "dir" => $dir, "files" => $file ))); -}else{ +} else { OCP\JSON::error(array("data" => array( "message" => "Could not move $file" ))); } diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index cc9208ad08..4619315ce0 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -3,7 +3,7 @@ // Init owncloud global $eventSource; -if(!OC_User::isLoggedIn()){ +if(!OC_User::isLoggedIn()) { exit; } @@ -15,9 +15,9 @@ $filename = isset( $_REQUEST['filename'] ) ? stripslashes($_REQUEST['filename']) $content = isset( $_REQUEST['content'] ) ? $_REQUEST['content'] : ''; $source = isset( $_REQUEST['source'] ) ? stripslashes($_REQUEST['source']) : ''; -if($source){ +if($source) { $eventSource=new OC_EventSource(); -}else{ +} else { OC_JSON::callCheck(); } @@ -25,12 +25,12 @@ if($filename == '') { OCP\JSON::error(array("data" => array( "message" => "Empty Filename" ))); exit(); } -if(strpos($filename,'/')!==false){ +if(strpos($filename, '/')!==false) { OCP\JSON::error(array("data" => array( "message" => "Invalid Filename" ))); exit(); } -function progress($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max){ +function progress($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) { static $filesize = 0; static $lastsize = 0; global $eventSource; @@ -39,14 +39,14 @@ function progress($notification_code, $severity, $message, $message_code, $bytes case STREAM_NOTIFY_FILE_SIZE_IS: $filesize = $bytes_max; break; - + case STREAM_NOTIFY_PROGRESS: if ($bytes_transferred > 0) { if (!isset($filesize)) { } else { $progress = (int)(($bytes_transferred/$filesize)*100); - if($progress>$lastsize){//limit the number or messages send - $eventSource->send('progress',$progress); + if($progress>$lastsize) {//limit the number or messages send + $eventSource->send('progress', $progress); } $lastsize=$progress; } @@ -55,31 +55,31 @@ function progress($notification_code, $severity, $message, $message_code, $bytes } } -if($source){ - if(substr($source,0,8)!='https://' and substr($source,0,7)!='http://'){ +if($source) { + if(substr($source, 0, 8)!='https://' and substr($source, 0, 7)!='http://') { OCP\JSON::error(array("data" => array( "message" => "Not a valid source" ))); exit(); } $ctx = stream_context_create(null, array('notification' =>'progress')); - $sourceStream=fopen($source,'rb', false, $ctx); + $sourceStream=fopen($source, 'rb', false, $ctx); $target=$dir.'/'.$filename; - $result=OC_Filesystem::file_put_contents($target,$sourceStream); - if($result){ + $result=OC_Filesystem::file_put_contents($target, $sourceStream); + if($result) { $mime=OC_Filesystem::getMimetype($target); - $eventSource->send('success',$mime); - }else{ - $eventSource->send('error',"Error while downloading ".$source. ' to '.$target); + $eventSource->send('success', $mime); + } else { + $eventSource->send('error', "Error while downloading ".$source. ' to '.$target); } $eventSource->close(); exit(); -}else{ - if($content){ - if(OC_Filesystem::file_put_contents($dir.'/'.$filename,$content)){ +} else { + if($content) { + if(OC_Filesystem::file_put_contents($dir.'/'.$filename, $content)) { OCP\JSON::success(array("data" => array('content'=>$content))); exit(); } - }elseif(OC_Files::newFile($dir, $filename, 'file')){ + }elseif(OC_Files::newFile($dir, $filename, 'file')) { OCP\JSON::success(array("data" => array('content'=>$content))); exit(); } diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php index ae92bcf09b..34c2d0ca14 100644 --- a/apps/files/ajax/newfolder.php +++ b/apps/files/ajax/newfolder.php @@ -14,7 +14,7 @@ if(trim($foldername) == '') { OCP\JSON::error(array("data" => array( "message" => "Empty Foldername" ))); exit(); } -if(strpos($foldername,'/')!==false){ +if(strpos($foldername, '/')!==false) { OCP\JSON::error(array("data" => array( "message" => "Invalid Foldername" ))); exit(); } diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php index d159f6e152..e0aa0bdac5 100644 --- a/apps/files/ajax/rawlist.php +++ b/apps/files/ajax/rawlist.php @@ -5,19 +5,19 @@ $RUNTIME_APPTYPES=array('filesystem'); // Init owncloud -require_once('lib/template.php'); +require_once 'lib/template.php'; OCP\JSON::checkLoggedIn(); // Load the files $dir = isset( $_GET['dir'] ) ? $_GET['dir'] : ''; -$mimetype = isset($_GET['mimetype']) ? $_GET['mimetype'] : ''; +$mimetype = isset($_GET['mimetype']) ? $_GET['mimetype'] : ''; // make filelist $files = array(); -foreach( OC_Files::getdirectorycontent( $dir, $mimetype ) as $i ){ +foreach( OC_Files::getdirectorycontent( $dir, $mimetype ) as $i ) { $i["date"] = OCP\Util::formatDate($i["mtime"] ); - $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']); + $i['mimetype_icon'] = $i['type'] == 'dir' ? \mimetype_icon('dir'): \mimetype_icon($i['mimetype']); $files[] = $i; } diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index eef3885851..d2ec1ab516 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -6,38 +6,38 @@ $force=isset($_GET['force']) and $_GET['force']=='true'; $dir=isset($_GET['dir'])?$_GET['dir']:''; $checkOnly=isset($_GET['checkonly']) and $_GET['checkonly']=='true'; -if(!$checkOnly){ +if(!$checkOnly) { $eventSource=new OC_EventSource(); } session_write_close(); //create the file cache if necesary -if($force or !OC_FileCache::inCache('')){ - if(!$checkOnly){ +if($force or !OC_FileCache::inCache('')) { + if(!$checkOnly) { OCP\DB::beginTransaction(); - - if(OC_Cache::isFast()){ + + if(OC_Cache::isFast()) { OC_Cache::clear('fileid/'); //make sure the old fileid's don't mess things up } - + OC_FileCache::scan($dir,$eventSource); OC_FileCache::clean(); OCP\DB::commit(); - $eventSource->send('success',true); - }else{ + $eventSource->send('success', true); + } else { OCP\JSON::success(array('data'=>array('done'=>true))); exit; } -}else{ - if($checkOnly){ +} else { + if($checkOnly) { OCP\JSON::success(array('data'=>array('done'=>false))); exit; } - if(isset($eventSource)){ - $eventSource->send('success',false); - }else{ + if(isset($eventSource)) { + $eventSource->send('success', false); + } else { exit; } } -$eventSource->close(); \ No newline at end of file +$eventSource->close(); diff --git a/apps/files/ajax/timezone.php b/apps/files/ajax/timezone.php index 0be441a36a..b71fa3940c 100644 --- a/apps/files/ajax/timezone.php +++ b/apps/files/ajax/timezone.php @@ -3,4 +3,3 @@ // see lib/base.php for an example //session_start(); $_SESSION['timezone'] = $_GET['time']; - \ No newline at end of file diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 74e6eb560d..fb3e277a21 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -35,27 +35,27 @@ $dir = $_POST['dir']; $error=''; $totalSize=0; -foreach($files['size'] as $size){ +foreach($files['size'] as $size) { $totalSize+=$size; } -if($totalSize>OC_Filesystem::free_space('/')){ +if($totalSize>OC_Filesystem::free_space('/')) { OCP\JSON::error(array("data" => array( "message" => "Not enough space available" ))); exit(); } $result=array(); -if(strpos($dir,'..') === false){ +if(strpos($dir, '..') === false) { $fileCount=count($files['name']); - for($i=0;$i<$fileCount;$i++){ + for($i=0;$i<$fileCount;$i++) { $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]); - if(is_uploaded_file($files['tmp_name'][$i]) and OC_Filesystem::fromTmpFile($files['tmp_name'][$i],$target)){ - $meta=OC_FileCache_Cached::get($target); + if(is_uploaded_file($files['tmp_name'][$i]) and OC_Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) { + $meta = OC_FileCache::get($target); $result[]=array( "status" => "success", 'mime'=>$meta['mimetype'],'size'=>$meta['size'],'name'=>basename($target)); } } OCP\JSON::encodedPrint($result); exit(); -}else{ +} else { $error='invalid dir'; } diff --git a/apps/files/appinfo/filesync.php b/apps/files/appinfo/filesync.php new file mode 100644 index 0000000000..c1fe444cec --- /dev/null +++ b/apps/files/appinfo/filesync.php @@ -0,0 +1,64 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/** + * filesync can be called with a PUT method. + * PUT takes a stream starting with a 2 byte blocksize, + * followed by binary md5 of the blocks. Everything in big-endian. + * The return is a json encoded with: + * - 'transferid' + * - 'needed' chunks + * - 'last' checked chunk + * The URL is made of 3 parts, the service url (remote.php/filesync/), the sync + * type and the path in ownCloud. + * At the moment the only supported sync type is 'oc_chunked'. + * The final URL will look like http://.../remote.php/filesync/oc_chunked/path/to/file + */ + +// only need filesystem apps +$RUNTIME_APPTYPES=array('filesystem','authentication'); +OC_App::loadApps($RUNTIME_APPTYPES); +if(!OC_User::isLoggedIn()) { + if(!isset($_SERVER['PHP_AUTH_USER'])) { + header('WWW-Authenticate: Basic realm="ownCloud Server"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'Valid credentials must be supplied'; + exit(); + } else { + if(!OC_User::login($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])) { + exit(); + } + } +} + +list($type,$file) = explode('/', substr($path_info,1+strlen($service)+1), 2); + +if ($type != 'oc_chunked') { + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); + die; +} + +if (!OC_Filesystem::is_file($file)) { + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); + die; +} + +switch($_SERVER['REQUEST_METHOD']) { + case 'PUT': + $input = fopen("php://input", "r"); + $org_file = OC_Filesystem::fopen($file, 'rb'); + $info = array( + 'name' => basename($file), + ); + $sync = new OC_FileChunking($info); + $result = $sync->signature_split($org_file, $input); + echo json_encode($result); + break; + default: + OC_Response::setStatus(OC_Response::STATUS_NOT_FOUND); +} diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index 105df092ce..e58f83c5a0 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -15,5 +15,6 @@ appinfo/remote.php appinfo/remote.php + appinfo/filesync.php diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php index 5514aed197..35008e345b 100644 --- a/apps/files/appinfo/update.php +++ b/apps/files/appinfo/update.php @@ -1,13 +1,13 @@ execute(); - while( $row = $result->fetchRow()){ - $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertyname = ? WHERE userid = ? AND propertypath = ?' ); - $query->execute( array( preg_replace("/^{.*}/", "", $row["propertyname"]),$row["userid"], $row["propertypath"] )); + $query = OC_DB::prepare( "SELECT `propertyname`, `propertypath`, `userid` FROM `*PREFIX*properties`" ); + $result = $query->execute(); + while( $row = $result->fetchRow()) { + $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyname` = ? WHERE `userid` = ? AND `propertypath` = ?' ); + $query->execute( array( preg_replace("/^{.*}/", "", $row["propertyname"]),$row["userid"], $row["propertypath"] )); } } @@ -41,5 +41,3 @@ foreach($filesToRemove as $file) { break; } } - - diff --git a/apps/files/appinfo/version b/apps/files/appinfo/version index 1b87bcd0b0..e25d8d9f35 100644 --- a/apps/files/appinfo/version +++ b/apps/files/appinfo/version @@ -1 +1 @@ -1.1.4 \ No newline at end of file +1.1.5 diff --git a/apps/files/css/files.css b/apps/files/css/files.css index dc298e4d44..f35478ecc2 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -3,7 +3,7 @@ See the COPYING-README file. */ /* FILE MENU */ -.actions { padding:.3em; float:left; height:2em; } +.actions { padding:.3em; float:left; height:2em; width:10em; } .actions input, .actions button, .actions .button { margin:0; } #file_menu { right:0; position:absolute; top:0; } #file_menu a { display:block; float:left; background-image:none; text-decoration:none; } @@ -19,7 +19,8 @@ #new>ul>li { margin:.3em; padding-left:2em; background-repeat:no-repeat; cursor:pointer; padding-bottom:0.1em } #new>ul>li>p { cursor:pointer; } #new>ul>li>input { padding:0.3em; margin:-0.3em; } -#new, .file_upload_filename { background:#5bb75b; border:1px solid; border-color:#51a351 #51a351 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; box-shadow:0 1px 1px #f8f8f8, 0 1px 1px #cfc inset; } +#new, .file_upload_filename { background:#5bb75b; border:1px solid; border-color:#51a351 #419341 #387038; -moz-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; -webkit-box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; box-shadow:0 1px 1px #f8f8f8, 1px 1px 1px #ada inset; } +#new .popup { border-top-left-radius:0; } #file_newfolder_name { background-image:url('%webroot%/core/img/places/folder.svg'); font-weight:normal; width:7em; } .file_upload_start, .file_upload_filename { font-size:1em; } @@ -46,9 +47,6 @@ tbody a { color:#000; } span.extension, span.uploading, td.date { color:#999; } span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; } tr:hover span.extension { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; color:#777; } -div.crumb { float:left; display:block; background:no-repeat right 0; padding:.75em 1.5em 0 1em; height:2.9em; } -div.crumb:first-child { padding-left:1em; } -div.crumb.last { font-weight:bold; } table tr.mouseOver td { background-color:#eee; } table th { height:2em; padding:0 .5em; color:#999; } table th .name { float:left; margin-left:.5em; } diff --git a/apps/files/download.php b/apps/files/download.php index 4e2478d1ad..ff6aefbbe0 100644 --- a/apps/files/download.php +++ b/apps/files/download.php @@ -22,14 +22,14 @@ */ // Init owncloud - + // Check if we are a user OCP\User::checkLoggedIn(); $filename = $_GET["file"]; -if(!OC_Filesystem::file_exists($filename)){ +if(!OC_Filesystem::file_exists($filename)) { header("HTTP/1.0 404 Not Found"); $tmpl = new OCP\Template( '', '404', 'guest' ); $tmpl->assign('file',$filename); diff --git a/apps/files/index.php b/apps/files/index.php index 79bed8e357..493087d26f 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -31,7 +31,7 @@ OCP\Util::addscript( 'files', 'jquery.fileupload' ); OCP\Util::addscript( 'files', 'files' ); OCP\Util::addscript( 'files', 'filelist' ); OCP\Util::addscript( 'files', 'fileactions' ); -if(!isset($_SESSION['timezone'])){ +if(!isset($_SESSION['timezone'])) { OCP\Util::addscript( 'files', 'timezone' ); } OCP\App::setActiveNavigationEntry( 'files_index' ); @@ -39,14 +39,14 @@ OCP\App::setActiveNavigationEntry( 'files_index' ); $dir = isset( $_GET['dir'] ) ? stripslashes($_GET['dir']) : ''; // Redirect if directory does not exist if(!OC_Filesystem::is_dir($dir.'/')) { - header('Location: '.$_SERVER['PHP_SELF'].''); + header('Location: '.$_SERVER['SCRIPT_NAME'].''); exit(); } $files = array(); -foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ +foreach( OC_Files::getdirectorycontent( $dir ) as $i ) { $i['date'] = OCP\Util::formatDate($i['mtime'] ); - if($i['type']=='file'){ + if($i['type']=='file') { $fileinfo=pathinfo($i['name']); $i['basename']=$fileinfo['filename']; if (!empty($fileinfo['extension'])) { @@ -56,7 +56,7 @@ foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ $i['extension']=''; } } - if($i['directory']=='/'){ + if($i['directory']=='/') { $i['directory']=''; } $files[] = $i; @@ -65,8 +65,8 @@ foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ // Make breadcrumb $breadcrumb = array(); $pathtohere = ''; -foreach( explode( '/', $dir ) as $i ){ - if( $i != '' ){ +foreach( explode( '/', $dir ) as $i ) { + if( $i != '' ) { $pathtohere .= '/'.str_replace('+','%20', urlencode($i)); $breadcrumb[] = array( 'dir' => $pathtohere, 'name' => $i ); } @@ -89,11 +89,23 @@ $freeSpace=OC_Filesystem::free_space('/'); $freeSpace=max($freeSpace,0); $maxUploadFilesize = min($maxUploadFilesize ,$freeSpace); +$permissions = OCP\Share::PERMISSION_READ; +if (OC_Filesystem::isUpdatable($dir.'/')) { + $permissions |= OCP\Share::PERMISSION_UPDATE; +} +if (OC_Filesystem::isDeletable($dir.'/')) { + $permissions |= OCP\Share::PERMISSION_DELETE; +} +if (OC_Filesystem::isSharable($dir.'/')) { + $permissions |= OCP\Share::PERMISSION_SHARE; +} + $tmpl = new OCP\Template( 'files', 'index', 'user' ); $tmpl->assign( 'fileList', $list->fetchPage(), false ); $tmpl->assign( 'breadcrumb', $breadcrumbNav->fetchPage(), false ); -$tmpl->assign( 'dir', $dir); -$tmpl->assign( 'readonly', !OC_Filesystem::is_writable($dir.'/')); +$tmpl->assign( 'dir', OC_Filesystem::normalizePath($dir)); +$tmpl->assign( 'isCreatable', OC_Filesystem::isCreatable($dir.'/')); +$tmpl->assign('permissions', $permissions); $tmpl->assign( 'files', $files ); $tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize); $tmpl->assign( 'uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 4dc05088ee..1403d345e8 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -1,40 +1,50 @@ -FileActions={ +var FileActions={ actions:{}, defaults:{}, icons:{}, currentFile:null, - register:function(mime,name,icon,action){ + register:function(mime,name,permissions,icon,action){ if(!FileActions.actions[mime]){ FileActions.actions[mime]={}; } - FileActions.actions[mime][name]=action; + if (!FileActions.actions[mime][name]) { + FileActions.actions[mime][name] = {}; + } + FileActions.actions[mime][name]['action'] = action; + FileActions.actions[mime][name]['permissions'] = permissions; FileActions.icons[name]=icon; }, setDefault:function(mime,name){ FileActions.defaults[mime]=name; }, - get:function(mime,type){ + get:function(mime,type,permissions){ var actions={}; if(FileActions.actions.all){ - actions=$.extend( actions, FileActions.actions.all ) + actions=$.extend( actions, FileActions.actions.all ); } if(mime){ if(FileActions.actions[mime]){ - actions=$.extend( actions, FileActions.actions[mime] ) + actions=$.extend( actions, FileActions.actions[mime] ); } var mimePart=mime.substr(0,mime.indexOf('/')); if(FileActions.actions[mimePart]){ - actions=$.extend( actions, FileActions.actions[mimePart] ) + actions=$.extend( actions, FileActions.actions[mimePart] ); } } if(type){//type is 'dir' or 'file' if(FileActions.actions[type]){ - actions=$.extend( actions, FileActions.actions[type] ) + actions=$.extend( actions, FileActions.actions[type] ); } } - return actions; + var filteredActions = {}; + $.each(actions, function(name, action) { + if (action.permissions & permissions) { + filteredActions[name] = action.action; + } + }); + return filteredActions; }, - getDefault:function(mime,type){ + getDefault:function(mime,type,permissions){ if(mime){ var mimePart=mime.substr(0,mime.indexOf('/')); } @@ -48,22 +58,24 @@ FileActions={ }else{ name=FileActions.defaults.all; } - var actions=this.get(mime,type); + var actions=this.get(mime,type,permissions); return actions[name]; }, - display:function(parent, filename, type){ + display:function(parent){ FileActions.currentFile=parent; $('#fileList span.fileactions, #fileList td.date a.action').remove(); - var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType()); + var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions()); var file=FileActions.getCurrentFile(); if($('tr').filterAttr('data-file',file).data('renaming')){ return; } parent.children('a.name').append(''); - var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType()); + var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions()); for(name in actions){ - // no rename and share action for the 'Shared' dir - if((name=='Rename' || name =='Share') && type=='dir' && filename=='Shared') { continue; } + // NOTE: Temporary fix to prevent rename action in root of Shared directory + if (name == 'Rename' && $('#dir').val() == '/Shared') { + continue; + } if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){ var img=FileActions.icons[name]; if(img.call){ @@ -86,14 +98,15 @@ FileActions={ parent.find('a.name>span.fileactions').append(element); } } - if(actions['Delete'] && (type!='dir' || filename != 'Shared')){ // no delete action for the 'Shared' dir + if(actions['Delete']){ var img=FileActions.icons['Delete']; if(img.call){ img=img(file); } - if ($('#dir').val().indexOf('Shared') != -1) { - var html=''+basename + html+=''+basename; if(extension){ html+=''+extension+''; } @@ -36,9 +36,12 @@ FileList={ }else{ $('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions); } + if (hidden) { + $('tr').filterAttr('data-file', name).hide(); + } }, - addDir:function(name,size,lastModified){ - html = $('').attr({ "data-type": "dir", "data-size": size, "data-file": name}); + addDir:function(name,size,lastModified,hidden){ + html = $('').attr({ "data-type": "dir", "data-size": size, "data-file": name, "data-permissions": $('#permissions').val()}); td = $('').attr({"class": "filename", "style": 'background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')' }); td.append(''); var link_elem = $('').attr({ "class": "name", "href": OC.linkTo('files', 'index.php')+"&dir="+ encodeURIComponent($('#dir').val()+'/'+name).replace(/%2F/g, '/') }); @@ -63,6 +66,9 @@ FileList={ FileList.insertElement(name,'dir',html); $('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions); $('tr').filterAttr('data-file',name).find('td.filename').droppable(folderDropOptions); + if (hidden) { + $('tr').filterAttr('data-file', name).hide(); + } }, refresh:function(data) { result = jQuery.parseJSON(data.responseText); @@ -82,7 +88,7 @@ FileList={ }, insertElement:function(name,type,element){ //find the correct spot to insert the file or folder - var fileElements=$('tr[data-file][data-type="'+type+'"]'); + var fileElements=$('tr[data-file][data-type="'+type+'"]:visible'); var pos; if(name.localeCompare($(fileElements[0]).attr('data-file'))<0){ pos=-1; @@ -136,24 +142,34 @@ FileList={ event.stopPropagation(); event.preventDefault(); var newname=input.val(); - tr.attr('data-file',newname); - td.children('a.name').empty(); + if (newname != name) { + if (FileList.checkName(name, newname, false)) { + newname = name; + } else { + $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(result) { + if (!result || result.status == 'error') { + OC.dialogs.alert(result.data.message, 'Error moving file'); + newname = name; + } + }); + } + } + tr.attr('data-file', newname); var path = td.children('a.name').attr('href'); td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname))); - if(newname.indexOf('.')>0){ - basename=newname.substr(0,newname.lastIndexOf('.')); - }else{ - basename=newname; + if (newname.indexOf('.') > 0) { + var basename=newname.substr(0,newname.lastIndexOf('.')); + } else { + var basename=newname; } + td.children('a.name').empty(); var span=$(''); span.text(basename); td.children('a.name').append(span); - if(newname.indexOf('.')>0){ + if (newname.indexOf('.') > 0) { span.append($(''+newname.substr(newname.lastIndexOf('.'))+'')); } - $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(){ - tr.data('renaming',false); - }); + tr.data('renaming',false); return false; }); input.click(function(event){ @@ -164,13 +180,122 @@ FileList={ form.trigger('submit'); }); }, + checkName:function(oldName, newName, isNewFile) { + if (isNewFile || $('tr').filterAttr('data-file', newName).length > 0) { + if (isNewFile) { + $('#notification').html(newName+' '+t('files', 'already exists')+''+t('files', 'replace')+''+t('files', 'suggest name')+''+t('files', 'cancel')+''); + } else { + $('#notification').html(newName+' '+t('files', 'already exists')+''+t('files', 'replace')+''+t('files', 'cancel')+''); + } + $('#notification').data('oldName', oldName); + $('#notification').data('newName', newName); + $('#notification').data('isNewFile', isNewFile); + $('#notification').fadeIn(); + return true; + } else { + return false; + } + }, + replace:function(oldName, newName, isNewFile) { + // Finish any existing actions + if (FileList.lastAction || !FileList.useUndo) { + FileList.lastAction(); + } + $('tr').filterAttr('data-file', oldName).hide(); + $('tr').filterAttr('data-file', newName).hide(); + var tr = $('tr').filterAttr('data-file', oldName).clone(); + tr.attr('data-replace', 'true'); + tr.attr('data-file', newName); + var td = tr.children('td.filename'); + td.children('a.name .span').text(newName); + var path = td.children('a.name').attr('href'); + td.children('a.name').attr('href', path.replace(encodeURIComponent(oldName), encodeURIComponent(newName))); + if (newName.indexOf('.') > 0) { + var basename = newName.substr(0, newName.lastIndexOf('.')); + } else { + var basename = newName; + } + td.children('a.name').empty(); + var span = $(''); + span.text(basename); + td.children('a.name').append(span); + if (newName.indexOf('.') > 0) { + span.append($(''+newName.substr(newName.lastIndexOf('.'))+'')); + } + FileList.insertElement(newName, tr.data('type'), tr); + tr.show(); + FileList.replaceCanceled = false; + FileList.replaceOldName = oldName; + FileList.replaceNewName = newName; + FileList.replaceIsNewFile = isNewFile; + FileList.lastAction = function() { + FileList.finishReplace(); + }; + if (isNewFile) { + $('#notification').html(t('files', 'replaced')+' '+newName+''+t('files', 'undo')+''); + } else { + $('#notification').html(t('files', 'replaced')+' '+newName+' '+t('files', 'with')+' '+oldName+''+t('files', 'undo')+''); + } + $('#notification').fadeIn(); + }, + finishReplace:function() { + if (!FileList.replaceCanceled && FileList.replaceOldName && FileList.replaceNewName) { + $.ajax({url: OC.filePath('files', 'ajax', 'rename.php'), async: false, data: { dir: $('#dir').val(), newname: FileList.replaceNewName, file: FileList.replaceOldName }, success: function(result) { + if (result && result.status == 'success') { + $('tr').filterAttr('data-replace', 'true').removeAttr('data-replace'); + } else { + OC.dialogs.alert(result.data.message, 'Error moving file'); + } + FileList.replaceCanceled = true; + FileList.replaceOldName = null; + FileList.replaceNewName = null; + FileList.lastAction = null; + }}); + } + }, do_delete:function(files){ - if(FileList.deleteFiles || !FileList.useUndo){//finish any ongoing deletes first - FileList.finishDelete(function(){ - FileList.do_delete(files); - }); + // Finish any existing actions + if (FileList.lastAction || !FileList.useUndo) { + if(!FileList.deleteFiles) { + FileList.prepareDeletion(files); + } + FileList.lastAction(); return; } + FileList.prepareDeletion(files); + // NOTE: Temporary fix to change the text to unshared for files in root of Shared folder + if ($('#dir').val() == '/Shared') { + $('#notification').html(t('files', 'unshared')+' '+files+''+t('files', 'undo')+''); + } else { + $('#notification').html(t('files', 'deleted')+' '+files+''+t('files', 'undo')+''); + } + $('#notification').fadeIn(); + }, + finishDelete:function(ready,sync){ + if(!FileList.deleteCanceled && FileList.deleteFiles){ + var fileNames=FileList.deleteFiles.join(';'); + $.ajax({ + url: OC.filePath('files', 'ajax', 'delete.php'), + async:!sync, + data: {dir:$('#dir').val(),files:fileNames}, + complete: function(data){ + boolOperationFinished(data, function(){ + $('#notification').fadeOut('400'); + $.each(FileList.deleteFiles,function(index,file){ + FileList.remove(file); + }); + FileList.deleteCanceled=true; + FileList.deleteFiles=null; + FileList.lastAction = null; + if(ready){ + ready(); + } + }); + } + }); + } + }, + prepareDeletion:function(files){ if(files.substr){ files=[files]; } @@ -183,51 +308,60 @@ FileList={ procesSelection(); FileList.deleteCanceled=false; FileList.deleteFiles=files; - $('#notification').text(t('files','undo deletion')); - $('#notification').data('deletefile',true); - $('#notification').fadeIn(); - }, - finishDelete:function(ready,sync){ - if(!FileList.deleteCanceled && FileList.deleteFiles){ - var fileNames=FileList.deleteFiles.join(';'); - $.ajax({ - url: OC.filePath('files', 'ajax', 'delete.php'), - async:!sync, - data: {dir:$('#dir').val(),files:fileNames}, - complete: function(data){ - boolOperationFinished(data, function(){ - $('#notification').fadeOut(); - $.each(FileList.deleteFiles,function(index,file){ - FileList.remove(file); - }); - FileList.deleteCanceled=true; - FileList.deleteFiles=null; - if(ready){ - ready(); - } - }); - } - }); - } + FileList.lastAction = function() { + FileList.finishDelete(null, true); + }; } } $(document).ready(function(){ $('#notification').hide(); - $('#notification').click(function(){ - if($('#notification').data('deletefile')) - { + $('#notification .undo').live('click', function(){ + if (FileList.deleteFiles) { $.each(FileList.deleteFiles,function(index,file){ $('tr').filterAttr('data-file',file).show(); -// alert(file); }); FileList.deleteCanceled=true; FileList.deleteFiles=null; + } else if (FileList.replaceOldName && FileList.replaceNewName) { + if (FileList.replaceIsNewFile) { + // Delete the new uploaded file + FileList.deleteCanceled = false; + FileList.deleteFiles = [FileList.replaceOldName]; + FileList.finishDelete(null, true); + } else { + $('tr').filterAttr('data-file', FileList.replaceOldName).show(); + } + $('tr').filterAttr('data-replace', 'true').remove(); + $('tr').filterAttr('data-file', FileList.replaceNewName).show(); + FileList.replaceCanceled = true; + FileList.replaceOldName = null; + FileList.replaceNewName = null; + FileList.replaceIsNewFile = null; + } + FileList.lastAction = null; + $('#notification').fadeOut('400'); + }); + $('#notification .replace').live('click', function() { + $('#notification').fadeOut('400', function() { + FileList.replace($('#notification').data('oldName'), $('#notification').data('newName'), $('#notification').data('isNewFile')); + }); + }); + $('#notification .suggest').live('click', function() { + $('tr').filterAttr('data-file', $('#notification').data('oldName')).show(); + $('#notification').fadeOut('400'); + }); + $('#notification .cancel').live('click', function() { + if ($('#notification').data('isNewFile')) { + FileList.deleteCanceled = false; + FileList.deleteFiles = [$('#notification').data('oldName')]; + FileList.finishDelete(null, true); } - $('#notification').fadeOut(); }); FileList.useUndo=('onbeforeunload' in window) $(window).bind('beforeunload', function (){ - FileList.finishDelete(null,true); + if (FileList.lastAction) { + FileList.lastAction(); + } }); }); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index a4e2361fee..101e2bad2e 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -26,7 +26,7 @@ Files={ }); procesSelection(); } -} +}; $(document).ready(function() { $('#fileList tr').each(function(){ //little hack to set unescape filenames in attribute @@ -40,8 +40,16 @@ $(document).ready(function() { $('#file_action_panel').attr('activeAction', false); //drag/drop of files - $('#fileList tr[data-write="true"] td.filename').draggable(dragOptions); - $('#fileList tr[data-type="dir"][data-write="true"] td.filename').droppable(folderDropOptions); + $('#fileList tr td.filename').each(function(i,e){ + if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) { + $(e).draggable(dragOptions); + } + }); + $('#fileList tr[data-type="dir"] td.filename').each(function(i,e){ + if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE){ + $(e).droppable(folderDropOptions); + } + }); $('div.crumb:not(.last)').droppable(crumbDropOptions); $('ul#apps>li:first-child').data('dir',''); if($('div.crumb').length){ @@ -56,7 +64,7 @@ $(document).ready(function() { // Sets the file-action buttons behaviour : $('tr').live('mouseenter',function(event) { - FileActions.display($(this).children('td.filename'), $(this).attr('data-file'), $(this).attr('data-type')); + FileActions.display($(this).children('td.filename')); }); $('tr').live('mouseleave',function(event) { FileActions.hide(); @@ -106,7 +114,8 @@ $(document).ready(function() { if(!renaming && !FileList.isLoading(filename)){ var mime=$(this).parent().parent().data('mime'); var type=$(this).parent().parent().data('type'); - var action=FileActions.getDefault(mime,type); + var permissions = $(this).parent().parent().data('permissions'); + var action=FileActions.getDefault(mime,type, permissions); if(action){ action(filename); } @@ -227,7 +236,14 @@ $(document).ready(function() { var size=t('files','Pending'); } if(files && !dirName){ - FileList.addFile(getUniqueName(files[i].name),size,date,true); + var uniqueName = getUniqueName(files[i].name); + if (uniqueName != files[i].name) { + FileList.checkName(uniqueName, files[i].name, true); + var hidden = true; + } else { + var hidden = false; + } + FileList.addFile(uniqueName,size,date,true,hidden); } else if(dirName) { var uploadtext = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName).find('.uploadtext') var currentUploads = parseInt(uploadtext.attr('currentUploads')); @@ -246,7 +262,14 @@ $(document).ready(function() { } }else{ var filename=this.value.split('\\').pop(); //ie prepends C:\fakepath\ in front of the filename - FileList.addFile(getUniqueName(filename),'Pending',date,true); + var uniqueName = getUniqueName(filename); + if (uniqueName != filename) { + FileList.checkName(uniqueName, filename, true); + var hidden = true; + } else { + var hidden = false; + } + FileList.addFile(uniqueName,'Pending',date,true,hidden); } if($.support.xhrFileUpload) { for(var i=0;i 0) + return t('files','File upload is in progress. Leaving the page now will cancel the upload.'); + }); + //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) if(navigator.userAgent.search(/konqueror/i)==-1){ $('.file_upload_start').attr('multiple','multiple') @@ -451,25 +489,35 @@ $(document).ready(function() { $(this).append(input); input.focus(); input.change(function(){ - var name=getUniqueName($(this).val()); - if(type != 'web' && name.indexOf('/')!=-1){ + if(type != 'web' && $(this).val().indexOf('/')!=-1){ $('#notification').text(t('files','Invalid name, \'/\' is not allowed.')); $('#notification').fadeIn(); return; } + var name = getUniqueName($(this).val()); + if (name != $(this).val()) { + FileList.checkName(name, $(this).val(), true); + var hidden = true; + } else { + var hidden = false; + } switch(type){ case 'file': $.post( OC.filePath('files','ajax','newfile.php'), - {dir:$('#dir').val(),filename:name,content:" \n"}, - function(data){ - var date=new Date(); - FileList.addFile(name,0,date); - var tr=$('tr').filterAttr('data-file',name); - tr.data('mime','text/plain'); - getMimeIcon('text/plain',function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); + {dir:$('#dir').val(),filename:name}, + function(result){ + if (result.status == 'success') { + var date=new Date(); + FileList.addFile(name,0,date,false,hidden); + var tr=$('tr').filterAttr('data-file',name); + tr.data('mime','text/plain'); + getMimeIcon('text/plain',function(path){ + tr.find('td.filename').attr('style','background-image:url('+path+')'); + }); + } else { + OC.dialogs.alert(result.data.message, 'Error'); + } } ); break; @@ -477,9 +525,13 @@ $(document).ready(function() { $.post( OC.filePath('files','ajax','newfolder.php'), {dir:$('#dir').val(),foldername:name}, - function(data){ - var date=new Date(); - FileList.addDir(name,0,date); + function(result){ + if (result.status == 'success') { + var date=new Date(); + FileList.addDir(name,0,date,hidden); + } else { + OC.dialogs.alert(result.data.message, 'Error'); + } } ); break; @@ -507,7 +559,7 @@ $(document).ready(function() { eventSource.listen('success',function(mime){ $('#uploadprogressbar').fadeOut(); var date=new Date(); - FileList.addFile(localName,0,date); + FileList.addFile(localName,0,date,false,hidden); var tr=$('tr').filterAttr('data-file',localName); tr.data('mime',mime); getMimeIcon(mime,function(path){ @@ -533,6 +585,69 @@ $(document).ready(function() { scanFiles(); } }, "json"); + + var lastWidth = 0; + var breadcrumbs = []; + var breadcrumbsWidth = $('#navigation').get(0).offsetWidth; + var hiddenBreadcrumbs = 0; + + $.each($('.crumb'), function(index, breadcrumb) { + breadcrumbs[index] = breadcrumb; + breadcrumbsWidth += $(breadcrumb).get(0).offsetWidth; + }); + + if ($('#controls .actions').length > 0) { + breadcrumbsWidth += $('#controls .actions').get(0).offsetWidth; + } + + function resizeBreadcrumbs(firstRun) { + var width = $(this).width(); + if (width != lastWidth) { + if ((width < lastWidth || firstRun) && width < breadcrumbsWidth) { + if (hiddenBreadcrumbs == 0) { + breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; + $(breadcrumbs[1]).find('a').hide(); + $(breadcrumbs[1]).append('...'); + breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth; + hiddenBreadcrumbs = 2; + } + var i = hiddenBreadcrumbs; + while (width < breadcrumbsWidth && i > 1 && i < breadcrumbs.length - 1) { + breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth; + $(breadcrumbs[i]).hide(); + hiddenBreadcrumbs = i; + i++ + } + } else if (width > lastWidth && hiddenBreadcrumbs > 0) { + var i = hiddenBreadcrumbs; + while (width > breadcrumbsWidth && i > 0) { + if (hiddenBreadcrumbs == 1) { + breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; + $(breadcrumbs[1]).find('span').remove(); + $(breadcrumbs[1]).find('a').show(); + breadcrumbsWidth += $(breadcrumbs[1]).get(0).offsetWidth; + } else { + $(breadcrumbs[i]).show(); + breadcrumbsWidth += $(breadcrumbs[i]).get(0).offsetWidth; + if (breadcrumbsWidth > width) { + breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth; + $(breadcrumbs[i]).hide(); + break; + } + } + i--; + hiddenBreadcrumbs = i; + } + } + lastWidth = width; + } + } + + $(window).resize(function() { + resizeBreadcrumbs(false); + }); + + resizeBreadcrumbs(true); }); function scanFiles(force,dir){ diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php index 91e748e300..52480ce7ff 100644 --- a/apps/files/l10n/ar.php +++ b/apps/files/l10n/ar.php @@ -6,6 +6,7 @@ "No file was uploaded" => "لم يتم ترفيع أي من الملفات", "Missing a temporary folder" => "المجلد المؤقت غير موجود", "Files" => "الملفات", +"Delete" => "محذوف", "Size" => "حجم", "Modified" => "معدل", "Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها", @@ -16,7 +17,6 @@ "Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!", "Name" => "الاسم", "Download" => "تحميل", -"Delete" => "محذوف", "Upload too large" => "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم." ); diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php index 83b3608731..624e08959f 100644 --- a/apps/files/l10n/bg_BG.php +++ b/apps/files/l10n/bg_BG.php @@ -5,15 +5,30 @@ "The uploaded file was only partially uploaded" => "Файлът е качен частично", "No file was uploaded" => "Фахлът не бе качен", "Missing a temporary folder" => "Липсва временната папка", +"Failed to write to disk" => "Грешка при запис на диска", "Files" => "Файлове", +"Delete" => "Изтриване", +"Upload Error" => "Грешка при качване", +"Upload cancelled." => "Качването е отменено.", +"Invalid name, '/' is not allowed." => "Неправилно име – \"/\" не е позволено.", "Size" => "Размер", "Modified" => "Променено", +"folder" => "папка", +"folders" => "папки", +"file" => "файл", "Maximum upload size" => "Макс. размер за качване", +"0 is unlimited" => "0 означава без ограничение", +"New" => "Нов", +"Text file" => "Текстов файл", +"Folder" => "Папка", +"From url" => "От url-адрес", "Upload" => "Качване", +"Cancel upload" => "Отказване на качването", "Nothing in here. Upload something!" => "Няма нищо, качете нещо!", "Name" => "Име", +"Share" => "Споделяне", "Download" => "Изтегляне", -"Delete" => "Изтриване", "Upload too large" => "Файлът е прекалено голям", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра." +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра.", +"Files are being scanned, please wait." => "Файловете се претърсват, изчакайте." ); diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php index baa6b3b7d4..26c6ad4de6 100644 --- a/apps/files/l10n/ca.php +++ b/apps/files/l10n/ca.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "S'ha perdut un fitxer temporal", "Failed to write to disk" => "Ha fallat en escriure al disc", "Files" => "Fitxers", +"Unshare" => "Deixa de compartir", +"Delete" => "Suprimeix", +"already exists" => "ja existeix", +"replace" => "substitueix", +"suggest name" => "sugereix un nom", +"cancel" => "cancel·la", +"replaced" => "substituït", +"undo" => "desfés", +"with" => "per", +"unshared" => "No compartits", +"deleted" => "esborrat", +"generating ZIP-file, it may take some time." => "s'estan generant fitxers ZIP, pot trigar una estona.", +"Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes", +"Upload Error" => "Error en la pujada", +"Pending" => "Pendents", +"Upload cancelled." => "La pujada s'ha cancel·lat.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", +"Invalid name, '/' is not allowed." => "El nom no és vàlid, no es permet '/'.", "Size" => "Mida", "Modified" => "Modificat", +"folder" => "carpeta", +"folders" => "carpetes", +"file" => "fitxer", +"files" => "fitxers", "File handling" => "Gestió de fitxers", "Maximum upload size" => "Mida màxima de pujada", "max. possible: " => "màxim possible:", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Activa la baixada ZIP", "0 is unlimited" => "0 és sense límit", "Maximum input size for ZIP files" => "Mida màxima d'entrada per fitxers ZIP", +"Save" => "Desa", "New" => "Nou", "Text file" => "Fitxer de text", "Folder" => "Carpeta", @@ -26,7 +49,6 @@ "Name" => "Nom", "Share" => "Comparteix", "Download" => "Baixa", -"Delete" => "Suprimeix", "Upload too large" => "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", "Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu", diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php index 9a4be26dad..41ef4e7849 100644 --- a/apps/files/l10n/cs_CZ.php +++ b/apps/files/l10n/cs_CZ.php @@ -1,34 +1,56 @@ "Soubor byl odeslán úspěšně", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Odeslaný soubor přesáhl velikostí parametr upload_max_filesize v php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Odeslaný soubor přesáhl velikostí parametr MAX_FILE_SIZE specifikovaný v HTML formuláři", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Odeslaný soubor přesáhl svou velikostí parametr upload_max_filesize v php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Odeslaný soubor přesáhl svou velikostí parametr MAX_FILE_SIZE specifikovaný v formuláři HTML", "The uploaded file was only partially uploaded" => "Soubor byl odeslán pouze částečně", -"No file was uploaded" => "Soubor nebyl odeslán", -"Missing a temporary folder" => "Chybí adresář pro sočasné soubory", -"Failed to write to disk" => "Zápis na disk se nezdařil", +"No file was uploaded" => "Žádný soubor nebyl odeslán", +"Missing a temporary folder" => "Chybí adresář pro dočasné soubory", +"Failed to write to disk" => "Zápis na disk selhal", "Files" => "Soubory", +"Unshare" => "Zrušit sdílení", +"Delete" => "Smazat", +"already exists" => "již existuje", +"replace" => "nahradit", +"suggest name" => "navrhnout název", +"cancel" => "zrušit", +"replaced" => "nahrazeno", +"undo" => "zpět", +"with" => "s", +"unshared" => "sdílení zrušeno", +"deleted" => "smazáno", +"generating ZIP-file, it may take some time." => "generuji ZIP soubor, může to nějakou dobu trvat.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář nebo má velikost 0 bajtů", +"Upload Error" => "Chyba odesílání", +"Pending" => "Čekající", +"Upload cancelled." => "Odesílání zrušeno.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Probíhá odesílání souboru. Opuštění stránky vyústí ve zrušení nahrávání.", +"Invalid name, '/' is not allowed." => "Neplatný název, znak '/' není povolen", "Size" => "Velikost", "Modified" => "Změněno", -"File handling" => "Nastavení chování k souborům", -"Maximum upload size" => "Maximální velikost ukládaných souborů", -"max. possible: " => "největší možná:", -"Needed for multi-file and folder downloads." => "Potřeba pro vícesoborvé stahování a stahování adresářů", +"folder" => "složka", +"folders" => "složky", +"file" => "soubor", +"files" => "soubory", +"File handling" => "Zacházení se soubory", +"Maximum upload size" => "Maximální velikost pro odesílání", +"max. possible: " => "největší možná: ", +"Needed for multi-file and folder downloads." => "Potřebné pro více-souborové stahování a stahování složek.", "Enable ZIP-download" => "Povolit ZIP-stahování", "0 is unlimited" => "0 znamená bez omezení", "Maximum input size for ZIP files" => "Maximální velikost vstupu pro ZIP soubory", +"Save" => "Uložit", "New" => "Nový", "Text file" => "Textový soubor", -"Folder" => "Adresář", +"Folder" => "Složka", "From url" => "Z url", -"Upload" => "Uložit", -"Cancel upload" => "Zrušit upload", -"Nothing in here. Upload something!" => "Žádný obsah. Uložte si něco!", +"Upload" => "Odeslat", +"Cancel upload" => "Zrušit odesílání", +"Nothing in here. Upload something!" => "Žádný obsah. Nahrajte něco.", "Name" => "Název", "Share" => "Sdílet", "Download" => "Stáhnout", -"Delete" => "Vymazat", -"Upload too large" => "Příliš velký soubor", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte uložit, překračují maximální velikosti uploadu na tomto serveru.", +"Upload too large" => "Odeslaný soubor je příliš velký", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", "Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte.", "Current scanning" => "Aktuální prohledávání" ); diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php index 3683ab8484..020f6142ec 100644 --- a/apps/files/l10n/da.php +++ b/apps/files/l10n/da.php @@ -7,8 +7,27 @@ "Missing a temporary folder" => "Mangler en midlertidig mappe", "Failed to write to disk" => "Fejl ved skrivning til disk.", "Files" => "Filer", +"Delete" => "Slet", +"already exists" => "findes allerede", +"replace" => "erstat", +"cancel" => "fortryd", +"replaced" => "erstattet", +"undo" => "fortryd", +"with" => "med", +"deleted" => "Slettet", +"generating ZIP-file, it may take some time." => "genererer ZIP-fil, det kan tage lidt tid.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Kunne ikke uploade din fil, da det enten er en mappe eller er tom", +"Upload Error" => "Fejl ved upload", +"Pending" => "Afventer", +"Upload cancelled." => "Upload afbrudt.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Fil upload kører. Hvis du forlader siden nu, vil uploadet blive annuleret.", +"Invalid name, '/' is not allowed." => "Ugyldigt navn, '/' er ikke tilladt.", "Size" => "Størrelse", "Modified" => "Ændret", +"folder" => "mappe", +"folders" => "mapper", +"file" => "fil", +"files" => "filer", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimal upload-størrelse", "max. possible: " => "max. mulige: ", @@ -26,7 +45,6 @@ "Name" => "Navn", "Share" => "Del", "Download" => "Download", -"Delete" => "Slet", "Upload too large" => "Upload for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", "Files are being scanned, please wait." => "Filerne bliver indlæst, vent venligst.", diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php index 9c5310c43b..324fae16f0 100644 --- a/apps/files/l10n/de.php +++ b/apps/files/l10n/de.php @@ -1,34 +1,56 @@ "Datei fehlerfrei hochgeladen.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die Größe der hochzuladenden Datei überschreitet die upload_max_filesize-Richtlinie in php.ini", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Die Größe der hochzuladenden Datei überschreitet die MAX_FILE_SIZE-Richtlinie, die im HTML-Formular angegeben wurde", "The uploaded file was only partially uploaded" => "Die Datei wurde nur teilweise hochgeladen.", "No file was uploaded" => "Es wurde keine Datei hochgeladen.", "Missing a temporary folder" => "Temporärer Ordner fehlt.", -"Failed to write to disk" => "Fehler beim Schreiben auf Festplatte", -"Files" => "Files", +"Failed to write to disk" => "Fehler beim Schreiben auf die Festplatte", +"Files" => "Dateien", +"Unshare" => "Nicht mehr teilen", +"Delete" => "Löschen", +"already exists" => "ist bereits vorhanden", +"replace" => "ersetzen", +"suggest name" => "Name vorschlagen", +"cancel" => "abbrechen", +"replaced" => "ersetzt", +"undo" => "rückgängig machen", +"with" => "mit", +"unshared" => "Nicht mehr teilen", +"deleted" => "gelöscht", +"generating ZIP-file, it may take some time." => "Erstelle ZIP-Datei. Dies kann eine Weile dauern.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei kann nicht hochgeladen werden, da sie ein Verzeichnis ist oder 0 Bytes hat.", +"Upload Error" => "Fehler beim Hochladen", +"Pending" => "Ausstehend", +"Upload cancelled." => "Hochladen abgebrochen.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", +"Invalid name, '/' is not allowed." => "Ungültiger Name: \"/\" ist nicht erlaubt.", "Size" => "Größe", "Modified" => "Bearbeitet", +"folder" => "Ordner", +"folders" => "Ordner", +"file" => "Datei", +"files" => "Dateien", "File handling" => "Dateibehandlung", -"Maximum upload size" => "Maximum upload size", +"Maximum upload size" => "Maximale Upload-Größe", "max. possible: " => "maximal möglich:", -"Needed for multi-file and folder downloads." => "Für Mehrfachdateien- und Ordnerdownloads benötigt:", +"Needed for multi-file and folder downloads." => "Für Mehrfachdatei- und Ordnerdownloads benötigt:", "Enable ZIP-download" => "ZIP-Download aktivieren", "0 is unlimited" => "0 bedeutet unbegrenzt", -"Maximum input size for ZIP files" => "Maximale Größe für ZIP Dateien", +"Maximum input size for ZIP files" => "Maximale Größe für ZIP-Dateien", +"Save" => "Speichern", "New" => "Neu", "Text file" => "Textdatei", "Folder" => "Ordner", "From url" => "Von der URL", "Upload" => "Hochladen", "Cancel upload" => "Upload abbrechen", -"Nothing in here. Upload something!" => "Alles leer. Lad’ was hoch!", +"Nothing in here. Upload something!" => "Alles leer. Lade etwas hoch!", "Name" => "Name", "Share" => "Teilen", "Download" => "Herunterladen", -"Delete" => "Löschen", "Upload too large" => "Upload zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", -"Files are being scanned, please wait." => "Daten werden gescannt, bitte warten.", +"Files are being scanned, please wait." => "Dateien werden gescannt, bitte warten.", "Current scanning" => "Scannen" ); diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php index 93be024615..9f311c6b28 100644 --- a/apps/files/l10n/el.php +++ b/apps/files/l10n/el.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Λείπει ένας προσωρινός φάκελος", "Failed to write to disk" => "Η εγγραφή στο δίσκο απέτυχε", "Files" => "Αρχεία", +"Delete" => "Διαγραφή", +"already exists" => "υπάρχει ήδη", +"replace" => "αντικατέστησε", +"cancel" => "ακύρωση", +"replaced" => "αντικαταστάθηκε", +"undo" => "αναίρεση", +"with" => "με", +"deleted" => "διαγράφηκε", +"generating ZIP-file, it may take some time." => "παραγωγή αρχείου ZIP, ίσως διαρκέσει αρκετά.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Αδυναμία στην μεταφόρτωση του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes", +"Upload Error" => "Σφάλμα Μεταφόρτωσης", +"Pending" => "Εν αναμονή", +"Upload cancelled." => "Η μεταφόρτωση ακυρώθηκε.", +"Invalid name, '/' is not allowed." => "Μη έγκυρο όνομα, το '/' δεν επιτρέπεται.", "Size" => "Μέγεθος", "Modified" => "Τροποποιήθηκε", +"folder" => "φάκελος", +"folders" => "φάκελοι", +"file" => "αρχείο", +"files" => "αρχεία", "File handling" => "Διαχείριση αρχείων", "Maximum upload size" => "Μέγιστο μέγεθος μεταφόρτωσης", "max. possible: " => "μέγιστο δυνατό:", @@ -26,7 +44,6 @@ "Name" => "Όνομα", "Share" => "Διαμοίρασε", "Download" => "Λήψη", -"Delete" => "Διαγραφή", "Upload too large" => "Πολύ μεγάλο το αρχείο προς μεταφόρτωση", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν το διακομιστή.", "Files are being scanned, please wait." => "Τα αρχεία ανιχνεύονται, παρακαλώ περιμένετε", diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php index 64c380d600..95df1363ff 100644 --- a/apps/files/l10n/eo.php +++ b/apps/files/l10n/eo.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Mankas tempa dosierujo", "Failed to write to disk" => "Malsukcesis skribo al disko", "Files" => "Dosieroj", +"Unshare" => "Malkunhavigi", +"Delete" => "Forigi", +"already exists" => "jam ekzistas", +"replace" => "anstataŭigi", +"suggest name" => "sugesti nomon", +"cancel" => "nuligi", +"replaced" => "anstataŭigita", +"undo" => "malfari", +"with" => "kun", +"unshared" => "malkunhavigita", +"deleted" => "forigita", +"generating ZIP-file, it may take some time." => "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo", +"Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn", +"Upload Error" => "Alŝuta eraro", +"Pending" => "Traktotaj", +"Upload cancelled." => "La alŝuto nuliĝis.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", +"Invalid name, '/' is not allowed." => "Nevalida nomo, “/” ne estas permesata.", "Size" => "Grando", "Modified" => "Modifita", +"folder" => "dosierujo", +"folders" => "dosierujoj", +"file" => "dosiero", +"files" => "dosieroj", "File handling" => "Dosieradministro", "Maximum upload size" => "Maksimuma alŝutogrando", "max. possible: " => "maks. ebla: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Kapabligi ZIP-elŝuton", "0 is unlimited" => "0 signifas senlime", "Maximum input size for ZIP files" => "Maksimuma enirgrando por ZIP-dosieroj", +"Save" => "Konservi", "New" => "Nova", "Text file" => "Tekstodosiero", "Folder" => "Dosierujo", @@ -26,7 +49,6 @@ "Name" => "Nomo", "Share" => "Kunhavigi", "Download" => "Elŝuti", -"Delete" => "Forigi", "Upload too large" => "Elŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", "Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi.", diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php index 67bfb4702e..d07149d859 100644 --- a/apps/files/l10n/es.php +++ b/apps/files/l10n/es.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Falta un directorio temporal", "Failed to write to disk" => "La escritura en disco ha fallado", "Files" => "Archivos", +"Unshare" => "Dejar de compartir", +"Delete" => "Eliminado", +"already exists" => "ya existe", +"replace" => "reemplazar", +"suggest name" => "sugerir nombre", +"cancel" => "cancelar", +"replaced" => "reemplazado", +"undo" => "deshacer", +"with" => "con", +"unshared" => "no compartido", +"deleted" => "borrado", +"generating ZIP-file, it may take some time." => "generando un fichero ZIP, puede llevar un tiempo.", +"Unable to upload your file as it is a directory or has 0 bytes" => "No ha sido posible subir tu archivo porque es un directorio o tiene 0 bytes", +"Upload Error" => "Error al subir el archivo", +"Pending" => "Pendiente", +"Upload cancelled." => "Subida cancelada.", +"File upload is in progress. Leaving the page now will cancel the upload." => "La subida del archivo está en proceso. Salir de la página ahora cancelará la subida.", +"Invalid name, '/' is not allowed." => "Nombre no válido, '/' no está permitido.", "Size" => "Tamaño", "Modified" => "Modificado", +"folder" => "carpeta", +"folders" => "carpetas", +"file" => "archivo", +"files" => "archivos", "File handling" => "Tratamiento de archivos", "Maximum upload size" => "Tamaño máximo de subida", "max. possible: " => "máx. posible:", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Habilitar descarga en ZIP", "0 is unlimited" => "0 es ilimitado", "Maximum input size for ZIP files" => "Tamaño máximo para archivos ZIP de entrada", +"Save" => "Guardar", "New" => "Nuevo", "Text file" => "Archivo de texto", "Folder" => "Carpeta", @@ -26,7 +49,6 @@ "Name" => "Nombre", "Share" => "Compartir", "Download" => "Descargar", -"Delete" => "Eliminado", "Upload too large" => "El archivo es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor.", "Files are being scanned, please wait." => "Se están escaneando los archivos, por favor espere.", diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php index 89bb96581c..88e9171928 100644 --- a/apps/files/l10n/et_EE.php +++ b/apps/files/l10n/et_EE.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Ajutiste failide kaust puudub", "Failed to write to disk" => "Kettale kirjutamine ebaõnnestus", "Files" => "Failid", +"Unshare" => "Lõpeta jagamine", +"Delete" => "Kustuta", +"already exists" => "on juba olemas", +"replace" => "asenda", +"suggest name" => "soovita nime", +"cancel" => "loobu", +"replaced" => "asendatud", +"undo" => "tagasi", +"with" => "millega", +"unshared" => "jagamata", +"deleted" => "kustutatud", +"generating ZIP-file, it may take some time." => "ZIP-faili loomine, see võib veidi aega võtta.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti", +"Upload Error" => "Üleslaadimise viga", +"Pending" => "Ootel", +"Upload cancelled." => "Üleslaadimine tühistati.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", +"Invalid name, '/' is not allowed." => "Vigane nimi, '/' pole lubatud.", "Size" => "Suurus", "Modified" => "Muudetud", +"folder" => "kaust", +"folders" => "kausta", +"file" => "fail", +"files" => "faili", "File handling" => "Failide käsitlemine", "Maximum upload size" => "Maksimaalne üleslaadimise suurus", "max. possible: " => "maks. võimalik: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Luba ZIP-ina allalaadimine", "0 is unlimited" => "0 tähendab piiramatut", "Maximum input size for ZIP files" => "Maksimaalne ZIP-faili sisestatava faili suurus", +"Save" => "Salvesta", "New" => "Uus", "Text file" => "Tekstifail", "Folder" => "Kaust", @@ -26,7 +49,6 @@ "Name" => "Nimi", "Share" => "Jaga", "Download" => "Lae alla", -"Delete" => "Kustuta", "Upload too large" => "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", "Files are being scanned, please wait." => "Faile skannitakse, palun oota", diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php index a7ca21f496..d72e73adf0 100644 --- a/apps/files/l10n/eu.php +++ b/apps/files/l10n/eu.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Aldi baterako karpeta falta da", "Failed to write to disk" => "Errore bat izan da diskoan idazterakoan", "Files" => "Fitxategiak", +"Unshare" => "Ez partekatu", +"Delete" => "Ezabatu", +"already exists" => "dagoeneko existitzen da", +"replace" => "ordeztu", +"suggest name" => "aholkatu izena", +"cancel" => "ezeztatu", +"replaced" => "ordeztua", +"undo" => "desegin", +"with" => "honekin", +"unshared" => "Ez partekatuta", +"deleted" => "ezabatuta", +"generating ZIP-file, it may take some time." => "ZIP-fitxategia sortzen ari da, denbora har dezake", +"Unable to upload your file as it is a directory or has 0 bytes" => "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu", +"Upload Error" => "Igotzean errore bat suertatu da", +"Pending" => "Zain", +"Upload cancelled." => "Igoera ezeztatuta", +"File upload is in progress. Leaving the page now will cancel the upload." => "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", +"Invalid name, '/' is not allowed." => "Baliogabeko izena, '/' ezin da erabili. ", "Size" => "Tamaina", "Modified" => "Aldatuta", +"folder" => "karpeta", +"folders" => "Karpetak", +"file" => "fitxategia", +"files" => "fitxategiak", "File handling" => "Fitxategien kudeaketa", "Maximum upload size" => "Igo daitekeen gehienezko tamaina", "max. possible: " => "max, posiblea:", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Gaitu ZIP-deskarga", "0 is unlimited" => "0 mugarik gabe esan nahi du", "Maximum input size for ZIP files" => "ZIP fitxategien gehienezko tamaina", +"Save" => "Gorde", "New" => "Berria", "Text file" => "Testu fitxategia", "Folder" => "Karpeta", @@ -26,7 +49,6 @@ "Name" => "Izena", "Share" => "Elkarbanatu", "Download" => "Deskargatu", -"Delete" => "Ezabatu", "Upload too large" => "Igotakoa handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", "Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez.", diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php index 4bb46e1fcf..e6ddd50f91 100644 --- a/apps/files/l10n/fa.php +++ b/apps/files/l10n/fa.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "یک پوشه موقت گم شده است", "Failed to write to disk" => "نوشتن بر روی دیسک سخت ناموفق بود", "Files" => "فایل ها", +"Delete" => "پاک کردن", +"already exists" => "وجود دارد", +"replace" => "جایگزین", +"cancel" => "لغو", +"replaced" => "جایگزین‌شده", +"undo" => "بازگشت", +"with" => "همراه", +"deleted" => "حذف شده", +"generating ZIP-file, it may take some time." => "در حال ساخت فایل فشرده ممکن است زمان زیادی به طول بیانجامد", +"Unable to upload your file as it is a directory or has 0 bytes" => "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد", +"Upload Error" => "خطا در بار گذاری", +"Pending" => "در انتظار", +"Upload cancelled." => "بار گذاری لغو شد", +"Invalid name, '/' is not allowed." => "نام نامناسب '/' غیرفعال است", "Size" => "اندازه", "Modified" => "تغییر یافته", +"folder" => "پوشه", +"folders" => "پوشه ها", +"file" => "پرونده", +"files" => "پرونده ها", "File handling" => "اداره پرونده ها", "Maximum upload size" => "حداکثر اندازه بارگزاری", "max. possible: " => "حداکثرمقدارممکن:", @@ -26,7 +44,6 @@ "Name" => "نام", "Share" => "به اشتراک گذاری", "Download" => "بارگیری", -"Delete" => "پاک کردن", "Upload too large" => "حجم بارگذاری بسیار زیاد است", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", "Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید", diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php index c99d4408f6..757d0594d3 100644 --- a/apps/files/l10n/fi_FI.php +++ b/apps/files/l10n/fi_FI.php @@ -7,14 +7,36 @@ "Missing a temporary folder" => "Väliaikaiskansiota ei ole olemassa", "Failed to write to disk" => "Levylle kirjoitus epäonnistui", "Files" => "Tiedostot", +"Delete" => "Poista", +"already exists" => "on jo olemassa", +"replace" => "korvaa", +"suggest name" => "ehdota nimeä", +"cancel" => "peru", +"replaced" => "korvattu", +"undo" => "kumoa", +"with" => "käyttäen", +"deleted" => "poistettu", +"generating ZIP-file, it may take some time." => "luodaan ZIP-tiedostoa, tämä saattaa kestää hetken.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio", +"Upload Error" => "Lähetysvirhe.", +"Pending" => "Odottaa", +"Upload cancelled." => "Lähetys peruttu.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", +"Invalid name, '/' is not allowed." => "Virheellinen nimi, merkki '/' ei ole sallittu.", "Size" => "Koko", "Modified" => "Muutettu", +"folder" => "kansio", +"folders" => "kansiota", +"file" => "tiedosto", +"files" => "tiedostoa", "File handling" => "Tiedostonhallinta", "Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko", +"max. possible: " => "suurin mahdollinen:", "Needed for multi-file and folder downloads." => "Tarvitaan useampien tiedostojen ja kansioiden latausta varten.", "Enable ZIP-download" => "Ota ZIP-paketin lataaminen käytöön", "0 is unlimited" => "0 on rajoittamaton", "Maximum input size for ZIP files" => "ZIP-tiedostojen enimmäiskoko", +"Save" => "Tallenna", "New" => "Uusi", "Text file" => "Tekstitiedosto", "Folder" => "Kansio", @@ -25,8 +47,8 @@ "Name" => "Nimi", "Share" => "Jaa", "Download" => "Lataa", -"Delete" => "Poista", "Upload too large" => "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", -"Files are being scanned, please wait." => "Tiedostoja tarkistetaan, odota hetki." +"Files are being scanned, please wait." => "Tiedostoja tarkistetaan, odota hetki.", +"Current scanning" => "Tämänhetkinen tutkinta" ); diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php index ab2f4ea13d..c0f08b118d 100644 --- a/apps/files/l10n/fr.php +++ b/apps/files/l10n/fr.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Il manque un répertoire temporaire", "Failed to write to disk" => "Erreur d'écriture sur le disque", "Files" => "Fichiers", +"Unshare" => "Ne plus partager", +"Delete" => "Supprimer", +"already exists" => "existe déjà", +"replace" => "remplacer", +"suggest name" => "Suggérer un nom", +"cancel" => "annuler", +"replaced" => "remplacé", +"undo" => "annuler", +"with" => "avec", +"unshared" => "non partagée", +"deleted" => "supprimé", +"generating ZIP-file, it may take some time." => "Fichier ZIP en cours d'assemblage ; cela peut prendre du temps.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible de charger vos fichiers car il s'agit d'un dossier ou le fichier fait 0 octet.", +"Upload Error" => "Erreur de chargement", +"Pending" => "En cours", +"Upload cancelled." => "Chargement annulé.", +"File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", +"Invalid name, '/' is not allowed." => "Nom invalide, '/' n'est pas autorisé.", "Size" => "Taille", "Modified" => "Modifié", +"folder" => "dossier", +"folders" => "dossiers", +"file" => "fichier", +"files" => "fichiers", "File handling" => "Gestion des fichiers", "Maximum upload size" => "Taille max. d'envoi", "max. possible: " => "Max. possible :", @@ -16,19 +38,19 @@ "Enable ZIP-download" => "Activer le téléchargement ZIP", "0 is unlimited" => "0 est illimité", "Maximum input size for ZIP files" => "Taille maximale pour les fichiers ZIP", +"Save" => "Sauvegarder", "New" => "Nouveau", "Text file" => "Fichier texte", "Folder" => "Dossier", "From url" => "Depuis URL", "Upload" => "Envoyer", -"Cancel upload" => "Annuler envoi", +"Cancel upload" => "Annuler l'envoi", "Nothing in here. Upload something!" => "Il n'y a rien ici ! Envoyez donc quelque chose :)", "Name" => "Nom", "Share" => "Partager", "Download" => "Téléchargement", -"Delete" => "Supprimer", "Upload too large" => "Fichier trop volumineux", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.", -"Files are being scanned, please wait." => "Les fichiers sont analysés, patientez svp.", +"Files are being scanned, please wait." => "Les fichiers sont en cours d'analyse, veuillez patienter.", "Current scanning" => "Analyse en cours" ); diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php index 36eafaefe2..67293de5cb 100644 --- a/apps/files/l10n/gl.php +++ b/apps/files/l10n/gl.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Falta un cartafol temporal", "Failed to write to disk" => "Erro ao escribir no disco", "Files" => "Ficheiros", +"Delete" => "Eliminar", +"already exists" => "xa existe", +"replace" => "substituír", +"cancel" => "cancelar", +"replaced" => "substituído", +"undo" => "desfacer", +"with" => "con", +"deleted" => "eliminado", +"generating ZIP-file, it may take some time." => "xerando ficheiro ZIP, pode levar un anaco.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes", +"Upload Error" => "Erro na subida", +"Pending" => "Pendentes", +"Upload cancelled." => "Subida cancelada.", +"Invalid name, '/' is not allowed." => "Nome non válido, '/' non está permitido.", "Size" => "Tamaño", "Modified" => "Modificado", +"folder" => "cartafol", +"folders" => "cartafoles", +"file" => "ficheiro", +"files" => "ficheiros", "File handling" => "Manexo de ficheiro", "Maximum upload size" => "Tamaño máximo de envío", "max. possible: " => "máx. posible: ", @@ -26,7 +44,6 @@ "Name" => "Nome", "Share" => "Compartir", "Download" => "Descargar", -"Delete" => "Eliminar", "Upload too large" => "Envío demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor", "Files are being scanned, please wait." => "Estanse analizando os ficheiros, espere por favor.", diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php index 0876eb952c..65d093e366 100644 --- a/apps/files/l10n/he.php +++ b/apps/files/l10n/he.php @@ -7,8 +7,19 @@ "Missing a temporary folder" => "תיקייה זמנית חסרה", "Failed to write to disk" => "הכתיבה לכונן נכשלה", "Files" => "קבצים", +"Delete" => "מחיקה", +"generating ZIP-file, it may take some time." => "יוצר קובץ ZIP, אנא המתן.", +"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים", +"Upload Error" => "שגיאת העלאה", +"Pending" => "ממתין", +"Upload cancelled." => "ההעלאה בוטלה.", +"Invalid name, '/' is not allowed." => "שם לא חוקי, '/' אסור לשימוש.", "Size" => "גודל", "Modified" => "זמן שינוי", +"folder" => "תקיה", +"folders" => "תקיות", +"file" => "קובץ", +"files" => "קבצים", "File handling" => "טיפול בקבצים", "Maximum upload size" => "גודל העלאה מקסימלי", "max. possible: " => "המרבי האפשרי: ", @@ -26,7 +37,6 @@ "Name" => "שם", "Share" => "שיתוף", "Download" => "הורדה", -"Delete" => "מחיקה", "Upload too large" => "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", "Files are being scanned, please wait." => "הקבצים נסרקים, נא להמתין.", diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php index 3281d20a61..b05b7c568b 100644 --- a/apps/files/l10n/hr.php +++ b/apps/files/l10n/hr.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Nedostaje privremena mapa", "Failed to write to disk" => "Neuspjelo pisanje na disk", "Files" => "Datoteke", +"Delete" => "Briši", +"already exists" => "već postoji", +"replace" => "zamjeni", +"cancel" => "odustani", +"replaced" => "zamjenjeno", +"undo" => "vrati", +"with" => "sa", +"deleted" => "izbrisano", +"generating ZIP-file, it may take some time." => "generiranje ZIP datoteke, ovo može potrajati.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij", +"Upload Error" => "Pogreška pri slanju", +"Pending" => "U tijeku", +"Upload cancelled." => "Slanje poništeno.", +"Invalid name, '/' is not allowed." => "Neispravan naziv, znak '/' nije dozvoljen.", "Size" => "Veličina", "Modified" => "Zadnja promjena", +"folder" => "mapa", +"folders" => "mape", +"file" => "datoteka", +"files" => "datoteke", "File handling" => "datoteka za rukovanje", "Maximum upload size" => "Maksimalna veličina prijenosa", "max. possible: " => "maksimalna moguća: ", @@ -26,7 +44,6 @@ "Name" => "Naziv", "Share" => "podjeli", "Download" => "Preuzmi", -"Delete" => "Briši", "Upload too large" => "Prijenos je preobiman", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.", "Files are being scanned, please wait." => "Datoteke se skeniraju, molimo pričekajte.", diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php index 41255cb409..95b3c57ce1 100644 --- a/apps/files/l10n/hu_HU.php +++ b/apps/files/l10n/hu_HU.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár", "Failed to write to disk" => "Nem írható lemezre", "Files" => "Fájlok", +"Delete" => "Törlés", +"already exists" => "már létezik", +"replace" => "cserél", +"cancel" => "mégse", +"replaced" => "kicserélve", +"undo" => "visszavon", +"with" => "-val/-vel", +"deleted" => "törölve", +"generating ZIP-file, it may take some time." => "ZIP-fájl generálása, ez eltarthat egy ideig.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű", +"Upload Error" => "Feltöltési hiba", +"Pending" => "Folyamatban", +"Upload cancelled." => "Feltöltés megszakítva", +"Invalid name, '/' is not allowed." => "Érvénytelen név, a '/' nem megengedett", "Size" => "Méret", "Modified" => "Módosítva", +"folder" => "mappa", +"folders" => "mappák", +"file" => "fájl", +"files" => "fájlok", "File handling" => "Fájlkezelés", "Maximum upload size" => "Maximális feltölthető fájlméret", "max. possible: " => "max. lehetséges", @@ -26,7 +44,6 @@ "Name" => "Név", "Share" => "Megosztás", "Download" => "Letöltés", -"Delete" => "Törlés", "Upload too large" => "Feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren.", "Files are being scanned, please wait." => "File-ok vizsgálata, kis türelmet", diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php index 645eba48a1..f9205cb5f6 100644 --- a/apps/files/l10n/ia.php +++ b/apps/files/l10n/ia.php @@ -2,6 +2,7 @@ "The uploaded file was only partially uploaded" => "Le file incargate solmente esseva incargate partialmente", "No file was uploaded" => "Nulle file esseva incargate", "Files" => "Files", +"Delete" => "Deler", "Size" => "Dimension", "Modified" => "Modificate", "Maximum upload size" => "Dimension maxime de incargamento", @@ -12,6 +13,5 @@ "Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!", "Name" => "Nomine", "Download" => "Discargar", -"Delete" => "Deler", "Upload too large" => "Incargamento troppo longe" ); diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php index 1f9dc3290a..351d064138 100644 --- a/apps/files/l10n/id.php +++ b/apps/files/l10n/id.php @@ -1,12 +1,32 @@ "Tidak ada galat, berkas sukses diunggah", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "File yang diunggah melampaui directive upload_max_filesize di php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "File yang diunggah melampaui directive MAX_FILE_SIZE yang disebutan dalam form HTML.", "The uploaded file was only partially uploaded" => "Berkas hanya diunggah sebagian", "No file was uploaded" => "Tidak ada berkas yang diunggah", "Missing a temporary folder" => "Kehilangan folder temporer", "Failed to write to disk" => "Gagal menulis ke disk", "Files" => "Berkas", +"Delete" => "Hapus", +"already exists" => "sudah ada", +"replace" => "mengganti", +"cancel" => "batalkan", +"replaced" => "diganti", +"undo" => "batal dikerjakan", +"with" => "dengan", +"deleted" => "dihapus", +"generating ZIP-file, it may take some time." => "membuat berkas ZIP, ini mungkin memakan waktu.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Gagal mengunggah berkas anda karena berupa direktori atau mempunyai ukuran 0 byte", +"Upload Error" => "Terjadi Galat Pengunggahan", +"Pending" => "Menunggu", +"Upload cancelled." => "Pengunggahan dibatalkan.", +"Invalid name, '/' is not allowed." => "Kesalahan nama, '/' tidak diijinkan.", "Size" => "Ukuran", "Modified" => "Dimodifikasi", +"folder" => "folder", +"folders" => "folder-folder", +"file" => "berkas", +"files" => "berkas-berkas", "File handling" => "Penanganan berkas", "Maximum upload size" => "Ukuran unggah maksimum", "max. possible: " => "Kemungkinan maks:", @@ -24,7 +44,6 @@ "Name" => "Nama", "Share" => "Bagikan", "Download" => "Unduh", -"Delete" => "Hapus", "Upload too large" => "Unggahan terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang anda coba unggah melebihi ukuran maksimum untuk pengunggahan berkas di server ini.", "Files are being scanned, please wait." => "Berkas sedang dipindai, silahkan tunggu.", diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php index 82871826c1..c7046118a3 100644 --- a/apps/files/l10n/it.php +++ b/apps/files/l10n/it.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Cartella temporanea mancante", "Failed to write to disk" => "Scrittura su disco non riuscita", "Files" => "File", +"Unshare" => "Rimuovi condivisione", +"Delete" => "Elimina", +"already exists" => "esiste già", +"replace" => "sostituisci", +"suggest name" => "suggerisci nome", +"cancel" => "annulla", +"replaced" => "sostituito", +"undo" => "annulla", +"with" => "con", +"unshared" => "condivisione rimossa", +"deleted" => "eliminati", +"generating ZIP-file, it may take some time." => "creazione file ZIP, potrebbe richiedere del tempo.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile inviare il file poiché è una cartella o ha dimensione 0 byte", +"Upload Error" => "Errore di invio", +"Pending" => "In corso", +"Upload cancelled." => "Invio annullato", +"File upload is in progress. Leaving the page now will cancel the upload." => "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", +"Invalid name, '/' is not allowed." => "Nome non valido", "Size" => "Dimensione", "Modified" => "Modificato", +"folder" => "cartella", +"folders" => "cartelle", +"file" => "file", +"files" => "file", "File handling" => "Gestione file", "Maximum upload size" => "Dimensione massima upload", "max. possible: " => "numero mass.: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Abilita scaricamento ZIP", "0 is unlimited" => "0 è illimitato", "Maximum input size for ZIP files" => "Dimensione massima per i file ZIP", +"Save" => "Salva", "New" => "Nuovo", "Text file" => "File di testo", "Folder" => "Cartella", @@ -26,7 +49,6 @@ "Name" => "Nome", "Share" => "Condividi", "Download" => "Scarica", -"Delete" => "Elimina", "Upload too large" => "Il file caricato è troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", "Files are being scanned, please wait." => "Scansione dei file in corso, attendi", diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php index c04d0836df..6d278c3f0f 100644 --- a/apps/files/l10n/ja_JP.php +++ b/apps/files/l10n/ja_JP.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "テンポラリフォルダが見つかりません", "Failed to write to disk" => "ディスクへの書き込みに失敗しました", "Files" => "ファイル", +"Unshare" => "共有しない", +"Delete" => "削除", +"already exists" => "既に存在します", +"replace" => "置き換え", +"suggest name" => "推奨名称", +"cancel" => "キャンセル", +"replaced" => "置換:", +"undo" => "元に戻す", +"with" => "←", +"unshared" => "未共有", +"deleted" => "削除", +"generating ZIP-file, it may take some time." => "ZIPファイルを生成中です、しばらくお待ちください。", +"Unable to upload your file as it is a directory or has 0 bytes" => "アップロード使用としているファイルがディレクトリ、もしくはサイズが0バイトのため、アップロードできません。", +"Upload Error" => "アップロードエラー", +"Pending" => "保留", +"Upload cancelled." => "アップロードはキャンセルされました。", +"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。", +"Invalid name, '/' is not allowed." => "無効な名前、'/' は使用できません。", "Size" => "サイズ", "Modified" => "更新日時", +"folder" => "フォルダ", +"folders" => "フォルダ", +"file" => "ファイル", +"files" => "ファイル", "File handling" => "ファイル操作", "Maximum upload size" => "最大アップロードサイズ", "max. possible: " => "最大容量: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "ZIP形式のダウンロードを有効にする", "0 is unlimited" => "0を指定した場合は無制限", "Maximum input size for ZIP files" => "ZIPファイルへの最大入力サイズ", +"Save" => "保存", "New" => "新規", "Text file" => "テキストファイル", "Folder" => "フォルダ", @@ -26,7 +49,6 @@ "Name" => "名前", "Share" => "共有", "Download" => "ダウンロード", -"Delete" => "削除", "Upload too large" => "ファイルサイズが大きすぎます", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。", "Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。", diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php index 70575f0975..121be7d1ab 100644 --- a/apps/files/l10n/ko.php +++ b/apps/files/l10n/ko.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "임시 폴더가 사라짐", "Failed to write to disk" => "디스크에 쓰지 못했습니다", "Files" => "파일", +"Delete" => "삭제", +"already exists" => "이미 존재 합니다", +"replace" => "대체", +"cancel" => "취소", +"replaced" => "대체됨", +"undo" => "복구", +"with" => "와", +"deleted" => "삭제", +"generating ZIP-file, it may take some time." => "ZIP파일 생성에 시간이 걸릴 수 있습니다.", +"Unable to upload your file as it is a directory or has 0 bytes" => "이 파일은 디렉토리이거나 0 바이트이기 때문에 업로드 할 수 없습니다.", +"Upload Error" => "업로드 에러", +"Pending" => "보류 중", +"Upload cancelled." => "업로드 취소.", +"Invalid name, '/' is not allowed." => "잘못된 이름, '/' 은 허용이 되지 않습니다.", "Size" => "크기", "Modified" => "수정됨", +"folder" => "폴더", +"folders" => "폴더", +"file" => "파일", +"files" => "파일", "File handling" => "파일 처리", "Maximum upload size" => "최대 업로드 크기", "max. possible: " => "최대. 가능한:", @@ -26,7 +44,6 @@ "Name" => "이름", "Share" => "공유", "Download" => "다운로드", -"Delete" => "삭제", "Upload too large" => "업로드 용량 초과", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", "Files are being scanned, please wait." => "파일을 검색중입니다, 기다려 주십시오.", diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php index 548ef4895d..92acea1d11 100644 --- a/apps/files/l10n/lb.php +++ b/apps/files/l10n/lb.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Et feelt en temporären Dossier", "Failed to write to disk" => "Konnt net op den Disk schreiwen", "Files" => "Dateien", +"Delete" => "Läschen", +"already exists" => "existéiert schonn", +"replace" => "ersetzen", +"cancel" => "ofbriechen", +"replaced" => "ersat", +"undo" => "réckgängeg man", +"with" => "mat", +"deleted" => "geläscht", +"generating ZIP-file, it may take some time." => "Et gëtt eng ZIP-File generéiert, dëst ka bëssen daueren.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Kann deng Datei net eroplueden well et en Dossier ass oder 0 byte grouss ass.", +"Upload Error" => "Fehler beim eroplueden", +"Upload cancelled." => "Upload ofgebrach.", +"File upload is in progress. Leaving the page now will cancel the upload." => "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", +"Invalid name, '/' is not allowed." => "Ongültege Numm, '/' net erlaabt.", "Size" => "Gréisst", "Modified" => "Geännert", +"folder" => "Dossier", +"folders" => "Dossieren", +"file" => "Datei", +"files" => "Dateien", "File handling" => "Fichier handling", "Maximum upload size" => "Maximum Upload Gréisst ", "max. possible: " => "max. méiglech:", @@ -26,7 +44,6 @@ "Name" => "Numm", "Share" => "Share", "Download" => "Eroflueden", -"Delete" => "Läschen", "Upload too large" => "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", "Files are being scanned, please wait." => "Fichieren gi gescannt, war weg.", diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php index e876e743a4..90b0314307 100644 --- a/apps/files/l10n/lt_LT.php +++ b/apps/files/l10n/lt_LT.php @@ -7,9 +7,25 @@ "Missing a temporary folder" => "Nėra laikinojo katalogo", "Failed to write to disk" => "Nepavyko įrašyti į diską", "Files" => "Failai", +"Delete" => "Ištrinti", +"cancel" => "atšaukti", +"generating ZIP-file, it may take some time." => "kuriamas ZIP archyvas, tai gali užtrukti šiek tiek laiko.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas", +"Upload Error" => "Įkėlimo klaida", +"Pending" => "Laukiantis", +"Upload cancelled." => "Įkėlimas atšauktas.", +"Invalid name, '/' is not allowed." => "Pavadinime negali būti naudojamas ženklas \"/\".", "Size" => "Dydis", "Modified" => "Pakeista", -"Maximum upload size" => "Maksimalus failo dydis", +"folder" => "katalogas", +"folders" => "katalogai", +"file" => "failas", +"files" => "failai", +"File handling" => "Failų tvarkymas", +"Maximum upload size" => "Maksimalus įkeliamo failo dydis", +"Enable ZIP-download" => "Įjungti atsisiuntimą ZIP archyvu", +"0 is unlimited" => "0 yra neribotas", +"Maximum input size for ZIP files" => "Maksimalus ZIP archyvo failo dydis", "New" => "Naujas", "Text file" => "Teksto failas", "Folder" => "Katalogas", @@ -20,7 +36,8 @@ "Name" => "Pavadinimas", "Share" => "Dalintis", "Download" => "Atsisiųsti", -"Delete" => "Ištrinti", "Upload too large" => "Įkėlimui failas per didelis", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje" +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje", +"Files are being scanned, please wait." => "Skenuojami failai, prašome palaukti.", +"Current scanning" => "Šiuo metu skenuojama" ); diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php new file mode 100644 index 0000000000..eedab2546c --- /dev/null +++ b/apps/files/l10n/lv.php @@ -0,0 +1,42 @@ + "Neviens fails netika augšuplādēts", +"Failed to write to disk" => "Nav iespējams saglabāt", +"Files" => "Faili", +"Delete" => "Izdzēst", +"already exists" => "tāds fails jau eksistē", +"replace" => "aizvietot", +"cancel" => "atcelt", +"replaced" => "aizvietots", +"undo" => "vienu soli atpakaļ", +"with" => "ar", +"deleted" => "izdzests", +"generating ZIP-file, it may take some time." => "lai uzģenerētu ZIP failu, kāds brīdis ir jāpagaida", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nav iespējams augšuplādēt jūsu failu, jo tāds jau eksistē vai arī failam nav izmēra (0 baiti)", +"Upload Error" => "Augšuplādēšanas laikā radās kļūda", +"Pending" => "Gaida savu kārtu", +"Upload cancelled." => "Augšuplāde ir atcelta", +"Invalid name, '/' is not allowed." => "Šis simbols '/', nav atļauts.", +"Size" => "Izmērs", +"Modified" => "Izmainīts", +"folder" => "mape", +"folders" => "mapes", +"file" => "fails", +"files" => "faili", +"Maximum upload size" => "Maksimālais failu augšuplādes apjoms", +"max. possible: " => "maksīmālais iespējamais:", +"Enable ZIP-download" => "Iespējot ZIP lejuplādi", +"0 is unlimited" => "0 ir neierobežots", +"New" => "Jauns", +"Text file" => "Teksta fails", +"Folder" => "Mape", +"From url" => "No URL saites", +"Upload" => "Augšuplādet", +"Cancel upload" => "Atcelt augšuplādi", +"Nothing in here. Upload something!" => "Te vēl nekas nav. Rīkojies, sāc augšuplādēt", +"Name" => "Nosaukums", +"Share" => "Līdzdalīt", +"Download" => "Lejuplādēt", +"Upload too large" => "Fails ir par lielu lai to augšuplādetu", +"Files are being scanned, please wait." => "Faili šobrīd tiek caurskatīti, nedaudz jāpagaida.", +"Current scanning" => "Šobrīd tiek pārbaudīti" +); diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php index d3efa4d022..4e1eccff25 100644 --- a/apps/files/l10n/mk.php +++ b/apps/files/l10n/mk.php @@ -7,8 +7,19 @@ "Missing a temporary folder" => "Не постои привремена папка", "Failed to write to disk" => "Неуспеав да запишам на диск", "Files" => "Датотеки", +"Delete" => "Избриши", +"generating ZIP-file, it may take some time." => "Се генерира ZIP фајлот, ќе треба извесно време.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти", +"Upload Error" => "Грешка при преземање", +"Pending" => "Чека", +"Upload cancelled." => "Преземањето е прекинато.", +"Invalid name, '/' is not allowed." => "неисправно име, '/' не е дозволено.", "Size" => "Големина", "Modified" => "Променето", +"folder" => "фолдер", +"folders" => "фолдери", +"file" => "датотека", +"files" => "датотеки", "File handling" => "Ракување со датотеки", "Maximum upload size" => "Максимална големина за подигање", "max. possible: " => "макс. можно:", @@ -26,7 +37,6 @@ "Name" => "Име", "Share" => "Сподели", "Download" => "Преземи", -"Delete" => "Избриши", "Upload too large" => "Датотеката е премногу голема", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", "Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте.", diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php index 1a1d72a01b..de472a7c65 100644 --- a/apps/files/l10n/ms_MY.php +++ b/apps/files/l10n/ms_MY.php @@ -5,18 +5,46 @@ "The uploaded file was only partially uploaded" => "Sebahagian daripada fail telah dimuat naik. ", "No file was uploaded" => "Tiada fail yang dimuat naik", "Missing a temporary folder" => "Folder sementara hilang", +"Failed to write to disk" => "Gagal untuk disimpan", "Files" => "fail", +"Delete" => "Padam", +"already exists" => "Sudah wujud", +"replace" => "ganti", +"cancel" => "Batal", +"replaced" => "diganti", +"with" => "dengan", +"deleted" => "dihapus", +"generating ZIP-file, it may take some time." => "sedang menghasilkan fail ZIP, mungkin mengambil sedikit masa.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes", +"Upload Error" => "Muat naik ralat", +"Pending" => "Dalam proses", +"Upload cancelled." => "Muatnaik dibatalkan.", +"Invalid name, '/' is not allowed." => "penggunaa nama tidak sah, '/' tidak dibenarkan.", "Size" => "Saiz", "Modified" => "Dimodifikasi", +"folder" => "direktori", +"folders" => "direktori", +"file" => "fail", +"files" => "fail", +"File handling" => "Pengendalian fail", "Maximum upload size" => "Saiz maksimum muat naik", +"max. possible: " => "maksimum:", +"Needed for multi-file and folder downloads." => "Diperlukan untuk muatturun fail pelbagai ", +"Enable ZIP-download" => "Aktifkan muatturun ZIP", +"0 is unlimited" => "0 adalah tanpa had", +"Maximum input size for ZIP files" => "Saiz maksimum input untuk fail ZIP", "New" => "Baru", "Text file" => "Fail teks", "Folder" => "Folder", +"From url" => "Dari url", "Upload" => "Muat naik", +"Cancel upload" => "Batal muat naik", "Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!", "Name" => "Nama ", +"Share" => "Kongsi", "Download" => "Muat turun", -"Delete" => "Padam", "Upload too large" => "Muat naik terlalu besar", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server" +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", +"Files are being scanned, please wait." => "Fail sedang diimbas, harap bersabar.", +"Current scanning" => "Imbasan semasa" ); diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php index 0f4cc33ae3..6331de6d45 100644 --- a/apps/files/l10n/nb_NO.php +++ b/apps/files/l10n/nb_NO.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Mangler en midlertidig mappe", "Failed to write to disk" => "Klarte ikke å skrive til disk", "Files" => "Filer", +"Delete" => "Slett", +"already exists" => "eksisterer allerede", +"replace" => "erstatt", +"cancel" => "avbryt", +"replaced" => "erstattet", +"undo" => "angre", +"with" => "med", +"deleted" => "slettet", +"generating ZIP-file, it may take some time." => "opprettet ZIP-fil, dette kan ta litt tid", +"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke laste opp filen din siden det er en mappe eller den har 0 bytes", +"Upload Error" => "Opplasting feilet", +"Pending" => "Ventende", +"Upload cancelled." => "Opplasting avbrutt.", +"Invalid name, '/' is not allowed." => "Ugyldig navn, '/' er ikke tillatt. ", "Size" => "Størrelse", "Modified" => "Endret", +"folder" => "mappe", +"folders" => "mapper", +"file" => "fil", +"files" => "filer", "File handling" => "Filhåndtering", "Maximum upload size" => "Maksimum opplastingsstørrelse", "max. possible: " => "max. mulige:", @@ -16,6 +34,7 @@ "Enable ZIP-download" => "Aktiver nedlasting av ZIP", "0 is unlimited" => "0 er ubegrenset", "Maximum input size for ZIP files" => "Maksimal størrelse på ZIP-filer", +"Save" => "Lagre", "New" => "Ny", "Text file" => "Tekstfil", "Folder" => "Mappe", @@ -26,7 +45,6 @@ "Name" => "Navn", "Share" => "Del", "Download" => "Last ned", -"Delete" => "Slett", "Upload too large" => "Opplasting for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.", "Files are being scanned, please wait." => "Skanner etter filer, vennligst vent.", diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php index 119f6034f1..b54c96bd9a 100644 --- a/apps/files/l10n/nl.php +++ b/apps/files/l10n/nl.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Een tijdelijke map mist", "Failed to write to disk" => "Schrijven naar schijf mislukt", "Files" => "Bestanden", +"Unshare" => "Stop delen", +"Delete" => "Verwijder", +"already exists" => "bestaat al", +"replace" => "vervang", +"suggest name" => "Stel een naam voor", +"cancel" => "annuleren", +"replaced" => "vervangen", +"undo" => "ongedaan maken", +"with" => "door", +"unshared" => "niet gedeeld", +"deleted" => "verwijderd", +"generating ZIP-file, it may take some time." => "aanmaken ZIP-file, dit kan enige tijd duren.", +"Unable to upload your file as it is a directory or has 0 bytes" => "uploaden van de file mislukt, het is of een directory of de bestandsgrootte is 0 bytes", +"Upload Error" => "Upload Fout", +"Pending" => "Wachten", +"Upload cancelled." => "Uploaden geannuleerd.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Bestands upload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", +"Invalid name, '/' is not allowed." => "Ongeldige naam, '/' is niet toegestaan.", "Size" => "Bestandsgrootte", "Modified" => "Laatst aangepast", +"folder" => "map", +"folders" => "mappen", +"file" => "bestand", +"files" => "bestanden", "File handling" => "Bestand", "Maximum upload size" => "Maximale bestandsgrootte voor uploads", "max. possible: " => "max. mogelijk: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Zet ZIP-download aan", "0 is unlimited" => "0 is ongelimiteerd", "Maximum input size for ZIP files" => "Maximale grootte voor ZIP bestanden", +"Save" => "Opslaan", "New" => "Nieuw", "Text file" => "Tekstbestand", "Folder" => "Map", @@ -26,7 +49,6 @@ "Name" => "Naam", "Share" => "Delen", "Download" => "Download", -"Delete" => "Verwijder", "Upload too large" => "Bestanden te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", "Files are being scanned, please wait." => "Bestanden worden gescand, even wachten.", diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php index 002e85de5c..d6af730249 100644 --- a/apps/files/l10n/nn_NO.php +++ b/apps/files/l10n/nn_NO.php @@ -6,6 +6,7 @@ "No file was uploaded" => "Ingen filer vart lasta opp", "Missing a temporary folder" => "Manglar ei mellombels mappe", "Files" => "Filer", +"Delete" => "Slett", "Size" => "Storleik", "Modified" => "Endra", "Maximum upload size" => "Maksimal opplastingsstorleik", @@ -16,7 +17,6 @@ "Nothing in here. Upload something!" => "Ingenting her. Last noko opp!", "Name" => "Namn", "Download" => "Last ned", -"Delete" => "Slett", "Upload too large" => "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er større enn maksgrensa til denne tenaren." ); diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php index bfdd04659d..289a613915 100644 --- a/apps/files/l10n/pl.php +++ b/apps/files/l10n/pl.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Brak katalogu tymczasowego", "Failed to write to disk" => "Błąd zapisu na dysk", "Files" => "Pliki", +"Unshare" => "Nie udostępniaj", +"Delete" => "Usuwa element", +"already exists" => "Już istnieje", +"replace" => "zastap", +"suggest name" => "zasugeruj nazwę", +"cancel" => "anuluj", +"replaced" => "zastąpione", +"undo" => "wróć", +"with" => "z", +"unshared" => "Nie udostępnione", +"deleted" => "skasuj", +"generating ZIP-file, it may take some time." => "Generowanie pliku ZIP, może potrwać pewien czas.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nie można wczytać pliku jeśli jest katalogiem lub ma 0 bajtów", +"Upload Error" => "Błąd wczytywania", +"Pending" => "Oczekujące", +"Upload cancelled." => "Wczytywanie anulowane.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Teraz opuszczając stronę wysyłanie zostanie anulowane.", +"Invalid name, '/' is not allowed." => "Nieprawidłowa nazwa '/' jest niedozwolone.", "Size" => "Rozmiar", "Modified" => "Czas modyfikacji", +"folder" => "folder", +"folders" => "foldery", +"file" => "plik", +"files" => "pliki", "File handling" => "Zarządzanie plikami", "Maximum upload size" => "Maksymalny rozmiar wysyłanego pliku", "max. possible: " => "max. możliwych", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Włącz pobieranie ZIP-paczki", "0 is unlimited" => "0 jest nielimitowane", "Maximum input size for ZIP files" => "Maksymalna wielkość pliku wejściowego ZIP ", +"Save" => "Zapisz", "New" => "Nowy", "Text file" => "Plik tekstowy", "Folder" => "Katalog", @@ -26,7 +49,6 @@ "Name" => "Nazwa", "Share" => "Współdziel", "Download" => "Pobiera element", -"Delete" => "Usuwa element", "Upload too large" => "Wysyłany plik ma za duży rozmiar", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki które próbujesz przesłać, przekraczają maksymalną, dopuszczalną wielkość.", "Files are being scanned, please wait." => "Skanowanie plików, proszę czekać.", diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php index b70406f517..e9fe7747c1 100644 --- a/apps/files/l10n/pt_BR.php +++ b/apps/files/l10n/pt_BR.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Pasta temporária não encontrada", "Failed to write to disk" => "Falha ao escrever no disco", "Files" => "Arquivos", +"Delete" => "Excluir", +"already exists" => "já existe", +"replace" => "substituir", +"cancel" => "cancelar", +"replaced" => "substituido ", +"undo" => "desfazer", +"with" => "com", +"deleted" => "deletado", +"generating ZIP-file, it may take some time." => "gerando arquivo ZIP, isso pode levar um tempo.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes.", +"Upload Error" => "Erro de envio", +"Pending" => "Pendente", +"Upload cancelled." => "Envio cancelado.", +"Invalid name, '/' is not allowed." => "Nome inválido, '/' não é permitido.", "Size" => "Tamanho", "Modified" => "Modificado", +"folder" => "pasta", +"folders" => "pastas", +"file" => "arquivo", +"files" => "arquivos", "File handling" => "Tratamento de Arquivo", "Maximum upload size" => "Tamanho máximo para carregar", "max. possible: " => "max. possível:", @@ -26,7 +44,6 @@ "Name" => "Nome", "Share" => "Compartilhar", "Download" => "Baixar", -"Delete" => "Excluir", "Upload too large" => "Arquivo muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.", diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php index ac22430282..998c494a69 100644 --- a/apps/files/l10n/pt_PT.php +++ b/apps/files/l10n/pt_PT.php @@ -7,8 +7,26 @@ "Missing a temporary folder" => "Falta uma pasta temporária", "Failed to write to disk" => "Falhou a escrita no disco", "Files" => "Ficheiros", +"Delete" => "Apagar", +"already exists" => "Já existe", +"replace" => "substituir", +"cancel" => "cancelar", +"replaced" => "substituido", +"undo" => "desfazer", +"with" => "com", +"deleted" => "apagado", +"generating ZIP-file, it may take some time." => "a gerar o ficheiro ZIP, poderá demorar algum tempo.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Não é possivel fazer o upload do ficheiro devido a ser uma pasta ou ter 0 bytes", +"Upload Error" => "Erro no upload", +"Pending" => "Pendente", +"Upload cancelled." => "O upload foi cancelado.", +"Invalid name, '/' is not allowed." => "nome inválido, '/' não permitido.", "Size" => "Tamanho", "Modified" => "Modificado", +"folder" => "pasta", +"folders" => "pastas", +"file" => "ficheiro", +"files" => "ficheiros", "File handling" => "Manuseamento de ficheiros", "Maximum upload size" => "Tamanho máximo de envio", "max. possible: " => "max. possivel: ", @@ -26,7 +44,6 @@ "Name" => "Nome", "Share" => "Partilhar", "Download" => "Transferir", -"Delete" => "Apagar", "Upload too large" => "Envio muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiro que estás a tentar enviar excedem o tamanho máximo de envio neste servidor.", "Files are being scanned, please wait." => "Os ficheiros estão a ser analisados, por favor aguarde.", diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php index e6f0294fd3..58a6d2454f 100644 --- a/apps/files/l10n/ro.php +++ b/apps/files/l10n/ro.php @@ -7,6 +7,7 @@ "Missing a temporary folder" => "Lipsește un dosar temporar", "Failed to write to disk" => "Eroare la scriere pe disc", "Files" => "Fișiere", +"Delete" => "Șterge", "Size" => "Dimensiune", "Modified" => "Modificat", "File handling" => "Manipulare fișiere", @@ -26,7 +27,6 @@ "Name" => "Nume", "Share" => "Partajează", "Download" => "Descarcă", -"Delete" => "Șterge", "Upload too large" => "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.", "Files are being scanned, please wait." => "Fișierele sunt scanate, te rog așteptă.", diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php index 45648012a1..61091790af 100644 --- a/apps/files/l10n/ru.php +++ b/apps/files/l10n/ru.php @@ -7,28 +7,50 @@ "Missing a temporary folder" => "Невозможно найти временную папку", "Failed to write to disk" => "Ошибка записи на диск", "Files" => "Файлы", +"Unshare" => "Отменить публикацию", +"Delete" => "Удалить", +"already exists" => "уже существует", +"replace" => "заменить", +"suggest name" => "предложить название", +"cancel" => "отмена", +"replaced" => "заменён", +"undo" => "отмена", +"with" => "с", +"unshared" => "публикация отменена", +"deleted" => "удален", +"generating ZIP-file, it may take some time." => "создание ZIP-файла, это может занять некоторое время.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Не удается загрузить файл размером 0 байт в каталог", +"Upload Error" => "Ошибка загрузки", +"Pending" => "Ожидание", +"Upload cancelled." => "Загрузка отменена.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Файл в процессе загрузки. Покинув страницу вы прервёте загрузку.", +"Invalid name, '/' is not allowed." => "Неверное имя, '/' не допускается.", "Size" => "Размер", -"Modified" => "Изменен", +"Modified" => "Изменён", +"folder" => "папка", +"folders" => "папки", +"file" => "файл", +"files" => "файлы", "File handling" => "Управление файлами", -"Maximum upload size" => "Максимальный размер файла", +"Maximum upload size" => "Максимальный размер загружаемого файла", "max. possible: " => "макс. возможно: ", -"Needed for multi-file and folder downloads." => "Требуется для загрузки нескольких файорв и папок", -"Enable ZIP-download" => "Включить ZIP-загрузку", +"Needed for multi-file and folder downloads." => "Требуется для скачивания нескольких файлов и папок", +"Enable ZIP-download" => "Включить ZIP-скачивание", "0 is unlimited" => "0 - без ограничений", "Maximum input size for ZIP files" => "Максимальный исходный размер для ZIP файлов", +"Save" => "Сохранить", "New" => "Новый", "Text file" => "Текстовый файл", "Folder" => "Папка", "From url" => "С url", -"Upload" => "Закачать", -"Cancel upload" => "Отмена закачки", -"Nothing in here. Upload something!" => "Здесь ничего нет. Закачайте что-нибудь!", +"Upload" => "Загрузить", +"Cancel upload" => "Отмена загрузки", +"Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", "Name" => "Название", -"Share" => "Поделиться", +"Share" => "Опубликовать", "Download" => "Скачать", -"Delete" => "Удалить", "Upload too large" => "Файл слишком большой", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые Вы пытаетесь закачать, превышают лимит для файлов на этом сервере.", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые Вы пытаетесь загрузить, превышают лимит для файлов на этом сервере.", "Files are being scanned, please wait." => "Подождите, файлы сканируются.", "Current scanning" => "Текущее сканирование" ); diff --git a/apps/files/l10n/ru_RU.php b/apps/files/l10n/ru_RU.php new file mode 100644 index 0000000000..d272d9580d --- /dev/null +++ b/apps/files/l10n/ru_RU.php @@ -0,0 +1,38 @@ + "Ошибка отсутствует, файл загружен успешно.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Размер загруженного файла превышает заданный в директиве upload_max_filesize в php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Размер загруженного", +"The uploaded file was only partially uploaded" => "Загружаемый файл был загружен частично", +"No file was uploaded" => "Файл не был загружен", +"Missing a temporary folder" => "Отсутствует временная папка", +"Failed to write to disk" => "Не удалось записать на диск", +"Files" => "Файлы", +"Delete" => "Удалить", +"already exists" => "уже существует", +"replace" => "отмена", +"cancel" => "отменить", +"replaced" => "заменено", +"undo" => "отменить действие", +"with" => "с", +"deleted" => "удалено", +"Upload Error" => "Ошибка загрузки", +"Upload cancelled." => "Загрузка отменена", +"Invalid name, '/' is not allowed." => "Неправильное имя, '/' не допускается.", +"Size" => "Размер", +"Modified" => "Изменен", +"File handling" => "Работа с файлами", +"Maximum upload size" => "Максимальный размер загружаемого файла", +"max. possible: " => "Максимально возможный", +"Save" => "Сохранить", +"New" => "Новый", +"Text file" => "Текстовый файл", +"Folder" => "Папка", +"Upload" => "Загрузить ", +"Cancel upload" => "Отмена загрузки", +"Nothing in here. Upload something!" => "Здесь ничего нет. Загрузите что-нибудь!", +"Name" => "Имя", +"Download" => "Загрузить", +"Upload too large" => "Загрузка слишком велика", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Размер файлов, которые Вы пытаетесь загрузить, превышает максимально допустимый размер для загрузки на данный сервер.", +"Current scanning" => "Текущее сканирование" +); diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php index 2a7e84af6c..8a31c55032 100644 --- a/apps/files/l10n/sk_SK.php +++ b/apps/files/l10n/sk_SK.php @@ -7,8 +7,19 @@ "Missing a temporary folder" => "Chýbajúci dočasný priečinok", "Failed to write to disk" => "Zápis na disk sa nepodaril", "Files" => "Súbory", +"Delete" => "Odstrániť", +"generating ZIP-file, it may take some time." => "generujem ZIP-súbor, môže to chvíľu trvať.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nemôžem nahrať súbor lebo je to priečinok alebo má 0 bajtov.", +"Upload Error" => "Chyba nahrávania", +"Pending" => "Čaká sa", +"Upload cancelled." => "Nahrávanie zrušené", +"Invalid name, '/' is not allowed." => "Chybný názov, \"/\" nie je povolené", "Size" => "Veľkosť", "Modified" => "Upravené", +"folder" => "priečinok", +"folders" => "priečinky", +"file" => "súbor", +"files" => "súbory", "File handling" => "Nastavenie správanie k súborom", "Maximum upload size" => "Maximálna veľkosť nahratia", "max. possible: " => "najväčšie možné:", @@ -26,7 +37,6 @@ "Name" => "Meno", "Share" => "Zdielať", "Download" => "Stiahnuť", -"Delete" => "Odstrániť", "Upload too large" => "Nahrávanie príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre nahratie súborov na tento server.", "Files are being scanned, please wait." => "Súbory sa práve prehľadávajú, prosím čakajte.", diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php index b0ea2dc373..1a7ae8c0b1 100644 --- a/apps/files/l10n/sl.php +++ b/apps/files/l10n/sl.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "Manjka začasna mapa", "Failed to write to disk" => "Pisanje na disk je spodletelo", "Files" => "Datoteke", +"Unshare" => "Odstrani iz souporabe", +"Delete" => "Izbriši", +"already exists" => "že obstaja", +"replace" => "nadomesti", +"suggest name" => "predlagaj ime", +"cancel" => "ekliči", +"replaced" => "nadomeščen", +"undo" => "razveljavi", +"with" => "z", +"unshared" => "odstranjeno iz souporabe", +"deleted" => "izbrisano", +"generating ZIP-file, it may take some time." => "Ustvarjam ZIP datoteko. To lahko traja nekaj časa.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Nalaganje ni mogoče, saj gre za mapo, ali pa ima datoteka velikost 0 bajtov.", +"Upload Error" => "Napaka pri nalaganju", +"Pending" => "Na čakanju", +"Upload cancelled." => "Nalaganje je bilo preklicano.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Nalaganje datoteke je v teku. Če zapustite to stran zdaj, boste nalaganje preklicali.", +"Invalid name, '/' is not allowed." => "Neveljavno ime. Znak '/' ni dovoljen.", "Size" => "Velikost", "Modified" => "Spremenjeno", +"folder" => "mapa", +"folders" => "mape", +"file" => "datoteka", +"files" => "datoteke", "File handling" => "Rokovanje z datotekami", "Maximum upload size" => "Največja velikost za nalaganje", "max. possible: " => "največ mogoče:", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "Omogoči ZIP-prejemanje", "0 is unlimited" => "0 je neskončno", "Maximum input size for ZIP files" => "Največja vhodna velikost za ZIP datoteke", +"Save" => "Shrani", "New" => "Nova", "Text file" => "Besedilna datoteka", "Folder" => "Mapa", @@ -25,8 +48,7 @@ "Nothing in here. Upload something!" => "Tukaj ni ničesar. Naložite kaj!", "Name" => "Ime", "Share" => "Souporaba", -"Download" => "Prejmi", -"Delete" => "Izbriši", +"Download" => "Prenesi", "Upload too large" => "Nalaganje ni mogoče, ker je preveliko", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku.", "Files are being scanned, please wait." => "Preiskujem datoteke, prosimo počakajte.", diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php index 68c50d5282..84164e25c6 100644 --- a/apps/files/l10n/sr.php +++ b/apps/files/l10n/sr.php @@ -6,6 +6,7 @@ "No file was uploaded" => "Ниједан фајл није послат", "Missing a temporary folder" => "Недостаје привремена фасцикла", "Files" => "Фајлови", +"Delete" => "Обриши", "Size" => "Величина", "Modified" => "Задња измена", "Maximum upload size" => "Максимална величина пошиљке", @@ -16,7 +17,6 @@ "Nothing in here. Upload something!" => "Овде нема ничег. Пошаљите нешто!", "Name" => "Име", "Download" => "Преузми", -"Delete" => "Обриши", "Upload too large" => "Пошиљка је превелика", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу." ); diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php index 63843fc8b5..96c567aec4 100644 --- a/apps/files/l10n/sr@latin.php +++ b/apps/files/l10n/sr@latin.php @@ -6,6 +6,7 @@ "No file was uploaded" => "Nijedan fajl nije poslat", "Missing a temporary folder" => "Nedostaje privremena fascikla", "Files" => "Fajlovi", +"Delete" => "Obriši", "Size" => "Veličina", "Modified" => "Zadnja izmena", "Maximum upload size" => "Maksimalna veličina pošiljke", @@ -13,7 +14,6 @@ "Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!", "Name" => "Ime", "Download" => "Preuzmi", -"Delete" => "Obriši", "Upload too large" => "Pošiljka je prevelika", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru." ); diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php index f508f22f3c..06d988d451 100644 --- a/apps/files/l10n/sv.php +++ b/apps/files/l10n/sv.php @@ -2,20 +2,43 @@ "There is no error, the file uploaded with success" => "Inga fel uppstod. Filen laddades upp utan problem", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HTML-formulär", -"The uploaded file was only partially uploaded" => "Den uppladdade filen var endast delvist uppladdad", +"The uploaded file was only partially uploaded" => "Den uppladdade filen var endast delvis uppladdad", "No file was uploaded" => "Ingen fil blev uppladdad", "Missing a temporary folder" => "Saknar en tillfällig mapp", "Failed to write to disk" => "Misslyckades spara till disk", "Files" => "Filer", +"Unshare" => "Sluta dela", +"Delete" => "Radera", +"already exists" => "finns redan", +"replace" => "ersätt", +"suggest name" => "föreslå namn", +"cancel" => "avbryt", +"replaced" => "ersatt", +"undo" => "ångra", +"with" => "med", +"unshared" => "Ej delad", +"deleted" => "raderad", +"generating ZIP-file, it may take some time." => "genererar ZIP-fil, det kan ta lite tid.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Kunde inte ladda upp dina filer eftersom det antingen är en mapp eller har 0 bytes.", +"Upload Error" => "Uppladdningsfel", +"Pending" => "Väntar", +"Upload cancelled." => "Uppladdning avbruten.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", +"Invalid name, '/' is not allowed." => "Ogiltigt namn, '/' är inte tillåten.", "Size" => "Storlek", "Modified" => "Ändrad", +"folder" => "mapp", +"folders" => "mappar", +"file" => "fil", +"files" => "filer", "File handling" => "Filhantering", "Maximum upload size" => "Maximal storlek att ladda upp", "max. possible: " => "max. möjligt:", -"Needed for multi-file and folder downloads." => "Krävs för nerladdning av flera mappar och filer", +"Needed for multi-file and folder downloads." => "Krävs för nerladdning av flera mappar och filer.", "Enable ZIP-download" => "Aktivera ZIP-nerladdning", -"0 is unlimited" => "0 är lika med oändligt", -"Maximum input size for ZIP files" => "Största tillåtna storlek för ZIP filer", +"0 is unlimited" => "0 är oändligt", +"Maximum input size for ZIP files" => "Största tillåtna storlek för ZIP-filer", +"Save" => "Spara", "New" => "Ny", "Text file" => "Textfil", "Folder" => "Mapp", @@ -25,10 +48,9 @@ "Nothing in here. Upload something!" => "Ingenting här. Ladda upp något!", "Name" => "Namn", "Share" => "Dela", -"Download" => "Ladda ned", -"Delete" => "Ta bort", +"Download" => "Ladda ner", "Upload too large" => "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", -"Files are being scanned, please wait." => "Filerna skannas, var god vänta", -"Current scanning" => "Aktuell avsökning" +"Files are being scanned, please wait." => "Filer skannas, var god vänta", +"Current scanning" => "Aktuell skanning" ); diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php index ec538262e0..2208051236 100644 --- a/apps/files/l10n/th_TH.php +++ b/apps/files/l10n/th_TH.php @@ -7,8 +7,30 @@ "Missing a temporary folder" => "แฟ้มเอกสารชั่วคราวเกิดการสูญหาย", "Failed to write to disk" => "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว", "Files" => "ไฟล์", +"Unshare" => "ยกเลิกการแชร์ข้อมูล", +"Delete" => "ลบ", +"already exists" => "มีอยู่แล้ว", +"replace" => "แทนที่", +"suggest name" => "แนะนำชื่อ", +"cancel" => "ยกเลิก", +"replaced" => "แทนที่แล้ว", +"undo" => "เลิกทำ", +"with" => "กับ", +"unshared" => "ยกเลิกการแชร์ข้อมูลแล้ว", +"deleted" => "ลบแล้ว", +"generating ZIP-file, it may take some time." => "กำลังสร้างไฟล์บีบอัด ZIP อาจใช้เวลาสักครู่", +"Unable to upload your file as it is a directory or has 0 bytes" => "ไม่สามารถอัพโหลดไฟล์ของคุณได้ เนื่องจากไฟล์ดังกล่าวเป็นไดเร็กทอรี่หรือมีขนาด 0 ไบต์", +"Upload Error" => "เกิดข้อผิดพลาดในการอัพโหลด", +"Pending" => "อยู่ระหว่างดำเนินการ", +"Upload cancelled." => "การอัพโหลดถูกยกเลิก", +"File upload is in progress. Leaving the page now will cancel the upload." => "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", +"Invalid name, '/' is not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง '/' ไม่อนุญาตให้ใช้งาน", "Size" => "ขนาด", "Modified" => "ปรับปรุงล่าสุด", +"folder" => "โฟลเดอร์", +"folders" => "โฟลเดอร์", +"file" => "ไฟล์", +"files" => "ไฟล์", "File handling" => "การจัดกาไฟล์", "Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้", "max. possible: " => "จำนวนสูงสุดที่สามารถทำได้: ", @@ -16,6 +38,7 @@ "Enable ZIP-download" => "อนุญาตให้ดาวน์โหลดเป็นไฟล์ ZIP ได้", "0 is unlimited" => "0 หมายถึงไม่จำกัด", "Maximum input size for ZIP files" => "ขนาดไฟล์ ZIP สูงสุด", +"Save" => "บันทึก", "New" => "อัพโหลดไฟล์ใหม่", "Text file" => "ไฟล์ข้อความ", "Folder" => "แฟ้มเอกสาร", @@ -26,7 +49,6 @@ "Name" => "ชื่อ", "Share" => "แชร์", "Download" => "ดาวน์โหลด", -"Delete" => "ลบ", "Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", "Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php index b8de8249a1..72e0e1427d 100644 --- a/apps/files/l10n/tr.php +++ b/apps/files/l10n/tr.php @@ -7,8 +7,27 @@ "Missing a temporary folder" => "Geçici bir klasör eksik", "Failed to write to disk" => "Diske yazılamadı", "Files" => "Dosyalar", +"Delete" => "Sil", +"already exists" => "zaten mevcut", +"replace" => "değiştir", +"cancel" => "iptal", +"replaced" => "değiştirildi", +"undo" => "geri al", +"with" => "ile", +"deleted" => "silindi", +"generating ZIP-file, it may take some time." => "ZIP dosyası oluşturuluyor, biraz sürebilir.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi", +"Upload Error" => "Yükleme hatası", +"Pending" => "Bekliyor", +"Upload cancelled." => "Yükleme iptal edildi.", +"File upload is in progress. Leaving the page now will cancel the upload." => "Dosya yükleme işlemi sürüyor. Şimdi sayfadan ayrılırsanız işleminiz iptal olur.", +"Invalid name, '/' is not allowed." => "Geçersiz isim, '/' işaretine izin verilmiyor.", "Size" => "Boyut", "Modified" => "Değiştirilme", +"folder" => "dizin", +"folders" => "dizinler", +"file" => "dosya", +"files" => "dosyalar", "File handling" => "Dosya taşıma", "Maximum upload size" => "Maksimum yükleme boyutu", "max. possible: " => "mümkün olan en fazla: ", @@ -26,7 +45,6 @@ "Name" => "Ad", "Share" => "Paylaş", "Download" => "İndir", -"Delete" => "Sil", "Upload too large" => "Yüklemeniz çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.", "Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.", diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php index 8b21cb26a3..dc7e9d18b7 100644 --- a/apps/files/l10n/uk.php +++ b/apps/files/l10n/uk.php @@ -6,17 +6,36 @@ "No file was uploaded" => "Не відвантажено жодного файлу", "Missing a temporary folder" => "Відсутній тимчасовий каталог", "Files" => "Файли", +"Delete" => "Видалити", +"undo" => "відмінити", +"deleted" => "видалені", +"generating ZIP-file, it may take some time." => "Створення ZIP-файлу, це може зайняти певний час.", +"Unable to upload your file as it is a directory or has 0 bytes" => "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт", +"Upload Error" => "Помилка завантаження", +"Pending" => "Очікування", +"Upload cancelled." => "Завантаження перервано.", +"Invalid name, '/' is not allowed." => "Некоректне ім'я, '/' не дозволено.", "Size" => "Розмір", "Modified" => "Змінено", +"folder" => "тека", +"folders" => "теки", +"file" => "файл", +"files" => "файли", "Maximum upload size" => "Максимальний розмір відвантажень", +"max. possible: " => "макс.можливе:", +"0 is unlimited" => "0 є безліміт", "New" => "Створити", "Text file" => "Текстовий файл", "Folder" => "Папка", +"From url" => "З URL", "Upload" => "Відвантажити", +"Cancel upload" => "Перервати завантаження", "Nothing in here. Upload something!" => "Тут нічого немає. Відвантажте що-небудь!", "Name" => "Ім'я", +"Share" => "Поділитися", "Download" => "Завантажити", -"Delete" => "Видалити", "Upload too large" => "Файл занадто великий", -"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері." +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", +"Files are being scanned, please wait." => "Файли скануються, зачекайте, будь-ласка.", +"Current scanning" => "Поточне сканування" ); diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php new file mode 100644 index 0000000000..ce7e0c219a --- /dev/null +++ b/apps/files/l10n/vi.php @@ -0,0 +1,54 @@ + "Không có lỗi, các tập tin đã được tải lên thành công", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Những tập tin được tải lên vượt quá upload_max_filesize được chỉ định trong php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Kích thước những tập tin tải lên vượt quá MAX_FILE_SIZE đã được quy định", +"The uploaded file was only partially uploaded" => "Tập tin tải lên mới chỉ tải lên được một phần", +"No file was uploaded" => "Không có tập tin nào được tải lên", +"Missing a temporary folder" => "Không tìm thấy thư mục tạm", +"Failed to write to disk" => "Không thể ghi vào đĩa cứng", +"Files" => "Tập tin", +"Unshare" => "Không chia sẽ", +"Delete" => "Xóa", +"already exists" => "đã tồn tại", +"replace" => "thay thế", +"suggest name" => "tên gợi ý", +"cancel" => "hủy", +"replaced" => "đã được thay thế", +"undo" => "lùi lại", +"with" => "với", +"deleted" => "đã xóa", +"generating ZIP-file, it may take some time." => "Tạo tập tinh ZIP, điều này có thể mất một ít thời gian", +"Unable to upload your file as it is a directory or has 0 bytes" => "Không thể tải lên tập tin này do nó là một thư mục hoặc kích thước tập tin bằng 0 byte", +"Upload Error" => "Tải lên lỗi", +"Pending" => "Chờ", +"Upload cancelled." => "Hủy tải lên", +"File upload is in progress. Leaving the page now will cancel the upload." => "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", +"Invalid name, '/' is not allowed." => "Tên không hợp lệ ,không được phép dùng '/'", +"Size" => "Kích cỡ", +"Modified" => "Thay đổi", +"folder" => "folder", +"folders" => "folders", +"file" => "file", +"files" => "files", +"File handling" => "Xử lý tập tin", +"Maximum upload size" => "Kích thước tối đa ", +"Needed for multi-file and folder downloads." => "Cần thiết cho tải nhiều tập tin và thư mục.", +"Enable ZIP-download" => "Cho phép ZIP-download", +"0 is unlimited" => "0 là không giới hạn", +"Maximum input size for ZIP files" => "Kích thước tối đa cho các tập tin ZIP", +"Save" => "Lưu", +"New" => "Mới", +"Text file" => "Tập tin văn bản", +"Folder" => "Folder", +"From url" => "Từ url", +"Upload" => "Tải lên", +"Cancel upload" => "Hủy upload", +"Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !", +"Name" => "Tên", +"Share" => "Chia sẻ", +"Download" => "Tải xuống", +"Upload too large" => "File tải lên quá lớn", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Các tập tin bạn đang cố gắng tải lên vượt quá kích thước tối đa cho phép trên máy chủ này.", +"Files are being scanned, please wait." => "Tập tin đang được quét ,vui lòng chờ.", +"Current scanning" => "Hiện tại đang quét" +); diff --git a/apps/files/l10n/zh_CN.GB2312.php b/apps/files/l10n/zh_CN.GB2312.php new file mode 100644 index 0000000000..42063712ea --- /dev/null +++ b/apps/files/l10n/zh_CN.GB2312.php @@ -0,0 +1,51 @@ + "没有任何错误,文件上传成功了", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件超过了php.ini指定的upload_max_filesize", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件超过了HTML表单指定的MAX_FILE_SIZE", +"The uploaded file was only partially uploaded" => "文件只有部分被上传", +"No file was uploaded" => "没有上传完成的文件", +"Missing a temporary folder" => "丢失了一个临时文件夹", +"Failed to write to disk" => "写磁盘失败", +"Files" => "文件", +"Delete" => "删除", +"already exists" => "已经存在了", +"replace" => "替换", +"cancel" => "取消", +"replaced" => "替换过了", +"undo" => "撤销", +"with" => "随着", +"deleted" => "删除", +"generating ZIP-file, it may take some time." => "正在生成ZIP文件,这可能需要点时间", +"Unable to upload your file as it is a directory or has 0 bytes" => "不能上传你指定的文件,可能因为它是个文件夹或者大小为0", +"Upload Error" => "上传错误", +"Pending" => "Pending", +"Upload cancelled." => "上传取消了", +"Invalid name, '/' is not allowed." => "非法文件名,\"/\"是不被许可的", +"Size" => "大小", +"Modified" => "修改日期", +"folder" => "文件夹", +"folders" => "文件夹", +"file" => "文件", +"files" => "文件", +"File handling" => "文件处理中", +"Maximum upload size" => "最大上传大小", +"max. possible: " => "最大可能", +"Needed for multi-file and folder downloads." => "需要多文件和文件夹下载.", +"Enable ZIP-download" => "支持ZIP下载", +"0 is unlimited" => "0是无限的", +"Maximum input size for ZIP files" => "最大的ZIP文件输入大小", +"New" => "新建", +"Text file" => "文本文档", +"Folder" => "文件夹", +"From url" => "从URL:", +"Upload" => "上传", +"Cancel upload" => "取消上传", +"Nothing in here. Upload something!" => "这里没有东西.上传点什么!", +"Name" => "名字", +"Share" => "分享", +"Download" => "下载", +"Upload too large" => "上传的文件太大了", +"The files you are trying to upload exceed the maximum size for file uploads on this server." => "你正在试图上传的文件超过了此服务器支持的最大的文件大小.", +"Files are being scanned, please wait." => "正在扫描文件,请稍候.", +"Current scanning" => "正在扫描" +); diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php index c2e6541f2a..3fdb5b6af3 100644 --- a/apps/files/l10n/zh_CN.php +++ b/apps/files/l10n/zh_CN.php @@ -7,8 +7,28 @@ "Missing a temporary folder" => "缺少临时目录", "Failed to write to disk" => "写入磁盘失败", "Files" => "文件", +"Delete" => "删除", +"already exists" => "已经存在", +"replace" => "替换", +"suggest name" => "建议名称", +"cancel" => "取消", +"replaced" => "已经替换", +"undo" => "撤销", +"with" => "随着", +"deleted" => "已经删除", +"generating ZIP-file, it may take some time." => "正在生成 ZIP 文件,可能需要一些时间", +"Unable to upload your file as it is a directory or has 0 bytes" => "无法上传文件,因为它是一个目录或者大小为 0 字节", +"Upload Error" => "上传错误", +"Pending" => "操作等待中", +"Upload cancelled." => "上传已取消", +"File upload is in progress. Leaving the page now will cancel the upload." => "文件正在上传中。现在离开此页会导致上传动作被取消。", +"Invalid name, '/' is not allowed." => "非法的名称,不允许使用‘/’。", "Size" => "大小", "Modified" => "修改日期", +"folder" => "文件夹", +"folders" => "文件夹", +"file" => "文件", +"files" => "文件", "File handling" => "文件处理", "Maximum upload size" => "最大上传大小", "max. possible: " => "最大可能: ", @@ -16,6 +36,7 @@ "Enable ZIP-download" => "启用 ZIP 下载", "0 is unlimited" => "0 为无限制", "Maximum input size for ZIP files" => "ZIP 文件的最大输入大小", +"Save" => "保存", "New" => "新建", "Text file" => "文本文件", "Folder" => "文件夹", @@ -26,7 +47,6 @@ "Name" => "名称", "Share" => "共享", "Download" => "下载", -"Delete" => "删除", "Upload too large" => "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大大小", "Files are being scanned, please wait." => "文件正在被扫描,请稍候。", diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php index 91a1344ca3..9652fb5a07 100644 --- a/apps/files/l10n/zh_TW.php +++ b/apps/files/l10n/zh_TW.php @@ -7,6 +7,16 @@ "Missing a temporary folder" => "遺失暫存資料夾", "Failed to write to disk" => "寫入硬碟失敗", "Files" => "檔案", +"Delete" => "刪除", +"already exists" => "已經存在", +"replace" => "取代", +"cancel" => "取消", +"generating ZIP-file, it may take some time." => "產生壓縮檔, 它可能需要一段時間.", +"Unable to upload your file as it is a directory or has 0 bytes" => "無法上傳您的檔案因為它可能是一個目錄或檔案大小為0", +"Upload Error" => "上傳發生錯誤", +"Upload cancelled." => "上傳取消", +"File upload is in progress. Leaving the page now will cancel the upload." => "檔案上傳中. 離開此頁面將會取消上傳.", +"Invalid name, '/' is not allowed." => "無效的名稱, '/'是不被允許的", "Size" => "大小", "Modified" => "修改", "File handling" => "檔案處理", @@ -26,7 +36,6 @@ "Name" => "名稱", "Share" => "分享", "Download" => "下載", -"Delete" => "刪除", "Upload too large" => "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." => "你試圖上傳的檔案已超過伺服器的最大容量限制。 ", "Files are being scanned, please wait." => "正在掃描檔案,請稍等。", diff --git a/apps/files/settings.php b/apps/files/settings.php index cd6dd8c161..52ec9fd0fe 100644 --- a/apps/files/settings.php +++ b/apps/files/settings.php @@ -23,7 +23,7 @@ // Init owncloud - + // Check if we are a user OCP\User::checkLoggedIn(); @@ -36,7 +36,7 @@ OCP\Util::addscript( "files", "files" ); $dir = isset( $_GET['dir'] ) ? $_GET['dir'] : ''; $files = array(); -foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ +foreach( OC_Files::getdirectorycontent( $dir ) as $i ) { $i["date"] = date( $CONFIG_DATEFORMAT, $i["mtime"] ); $files[] = $i; } @@ -44,8 +44,8 @@ foreach( OC_Files::getdirectorycontent( $dir ) as $i ){ // Make breadcrumb $breadcrumb = array(); $pathtohere = "/"; -foreach( explode( "/", $dir ) as $i ){ - if( $i != "" ){ +foreach( explode( "/", $dir ) as $i ) { + if( $i != "" ) { $pathtohere .= "$i/"; $breadcrumb[] = array( "dir" => $pathtohere, "name" => $i ); } diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php index 23021ec664..c4fe4c8656 100644 --- a/apps/files/templates/admin.php +++ b/apps/files/templates/admin.php @@ -11,9 +11,6 @@ ' title="t( '0 is unlimited' ); ?>" />
    - + - - - diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index 44000171a1..911a312fb9 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -1,8 +1,8 @@
    - -
    + +
    t('New');?>
    - +
    t('Nothing in here. Upload something!')?>
    @@ -43,7 +44,7 @@ - + t( 'Name' ); ?> @@ -53,10 +54,20 @@ t( 'Size' ); ?> - t( 'Modified' ); ?>t('Delete')?> <?php echo $l->t('Delete')?>" /> + + t( 'Modified' ); ?> + + + + t('Unshare')?> <?php echo $l->t('Unshare')?>" /> + + t('Delete')?> <?php echo $l->t('Delete')?>" /> + + + - + diff --git a/apps/files/templates/part.breadcrumb.php b/apps/files/templates/part.breadcrumb.php index 22d9bb4490..875fc747bb 100644 --- a/apps/files/templates/part.breadcrumb.php +++ b/apps/files/templates/part.breadcrumb.php @@ -1,6 +1,6 @@
    svg" data-dir='' style='background-image:url("")'> - "> + ">
    diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index 4506630c16..8faeae3939 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -1,5 +1,4 @@ - ' data-write=''> + ' data-permissions=''> diff --git a/apps/files_archive/appinfo/app.php b/apps/files_archive/appinfo/app.php deleted file mode 100644 index 67376c4a03..0000000000 --- a/apps/files_archive/appinfo/app.php +++ /dev/null @@ -1,13 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OC::$CLASSPATH['OC_Filestorage_Archive']='apps/files_archive/lib/storage.php'; - -OCP\Util::connectHook('OC_Filesystem','get_mountpoint','OC_Filestorage_Archive','autoMount'); - -OCP\Util::addscript( 'files_archive', 'archive' ); diff --git a/apps/files_archive/appinfo/info.xml b/apps/files_archive/appinfo/info.xml deleted file mode 100644 index 93ec68ee10..0000000000 --- a/apps/files_archive/appinfo/info.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - files_archive - Archive support - Transparent opening of archives - AGPL - Robin Appelman - 4 - true - - - - - diff --git a/apps/files_archive/appinfo/version b/apps/files_archive/appinfo/version deleted file mode 100644 index 2f4536184b..0000000000 --- a/apps/files_archive/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.2 \ No newline at end of file diff --git a/apps/files_archive/js/archive.js b/apps/files_archive/js/archive.js deleted file mode 100644 index 9fb9853e29..0000000000 --- a/apps/files_archive/js/archive.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2012 Robin Appelman - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - FileActions.register('application/zip','Open','',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); - }); - FileActions.setDefault('application/zip','Open'); - FileActions.register('application/x-gzip','Open','',function(filename){ - window.location=OC.linkTo('files', 'index.php')+'&dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); - }); - FileActions.setDefault('application/x-gzip','Open'); - } -}); diff --git a/apps/files_archive/lib/storage.php b/apps/files_archive/lib/storage.php deleted file mode 100644 index 8676166361..0000000000 --- a/apps/files_archive/lib/storage.php +++ /dev/null @@ -1,146 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class OC_Filestorage_Archive extends OC_Filestorage_Common{ - /** - * underlying local storage used for missing functions - * @var OC_Archive - */ - private $archive; - private $path; - private static $mounted=array(); - private static $enableAutomount=true; - private static $rootView; - - private function stripPath($path){//files should never start with / - if(!$path || $path[0]=='/'){ - $path=substr($path,1); - } - return $path; - } - - public function __construct($params){ - $this->archive=OC_Archive::open($params['archive']); - $this->path=$params['archive']; - } - - public function mkdir($path){ - $path=$this->stripPath($path); - return $this->archive->addFolder($path); - } - public function rmdir($path){ - $path=$this->stripPath($path); - return $this->archive->remove($path.'/'); - } - public function opendir($path){ - $path=$this->stripPath($path); - $content=$this->archive->getFolder($path); - foreach($content as &$file){ - if(substr($file,-1)=='/'){ - $file=substr($file,0,-1); - } - } - $id=md5($this->path.$path); - OC_FakeDirStream::$dirs[$id]=$content; - return opendir('fakedir://'.$id); - } - public function stat($path){ - $ctime=filectime($this->path); - $path=$this->stripPath($path); - if($path==''){ - $stat=stat($this->path); - }else{ - if($this->is_dir($path)){ - $stat=array('size'=>0); - $stat['mtime']=filemtime($this->path); - }else{ - $stat=array(); - $stat['mtime']=$this->archive->mtime($path); - $stat['size']=$this->archive->filesize($path); - } - } - $stat['ctime']=$ctime; - return $stat; - } - public function filetype($path){ - $path=$this->stripPath($path); - if($path==''){ - return 'dir'; - } - if(substr($path,-1)=='/'){ - return $this->archive->fileExists($path)?'dir':'file'; - }else{ - return $this->archive->fileExists($path.'/')?'dir':'file'; - } - } - public function is_readable($path){ - return is_readable($this->path); - } - public function is_writable($path){ - return is_writable($this->path); - } - public function file_exists($path){ - $path=$this->stripPath($path); - if($path==''){ - return file_exists($this->path); - } - return $this->archive->fileExists($path); - } - public function unlink($path){ - $path=$this->stripPath($path); - return $this->archive->remove($path); - } - public function fopen($path,$mode){ - $path=$this->stripPath($path); - return $this->archive->getStream($path,$mode); - } - public function free_space($path){ - return 0; - } - public function touch($path, $mtime=null){ - if(is_null($mtime)){ - $tmpFile=OCP\Files::tmpFile(); - $this->archive->extractFile($path,$tmpFile); - $this->archive->addfile($path,$tmpFile); - }else{ - return false;//not supported - } - } - - /** - * automount paths from file hooks - * @param aray params - */ - public static function autoMount($params){ - if(!self::$enableAutomount){ - return; - } - $path=$params['path']; - if(!self::$rootView){ - self::$rootView=new OC_FilesystemView(''); - } - self::$enableAutomount=false;//prevent recursion - $supported=array('zip','tar.gz','tar.bz2','tgz'); - foreach($supported as $type){ - $ext='.'.$type.'/'; - if(($pos=strpos(strtolower($path),$ext))!==false){ - $archive=substr($path,0,$pos+strlen($ext)-1); - if(self::$rootView->file_exists($archive) and array_search($archive,self::$mounted)===false){ - $localArchive=self::$rootView->getLocalFile($archive); - OC_Filesystem::mount('OC_Filestorage_Archive',array('archive'=>$localArchive),$archive.'/'); - self::$mounted[]=$archive; - } - } - } - self::$enableAutomount=true; - } - - public function rename($path1,$path2){ - return $this->archive->rename($path1,$path2); - } -} diff --git a/apps/files_archive/tests/data/data.tar.gz b/apps/files_archive/tests/data/data.tar.gz deleted file mode 100644 index 39f2cdada0..0000000000 Binary files a/apps/files_archive/tests/data/data.tar.gz and /dev/null differ diff --git a/apps/files_archive/tests/data/data.zip b/apps/files_archive/tests/data/data.zip deleted file mode 100644 index eccef53eb4..0000000000 Binary files a/apps/files_archive/tests/data/data.zip and /dev/null differ diff --git a/apps/files_archive/tests/data/lorem.txt b/apps/files_archive/tests/data/lorem.txt deleted file mode 100644 index b62c3fb2ff..0000000000 --- a/apps/files_archive/tests/data/lorem.txt +++ /dev/null @@ -1,4 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. -Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. -Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. -Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. \ No newline at end of file diff --git a/apps/files_archive/tests/storage.php b/apps/files_archive/tests/storage.php deleted file mode 100644 index 74ddf22870..0000000000 --- a/apps/files_archive/tests/storage.php +++ /dev/null @@ -1,39 +0,0 @@ - - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -class Test_Filestorage_Archive_Zip extends Test_FileStorage { - /** - * @var string tmpDir - */ - private $tmpFile; - - public function setUp(){ - $this->tmpFile=OCP\Files::tmpFile('.zip'); - $this->instance=new OC_Filestorage_Archive(array('archive'=>$this->tmpFile)); - } - - public function tearDown(){ - unlink($this->tmpFile); - } -} - -class Test_Filestorage_Archive_Tar extends Test_FileStorage { - /** - * @var string tmpDir - */ - private $tmpFile; - - public function setUp(){ - $this->tmpFile=OCP\Files::tmpFile('.tar.gz'); - $this->instance=new OC_Filestorage_Archive(array('archive'=>$this->tmpFile)); - } - - public function tearDown(){ - unlink($this->tmpFile); - } -} diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php index 679d0b95ed..bb130a366b 100644 --- a/apps/files_encryption/appinfo/app.php +++ b/apps/files_encryption/appinfo/app.php @@ -10,7 +10,7 @@ OCP\Util::connectHook('OC_User','post_login','OC_Crypt','loginListener'); stream_wrapper_register('crypt','OC_CryptStream'); -if(!isset($_SESSION['enckey']) and OCP\User::isLoggedIn()){//force the user to re-loggin if the encryption key isn't unlocked (happens when a user is logged in before the encryption app is enabled) +if(!isset($_SESSION['enckey']) and OCP\User::isLoggedIn()) {//force the user to re-loggin if the encryption key isn't unlocked (happens when a user is logged in before the encryption app is enabled) OCP\User::logout(); header("Location: ".OC::$WEBROOT.'/'); exit(); diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml index 8e64b0cafd..419bdb1b12 100644 --- a/apps/files_encryption/appinfo/info.xml +++ b/apps/files_encryption/appinfo/info.xml @@ -2,7 +2,7 @@ files_encryption Encryption - Server side encryption of files. Warning: You will lose your data if you enable this App and forget your password. Encryption is not yet compatible with LDAP. + Server side encryption of files. DEPRECATED. This app is no longer supported and will be replaced with an improved version in ownCloud 5. Only enable this features if you want to read old encrypted data. Warning: You will lose your data if you enable this App and forget your password. Encryption is not yet compatible with LDAP. AGPL Robin Appelman 4 diff --git a/apps/files_encryption/js/settings.js b/apps/files_encryption/js/settings.js index 8cc433246c..6fc70eba7f 100644 --- a/apps/files_encryption/js/settings.js +++ b/apps/files_encryption/js/settings.js @@ -11,7 +11,7 @@ $(document).ready(function(){ onuncheck:blackListChange, createText:'...', }); - + function blackListChange(){ var blackList=$('#encryption_blacklist').val().join(','); OC.AppConfig.setValue('files_encryption','type_blacklist',blackList); @@ -20,5 +20,5 @@ $(document).ready(function(){ $('#enable_encryption').change(function(){ var checked=$('#enable_encryption').is(':checked'); OC.AppConfig.setValue('files_encryption','enable_encryption',(checked)?'true':'false'); - }) -}) \ No newline at end of file + }); +}); diff --git a/apps/contacts/l10n/.gitkeep b/apps/files_encryption/l10n/.gitkeep similarity index 100% rename from apps/contacts/l10n/.gitkeep rename to apps/files_encryption/l10n/.gitkeep diff --git a/apps/files_encryption/l10n/ca.php b/apps/files_encryption/l10n/ca.php new file mode 100644 index 0000000000..8e087b3462 --- /dev/null +++ b/apps/files_encryption/l10n/ca.php @@ -0,0 +1,6 @@ + "Encriptatge", +"Exclude the following file types from encryption" => "Exclou els tipus de fitxers següents de l'encriptatge", +"None" => "Cap", +"Enable Encryption" => "Activa l'encriptatge" +); diff --git a/apps/files_encryption/l10n/cs_CZ.php b/apps/files_encryption/l10n/cs_CZ.php new file mode 100644 index 0000000000..9be2be9809 --- /dev/null +++ b/apps/files_encryption/l10n/cs_CZ.php @@ -0,0 +1,6 @@ + "Šifrování", +"Exclude the following file types from encryption" => "Při šifrování vynechat následující typy souborů", +"None" => "Žádné", +"Enable Encryption" => "Povolit šifrování" +); diff --git a/apps/files_encryption/l10n/de.php b/apps/files_encryption/l10n/de.php new file mode 100644 index 0000000000..d486a82322 --- /dev/null +++ b/apps/files_encryption/l10n/de.php @@ -0,0 +1,6 @@ + "Verschlüsselung", +"Exclude the following file types from encryption" => "Die folgenden Dateitypen von der Verschlüsselung ausnehmen", +"None" => "Keine", +"Enable Encryption" => "Verschlüsselung aktivieren" +); diff --git a/apps/files_encryption/l10n/el.php b/apps/files_encryption/l10n/el.php new file mode 100644 index 0000000000..40a7c6a367 --- /dev/null +++ b/apps/files_encryption/l10n/el.php @@ -0,0 +1,6 @@ + "Κρυπτογράφηση", +"Exclude the following file types from encryption" => "Εξαίρεση των παρακάτω τύπων αρχείων από την κρυπτογράφηση", +"None" => "Καμία", +"Enable Encryption" => "Ενεργοποίηση Κρυπτογράφησης" +); diff --git a/apps/files_encryption/l10n/eo.php b/apps/files_encryption/l10n/eo.php new file mode 100644 index 0000000000..af3c9ae98e --- /dev/null +++ b/apps/files_encryption/l10n/eo.php @@ -0,0 +1,6 @@ + "Ĉifrado", +"Exclude the following file types from encryption" => "Malinkluzivigi la jenajn dosiertipojn el ĉifrado", +"None" => "Nenio", +"Enable Encryption" => "Kapabligi ĉifradon" +); diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php new file mode 100644 index 0000000000..b7e7601b35 --- /dev/null +++ b/apps/files_encryption/l10n/es.php @@ -0,0 +1,6 @@ + "Cifrado", +"Exclude the following file types from encryption" => "Excluir del cifrado los siguientes tipos de archivo", +"None" => "Ninguno", +"Enable Encryption" => "Habilitar cifrado" +); diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php new file mode 100644 index 0000000000..a7cd9395bf --- /dev/null +++ b/apps/files_encryption/l10n/et_EE.php @@ -0,0 +1,6 @@ + "Krüpteerimine", +"Exclude the following file types from encryption" => "Järgnevaid failitüüpe ära krüpteeri", +"None" => "Pole", +"Enable Encryption" => "Luba krüpteerimine" +); diff --git a/apps/files_encryption/l10n/eu.php b/apps/files_encryption/l10n/eu.php new file mode 100644 index 0000000000..57b6a4927b --- /dev/null +++ b/apps/files_encryption/l10n/eu.php @@ -0,0 +1,6 @@ + "Enkriptazioa", +"Exclude the following file types from encryption" => "Ez enkriptatu hurrengo fitxategi motak", +"None" => "Bat ere ez", +"Enable Encryption" => "Gaitu enkriptazioa" +); diff --git a/apps/files_encryption/l10n/fa.php b/apps/files_encryption/l10n/fa.php new file mode 100644 index 0000000000..0faa3f3aae --- /dev/null +++ b/apps/files_encryption/l10n/fa.php @@ -0,0 +1,5 @@ + "رمزگذاری", +"None" => "هیچ‌کدام", +"Enable Encryption" => "فعال کردن رمزگذاری" +); diff --git a/apps/files_encryption/l10n/fi_FI.php b/apps/files_encryption/l10n/fi_FI.php new file mode 100644 index 0000000000..5796499a26 --- /dev/null +++ b/apps/files_encryption/l10n/fi_FI.php @@ -0,0 +1,6 @@ + "Salaus", +"Exclude the following file types from encryption" => "Jätä seuraavat tiedostotyypit salaamatta", +"None" => "Ei mitään", +"Enable Encryption" => "Käytä salausta" +); diff --git a/apps/files_encryption/l10n/fr.php b/apps/files_encryption/l10n/fr.php new file mode 100644 index 0000000000..c9367d1a31 --- /dev/null +++ b/apps/files_encryption/l10n/fr.php @@ -0,0 +1,6 @@ + "Chiffrement", +"Exclude the following file types from encryption" => "Ne pas chiffrer les fichiers dont les types sont les suivants", +"None" => "Aucun", +"Enable Encryption" => "Activer le chiffrement" +); diff --git a/apps/files_encryption/l10n/hu_HU.php b/apps/files_encryption/l10n/hu_HU.php new file mode 100644 index 0000000000..4352d8b771 --- /dev/null +++ b/apps/files_encryption/l10n/hu_HU.php @@ -0,0 +1,6 @@ + "Titkosítás", +"Exclude the following file types from encryption" => "A következő fájl típusok kizárása a titkosításból", +"None" => "Egyik sem", +"Enable Encryption" => "Titkosítás engedélyezése" +); diff --git a/apps/files_encryption/l10n/it.php b/apps/files_encryption/l10n/it.php new file mode 100644 index 0000000000..5136b06179 --- /dev/null +++ b/apps/files_encryption/l10n/it.php @@ -0,0 +1,6 @@ + "Cifratura", +"Exclude the following file types from encryption" => "Escludi i seguenti tipi di file dalla cifratura", +"None" => "Nessuna", +"Enable Encryption" => "Abilita cifratura" +); diff --git a/apps/files_encryption/l10n/ja_JP.php b/apps/files_encryption/l10n/ja_JP.php new file mode 100644 index 0000000000..2c3e5410de --- /dev/null +++ b/apps/files_encryption/l10n/ja_JP.php @@ -0,0 +1,6 @@ + "暗号化", +"Exclude the following file types from encryption" => "暗号化から除外するファイルタイプ", +"None" => "なし", +"Enable Encryption" => "暗号化を有効にする" +); diff --git a/apps/files_encryption/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php new file mode 100644 index 0000000000..b939df164c --- /dev/null +++ b/apps/files_encryption/l10n/lt_LT.php @@ -0,0 +1,6 @@ + "Šifravimas", +"Exclude the following file types from encryption" => "Nešifruoti pasirinkto tipo failų", +"None" => "Nieko", +"Enable Encryption" => "Įjungti šifravimą" +); diff --git a/apps/files_encryption/l10n/nb_NO.php b/apps/files_encryption/l10n/nb_NO.php new file mode 100644 index 0000000000..e65df7b6ce --- /dev/null +++ b/apps/files_encryption/l10n/nb_NO.php @@ -0,0 +1,6 @@ + "Kryptering", +"Exclude the following file types from encryption" => "Ekskluder følgende filer fra kryptering", +"None" => "Ingen", +"Enable Encryption" => "Slå på kryptering" +); diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php new file mode 100644 index 0000000000..1ea56006fc --- /dev/null +++ b/apps/files_encryption/l10n/nl.php @@ -0,0 +1,6 @@ + "Versleuteling", +"Exclude the following file types from encryption" => "Versleutel de volgende bestand types niet", +"None" => "Geen", +"Enable Encryption" => "Zet versleuteling aan" +); diff --git a/apps/files_encryption/l10n/pl.php b/apps/files_encryption/l10n/pl.php new file mode 100644 index 0000000000..5cfc707450 --- /dev/null +++ b/apps/files_encryption/l10n/pl.php @@ -0,0 +1,6 @@ + "Szyfrowanie", +"Exclude the following file types from encryption" => "Wyłącz następujące typy plików z szyfrowania", +"None" => "Brak", +"Enable Encryption" => "Włącz szyfrowanie" +); diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php new file mode 100644 index 0000000000..3a7e84b6d0 --- /dev/null +++ b/apps/files_encryption/l10n/ru.php @@ -0,0 +1,6 @@ + "Шифрование", +"Exclude the following file types from encryption" => "Исключить шифрование следующих типов файлов", +"None" => "Ничего", +"Enable Encryption" => "Включить шифрование" +); diff --git a/apps/files_encryption/l10n/sk_SK.php b/apps/files_encryption/l10n/sk_SK.php new file mode 100644 index 0000000000..598f1294f6 --- /dev/null +++ b/apps/files_encryption/l10n/sk_SK.php @@ -0,0 +1,6 @@ + "Šifrovanie", +"Exclude the following file types from encryption" => "Vynechať nasledujúce súbory pri šifrovaní", +"None" => "Žiadne", +"Enable Encryption" => "Zapnúť šifrovanie" +); diff --git a/apps/files_encryption/l10n/sl.php b/apps/files_encryption/l10n/sl.php new file mode 100644 index 0000000000..65807910e1 --- /dev/null +++ b/apps/files_encryption/l10n/sl.php @@ -0,0 +1,6 @@ + "Šifriranje", +"Exclude the following file types from encryption" => "Naslednje vrste datotek naj se ne šifrirajo", +"None" => "Brez", +"Enable Encryption" => "Omogoči šifriranje" +); diff --git a/apps/files_encryption/l10n/sv.php b/apps/files_encryption/l10n/sv.php new file mode 100644 index 0000000000..0a477f8346 --- /dev/null +++ b/apps/files_encryption/l10n/sv.php @@ -0,0 +1,6 @@ + "Kryptering", +"Exclude the following file types from encryption" => "Exkludera följande filtyper från kryptering", +"None" => "Ingen", +"Enable Encryption" => "Aktivera kryptering" +); diff --git a/apps/files_encryption/l10n/th_TH.php b/apps/files_encryption/l10n/th_TH.php new file mode 100644 index 0000000000..c2685de6e3 --- /dev/null +++ b/apps/files_encryption/l10n/th_TH.php @@ -0,0 +1,6 @@ + "การเข้ารหัส", +"Exclude the following file types from encryption" => "ไม่ต้องรวมชนิดของไฟล์ดังต่อไปนี้จากการเข้ารหัส", +"None" => "ไม่ต้อง", +"Enable Encryption" => "เปิดใช้งานการเข้ารหัส" +); diff --git a/apps/files_encryption/l10n/vi.php b/apps/files_encryption/l10n/vi.php new file mode 100644 index 0000000000..cabf2da7dc --- /dev/null +++ b/apps/files_encryption/l10n/vi.php @@ -0,0 +1,6 @@ + "Mã hóa", +"Exclude the following file types from encryption" => "Loại trừ các loại tập tin sau đây từ mã hóa", +"None" => "none", +"Enable Encryption" => "BẬT mã hóa" +); diff --git a/apps/files_encryption/l10n/zh_CN.php b/apps/files_encryption/l10n/zh_CN.php new file mode 100644 index 0000000000..1e1247d15f --- /dev/null +++ b/apps/files_encryption/l10n/zh_CN.php @@ -0,0 +1,6 @@ + "加密", +"Exclude the following file types from encryption" => "从加密中排除列出的文件类型", +"None" => "None", +"Enable Encryption" => "开启加密" +); diff --git a/apps/files_encryption/l10n/zh_TW.php b/apps/files_encryption/l10n/zh_TW.php new file mode 100644 index 0000000000..4c62130cf4 --- /dev/null +++ b/apps/files_encryption/l10n/zh_TW.php @@ -0,0 +1,6 @@ + "加密", +"Exclude the following file types from encryption" => "下列的檔案類型不加密", +"None" => "無", +"Enable Encryption" => "啟用加密" +); diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index 849e88ee0b..38d8edf28c 100644 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -31,7 +31,7 @@ // - IMPORTANT! Check if the block lenght of the encrypted data stays the same -require_once('Crypt_Blowfish/Blowfish.php'); +require_once 'Crypt_Blowfish/Blowfish.php'; /** * This class is for crypting and decrypting @@ -39,18 +39,18 @@ require_once('Crypt_Blowfish/Blowfish.php'); class OC_Crypt { static private $bf = null; - public static function loginListener($params){ + public static function loginListener($params) { self::init($params['uid'],$params['password']); } public static function init($login,$password) { $view=new OC_FilesystemView('/'); - if(!$view->file_exists('/'.$login)){ + if(!$view->file_exists('/'.$login)) { $view->mkdir('/'.$login); } OC_FileProxy::$enabled=false; - if(!$view->file_exists('/'.$login.'/encryption.key')){// does key exist? + if(!$view->file_exists('/'.$login.'/encryption.key')) {// does key exist? OC_Crypt::createkey($login,$password); } $key=$view->file_get_contents('/'.$login.'/encryption.key'); @@ -66,14 +66,14 @@ class OC_Crypt { * * if the key is left out, the default handeler will be used */ - public static function getBlowfish($key=''){ - if($key){ + public static function getBlowfish($key='') { + if($key) { return new Crypt_Blowfish($key); }else{ - if(!isset($_SESSION['enckey'])){ + if(!isset($_SESSION['enckey'])) { return false; } - if(!self::$bf){ + if(!self::$bf) { self::$bf=new Crypt_Blowfish($_SESSION['enckey']); } return self::$bf; @@ -96,7 +96,7 @@ class OC_Crypt { } public static function changekeypasscode($oldPassword, $newPassword) { - if(OCP\User::isLoggedIn()){ + if(OCP\User::isLoggedIn()) { $username=OCP\USER::getUser(); $view=new OC_FilesystemView('/'.$username); @@ -179,7 +179,7 @@ class OC_Crypt { while (!feof($handleread)) { $content = fread($handleread, 8192); $enccontent=OC_CRYPT::decrypt( $content, $key); - if(feof($handleread)){ + if(feof($handleread)) { $enccontent=rtrim($enccontent, "\0"); } fwrite($handlewrite, $enccontent); @@ -188,29 +188,29 @@ class OC_Crypt { fclose($handleread); } } - + /** * encrypt data in 8192b sized blocks */ - public static function blockEncrypt($data, $key=''){ + public static function blockEncrypt($data, $key='') { $result=''; - while(strlen($data)){ + while(strlen($data)) { $result.=self::encrypt(substr($data,0,8192),$key); $data=substr($data,8192); } return $result; } - + /** * decrypt data in 8192b sized blocks */ - public static function blockDecrypt($data, $key='',$maxLength=0){ + public static function blockDecrypt($data, $key='',$maxLength=0) { $result=''; - while(strlen($data)){ + while(strlen($data)) { $result.=self::decrypt(substr($data,0,8192),$key); $data=substr($data,8192); } - if($maxLength>0){ + if($maxLength>0) { return substr($result,0,$maxLength); }else{ return rtrim($result, "\0"); diff --git a/apps/files_encryption/lib/cryptstream.php b/apps/files_encryption/lib/cryptstream.php index 46471911d9..721a1b955d 100644 --- a/apps/files_encryption/lib/cryptstream.php +++ b/apps/files_encryption/lib/cryptstream.php @@ -36,18 +36,18 @@ class OC_CryptStream{ private $size; private static $rootView; - public function stream_open($path, $mode, $options, &$opened_path){ - if(!self::$rootView){ + public function stream_open($path, $mode, $options, &$opened_path) { + if(!self::$rootView) { self::$rootView=new OC_FilesystemView(''); } $path=str_replace('crypt://','',$path); - if(dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])){ + if(dirname($path)=='streams' and isset(self::$sourceStreams[basename($path)])) { $this->source=self::$sourceStreams[basename($path)]['stream']; $this->path=self::$sourceStreams[basename($path)]['path']; $this->size=self::$sourceStreams[basename($path)]['size']; }else{ $this->path=$path; - if($mode=='w' or $mode=='w+' or $mode=='wb' or $mode=='wb+'){ + if($mode=='w' or $mode=='w+' or $mode=='wb' or $mode=='wb+') { $this->size=0; }else{ $this->size=self::$rootView->filesize($path,$mode); @@ -55,55 +55,55 @@ class OC_CryptStream{ OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file $this->source=self::$rootView->fopen($path,$mode); OC_FileProxy::$enabled=true; - if(!is_resource($this->source)){ + if(!is_resource($this->source)) { OCP\Util::writeLog('files_encryption','failed to open '.$path,OCP\Util::ERROR); } } - if(is_resource($this->source)){ + if(is_resource($this->source)) { $this->meta=stream_get_meta_data($this->source); } return is_resource($this->source); } - - public function stream_seek($offset, $whence=SEEK_SET){ + + public function stream_seek($offset, $whence=SEEK_SET) { $this->flush(); fseek($this->source,$offset,$whence); } - - public function stream_tell(){ + + public function stream_tell() { return ftell($this->source); } - - public function stream_read($count){ + + public function stream_read($count) { //$count will always be 8192 https://bugs.php.net/bug.php?id=21641 //This makes this function a lot simpler but will breake everything the moment it's fixed $this->writeCache=''; - if($count!=8192){ + if($count!=8192) { OCP\Util::writeLog('files_encryption','php bug 21641 no longer holds, decryption will not work',OCP\Util::FATAL); die(); } $pos=ftell($this->source); $data=fread($this->source,8192); - if(strlen($data)){ + if(strlen($data)) { $result=OC_Crypt::decrypt($data); }else{ $result=''; } $length=$this->size-$pos; - if($length<8192){ + if($length<8192) { $result=substr($result,0,$length); } return $result; } - - public function stream_write($data){ + + public function stream_write($data) { $length=strlen($data); $currentPos=ftell($this->source); - if($this->writeCache){ + if($this->writeCache) { $data=$this->writeCache.$data; $this->writeCache=''; } - if($currentPos%8192!=0){ + if($currentPos%8192!=0) { //make sure we always start on a block start fseek($this->source,-($currentPos%8192),SEEK_CUR); $encryptedBlock=fread($this->source,8192); @@ -113,8 +113,8 @@ class OC_CryptStream{ fseek($this->source,-($currentPos%8192),SEEK_CUR); } $currentPos=ftell($this->source); - while($remainingLength=strlen($data)>0){ - if($remainingLength<8192){ + while($remainingLength=strlen($data)>0) { + if($remainingLength<8192) { $this->writeCache=$data; $data=''; }else{ @@ -127,8 +127,8 @@ class OC_CryptStream{ return $length; } - public function stream_set_option($option,$arg1,$arg2){ - switch($option){ + public function stream_set_option($option,$arg1,$arg2) { + switch($option) { case STREAM_OPTION_BLOCKING: stream_set_blocking($this->source,$arg1); break; @@ -140,33 +140,33 @@ class OC_CryptStream{ } } - public function stream_stat(){ + public function stream_stat() { return fstat($this->source); } - - public function stream_lock($mode){ + + public function stream_lock($mode) { flock($this->source,$mode); } - - public function stream_flush(){ + + public function stream_flush() { return fflush($this->source); } - public function stream_eof(){ + public function stream_eof() { return feof($this->source); } - private function flush(){ - if($this->writeCache){ + private function flush() { + if($this->writeCache) { $encrypted=OC_Crypt::encrypt($this->writeCache); fwrite($this->source,$encrypted); $this->writeCache=''; } } - public function stream_close(){ + public function stream_close() { $this->flush(); - if($this->meta['mode']!='r' and $this->meta['mode']!='rb'){ + if($this->meta['mode']!='r' and $this->meta['mode']!='rb') { OC_FileCache::put($this->path,array('encrypted'=>true,'size'=>$this->size),''); } return fclose($this->source); diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index f25e4a662f..f61cd1e377 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -28,27 +28,27 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ private static $blackList=null; //mimetypes blacklisted from encryption private static $enableEncryption=null; - + /** * check if a file should be encrypted during write * @param string $path * @return bool */ - private static function shouldEncrypt($path){ - if(is_null(self::$enableEncryption)){ + private static function shouldEncrypt($path) { + if(is_null(self::$enableEncryption)) { self::$enableEncryption=(OCP\Config::getAppValue('files_encryption','enable_encryption','true')=='true'); } - if(!self::$enableEncryption){ + if(!self::$enableEncryption) { return false; } - if(is_null(self::$blackList)){ + if(is_null(self::$blackList)) { self::$blackList=explode(',',OCP\Config::getAppValue('files_encryption','type_blacklist','jpg,png,jpeg,avi,mpg,mpeg,mkv,mp3,oga,ogv,ogg')); } - if(self::isEncrypted($path)){ + if(self::isEncrypted($path)) { return true; } $extension=substr($path,strrpos($path,'.')+1); - if(array_search($extension,self::$blackList)===false){ + if(array_search($extension,self::$blackList)===false) { return true; } } @@ -58,13 +58,13 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ * @param string $path * @return bool */ - private static function isEncrypted($path){ + private static function isEncrypted($path) { $metadata=OC_FileCache_Cached::get($path,''); return isset($metadata['encrypted']) and (bool)$metadata['encrypted']; } - - public function preFile_put_contents($path,&$data){ - if(self::shouldEncrypt($path)){ + + public function preFile_put_contents($path,&$data) { + if(self::shouldEncrypt($path)) { if (!is_resource($data)) {//stream put contents should have been converter to fopen $size=strlen($data); $data=OC_Crypt::blockEncrypt($data); @@ -72,25 +72,25 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ } } } - - public function postFile_get_contents($path,$data){ - if(self::isEncrypted($path)){ + + public function postFile_get_contents($path,$data) { + if(self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path,''); $data=OC_Crypt::blockDecrypt($data,'',$cached['size']); } return $data; } - - public function postFopen($path,&$result){ - if(!$result){ + + public function postFopen($path,&$result) { + if(!$result) { return $result; } $meta=stream_get_meta_data($result); - if(self::isEncrypted($path)){ + if(self::isEncrypted($path)) { fclose($result); $result=fopen('crypt://'.$path,$meta['mode']); - }elseif(self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb'){ - if(OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0){ + }elseif(self::shouldEncrypt($path) and $meta['mode']!='r' and $meta['mode']!='rb') { + if(OC_Filesystem::file_exists($path) and OC_Filesystem::filesize($path)>0) { //first encrypt the target file so we don't end up with a half encrypted file OCP\Util::writeLog('files_encryption','Decrypting '.$path.' before writing',OCP\Util::DEBUG); $tmp=fopen('php://temp'); @@ -104,23 +104,23 @@ class OC_FileProxy_Encryption extends OC_FileProxy{ return $result; } - public function postGetMimeType($path,$mime){ - if(self::isEncrypted($path)){ + public function postGetMimeType($path,$mime) { + if(self::isEncrypted($path)) { $mime=OCP\Files::getMimeType('crypt://'.$path,'w'); } return $mime; } - public function postStat($path,$data){ - if(self::isEncrypted($path)){ + public function postStat($path,$data) { + if(self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path,''); $data['size']=$cached['size']; } return $data; } - public function postFileSize($path,$size){ - if(self::isEncrypted($path)){ + public function postFileSize($path,$size) { + if(self::isEncrypted($path)) { $cached=OC_FileCache_Cached::get($path,''); return $cached['size']; }else{ diff --git a/apps/files_encryption/templates/settings.php b/apps/files_encryption/templates/settings.php index 79780d694c..55e8cf1542 100644 --- a/apps/files_encryption/templates/settings.php +++ b/apps/files_encryption/templates/settings.php @@ -7,6 +7,6 @@ - > + > diff --git a/apps/files_encryption/tests/encryption.php b/apps/files_encryption/tests/encryption.php index 286770a69f..89397f6ef2 100644 --- a/apps/files_encryption/tests/encryption.php +++ b/apps/files_encryption/tests/encryption.php @@ -7,7 +7,7 @@ */ class Test_Encryption extends UnitTestCase { - function testEncryption(){ + function testEncryption() { $key=uniqid(); $file=OC::$SERVERROOT.'/3rdparty/MDB2.php'; $source=file_get_contents($file); //nice large text file @@ -23,7 +23,7 @@ class Test_Encryption extends UnitTestCase { $decrypted=OC_Crypt::decrypt($encrypted,$key); $decrypted=rtrim($decrypted, "\0"); $this->assertEqual($decrypted,$chunk); - + $encrypted=OC_Crypt::blockEncrypt($source,$key); $decrypted=OC_Crypt::blockDecrypt($encrypted,$key); $this->assertNotEqual($encrypted,$source); @@ -54,9 +54,9 @@ class Test_Encryption extends UnitTestCase { } - function testBinary(){ + function testBinary() { $key=uniqid(); - + $file=__DIR__.'/binary'; $source=file_get_contents($file); //binary file $encrypted=OC_Crypt::encrypt($source,$key); diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php index 5463836a20..042011a6c8 100644 --- a/apps/files_encryption/tests/proxy.php +++ b/apps/files_encryption/tests/proxy.php @@ -9,18 +9,18 @@ class Test_CryptProxy extends UnitTestCase { private $oldConfig; private $oldKey; - - public function setUp(){ + + public function setUp() { $user=OC_User::getUser(); $this->oldConfig=OCP\Config::getAppValue('files_encryption','enable_encryption','true'); OCP\Config::setAppValue('files_encryption','enable_encryption','true'); $this->oldKey=isset($_SESSION['enckey'])?$_SESSION['enckey']:null; - - + + //set testing key $_SESSION['enckey']=md5(time()); - + //clear all proxies and hooks so we can do clean testing OC_FileProxy::clearProxies(); OC_Hook::clear('OC_Filesystem'); @@ -40,23 +40,23 @@ class Test_CryptProxy extends UnitTestCase { $rootView->mkdir('/'.$user.'/files'); } - public function tearDown(){ + public function tearDown() { OCP\Config::setAppValue('files_encryption','enable_encryption',$this->oldConfig); - if(!is_null($this->oldKey)){ + if(!is_null($this->oldKey)) { $_SESSION['enckey']=$this->oldKey; } } - public function testSimple(){ + public function testSimple() { $file=OC::$SERVERROOT.'/3rdparty/MDB2.php'; $original=file_get_contents($file); OC_Filesystem::file_put_contents('/file',$original); - + OC_FileProxy::$enabled=false; $stored=OC_Filesystem::file_get_contents('/file'); OC_FileProxy::$enabled=true; - + $fromFile=OC_Filesystem::file_get_contents('/file'); $this->assertNotEqual($original,$stored); $this->assertEqual(strlen($original),strlen($fromFile)); @@ -64,7 +64,7 @@ class Test_CryptProxy extends UnitTestCase { } - public function testView(){ + public function testView() { $file=OC::$SERVERROOT.'/3rdparty/MDB2.php'; $original=file_get_contents($file); @@ -86,7 +86,7 @@ class Test_CryptProxy extends UnitTestCase { $this->assertEqual($original,$fromFile); } - public function testBinary(){ + public function testBinary() { $file=__DIR__.'/binary'; $original=file_get_contents($file); diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php index d95ea792f7..39b1362078 100644 --- a/apps/files_encryption/tests/stream.php +++ b/apps/files_encryption/tests/stream.php @@ -8,8 +8,8 @@ class Test_CryptStream extends UnitTestCase { private $tmpFiles=array(); - - function testStream(){ + + function testStream() { $stream=$this->getStream('test1','w',strlen('foobar')); fwrite($stream,'foobar'); fclose($stream); @@ -40,11 +40,11 @@ class Test_CryptStream extends UnitTestCase { * @param int size * @return resource */ - function getStream($id,$mode,$size){ - if($id===''){ + function getStream($id,$mode,$size) { + if($id==='') { $id=uniqid(); } - if(!isset($this->tmpFiles[$id])){ + if(!isset($this->tmpFiles[$id])) { $file=OCP\Files::tmpFile(); $this->tmpFiles[$id]=$file; }else{ @@ -55,7 +55,7 @@ class Test_CryptStream extends UnitTestCase { return fopen('crypt://streams/'.$id,$mode); } - function testBinary(){ + function testBinary() { $file=__DIR__.'/binary'; $source=file_get_contents($file); diff --git a/apps/files_external/ajax/addRootCertificate.php b/apps/files_external/ajax/addRootCertificate.php index d28a7d24b2..a8719fc7a3 100644 --- a/apps/files_external/ajax/addRootCertificate.php +++ b/apps/files_external/ajax/addRootCertificate.php @@ -14,7 +14,7 @@ $fh = fopen($to, 'r'); $data = fread($fh, filesize($to)); fclose($fh); if (!strpos($data, 'BEGIN CERTIFICATE')) { - $pem = chunk_split(base64_encode($data), 64, "\n"); + $pem = chunk_split(base64_encode($data), 64, "\n"); $pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n"; $fh = fopen($to, 'w'); fwrite($fh, $pem); @@ -25,4 +25,3 @@ OC_Mount_Config::createCertificateBundle(); header("Location: settings/personal.php"); exit; -?> \ No newline at end of file diff --git a/apps/files_external/ajax/dropbox.php b/apps/files_external/ajax/dropbox.php index 5f2ff17e62..f5923940dc 100644 --- a/apps/files_external/ajax/dropbox.php +++ b/apps/files_external/ajax/dropbox.php @@ -37,5 +37,3 @@ if (isset($_POST['app_key']) && isset($_POST['app_secret'])) { } else { OCP\JSON::error(array('data' => array('message' => 'Please provide a valid Dropbox app key and secret.'))); } - -?> \ No newline at end of file diff --git a/apps/files_external/ajax/google.php b/apps/files_external/ajax/google.php index 23ecfc3708..4cd01c06cc 100644 --- a/apps/files_external/ajax/google.php +++ b/apps/files_external/ajax/google.php @@ -47,5 +47,3 @@ if (isset($_POST['step'])) { break; } } - -?> \ No newline at end of file diff --git a/apps/files_external/ajax/removeRootCertificate.php b/apps/files_external/ajax/removeRootCertificate.php index a00922f421..9b78e180d9 100644 --- a/apps/files_external/ajax/removeRootCertificate.php +++ b/apps/files_external/ajax/removeRootCertificate.php @@ -1,10 +1,11 @@ getAbsolutePath("").'uploads/'.$cert; unlink($file); OC_Mount_Config::createCertificateBundle(); -?> \ No newline at end of file diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css index d8575c49e3..ca4b1c3ba8 100644 --- a/apps/files_external/css/settings.css +++ b/apps/files_external/css/settings.css @@ -1,5 +1,7 @@ .error { color: #FF3B3B; } td.mountPoint, td.backend { width:10em; } +td.remove>img { visibility:hidden; padding-top:0.8em; } +tr:hover>td.remove>img { visibility:visible; cursor:pointer; } #addMountPoint>td { border:none; } #addMountPoint>td.applicable { visibility:hidden; } #selectBackend { margin-left:-10px; } \ No newline at end of file diff --git a/apps/files_external/js/dropbox.js b/apps/files_external/js/dropbox.js index 08796cbbdc..6082fdd2cb 100644 --- a/apps/files_external/js/dropbox.js +++ b/apps/files_external/js/dropbox.js @@ -1,13 +1,16 @@ $(document).ready(function() { - $('#externalStorage tbody tr').each(function() { - if ($(this).find('.backend').data('class') == 'OC_Filestorage_Dropbox') { + $('#externalStorage tbody tr.OC_Filestorage_Dropbox').each(function() { + var configured = $(this).find('[data-parameter="configured"]'); + if ($(configured).val() == 'true') { + $(this).find('.configuration input').attr('disabled', 'disabled'); + $(this).find('.configuration').append('Access granted'); + } else { var app_key = $(this).find('.configuration [data-parameter="app_key"]').val(); var app_secret = $(this).find('.configuration [data-parameter="app_secret"]').val(); - if (app_key == '' && app_secret == '') { - $(this).find('.configuration').append('Grant access'); - } else { - var pos = window.location.search.indexOf('oauth_token') + 12 + var config = $(this).find('.configuration'); + if (app_key != '' && app_secret != '') { + var pos = window.location.search.indexOf('oauth_token') + 12; var token = $(this).find('.configuration [data-parameter="token"]'); if (pos != -1 && window.location.search.substr(pos, $(token).val().length) == $(token).val()) { var token_secret = $(this).find('.configuration [data-parameter="token_secret"]'); @@ -16,12 +19,33 @@ $(document).ready(function() { if (result && result.status == 'success') { $(token).val(result.access_token); $(token_secret).val(result.access_token_secret); + $(configured).val('true'); OC.MountConfig.saveStorage(tr); + $(tr).find('.configuration input').attr('disabled', 'disabled'); + $(tr).find('.configuration').append('Access granted'); } else { OC.dialogs.alert(result.data.message, 'Error configuring Dropbox storage'); } }); } + } else if ($(this).find('.mountPoint input').val() != '' && $(config).find('[data-parameter="app_key"]').val() != '' && $(config).find('[data-parameter="app_secret"]').val() != '' && $(this).find('.dropbox').length == 0) { + $(this).find('.configuration').append('Grant access'); + } + } + }); + + $('#externalStorage tbody tr input').live('keyup', function() { + var tr = $(this).parent().parent(); + if ($(tr).hasClass('OC_Filestorage_Dropbox') && $(tr).find('[data-parameter="configured"]').val() != 'true') { + var config = $(tr).find('.configuration'); + if ($(tr).find('.mountPoint input').val() != '' && $(config).find('[data-parameter="app_key"]').val() != '' && $(config).find('[data-parameter="app_secret"]').val() != '') { + if ($(tr).find('.dropbox').length == 0) { + $(config).append('Grant access'); + } else { + $(tr).find('.dropbox').show(); + } + } else if ($(tr).find('.dropbox').length > 0) { + $(tr).find('.dropbox').hide(); } } }); @@ -32,20 +56,25 @@ $(document).ready(function() { var app_secret = $(this).parent().find('[data-parameter="app_secret"]').val(); if (app_key != '' && app_secret != '') { var tr = $(this).parent().parent(); + var configured = $(this).parent().find('[data-parameter="configured"]'); var token = $(this).parent().find('[data-parameter="token"]'); var token_secret = $(this).parent().find('[data-parameter="token_secret"]'); $.post(OC.filePath('files_external', 'ajax', 'dropbox.php'), { step: 1, app_key: app_key, app_secret: app_secret, callback: window.location.href }, function(result) { if (result && result.status == 'success') { + $(configured).val('false'); $(token).val(result.data.request_token); $(token_secret).val(result.data.request_token_secret); - OC.MountConfig.saveStorage(tr); - window.location = result.data.url; + if (OC.MountConfig.saveStorage(tr)) { + window.location = result.data.url; + } else { + OC.dialogs.alert('Fill out all required fields', 'Error configuring Dropbox storage'); + } } else { OC.dialogs.alert(result.data.message, 'Error configuring Dropbox storage'); } }); } else { - OC.dialogs.alert('Please provide a valid Dropbox app key and secret.', 'Error configuring Dropbox storage') + OC.dialogs.alert('Please provide a valid Dropbox app key and secret.', 'Error configuring Dropbox storage'); } }); diff --git a/apps/files_external/js/google.js b/apps/files_external/js/google.js index 55042194c7..7c62297df4 100644 --- a/apps/files_external/js/google.js +++ b/apps/files_external/js/google.js @@ -1,47 +1,76 @@ $(document).ready(function() { - - $('#externalStorage tbody tr').each(function() { - if ($(this).find('.backend').data('class') == 'OC_Filestorage_Google') { + + $('#externalStorage tbody tr.OC_Filestorage_Google').each(function() { + var configured = $(this).find('[data-parameter="configured"]'); + if ($(configured).val() == 'true') { + $(this).find('.configuration').append('Access granted'); + } else { var token = $(this).find('[data-parameter="token"]'); var token_secret = $(this).find('[data-parameter="token_secret"]'); - if ($(token).val() == '' && $(token).val() == '') { - $(this).find('.configuration').append('Grant access'); - } else { - var params = {}; - window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) { - params[key] = value; + var params = {}; + window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m, key, value) { + params[key] = value; + }); + if (params['oauth_token'] !== undefined && params['oauth_verifier'] !== undefined && decodeURIComponent(params['oauth_token']) == $(token).val()) { + var tr = $(this); + $.post(OC.filePath('files_external', 'ajax', 'google.php'), { step: 2, oauth_verifier: params['oauth_verifier'], request_token: $(token).val(), request_token_secret: $(token_secret).val() }, function(result) { + if (result && result.status == 'success') { + $(token).val(result.access_token); + $(token_secret).val(result.access_token_secret); + $(configured).val('true'); + OC.MountConfig.saveStorage(tr); + $(tr).find('.configuration').append('Access granted'); + } else { + OC.dialogs.alert(result.data.message, 'Error configuring Google Drive storage'); + } }); - if (params['oauth_token'] !== undefined && params['oauth_verifier'] !== undefined && decodeURIComponent(params['oauth_token']) == $(token).val()) { - var tr = $(this); - $.post(OC.filePath('files_external', 'ajax', 'google.php'), { step: 2, oauth_verifier: params['oauth_verifier'], request_token: $(token).val(), request_token_secret: $(token_secret).val() }, function(result) { - if (result && result.status == 'success') { - $(token).val(result.access_token); - $(token_secret).val(result.access_token_secret); - OC.MountConfig.saveStorage(tr); - } else { - OC.dialogs.alert(result.data.message, 'Error configuring Google Drive storage'); - } - }); + } else if ($(this).find('.google').length == 0) { + $(this).find('.configuration').append('Grant access'); + } + } + }); + + $('#externalStorage tbody tr').live('change', function() { + if ($(this).hasClass('OC_Filestorage_Google') && $(this).find('[data-parameter="configured"]').val() != 'true') { + if ($(this).find('.mountPoint input').val() != '') { + if ($(this).find('.google').length == 0) { + $(this).find('.configuration').append('Grant access'); } } } }); - + + $('#externalStorage tbody tr .mountPoint input').live('keyup', function() { + var tr = $(this).parent().parent(); + if ($(tr).hasClass('OC_Filestorage_Google') && $(tr).find('[data-parameter="configured"]').val() != 'true' && $(tr).find('.google').length > 0) { + if ($(this).val() != '') { + $(tr).find('.google').show(); + } else { + $(tr).find('.google').hide(); + } + } + }); + $('.google').live('click', function(event) { event.preventDefault(); var tr = $(this).parent().parent(); + var configured = $(this).parent().find('[data-parameter="configured"]'); var token = $(this).parent().find('[data-parameter="token"]'); var token_secret = $(this).parent().find('[data-parameter="token_secret"]'); $.post(OC.filePath('files_external', 'ajax', 'google.php'), { step: 1, callback: window.location.href }, function(result) { if (result && result.status == 'success') { + $(configured).val('false'); $(token).val(result.data.request_token); $(token_secret).val(result.data.request_token_secret); - OC.MountConfig.saveStorage(tr); - window.location = result.data.url; + if (OC.MountConfig.saveStorage(tr)) { + window.location = result.data.url; + } else { + OC.dialogs.alert('Fill out all required fields', 'Error configuring Google Drive storage'); + } } else { OC.dialogs.alert(result.data.message, 'Error configuring Google Drive storage'); } }); }); - + }); diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 0d942e7845..89f346574e 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -1,4 +1,4 @@ -OC.MountConfig={ +OC.MountConfig={ saveStorage:function(tr) { var mountPoint = $(tr).find('.mountPoint input').val(); if (mountPoint == '') { @@ -63,13 +63,14 @@ OC.MountConfig={ var applicable = OC.currentUser; $.post(OC.filePath('files_external', 'ajax', 'addMountPoint.php'), { mountPoint: mountPoint, class: backendClass, classOptions: classOptions, mountType: mountType, applicable: applicable, isPersonal: isPersonal }); } + return true; } } -} +}; $(document).ready(function() { $('.chzn-select').chosen(); - + $('#selectBackend').live('change', function() { var tr = $(this).parent().parent(); $('#externalStorage tbody').append($(tr).clone()); @@ -77,6 +78,10 @@ $(document).ready(function() { var selected = $(this).find('option:selected').text(); var backendClass = $(this).val(); $(this).parent().text(selected); + if ($(tr).find('.mountPoint input').val() == '') { + $(tr).find('.mountPoint input').val(suggestMountPoint(selected.replace(/\s+/g, ''))); + } + $(tr).addClass(backendClass); $(tr).find('.backend').data('class', backendClass); var configurations = $(this).data('configurations'); var td = $(tr).find('td.configuration'); @@ -95,7 +100,7 @@ $(document).ready(function() { td.append(''); } }); - if (parameters['custom']) { + if (parameters['custom'] && $('#externalStorage tbody tr.'+backendClass).length == 1) { OC.addScript('files_external', parameters['custom']); } return false; @@ -108,6 +113,28 @@ $(document).ready(function() { $(this).remove(); }); + function suggestMountPoint(defaultMountPoint) { + var i = 1; + var append = ''; + var match = true; + while (match && i < 20) { + match = false; + $('#externalStorage tbody td.mountPoint input').each(function(index, mountPoint) { + if ($(mountPoint).val() == defaultMountPoint+append) { + match = true; + return false; + } + }); + if (match) { + append = i; + i++; + } else { + break; + } + } + return defaultMountPoint+append; + } + $('#externalStorage td').live('change', function() { OC.MountConfig.saveStorage($(this).parent()); }); @@ -152,4 +179,4 @@ $(document).ready(function() { } }); -}); \ No newline at end of file +}); diff --git a/apps/files_texteditor/js/aceeditor/mode-text-uncompressed.js b/apps/files_external/l10n/.gitkeep similarity index 100% rename from apps/files_texteditor/js/aceeditor/mode-text-uncompressed.js rename to apps/files_external/l10n/.gitkeep diff --git a/apps/files_external/l10n/ca.php b/apps/files_external/l10n/ca.php new file mode 100644 index 0000000000..aa93379c35 --- /dev/null +++ b/apps/files_external/l10n/ca.php @@ -0,0 +1,18 @@ + "Emmagatzemament extern", +"Mount point" => "Punt de muntatge", +"Backend" => "Dorsal", +"Configuration" => "Configuració", +"Options" => "Options", +"Applicable" => "Aplicable", +"Add mount point" => "Afegeix punt de muntatge", +"None set" => "Cap d'establert", +"All Users" => "Tots els usuaris", +"Groups" => "Grups", +"Users" => "Usuaris", +"Delete" => "Elimina", +"SSL root certificates" => "Certificats SSL root", +"Import Root Certificate" => "Importa certificat root", +"Enable User External Storage" => "Habilita l'emmagatzemament extern d'usuari", +"Allow users to mount their own external storage" => "Permet als usuaris muntar el seu emmagatzemament extern propi" +); diff --git a/apps/files_external/l10n/cs_CZ.php b/apps/files_external/l10n/cs_CZ.php new file mode 100644 index 0000000000..7589960334 --- /dev/null +++ b/apps/files_external/l10n/cs_CZ.php @@ -0,0 +1,18 @@ + "Externí úložiště", +"Mount point" => "Přípojný bod", +"Backend" => "Podpůrná vrstva", +"Configuration" => "Nastavení", +"Options" => "Možnosti", +"Applicable" => "Platný", +"Add mount point" => "Přidat bod připojení", +"None set" => "Nenastaveno", +"All Users" => "Všichni uživatelé", +"Groups" => "Skupiny", +"Users" => "Uživatelé", +"Delete" => "Smazat", +"SSL root certificates" => "Kořenové certifikáty SSL", +"Import Root Certificate" => "Importovat kořenového certifikátu", +"Enable User External Storage" => "Zapnout externí uživatelské úložiště", +"Allow users to mount their own external storage" => "Povolit uživatelům připojení jejich vlastních externích úložišť" +); diff --git a/apps/files_external/l10n/de.php b/apps/files_external/l10n/de.php new file mode 100644 index 0000000000..4306ad33dc --- /dev/null +++ b/apps/files_external/l10n/de.php @@ -0,0 +1,18 @@ + "Externer Speicher", +"Mount point" => "Mount-Point", +"Backend" => "Backend", +"Configuration" => "Konfiguration", +"Options" => "Optionen", +"Applicable" => "Zutreffend", +"Add mount point" => "Mount-Point hinzufügen", +"None set" => "Nicht definiert", +"All Users" => "Alle Benutzer", +"Groups" => "Gruppen", +"Users" => "Benutzer", +"Delete" => "Löschen", +"SSL root certificates" => "SSL-Root-Zertifikate", +"Import Root Certificate" => "Root-Zertifikate importieren", +"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren", +"Allow users to mount their own external storage" => "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden" +); diff --git a/apps/files_external/l10n/el.php b/apps/files_external/l10n/el.php new file mode 100644 index 0000000000..7dcf13b397 --- /dev/null +++ b/apps/files_external/l10n/el.php @@ -0,0 +1,10 @@ + "Εξωτερική αποθήκευση", +"Mount point" => "Σημείο προσάρτησης", +"Configuration" => "Ρυθμίσεις", +"Options" => "Επιλογές", +"All Users" => "Όλοι οι χρήστες", +"Groups" => "Ομάδες", +"Users" => "Χρήστες", +"Delete" => "Διαγραφή" +); diff --git a/apps/files_external/l10n/eo.php b/apps/files_external/l10n/eo.php new file mode 100644 index 0000000000..3cb8255c52 --- /dev/null +++ b/apps/files_external/l10n/eo.php @@ -0,0 +1,18 @@ + "Malena memorilo", +"Mount point" => "Surmetingo", +"Backend" => "Motoro", +"Configuration" => "Agordo", +"Options" => "Malneproj", +"Applicable" => "Aplikebla", +"Add mount point" => "Aldoni surmetingon", +"None set" => "Nenio agordita", +"All Users" => "Ĉiuj uzantoj", +"Groups" => "Grupoj", +"Users" => "Uzantoj", +"Delete" => "Forigi", +"SSL root certificates" => "Radikaj SSL-atestoj", +"Import Root Certificate" => "Enporti radikan ateston", +"Enable User External Storage" => "Kapabligi malenan memorilon de uzanto", +"Allow users to mount their own external storage" => "Permesi al uzantoj surmeti siajn proprajn malenajn memorilojn" +); diff --git a/apps/files_external/l10n/es.php b/apps/files_external/l10n/es.php new file mode 100644 index 0000000000..004c352c19 --- /dev/null +++ b/apps/files_external/l10n/es.php @@ -0,0 +1,18 @@ + "Almacenamiento externo", +"Mount point" => "Punto de montaje", +"Backend" => "Motor", +"Configuration" => "Configuración", +"Options" => "Opciones", +"Applicable" => "Aplicable", +"Add mount point" => "Añadir punto de montaje", +"None set" => "No se ha configurado", +"All Users" => "Todos los usuarios", +"Groups" => "Grupos", +"Users" => "Usuarios", +"Delete" => "Eliiminar", +"SSL root certificates" => "Raíz de certificados SSL ", +"Import Root Certificate" => "Importar certificado raíz", +"Enable User External Storage" => "Habilitar almacenamiento de usuario externo", +"Allow users to mount their own external storage" => "Permitir a los usuarios montar su propio almacenamiento externo" +); diff --git a/apps/files_external/l10n/et_EE.php b/apps/files_external/l10n/et_EE.php new file mode 100644 index 0000000000..f47ebc936b --- /dev/null +++ b/apps/files_external/l10n/et_EE.php @@ -0,0 +1,18 @@ + "Väline salvestuskoht", +"Mount point" => "Ühenduspunkt", +"Backend" => "Admin", +"Configuration" => "Seadistamine", +"Options" => "Valikud", +"Applicable" => "Rakendatav", +"Add mount point" => "Lisa ühenduspunkt", +"None set" => "Pole määratud", +"All Users" => "Kõik kasutajad", +"Groups" => "Grupid", +"Users" => "Kasutajad", +"Delete" => "Kustuta", +"SSL root certificates" => "SSL root sertifikaadid", +"Import Root Certificate" => "Impordi root sertifikaadid", +"Enable User External Storage" => "Luba kasutajatele väline salvestamine", +"Allow users to mount their own external storage" => "Luba kasutajatel ühendada külge nende enda välised salvestusseadmed" +); diff --git a/apps/files_external/l10n/eu.php b/apps/files_external/l10n/eu.php new file mode 100644 index 0000000000..6299390c26 --- /dev/null +++ b/apps/files_external/l10n/eu.php @@ -0,0 +1,18 @@ + "Kanpoko Biltegiratzea", +"Mount point" => "Montatze puntua", +"Backend" => "Motorra", +"Configuration" => "Konfigurazioa", +"Options" => "Aukerak", +"Applicable" => "Aplikagarria", +"Add mount point" => "Gehitu muntatze puntua", +"None set" => "Ezarri gabe", +"All Users" => "Erabiltzaile guztiak", +"Groups" => "Taldeak", +"Users" => "Erabiltzaileak", +"Delete" => "Ezabatu", +"SSL root certificates" => "SSL erro ziurtagiriak", +"Import Root Certificate" => "Inportatu Erro Ziurtagiria", +"Enable User External Storage" => "Gaitu erabiltzaileentzako Kanpo Biltegiratzea", +"Allow users to mount their own external storage" => "Baimendu erabiltzaileak bere kanpo biltegiratzeak muntatzen" +); diff --git a/apps/files_external/l10n/fi_FI.php b/apps/files_external/l10n/fi_FI.php new file mode 100644 index 0000000000..cea671368e --- /dev/null +++ b/apps/files_external/l10n/fi_FI.php @@ -0,0 +1,18 @@ + "Erillinen tallennusväline", +"Mount point" => "Liitospiste", +"Backend" => "Taustaosa", +"Configuration" => "Asetukset", +"Options" => "Valinnat", +"Applicable" => "Sovellettavissa", +"Add mount point" => "Lisää liitospiste", +"None set" => "Ei asetettu", +"All Users" => "Kaikki käyttäjät", +"Groups" => "Ryhmät", +"Users" => "Käyttäjät", +"Delete" => "Poista", +"SSL root certificates" => "SSL-juurivarmenteet", +"Import Root Certificate" => "Tuo juurivarmenne", +"Enable User External Storage" => "Ota käyttöön ulkopuoliset tallennuspaikat", +"Allow users to mount their own external storage" => "Salli käyttäjien liittää omia erillisiä tallennusvälineitä" +); diff --git a/apps/files_external/l10n/fr.php b/apps/files_external/l10n/fr.php new file mode 100644 index 0000000000..b3e76c6350 --- /dev/null +++ b/apps/files_external/l10n/fr.php @@ -0,0 +1,18 @@ + "Stockage externe", +"Mount point" => "Point de montage", +"Backend" => "Infrastructure", +"Configuration" => "Configuration", +"Options" => "Options", +"Applicable" => "Disponible", +"Add mount point" => "Ajouter un point de montage", +"None set" => "Aucun spécifié", +"All Users" => "Tous les utilisateurs", +"Groups" => "Groupes", +"Users" => "Utilisateurs", +"Delete" => "Supprimer", +"SSL root certificates" => "Certificats racine SSL", +"Import Root Certificate" => "Importer un certificat racine", +"Enable User External Storage" => "Activer le stockage externe pour les utilisateurs", +"Allow users to mount their own external storage" => "Autoriser les utilisateurs à monter leur propre stockage externe" +); diff --git a/apps/files_external/l10n/he.php b/apps/files_external/l10n/he.php new file mode 100644 index 0000000000..edfa9aa85f --- /dev/null +++ b/apps/files_external/l10n/he.php @@ -0,0 +1,13 @@ + "אחסון חיצוני", +"Configuration" => "הגדרות", +"Options" => "אפשרויות", +"All Users" => "כל המשתמשים", +"Groups" => "קבוצות", +"Users" => "משתמשים", +"Delete" => "מחיקה", +"SSL root certificates" => "שורש אישורי אבטחת SSL ", +"Import Root Certificate" => "ייבוא אישור אבטחת שורש", +"Enable User External Storage" => "הפעלת אחסון חיצוני למשתמשים", +"Allow users to mount their own external storage" => "יאפשר למשתמשים לעגן את האחסון החיצוני שלהם" +); diff --git a/apps/files_external/l10n/it.php b/apps/files_external/l10n/it.php new file mode 100644 index 0000000000..5c5d32b214 --- /dev/null +++ b/apps/files_external/l10n/it.php @@ -0,0 +1,18 @@ + "Archiviazione esterna", +"Mount point" => "Punto di mount", +"Backend" => "Motore", +"Configuration" => "Configurazione", +"Options" => "Opzioni", +"Applicable" => "Applicabile", +"Add mount point" => "Aggiungi punto di mount", +"None set" => "Nessuna impostazione", +"All Users" => "Tutti gli utenti", +"Groups" => "Gruppi", +"Users" => "Utenti", +"Delete" => "Elimina", +"SSL root certificates" => "Certificati SSL radice", +"Import Root Certificate" => "Importa certificato radice", +"Enable User External Storage" => "Abilita la memoria esterna dell'utente", +"Allow users to mount their own external storage" => "Consenti agli utenti di montare la propria memoria esterna" +); diff --git a/apps/files_external/l10n/ja_JP.php b/apps/files_external/l10n/ja_JP.php new file mode 100644 index 0000000000..c7d38d8832 --- /dev/null +++ b/apps/files_external/l10n/ja_JP.php @@ -0,0 +1,18 @@ + "外部ストレージ", +"Mount point" => "マウントポイント", +"Backend" => "バックエンド", +"Configuration" => "設定", +"Options" => "オプション", +"Applicable" => "適用範囲", +"Add mount point" => "マウントポイントを追加", +"None set" => "未設定", +"All Users" => "すべてのユーザ", +"Groups" => "グループ", +"Users" => "ユーザ", +"Delete" => "削除", +"SSL root certificates" => "SSLルート証明書", +"Import Root Certificate" => "ルート証明書をインポート", +"Enable User External Storage" => "ユーザの外部ストレージを有効にする", +"Allow users to mount their own external storage" => "ユーザに外部ストレージのマウントを許可する" +); diff --git a/apps/files_external/l10n/lt_LT.php b/apps/files_external/l10n/lt_LT.php new file mode 100644 index 0000000000..00022aa3d3 --- /dev/null +++ b/apps/files_external/l10n/lt_LT.php @@ -0,0 +1,9 @@ + "Konfigūracija", +"Options" => "Nustatymai", +"None set" => "Nieko nepasirinkta", +"All Users" => "Visi vartotojai", +"Groups" => "Grupės", +"Users" => "Vartotojai", +"Delete" => "Ištrinti" +); diff --git a/apps/files_external/l10n/nb_NO.php b/apps/files_external/l10n/nb_NO.php new file mode 100644 index 0000000000..273b40cf8e --- /dev/null +++ b/apps/files_external/l10n/nb_NO.php @@ -0,0 +1,8 @@ + "Konfigurasjon", +"Options" => "Innstillinger", +"All Users" => "Alle brukere", +"Groups" => "Grupper", +"Users" => "Brukere", +"Delete" => "Slett" +); diff --git a/apps/files_external/l10n/nl.php b/apps/files_external/l10n/nl.php new file mode 100644 index 0000000000..f3f38260a8 --- /dev/null +++ b/apps/files_external/l10n/nl.php @@ -0,0 +1,18 @@ + "Externe opslag", +"Mount point" => "Aankoppelpunt", +"Backend" => "Backend", +"Configuration" => "Configuratie", +"Options" => "Opties", +"Applicable" => "Van toepassing", +"Add mount point" => "Voeg aankoppelpunt toe", +"None set" => "Niets ingesteld", +"All Users" => "Alle gebruikers", +"Groups" => "Groepen", +"Users" => "Gebruikers", +"Delete" => "Verwijder", +"SSL root certificates" => "SSL root certificaten", +"Import Root Certificate" => "Importeer root certificaat", +"Enable User External Storage" => "Zet gebruiker's externe opslag aan", +"Allow users to mount their own external storage" => "Sta gebruikers toe om hun eigen externe opslag aan te koppelen" +); diff --git a/apps/files_external/l10n/pl.php b/apps/files_external/l10n/pl.php new file mode 100644 index 0000000000..df0ed54e80 --- /dev/null +++ b/apps/files_external/l10n/pl.php @@ -0,0 +1,18 @@ + "Zewnętrzna zasoby dyskowe", +"Mount point" => "Punkt montowania", +"Backend" => "Zaplecze", +"Configuration" => "Konfiguracja", +"Options" => "Opcje", +"Applicable" => "Zastosowanie", +"Add mount point" => "Dodaj punkt montowania", +"None set" => "Nie ustawione", +"All Users" => "Wszyscy uzytkownicy", +"Groups" => "Grupy", +"Users" => "Użytkownicy", +"Delete" => "Usuń", +"SSL root certificates" => "Główny certyfikat SSL", +"Import Root Certificate" => "Importuj główny certyfikat", +"Enable User External Storage" => "Włącz zewnętrzne zasoby dyskowe użytkownika", +"Allow users to mount their own external storage" => "Zezwalaj użytkownikom na montowanie ich własnych zewnętrznych zasobów dyskowych" +); diff --git a/apps/files_external/l10n/ru.php b/apps/files_external/l10n/ru.php new file mode 100644 index 0000000000..7ee4378662 --- /dev/null +++ b/apps/files_external/l10n/ru.php @@ -0,0 +1,18 @@ + "Внешний носитель", +"Mount point" => "Точка монтирования", +"Backend" => "Подсистема", +"Configuration" => "Конфигурация", +"Options" => "Опции", +"Applicable" => "Применимый", +"Add mount point" => "Добавить точку монтирования", +"None set" => "Не установлено", +"All Users" => "Все пользователи", +"Groups" => "Группы", +"Users" => "Пользователи", +"Delete" => "Удалить", +"SSL root certificates" => "Корневые сертификаты SSL", +"Import Root Certificate" => "Импортировать корневые сертификаты", +"Enable User External Storage" => "Включить пользовательские внешние носители", +"Allow users to mount their own external storage" => "Разрешить пользователям монтировать их собственные внешние носители" +); diff --git a/apps/files_external/l10n/sk_SK.php b/apps/files_external/l10n/sk_SK.php new file mode 100644 index 0000000000..24087ea7fe --- /dev/null +++ b/apps/files_external/l10n/sk_SK.php @@ -0,0 +1,18 @@ + "Externé úložisko", +"Mount point" => "Prípojný bod", +"Backend" => "Backend", +"Configuration" => "Nastavenia", +"Options" => "Možnosti", +"Applicable" => "Aplikovateľné", +"Add mount point" => "Pridať prípojný bod", +"None set" => "Žiadne nastavené", +"All Users" => "Všetci užívatelia", +"Groups" => "Skupiny", +"Users" => "Užívatelia", +"Delete" => "Odstrániť", +"SSL root certificates" => "Koreňové SSL certifikáty", +"Import Root Certificate" => "Importovať koreňový certifikát", +"Enable User External Storage" => "Povoliť externé úložisko", +"Allow users to mount their own external storage" => "Povoliť užívateľom pripojiť ich vlastné externé úložisko" +); diff --git a/apps/files_external/l10n/sl.php b/apps/files_external/l10n/sl.php new file mode 100644 index 0000000000..d588844467 --- /dev/null +++ b/apps/files_external/l10n/sl.php @@ -0,0 +1,18 @@ + "Zunanja podatkovna shramba", +"Mount point" => "Priklopna točka", +"Backend" => "Zaledje", +"Configuration" => "Nastavitve", +"Options" => "Možnosti", +"Applicable" => "Se uporablja", +"Add mount point" => "Dodaj priklopno točko", +"None set" => "Ni nastavljeno", +"All Users" => "Vsi uporabniki", +"Groups" => "Skupine", +"Users" => "Uporabniki", +"Delete" => "Izbriši", +"SSL root certificates" => "SSL korenski certifikati", +"Import Root Certificate" => "Uvozi korenski certifikat", +"Enable User External Storage" => "Omogoči uporabo zunanje podatkovne shrambe za uporabnike", +"Allow users to mount their own external storage" => "Dovoli uporabnikom priklop lastne zunanje podatkovne shrambe" +); diff --git a/apps/files_external/l10n/sv.php b/apps/files_external/l10n/sv.php new file mode 100644 index 0000000000..0838df6a32 --- /dev/null +++ b/apps/files_external/l10n/sv.php @@ -0,0 +1,18 @@ + "Extern lagring", +"Mount point" => "Monteringspunkt", +"Backend" => "Källa", +"Configuration" => "Konfiguration", +"Options" => "Alternativ", +"Applicable" => "Tillämplig", +"Add mount point" => "Lägg till monteringspunkt", +"None set" => "Ingen angiven", +"All Users" => "Alla användare", +"Groups" => "Grupper", +"Users" => "Användare", +"Delete" => "Radera", +"SSL root certificates" => "SSL rotcertifikat", +"Import Root Certificate" => "Importera rotcertifikat", +"Enable User External Storage" => "Aktivera extern lagring för användare", +"Allow users to mount their own external storage" => "Tillåt användare att montera egen extern lagring" +); diff --git a/apps/files_external/l10n/th_TH.php b/apps/files_external/l10n/th_TH.php new file mode 100644 index 0000000000..84a233046e --- /dev/null +++ b/apps/files_external/l10n/th_TH.php @@ -0,0 +1,18 @@ + "พื้นทีจัดเก็บข้อมูลจากภายนอก", +"Mount point" => "จุดชี้ตำแหน่ง", +"Backend" => "ด้านหลังระบบ", +"Configuration" => "การกำหนดค่า", +"Options" => "ตัวเลือก", +"Applicable" => "สามารถใช้งานได้", +"Add mount point" => "เพิ่มจุดชี้ตำแหน่ง", +"None set" => "ยังไม่มีการกำหนด", +"All Users" => "ผู้ใช้งานทั้งหมด", +"Groups" => "กลุ่ม", +"Users" => "ผู้ใช้งาน", +"Delete" => "ลบ", +"SSL root certificates" => "ใบรับรองความปลอดภัยด้วยระบบ SSL จาก Root", +"Import Root Certificate" => "นำเข้าข้อมูลใบรับรองความปลอดภัยจาก Root", +"Enable User External Storage" => "เปิดให้มีการใช้พื้นที่จัดเก็บข้อมูลของผู้ใช้งานจากภายนอกได้", +"Allow users to mount their own external storage" => "อนุญาตให้ผู้ใช้งานสามารถชี้ตำแหน่งไปที่พื้นที่จัดเก็บข้อมูลภายนอกของตนเองได้" +); diff --git a/apps/files_external/l10n/uk.php b/apps/files_external/l10n/uk.php new file mode 100644 index 0000000000..79920b9014 --- /dev/null +++ b/apps/files_external/l10n/uk.php @@ -0,0 +1,5 @@ + "Групи", +"Users" => "Користувачі", +"Delete" => "Видалити" +); diff --git a/apps/files_external/l10n/vi.php b/apps/files_external/l10n/vi.php new file mode 100644 index 0000000000..35312329da --- /dev/null +++ b/apps/files_external/l10n/vi.php @@ -0,0 +1,18 @@ + "Lưu trữ ngoài", +"Mount point" => "Điểm gắn", +"Backend" => "phụ trợ", +"Configuration" => "Cấu hình", +"Options" => "Tùy chọn", +"Applicable" => "Áp dụng", +"Add mount point" => "Thêm điểm lắp", +"None set" => "không", +"All Users" => "Tất cả người dùng", +"Groups" => "Nhóm", +"Users" => "Người dùng", +"Delete" => "Xóa", +"SSL root certificates" => "Chứng chỉ SSL root", +"Import Root Certificate" => "Nhập Root Certificate", +"Enable User External Storage" => "Kích hoạt tính năng lưu trữ ngoài", +"Allow users to mount their own external storage" => "Cho phép người dùng kết nối với lưu trữ riêng bên ngoài của họ" +); diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 9feb490dac..41ec3c70b4 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -29,7 +29,7 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { private $objects = array(); private static $tempFiles = array(); - + // TODO options: storage class, encryption server side, encrypt before upload? public function __construct($params) { @@ -134,12 +134,12 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { // TODO Check acl and determine who grantee is return true; } - public function is_writable($path) { + public function isUpdatable($path) { // TODO Check acl and determine who grantee is return true; } @@ -216,7 +216,7 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { } public function free_space($path) { - // Infinite? + // Infinite? return false; } @@ -232,5 +232,3 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { } } - -?> \ No newline at end of file diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 5630df77a9..eec31ec2ef 100755 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -41,9 +41,9 @@ class OC_Mount_Config { return array( 'OC_Filestorage_Local' => array('backend' => 'Local', 'configuration' => array('datadir' => 'Location')), 'OC_Filestorage_AmazonS3' => array('backend' => 'Amazon S3', 'configuration' => array('key' => 'Key', 'secret' => '*Secret', 'bucket' => 'Bucket')), - 'OC_Filestorage_Dropbox' => array('backend' => 'Dropbox', 'configuration' => array('app_key' => 'App key', 'app_secret' => 'App secret', 'token' => '#token', 'token_secret' => '#token_secret'), 'custom' => 'dropbox'), + 'OC_Filestorage_Dropbox' => array('backend' => 'Dropbox', 'configuration' => array('configured' => '#configured','app_key' => 'App key', 'app_secret' => 'App secret', 'token' => '#token', 'token_secret' => '#token_secret'), 'custom' => 'dropbox'), 'OC_Filestorage_FTP' => array('backend' => 'FTP', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root', 'secure' => '!Secure ftps://')), - 'OC_Filestorage_Google' => array('backend' => 'Google Drive', 'configuration' => array('token' => '#token', 'token_secret' => '#token secret'), 'custom' => 'google'), + 'OC_Filestorage_Google' => array('backend' => 'Google Drive', 'configuration' => array('configured' => '#configured', 'token' => '#token', 'token_secret' => '#token secret'), 'custom' => 'google'), 'OC_Filestorage_SWIFT' => array('backend' => 'OpenStack Swift', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'token' => '*Token', 'root' => '&Root', 'secure' => '!Secure ftps://')), 'OC_Filestorage_SMB' => array('backend' => 'SMB', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'share' => 'Share', 'root' => '&Root')), 'OC_Filestorage_DAV' => array('backend' => 'WebDAV', 'configuration' => array('host' => 'URL', 'user' => 'Username', 'password' => '*Password', 'root' => '&Root', 'secure' => '!Secure https://')) @@ -109,7 +109,7 @@ class OC_Mount_Config { return $personal; } - + /** * Add a mount point to the filesystem * @param string Mount point @@ -186,7 +186,7 @@ class OC_Mount_Config { */ private static function readData($isPersonal) { if ($isPersonal) { - $file = OC::$SERVERROOT.'/data/'.OCP\User::getUser().'/mount.php'; + $file = OC_User::getHome(OCP\User::getUser()).'/mount.php'; } else { $file = OC::$SERVERROOT.'/config/mount.php'; } @@ -206,7 +206,7 @@ class OC_Mount_Config { */ private static function writeData($isPersonal, $data) { if ($isPersonal) { - $file = OC::$SERVERROOT.'/data/'.OCP\User::getUser().'/mount.php'; + $file = OC_User::getHome(OCP\User::getUser()).'/mount.php'; } else { $file = OC::$SERVERROOT.'/config/mount.php'; } @@ -217,7 +217,7 @@ class OC_Mount_Config { $content .= "\t\t'".$group."' => array (\n"; foreach ($mounts as $mountPoint => $mount) { $content .= "\t\t\t'".$mountPoint."' => ".str_replace("\n", '', var_export($mount, true)).",\n"; - + } $content .= "\t\t),\n"; } @@ -237,11 +237,11 @@ class OC_Mount_Config { $content .= ");\n?>"; @file_put_contents($file, $content); } - - /** - * Returns all user uploaded ssl root certificates - * @return array - */ + + /** + * Returns all user uploaded ssl root certificates + * @return array + */ public static function getCertificates() { $view = \OCP\Files::getStorage('files_external'); $path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/'; @@ -253,31 +253,29 @@ class OC_Mount_Config { } return $result; } - + /** * creates certificate bundle */ public static function createCertificateBundle() { - $view = \OCP\Files::getStorage("files_external"); - $path = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath(""); - - $certs = OC_Mount_Config::getCertificates(); - $fh_certs = fopen($path."/rootcerts.crt", 'w'); - foreach ($certs as $cert) { - $file=$path.'/uploads/'.$cert; - $fh = fopen($file, "r"); - $data = fread($fh, filesize($file)); + $view = \OCP\Files::getStorage("files_external"); + $path = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath(""); + + $certs = OC_Mount_Config::getCertificates(); + $fh_certs = fopen($path."/rootcerts.crt", 'w'); + foreach ($certs as $cert) { + $file=$path.'/uploads/'.$cert; + $fh = fopen($file, "r"); + $data = fread($fh, filesize($file)); fclose($fh); - if (strpos($data, 'BEGIN CERTIFICATE')) { + if (strpos($data, 'BEGIN CERTIFICATE')) { fwrite($fh_certs, $data); - } - } - + } + } + fclose($fh_certs); - + return true; - } + } } - -?> \ No newline at end of file diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php index c849db3843..bb86894e55 100755 --- a/apps/files_external/lib/dropbox.php +++ b/apps/files_external/lib/dropbox.php @@ -30,9 +30,13 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { private static $tempFiles = array(); public function __construct($params) { - $oauth = new Dropbox_OAuth_Curl($params['app_key'], $params['app_secret']); - $oauth->setToken($params['token'], $params['token_secret']); - $this->dropbox = new Dropbox_API($oauth, 'dropbox'); + if (isset($params['configured']) && $params['configured'] == 'true' && isset($params['app_key']) && isset($params['app_secret']) && isset($params['token']) && isset($params['token_secret'])) { + $oauth = new Dropbox_OAuth_Curl($params['app_key'], $params['app_secret']); + $oauth->setToken($params['token'], $params['token_secret']); + $this->dropbox = new Dropbox_API($oauth, 'dropbox'); + } else { + throw new Exception('Creating OC_Filestorage_Dropbox storage failed'); + } } private function getMetaData($path, $list = false) { @@ -43,6 +47,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { try { $response = $this->dropbox->getMetaData($path); } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } if ($response && isset($response['contents'])) { @@ -63,6 +68,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->metaData[$path] = $response; return $response; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -74,6 +80,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->dropbox->createFolder($path); return true; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -118,11 +125,11 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { return $this->file_exists($path); } - public function is_writable($path) { + public function isUpdatable($path) { return $this->file_exists($path); } @@ -141,6 +148,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->dropbox->delete($path); return true; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -150,6 +158,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->dropbox->move($path1, $path2); return true; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -159,6 +168,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->dropbox->copy($path1, $path2); return true; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -173,6 +183,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { file_put_contents($tmpFile, $data); return fopen($tmpFile, 'r'); } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } case 'w': @@ -211,7 +222,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $this->dropbox->putFile(self::$tempFiles[$tmpFile], $handle); unlink($tmpFile); } catch (Exception $exception) { - + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); } } } @@ -230,6 +241,7 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { $info = $this->dropbox->getAccountInfo(); return $info['quota_info']['quota'] - $info['quota_info']['normal']; } catch (Exception $exception) { + OCP\Util::writeLog('files_external', $exception->getMessage(), OCP\Util::ERROR); return false; } } @@ -239,5 +251,3 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { } } - -?> \ No newline at end of file diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php index 4d5ae670de..261141455c 100644 --- a/apps/files_external/lib/ftp.php +++ b/apps/files_external/lib/ftp.php @@ -14,19 +14,20 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ private $root; private static $tempFiles=array(); - - public function __construct($params){ + + public function __construct($params) { $this->host=$params['host']; $this->user=$params['user']; $this->password=$params['password']; $this->secure=isset($params['secure'])?(bool)$params['secure']:false; $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/'){ + if(!$this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } - //create the root folder if necesary - mkdir($this->constructUrl('')); + if (!$this->is_dir('')) { + $this->mkdir(''); + } } /** @@ -34,16 +35,16 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ * @param string path * @return string */ - public function constructUrl($path){ + public function constructUrl($path) { $url='ftp'; - if($this->secure){ + if($this->secure) { $url.='s'; } $url.='://'.$this->user.':'.$this->password.'@'.$this->host.$this->root.$path; return $url; } - public function fopen($path,$mode){ - switch($mode){ + public function fopen($path,$mode) { + switch($mode) { case 'r': case 'rb': case 'w': @@ -62,14 +63,14 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ case 'c': case 'c+': //emulate these - if(strrpos($path,'.')!==false){ + if(strrpos($path,'.')!==false) { $ext=substr($path,strrpos($path,'.')); }else{ $ext=''; } $tmpFile=OCP\Files::tmpFile($ext); OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack'); - if($this->file_exists($path)){ + if($this->file_exists($path)) { $this->getFile($path,$tmpFile); } self::$tempFiles[$tmpFile]=$path; @@ -77,8 +78,8 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{ } } - public function writeBack($tmpFile){ - if(isset(self::$tempFiles[$tmpFile])){ + public function writeBack($tmpFile) { + if(isset(self::$tempFiles[$tmpFile])) { $this->uploadFile($tmpFile,self::$tempFiles[$tmpFile]); unlink($tmpFile); } diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 2ad85d09d5..9b83dcee53 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -31,13 +31,17 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { private static $tempFiles = array(); - public function __construct($arguments) { - $consumer_key = isset($arguments['consumer_key']) ? $arguments['consumer_key'] : 'anonymous'; - $consumer_secret = isset($arguments['consumer_secret']) ? $arguments['consumer_secret'] : 'anonymous'; - $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); - $this->oauth_token = new OAuthToken($arguments['token'], $arguments['token_secret']); - $this->sig_method = new OAuthSignatureMethod_HMAC_SHA1(); - $this->entries = array(); + public function __construct($params) { + if (isset($params['configured']) && $params['configured'] == 'true' && isset($params['token']) && isset($params['token_secret'])) { + $consumer_key = isset($params['consumer_key']) ? $params['consumer_key'] : 'anonymous'; + $consumer_secret = isset($params['consumer_secret']) ? $params['consumer_secret'] : 'anonymous'; + $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); + $this->oauth_token = new OAuthToken($params['token'], $params['token_secret']); + $this->sig_method = new OAuthSignatureMethod_HMAC_SHA1(); + $this->entries = array(); + } else { + throw new Exception('Creating OC_Filestorage_Google storage failed'); + } } private function sendRequest($uri, $httpMethod, $postData = null, $extraHeaders = null, $isDownload = false, $returnHeaders = false, $isContentXML = true, $returnHTTPCode = false) { @@ -115,7 +119,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } } } - return false; + return false; } private function getFeed($feedUri, $httpMethod, $postData = null) { @@ -170,7 +174,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { return 'html'; } } - + public function mkdir($path) { $collection = dirname($path); @@ -250,7 +254,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } else if ($entry = $this->getResource($path)) { // NOTE: Native resources don't have a file size $stat['size'] = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'quotaBytesUsed')->item(0)->nodeValue; -// if (isset($atime = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'lastViewed')->item(0)->nodeValue)) +// if (isset($atime = $entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'lastViewed')->item(0)->nodeValue)) // $stat['atime'] = strtotime($entry->getElementsByTagNameNS('http://schemas.google.com/g/2005', 'lastViewed')->item(0)->nodeValue); $stat['mtime'] = strtotime($entry->getElementsByTagName('updated')->item(0)->nodeValue); $stat['ctime'] = strtotime($entry->getElementsByTagName('published')->item(0)->nodeValue); @@ -280,11 +284,11 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { return true; } - public function is_writable($path) { + public function isUpdatable($path) { if ($path == '' || $path == '/') { return true; } else if ($entry = $this->getResource($path)) { @@ -300,7 +304,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } return false; } - + public function file_exists($path) { if ($path == '' || $path == '/') { return true; @@ -309,7 +313,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } return false; } - + public function unlink($path) { // Get resource self link to trash resource if ($entry = $this->getResource($path)) { @@ -478,7 +482,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { // TODO Wait for resource entry } } - + public function getMimeType($path, $entry = null) { // Entry can be passed, because extension is required for opendir and the entry can't be cached without the extension if ($entry == null) { @@ -518,7 +522,7 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } return false; } - + public function free_space($path) { if ($dom = $this->getFeed('https://docs.google.com/feeds/metadata/default', 'GET')) { // NOTE: Native Google Docs resources don't count towards quota @@ -528,9 +532,9 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { } return false; } - + public function touch($path, $mtime = null) { - + } } \ No newline at end of file diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php index 8a5e993b1d..e5ba7a1774 100644 --- a/apps/files_external/lib/smb.php +++ b/apps/files_external/lib/smb.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -require_once('smb4php/smb.php'); +require_once 'smb4php/smb.php'; class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ private $password; @@ -15,40 +15,40 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ private $root; private $share; - public function __construct($params){ + public function __construct($params) { $this->host=$params['host']; $this->user=$params['user']; $this->password=$params['password']; $this->share=$params['share']; $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/'){ + if(!$this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } - if(substr($this->root,-1,1)!='/'){ + if(substr($this->root,-1,1)!='/') { $this->root.='/'; } - if(!$this->share || $this->share[0]!='/'){ + if(!$this->share || $this->share[0]!='/') { $this->share='/'.$this->share; } - if(substr($this->share,-1,1)=='/'){ + if(substr($this->share,-1,1)=='/') { $this->share=substr($this->share,0,-1); } //create the root folder if necesary - if(!$this->is_dir('')){ + if(!$this->is_dir('')) { $this->mkdir(''); } } - public function constructUrl($path){ - if(substr($path,-1)=='/'){ + public function constructUrl($path) { + if(substr($path,-1)=='/') { $path=substr($path,0,-1); } return 'smb://'.$this->user.':'.$this->password.'@'.$this->host.$this->share.$this->root.$path; } - public function stat($path){ - if(!$path and $this->root=='/'){//mtime doesn't work for shares + public function stat($path) { + if(!$path and $this->root=='/') {//mtime doesn't work for shares $mtime=$this->shareMTime(); $stat=stat($this->constructUrl($path)); $stat['mtime']=$mtime; @@ -58,7 +58,7 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ } } - public function filetype($path){ + public function filetype($path) { return (bool)@$this->opendir($path);//using opendir causes the same amount of requests and caches the content of the folder in one go } @@ -67,8 +67,8 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ * @param int $time * @return bool */ - public function hasUpdated($path,$time){ - if(!$path and $this->root=='/'){ + public function hasUpdated($path,$time) { + if(!$path and $this->root=='/') { //mtime doesn't work for shares, but giving the nature of the backend, doing a full update is still just fast enough return true; }else{ @@ -80,13 +80,13 @@ class OC_FileStorage_SMB extends OC_FileStorage_StreamWrapper{ /** * get the best guess for the modification time of the share */ - private function shareMTime(){ + private function shareMTime() { $dh=$this->opendir(''); $lastCtime=0; - while($file=readdir($dh)){ - if($file!='.' and $file!='..'){ + while($file=readdir($dh)) { + if($file!='.' and $file!='..') { $ctime=$this->filemtime($file); - if($ctime>$lastCtime){ + if($ctime>$lastCtime) { $lastCtime=$ctime; } } diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php index 7d56445361..7263ef2325 100644 --- a/apps/files_external/lib/streamwrapper.php +++ b/apps/files_external/lib/streamwrapper.php @@ -10,12 +10,12 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ abstract public function constructUrl($path); - public function mkdir($path){ + public function mkdir($path) { return mkdir($this->constructUrl($path)); } - public function rmdir($path){ - if($this->file_exists($path)){ + public function rmdir($path) { + if($this->file_exists($path)) { $succes=rmdir($this->constructUrl($path)); clearstatcache(); return $succes; @@ -24,42 +24,42 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ } } - public function opendir($path){ + public function opendir($path) { return opendir($this->constructUrl($path)); } - public function filetype($path){ + public function filetype($path) { return filetype($this->constructUrl($path)); } - public function is_readable($path){ + public function isReadable($path) { return true;//not properly supported } - public function is_writable($path){ + public function isUpdatable($path) { return true;//not properly supported } - public function file_exists($path){ + public function file_exists($path) { return file_exists($this->constructUrl($path)); } - public function unlink($path){ + public function unlink($path) { $succes=unlink($this->constructUrl($path)); clearstatcache(); return $succes; } - public function fopen($path,$mode){ + public function fopen($path,$mode) { return fopen($this->constructUrl($path),$mode); } - public function free_space($path){ + public function free_space($path) { return 0; } - public function touch($path,$mtime=null){ - if(is_null($mtime)){ + public function touch($path,$mtime=null) { + if(is_null($mtime)) { $fh=$this->fopen($path,'a'); fwrite($fh,''); fclose($fh); @@ -68,19 +68,19 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ } } - public function getFile($path,$target){ + public function getFile($path,$target) { return copy($this->constructUrl($path),$target); } - public function uploadFile($path,$target){ + public function uploadFile($path,$target) { return copy($path,$this->constructUrl($target)); } - public function rename($path1,$path2){ + public function rename($path1,$path2) { return rename($this->constructUrl($path1),$this->constructUrl($path2)); } - public function stat($path){ + public function stat($path) { return stat($this->constructUrl($path)); } diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php index 58b95a6ae0..c29d28b44c 100644 --- a/apps/files_external/lib/swift.php +++ b/apps/files_external/lib/swift.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -require_once('php-cloudfiles/cloudfiles.php'); +require_once 'php-cloudfiles/cloudfiles.php'; class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ private $host; @@ -38,7 +38,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return string */ - private function getContainerName($path){ + private function getContainerName($path) { $path=trim($this->root.$path,'/'); return str_replace('/','\\',$path); } @@ -48,18 +48,18 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return CF_Container */ - private function getContainer($path){ - if($path=='' or $path=='/'){ + private function getContainer($path) { + if($path=='' or $path=='/') { return $this->rootContainer; } - if(isset($this->containers[$path])){ + if(isset($this->containers[$path])) { return $this->containers[$path]; } try{ $container=$this->conn->get_container($this->getContainerName($path)); $this->containers[$path]=$container; return $container; - }catch(NoSuchContainerException $e){ + }catch(NoSuchContainerException $e) { return null; } } @@ -69,15 +69,15 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return CF_Container */ - private function createContainer($path){ - if($path=='' or $path=='/'){ + private function createContainer($path) { + if($path=='' or $path=='/') { return $this->conn->create_container($this->getContainerName($path)); } $parent=dirname($path); - if($parent=='' or $parent=='/'){ + if($parent=='' or $parent=='/') { $parentContainer=$this->rootContainer; }else{ - if(!$this->containerExists($parent)){ + if(!$this->containerExists($parent)) { $parentContainer=$this->createContainer($parent); }else{ $parentContainer=$this->getContainer($parent); @@ -92,19 +92,19 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return CF_Object */ - private function getObject($path){ - if(isset($this->objects[$path])){ + private function getObject($path) { + if(isset($this->objects[$path])) { return $this->objects[$path]; } $container=$this->getContainer(dirname($path)); - if(is_null($container)){ + if(is_null($container)) { return null; }else{ try{ $obj=$container->get_object(basename($path)); $this->objects[$path]=$obj; return $obj; - }catch(NoSuchObjectException $e){ + }catch(NoSuchObjectException $e) { return null; } } @@ -115,12 +115,12 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param CF_Container * @return array */ - private function getObjects($container){ - if(is_null($container)){ + private function getObjects($container) { + if(is_null($container)) { return array(); }else{ $files=$container->get_objects(); - foreach($files as &$file){ + foreach($files as &$file) { $file=$file->name; } return $files; @@ -132,9 +132,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return CF_Object */ - private function createObject($path){ + private function createObject($path) { $container=$this->getContainer(dirname($path)); - if(!is_null($container)){ + if(!is_null($container)) { $container=$this->createContainer($path); } return $container->create_object(basename($path)); @@ -145,7 +145,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string * @return bool */ - private function objectExists($path){ + private function objectExists($path) { return !is_null($this->getObject($path)); } @@ -154,7 +154,7 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string path * @return bool */ - private function containerExists($path){ + private function containerExists($path) { return !is_null($this->getContainer($path)); } @@ -163,18 +163,18 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param CF_Container container * @return array */ - private function getSubContainers($container){ + private function getSubContainers($container) { $tmpFile=OCP\Files::tmpFile(); $obj=$this->getSubContainerFile($container); try{ $obj->save_to_filename($tmpFile); - }catch(Exception $e){ + }catch(Exception $e) { return array(); } $obj->save_to_filename($tmpFile); $containers=file($tmpFile); unlink($tmpFile); - foreach($containers as &$sub){ + foreach($containers as &$sub) { $sub=trim($sub); } return $containers; @@ -186,8 +186,8 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string name * @return bool */ - private function addSubContainer($container,$name){ - if(!$name){ + private function addSubContainer($container,$name) { + if(!$name) { return false; } $tmpFile=OCP\Files::tmpFile(); @@ -195,17 +195,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ try{ $obj->save_to_filename($tmpFile); $containers=file($tmpFile); - foreach($containers as &$sub){ + foreach($containers as &$sub) { $sub=trim($sub); } - if(array_search($name,$containers)!==false){ + if(array_search($name,$containers)!==false) { unlink($tmpFile); return false; }else{ $fh=fopen($tmpFile,'a'); fwrite($fh,$name."\n"); } - }catch(Exception $e){ + }catch(Exception $e) { $containers=array(); file_put_contents($tmpFile,$name."\n"); } @@ -221,8 +221,8 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param string name * @return bool */ - private function removeSubContainer($container,$name){ - if(!$name){ + private function removeSubContainer($container,$name) { + if(!$name) { return false; } $tmpFile=OCP\Files::tmpFile(); @@ -230,14 +230,14 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ try{ $obj->save_to_filename($tmpFile); $containers=file($tmpFile); - }catch(Exception $e){ + }catch(Exception $e) { return false; } - foreach($containers as &$sub){ + foreach($containers as &$sub) { $sub=trim($sub); } $i=array_search($name,$containers); - if($i===false){ + if($i===false) { unlink($tmpFile); return false; }else{ @@ -255,29 +255,29 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * @param CF_Container container * @return CF_Object */ - private function getSubContainerFile($container){ + private function getSubContainerFile($container) { try{ return $container->get_object(self::SUBCONTAINER_FILE); - }catch(NoSuchObjectException $e){ + }catch(NoSuchObjectException $e) { return $container->create_object(self::SUBCONTAINER_FILE); } } - public function __construct($params){ + public function __construct($params) { $this->token=$params['token']; $this->host=$params['host']; $this->user=$params['user']; $this->root=isset($params['root'])?$params['root']:'/'; $this->secure=isset($params['secure'])?(bool)$params['secure']:true; - if(!$this->root || $this->root[0]!='/'){ + if(!$this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } $this->auth = new CF_Authentication($this->user, $this->token, null, $this->host); $this->auth->authenticate(); - + $this->conn = new CF_Connection($this->auth); - if(!$this->containerExists($this->root)){ + if(!$this->containerExists($this->root)) { $this->rootContainer=$this->createContainer('/'); }else{ $this->rootContainer=$this->getContainer('/'); @@ -285,8 +285,8 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } - public function mkdir($path){ - if($this->containerExists($path)){ + public function mkdir($path) { + if($this->containerExists($path)) { return false; }else{ $this->createContainer($path); @@ -294,30 +294,30 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } } - public function rmdir($path){ - if(!$this->containerExists($path)){ + public function rmdir($path) { + if(!$this->containerExists($path)) { return false; }else{ $this->emptyContainer($path); - if($path!='' and $path!='/'){ + if($path!='' and $path!='/') { $parentContainer=$this->getContainer(dirname($path)); $this->removeSubContainer($parentContainer,basename($path)); } - + $this->conn->delete_container($this->getContainerName($path)); unset($this->containers[$path]); return true; } } - private function emptyContainer($path){ + private function emptyContainer($path) { $container=$this->getContainer($path); - if(is_null($container)){ + if(is_null($container)) { return; } $subContainers=$this->getSubContainers($container); - foreach($subContainers as $sub){ - if($sub){ + foreach($subContainers as $sub) { + if($sub) { $this->emptyContainer($path.'/'.$sub); $this->conn->delete_container($this->getContainerName($path.'/'.$sub)); unset($this->containers[$path.'/'.$sub]); @@ -325,17 +325,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } $objects=$this->getObjects($container); - foreach($objects as $object){ + foreach($objects as $object) { $container->delete_object($object); unset($this->objects[$path.'/'.$object]); } } - public function opendir($path){ + public function opendir($path) { $container=$this->getContainer($path); $files=$this->getObjects($container); $i=array_search(self::SUBCONTAINER_FILE,$files); - if($i!==false){ + if($i!==false) { unset($files[$i]); } $subContainers=$this->getSubContainers($container); @@ -345,43 +345,43 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ return opendir('fakedir://'.$id); } - public function filetype($path){ - if($this->containerExists($path)){ + public function filetype($path) { + if($this->containerExists($path)) { return 'dir'; }else{ return 'file'; } } - public function is_readable($path){ + public function isReadable($path) { return true; } - public function is_writable($path){ + public function isUpdatable($path) { return true; } - public function file_exists($path){ - if($this->is_dir($path)){ + public function file_exists($path) { + if($this->is_dir($path)) { return true; }else{ return $this->objectExists($path); } } - public function file_get_contents($path){ + public function file_get_contents($path) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { return false; } return $obj->read(); } - public function file_put_contents($path,$content){ + public function file_put_contents($path,$content) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { $container=$this->getContainer(dirname($path)); - if(is_null($container)){ + if(is_null($container)) { return false; } $obj=$container->create_object(basename($path)); @@ -390,8 +390,8 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ return $obj->write($content); } - public function unlink($path){ - if($this->objectExists($path)){ + public function unlink($path) { + if($this->objectExists($path)) { $container=$this->getContainer(dirname($path)); $container->delete_object(basename($path)); unset($this->objects[$path]); @@ -400,17 +400,17 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } } - public function fopen($path,$mode){ + public function fopen($path,$mode) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { return false; } - switch($mode){ + switch($mode) { case 'r': case 'rb': $fp = fopen('php://temp', 'r+'); $obj->stream($fp); - + rewind($fp); return $fp; case 'w': @@ -432,61 +432,61 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } } - public function writeBack($tmpFile){ - if(isset(self::$tempFiles[$tmpFile])){ + public function writeBack($tmpFile) { + if(isset(self::$tempFiles[$tmpFile])) { $this->fromTmpFile($tmpFile,self::$tempFiles[$tmpFile]); unlink($tmpFile); } } - public function free_space($path){ + public function free_space($path) { return 0; } - public function touch($path,$mtime=null){ + public function touch($path,$mtime=null) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { return false; } - if(is_null($mtime)){ + if(is_null($mtime)) { $mtime=time(); } - + //emulate setting mtime with metadata $obj->metadata['Mtime']=$mtime; $obj->sync_metadata(); } - public function rename($path1,$path2){ + public function rename($path1,$path2) { $sourceContainer=$this->getContainer(dirname($path1)); $targetContainer=$this->getContainer(dirname($path2)); $result=$sourceContainer->move_object_to(basename($path1),$targetContainer,basename($path2)); unset($this->objects[$path1]); - if($result){ + if($result) { $targetObj=$this->getObject($path2); $this->resetMTime($targetObj); } return $result; } - public function copy($path1,$path2){ + public function copy($path1,$path2) { $sourceContainer=$this->getContainer(dirname($path1)); $targetContainer=$this->getContainer(dirname($path2)); $result=$sourceContainer->copy_object_to(basename($path1),$targetContainer,basename($path2)); - if($result){ + if($result) { $targetObj=$this->getObject($path2); $this->resetMTime($targetObj); } return $result; } - public function stat($path){ + public function stat($path) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { return false; } - if(isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1){ + if(isset($obj->metadata['Mtime']) and $obj->metadata['Mtime']>-1) { $mtime=$obj->metadata['Mtime']; }else{ $mtime=strtotime($obj->last_modified); @@ -498,9 +498,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ ); } - private function getTmpFile($path){ + private function getTmpFile($path) { $obj=$this->getObject($path); - if(!is_null($obj)){ + if(!is_null($obj)) { $tmpFile=OCP\Files::tmpFile(); $obj->save_to_filename($tmpFile); return $tmpFile; @@ -509,9 +509,9 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } } - private function fromTmpFile($tmpFile,$path){ + private function fromTmpFile($tmpFile,$path) { $obj=$this->getObject($path); - if(is_null($obj)){ + if(is_null($obj)) { $obj=$this->createObject($path); } $obj->load_from_filename($tmpFile); @@ -522,8 +522,8 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ * remove custom mtime metadata * @param CF_Object obj */ - private function resetMTime($obj){ - if(isset($obj->metadata['Mtime'])){ + private function resetMTime($obj) { + if(isset($obj->metadata['Mtime'])) { $obj->metadata['Mtime']=-1; $obj->sync_metadata(); } diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 84d64b6519..3c18b227fa 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -18,8 +18,8 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ private $client; private static $tempFiles=array(); - - public function __construct($params){ + + public function __construct($params) { $host = $params['host']; //remove leading http[s], will be generated in createBaseUri() if (substr($host,0,8) == "https://") $host = substr($host, 8); @@ -29,13 +29,13 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ $this->password=$params['password']; $this->secure=(isset($params['secure']) && $params['secure'] == 'true')?true:false; $this->root=isset($params['root'])?$params['root']:'/'; - if(!$this->root || $this->root[0]!='/'){ + if(!$this->root || $this->root[0]!='/') { $this->root='/'.$this->root; } - if(substr($this->root,-1,1)!='/'){ + if(substr($this->root,-1,1)!='/') { $this->root.='/'; } - + $settings = array( 'baseUri' => $this->createBaseUri(), 'userName' => $this->user, @@ -43,7 +43,7 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ ); $this->client = new OC_Connector_Sabre_Client($settings); - + if($caview = \OCP\Files::getStorage('files_external')) { $certPath=\OCP\Config::getSystemValue('datadirectory').$caview->getAbsolutePath("").'rootcerts.crt'; if (file_exists($certPath)) { @@ -54,26 +54,26 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ $this->mkdir(''); } - private function createBaseUri(){ + private function createBaseUri() { $baseUri='http'; - if($this->secure){ + if($this->secure) { $baseUri.='s'; } $baseUri.='://'.$this->host.$this->root; return $baseUri; } - public function mkdir($path){ + public function mkdir($path) { $path=$this->cleanPath($path); return $this->simpleResponse('MKCOL',$path,null,201); } - public function rmdir($path){ + public function rmdir($path) { $path=$this->cleanPath($path); return $this->simpleResponse('DELETE',$path,null,204); } - public function opendir($path){ + public function opendir($path) { $path=$this->cleanPath($path); try{ $response=$this->client->propfind($path, array(),1); @@ -81,54 +81,54 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ OC_FakeDirStream::$dirs[$id]=array(); $files=array_keys($response); array_shift($files);//the first entry is the current directory - foreach($files as $file){ + foreach($files as $file) { $file = urldecode(basename($file)); OC_FakeDirStream::$dirs[$id][]=$file; } return opendir('fakedir://'.$id); - }catch(Exception $e){ + }catch(Exception $e) { return false; } } - public function filetype($path){ + public function filetype($path) { $path=$this->cleanPath($path); try{ $response=$this->client->propfind($path, array('{DAV:}resourcetype')); $responseType=$response["{DAV:}resourcetype"]->resourceType; return (count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file'; - }catch(Exception $e){ + }catch(Exception $e) { error_log($e->getMessage()); \OCP\Util::writeLog("webdav client", \OCP\Util::sanitizeHTML($e->getMessage()), \OCP\Util::ERROR); return false; } } - public function is_readable($path){ + public function isReadable($path) { return true;//not properly supported } - public function is_writable($path){ + public function isUpdatable($path) { return true;//not properly supported } - public function file_exists($path){ + public function file_exists($path) { $path=$this->cleanPath($path); try{ $this->client->propfind($path, array('{DAV:}resourcetype')); return true;//no 404 exception - }catch(Exception $e){ + }catch(Exception $e) { return false; } } - public function unlink($path){ + public function unlink($path) { return $this->simpleResponse('DELETE',$path,null,204); } - public function fopen($path,$mode){ + public function fopen($path,$mode) { $path=$this->cleanPath($path); - switch($mode){ + switch($mode) { case 'r': case 'rb': //straight up curl instead of sabredav here, sabredav put's the entire get result in memory @@ -155,14 +155,14 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ case 'c': case 'c+': //emulate these - if(strrpos($path,'.')!==false){ + if(strrpos($path,'.')!==false) { $ext=substr($path,strrpos($path,'.')); }else{ $ext=''; } $tmpFile=OCP\Files::tmpFile($ext); OC_CloseStreamWrapper::$callBacks[$tmpFile]=array($this,'writeBack'); - if($this->file_exists($path)){ + if($this->file_exists($path)) { $this->getFile($path,$tmpFile); } self::$tempFiles[$tmpFile]=$path; @@ -170,41 +170,41 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ } } - public function writeBack($tmpFile){ - if(isset(self::$tempFiles[$tmpFile])){ + public function writeBack($tmpFile) { + if(isset(self::$tempFiles[$tmpFile])) { $this->uploadFile($tmpFile,self::$tempFiles[$tmpFile]); unlink($tmpFile); } } - public function free_space($path){ + public function free_space($path) { $path=$this->cleanPath($path); try{ $response=$this->client->propfind($path, array('{DAV:}quota-available-bytes')); - if(isset($response['{DAV:}quota-available-bytes'])){ + if(isset($response['{DAV:}quota-available-bytes'])) { return (int)$response['{DAV:}quota-available-bytes']; }else{ return 0; } - }catch(Exception $e){ + }catch(Exception $e) { return 0; } } - public function touch($path,$mtime=null){ - if(is_null($mtime)){ + public function touch($path,$mtime=null) { + if(is_null($mtime)) { $mtime=time(); } $path=$this->cleanPath($path); $this->client->proppatch($path, array('{DAV:}lastmodified' => $mtime)); } - public function getFile($path,$target){ + public function getFile($path,$target) { $source=$this->fopen($path,'r'); file_put_contents($target,$source); } - public function uploadFile($path,$target){ + public function uploadFile($path,$target) { $source=fopen($path,'r'); $curl = curl_init(); @@ -218,13 +218,13 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ curl_close ($curl); } - public function rename($path1,$path2){ + public function rename($path1,$path2) { $path1=$this->cleanPath($path1); $path2=$this->root.$this->cleanPath($path2); try{ $response=$this->client->request('MOVE',$path1,null,array('Destination'=>$path2)); return true; - }catch(Exception $e){ + }catch(Exception $e) { echo $e; echo 'fail'; var_dump($response); @@ -232,13 +232,13 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ } } - public function copy($path1,$path2){ + public function copy($path1,$path2) { $path1=$this->cleanPath($path1); $path2=$this->root.$this->cleanPath($path2); try{ $response=$this->client->request('COPY',$path1,null,array('Destination'=>$path2)); return true; - }catch(Exception $e){ + }catch(Exception $e) { echo $e; echo 'fail'; var_dump($response); @@ -246,7 +246,7 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ } } - public function stat($path){ + public function stat($path) { $path=$this->cleanPath($path); try{ $response=$this->client->propfind($path, array('{DAV:}getlastmodified','{DAV:}getcontentlength')); @@ -255,45 +255,44 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ 'size'=>(int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0, 'ctime'=>-1, ); - }catch(Exception $e){ + }catch(Exception $e) { return array(); } } - public function getMimeType($path){ + public function getMimeType($path) { $path=$this->cleanPath($path); try{ $response=$this->client->propfind($path, array('{DAV:}getcontenttype','{DAV:}resourcetype')); $responseType=$response["{DAV:}resourcetype"]->resourceType; $type=(count($responseType)>0 and $responseType[0]=="{DAV:}collection")?'dir':'file'; - if($type=='dir'){ + if($type=='dir') { return 'httpd/unix-directory'; - }elseif(isset($response['{DAV:}getcontenttype'])){ + }elseif(isset($response['{DAV:}getcontenttype'])) { return $response['{DAV:}getcontenttype']; }else{ return false; } - }catch(Exception $e){ + }catch(Exception $e) { return false; } } - private function cleanPath($path){ - if(!$path || $path[0]=='/'){ + private function cleanPath($path) { + if(!$path || $path[0]=='/') { return substr($path,1); }else{ return $path; } } - private function simpleResponse($method,$path,$body,$expected){ + private function simpleResponse($method,$path,$body,$expected) { $path=$this->cleanPath($path); try{ $response=$this->client->request($method,$path,$body); return $response['statusCode']==$expected; - }catch(Exception $e){ + }catch(Exception $e) { return false; } } } - diff --git a/apps/files_external/personal.php b/apps/files_external/personal.php index dec501741b..f0d76460f5 100755 --- a/apps/files_external/personal.php +++ b/apps/files_external/personal.php @@ -31,5 +31,3 @@ $tmpl->assign('mounts', OC_Mount_Config::getPersonalMountPoints()); $tmpl->assign('certs', OC_Mount_Config::getCertificates()); $tmpl->assign('backends', $backends); return $tmpl->fetchPage(); - -?> \ No newline at end of file diff --git a/apps/files_external/settings.php b/apps/files_external/settings.php index acc9036b29..b586ce1e8c 100644 --- a/apps/files_external/settings.php +++ b/apps/files_external/settings.php @@ -30,5 +30,3 @@ $tmpl->assign('groups', OC_Group::getGroups()); $tmpl->assign('users', OCP\User::getUsers()); $tmpl->assign('allowUserMounting', OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes')); return $tmpl->fetchPage(); - -?> \ No newline at end of file diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index e8bc94790d..c44b09b180 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -15,7 +15,7 @@ array())); ?> $mount): ?> - > + > @@ -80,9 +80,9 @@
    - + - '> +
    '> @@ -91,17 +91,17 @@ - + -
    t('SSL root certificates'); ?>
    ><?php echo $l->t('Delete'); ?>
    + - + - +
    /> diff --git a/apps/files_external/tests/ftp.php b/apps/files_external/tests/ftp.php index 97796bca12..12f3ec3908 100644 --- a/apps/files_external/tests/ftp.php +++ b/apps/files_external/tests/ftp.php @@ -5,25 +5,24 @@ * later. * See the COPYING-README file. */ - + $config=include('apps/files_external/tests/config.php'); -if(!is_array($config) or !isset($config['ftp']) or !$config['ftp']['run']){ +if(!is_array($config) or !isset($config['ftp']) or !$config['ftp']['run']) { abstract class Test_Filestorage_FTP extends Test_FileStorage{} return; }else{ class Test_Filestorage_FTP extends Test_FileStorage { private $config; - public function setUp(){ + public function setUp() { $id=uniqid(); $this->config=include('apps/files_external/tests/config.php'); $this->config['ftp']['root'].='/'.$id;//make sure we have an new empty folder to work in $this->instance=new OC_Filestorage_FTP($this->config['ftp']); } - public function tearDown(){ + public function tearDown() { OCP\Files::rmdirr($this->instance->constructUrl('')); } } } - diff --git a/apps/files_external/tests/google.php b/apps/files_external/tests/google.php index 806db5a6aa..d2a6358ade 100644 --- a/apps/files_external/tests/google.php +++ b/apps/files_external/tests/google.php @@ -21,24 +21,23 @@ */ $config=include('apps/files_external/tests/config.php'); -if(!is_array($config) or !isset($config['google']) or !$config['google']['run']){ +if(!is_array($config) or !isset($config['google']) or !$config['google']['run']) { abstract class Test_Filestorage_Google extends Test_FileStorage{} return; }else{ class Test_Filestorage_Google extends Test_FileStorage { - + private $config; - public function setUp(){ + public function setUp() { $id=uniqid(); $this->config=include('apps/files_external/tests/config.php'); $this->config['google']['root'].='/'.$id;//make sure we have an new empty folder to work in $this->instance=new OC_Filestorage_Google($this->config['google']); } - public function tearDown(){ + public function tearDown() { $this->instance->rmdir('/'); } } } - diff --git a/apps/files_external/tests/smb.php b/apps/files_external/tests/smb.php index 001ef84227..7de4fddbb3 100644 --- a/apps/files_external/tests/smb.php +++ b/apps/files_external/tests/smb.php @@ -8,21 +8,21 @@ $config=include('apps/files_external/tests/config.php'); -if(!is_array($config) or !isset($config['smb']) or !$config['smb']['run']){ +if(!is_array($config) or !isset($config['smb']) or !$config['smb']['run']) { abstract class Test_Filestorage_SMB extends Test_FileStorage{} return; }else{ class Test_Filestorage_SMB extends Test_FileStorage { private $config; - public function setUp(){ + public function setUp() { $id=uniqid(); $this->config=include('apps/files_external/tests/config.php'); $this->config['smb']['root'].=$id;//make sure we have an new empty folder to work in $this->instance=new OC_Filestorage_SMB($this->config['smb']); } - public function tearDown(){ + public function tearDown() { OCP\Files::rmdirr($this->instance->constructUrl('')); } } diff --git a/apps/files_external/tests/swift.php b/apps/files_external/tests/swift.php index 1520c9473d..a6f5eace1c 100644 --- a/apps/files_external/tests/swift.php +++ b/apps/files_external/tests/swift.php @@ -7,25 +7,24 @@ */ $config=include('apps/files_external/tests/config.php'); -if(!is_array($config) or !isset($config['swift']) or !$config['swift']['run']){ +if(!is_array($config) or !isset($config['swift']) or !$config['swift']['run']) { abstract class Test_Filestorage_SWIFT extends Test_FileStorage{} return; }else{ class Test_Filestorage_SWIFT extends Test_FileStorage { private $config; - public function setUp(){ + public function setUp() { $id=uniqid(); $this->config=include('apps/files_external/tests/config.php'); $this->config['swift']['root'].='/'.$id;//make sure we have an new empty folder to work in $this->instance=new OC_Filestorage_SWIFT($this->config['swift']); } - - public function tearDown(){ + + public function tearDown() { $this->instance->rmdir(''); } - + } } - diff --git a/apps/files_external/tests/webdav.php b/apps/files_external/tests/webdav.php index 14abbef2cb..74d980aa3f 100644 --- a/apps/files_external/tests/webdav.php +++ b/apps/files_external/tests/webdav.php @@ -7,23 +7,22 @@ */ $config=include('apps/files_external/tests/config.php'); -if(!is_array($config) or !isset($config['webdav']) or !$config['webdav']['run']){ +if(!is_array($config) or !isset($config['webdav']) or !$config['webdav']['run']) { abstract class Test_Filestorage_DAV extends Test_FileStorage{} return; }else{ class Test_Filestorage_DAV extends Test_FileStorage { private $config; - public function setUp(){ + public function setUp() { $id=uniqid(); $this->config=include('apps/files_external/tests/config.php'); $this->config['webdav']['root'].='/'.$id;//make sure we have an new empty folder to work in $this->instance=new OC_Filestorage_DAV($this->config['webdav']); } - public function tearDown(){ + public function tearDown() { $this->instance->rmdir('/'); } } } - diff --git a/apps/files_imageviewer/appinfo/app.php b/apps/files_imageviewer/appinfo/app.php deleted file mode 100644 index 6184585cff..0000000000 --- a/apps/files_imageviewer/appinfo/app.php +++ /dev/null @@ -1,6 +0,0 @@ - - - files_imageviewer - Image Viewer - Simple image viewer for owncloud - AGPL - Robin Appelman - 4 - true - - diff --git a/apps/files_imageviewer/appinfo/version b/apps/files_imageviewer/appinfo/version deleted file mode 100644 index 9f8e9b69a3..0000000000 --- a/apps/files_imageviewer/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -1.0 \ No newline at end of file diff --git a/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css b/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css deleted file mode 100644 index 6e982805a4..0000000000 --- a/apps/files_imageviewer/css/jquery.fancybox-1.3.4.css +++ /dev/null @@ -1,359 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -#fancybox-loading { - position: fixed; - top: 50%; - left: 50%; - width: 40px; - height: 40px; - margin-top: -20px; - margin-left: -20px; - cursor: pointer; - overflow: hidden; - z-index: 1104; - display: none; -} - -#fancybox-loading div { - position: absolute; - top: 0; - left: 0; - width: 40px; - height: 480px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); -} - -#fancybox-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - z-index: 1100; - display: none; -} - -#fancybox-tmp { - padding: 0; - margin: 0; - border: 0; - overflow: auto; - display: none; -} - -#fancybox-wrap { - position: absolute; - top: 0; - left: 0; - padding: 20px; - z-index: 1101; - outline: none; - display: none; -} - -#fancybox-outer { - position: relative; - width: 100%; - height: 100%; - background: #fff; -} - -#fancybox-content { - width: 0; - height: 0; - padding: 0; - outline: none; - position: relative; - overflow: hidden; - z-index: 1102; - border: 0px solid #fff; -} - -#fancybox-hide-sel-frame { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: transparent; - z-index: 1101; -} - -#fancybox-close { - position: absolute; - top: -15px; - right: -15px; - width: 30px; - height: 30px; - background: transparent url('%appswebroot%/files_imageviewer/img/fancybox.png') -40px 0px; - cursor: pointer; - z-index: 1103; - display: none; -} - -#fancybox-error { - color: #444; - font: normal 12px/20px Arial; - padding: 14px; - margin: 0; -} - -#fancybox-img { - width: 100%; - height: 100%; - padding: 0; - margin: 0; - border: none; - outline: none; - line-height: 0; - vertical-align: top; -} - -#fancybox-frame { - width: 100%; - height: 100%; - border: none; - display: block; -} - -#fancybox-left, #fancybox-right { - position: absolute; - bottom: 0px; - height: 100%; - width: 35%; - cursor: pointer; - outline: none; - background: transparent url('%appswebroot%/files_imageviewer/img/blank.gif'); - z-index: 1102; - display: none; -} - -#fancybox-left { - left: 0px; -} - -#fancybox-right { - right: 0px; -} - -#fancybox-left-ico, #fancybox-right-ico { - position: absolute; - top: 50%; - left: -9999px; - width: 30px; - height: 30px; - margin-top: -15px; - cursor: pointer; - z-index: 1102; - display: block; -} - -#fancybox-left-ico { - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -30px; -} - -#fancybox-right-ico { - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -60px; -} - -#fancybox-left:hover, #fancybox-right:hover { - visibility: visible; /* IE6 */ -} - -#fancybox-left:hover span { - left: 20px; -} - -#fancybox-right:hover span { - left: auto; - right: 20px; -} - -.fancybox-bg { - position: absolute; - padding: 0; - margin: 0; - border: 0; - width: 20px; - height: 20px; - z-index: 1001; -} - -#fancybox-bg-n { - top: -20px; - left: 0; - width: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-x.png'); -} - -#fancybox-bg-ne { - top: -20px; - right: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -162px; -} - -#fancybox-bg-e { - top: 0; - right: -20px; - height: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-y.png'); - background-position: -20px 0px; -} - -#fancybox-bg-se { - bottom: -20px; - right: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -182px; -} - -#fancybox-bg-s { - bottom: -20px; - left: 0; - width: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-x.png'); - background-position: 0px -20px; -} - -#fancybox-bg-sw { - bottom: -20px; - left: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -142px; -} - -#fancybox-bg-w { - top: 0; - left: -20px; - height: 100%; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox-y.png'); -} - -#fancybox-bg-nw { - top: -20px; - left: -20px; - background-image: url('%appswebroot%/files_imageviewer/img/fancybox.png'); - background-position: -40px -122px; -} - -#fancybox-title { - font-family: Helvetica; - font-size: 12px; - z-index: 1102; -} - -.fancybox-title-inside { - padding-bottom: 10px; - text-align: center; - color: #333; - background: #fff; - position: relative; -} - -.fancybox-title-outside { - padding-top: 10px; - color: #fff; -} - -.fancybox-title-over { - position: absolute; - bottom: 0; - left: 0; - color: #FFF; - text-align: left; -} - -#fancybox-title-over { - padding: 10px; - background-image: url('%appswebroot%/files_imageviewer/img/fancy_title_over.png'); - display: block; -} - -.fancybox-title-float { - position: absolute; - left: 0; - bottom: -20px; - height: 32px; -} - -#fancybox-title-float-wrap { - border: none; - border-collapse: collapse; - width: auto; -} - -#fancybox-title-float-wrap td { - border: none; - white-space: nowrap; -} - -#fancybox-title-float-left { - padding: 0 0 0 15px; - background: url('%appswebroot%/files_imageviewer/img/fancybox.png') -40px -90px no-repeat; -} - -#fancybox-title-float-main { - color: #FFF; - line-height: 29px; - font-weight: bold; - padding: 0 0 3px 0; - background: url('%appswebroot%/files_imageviewer/img/fancybox-x.png') 0px -40px; -} - -#fancybox-title-float-right { - padding: 0 0 0 15px; - background: url('%appswebroot%/files_imageviewer/img/fancybox.png') -55px -90px no-repeat; -} - -/* IE6 */ - -.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_close.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_nav_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_nav_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } -.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_left.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_main.png', sizingMethod='scale'); } -.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_title_right.png', sizingMethod='scale'); } - -.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { - height: expression(this.parentNode.clientHeight + "px"); -} - -#fancybox-loading.fancybox-ie6 { - position: absolute; margin-top: 0; - top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); -} - -#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_loading.png', sizingMethod='scale'); } - -/* IE6, IE7, IE8 */ - -.fancybox-ie .fancybox-bg { background: transparent !important; } - -.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_n.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_ne.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_e.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_se.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_s.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_sw.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_w.png', sizingMethod='scale'); } -.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='%appswebroot%/files_imageviewer/img/fancy_shadow_nw.png', sizingMethod='scale'); } diff --git a/apps/files_imageviewer/img/blank.gif b/apps/files_imageviewer/img/blank.gif deleted file mode 100644 index 35d42e808f..0000000000 Binary files a/apps/files_imageviewer/img/blank.gif and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_close.png b/apps/files_imageviewer/img/fancy_close.png deleted file mode 100644 index 07035307ad..0000000000 Binary files a/apps/files_imageviewer/img/fancy_close.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_loading.png b/apps/files_imageviewer/img/fancy_loading.png deleted file mode 100644 index 2503017960..0000000000 Binary files a/apps/files_imageviewer/img/fancy_loading.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_nav_left.png b/apps/files_imageviewer/img/fancy_nav_left.png deleted file mode 100644 index ebaa6a4fd3..0000000000 Binary files a/apps/files_imageviewer/img/fancy_nav_left.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_nav_right.png b/apps/files_imageviewer/img/fancy_nav_right.png deleted file mode 100644 index 873294e969..0000000000 Binary files a/apps/files_imageviewer/img/fancy_nav_right.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_e.png b/apps/files_imageviewer/img/fancy_shadow_e.png deleted file mode 100644 index 2eda089364..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_e.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_n.png b/apps/files_imageviewer/img/fancy_shadow_n.png deleted file mode 100644 index 69aa10e233..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_n.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_ne.png b/apps/files_imageviewer/img/fancy_shadow_ne.png deleted file mode 100644 index 79f6980a3b..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_ne.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_nw.png b/apps/files_imageviewer/img/fancy_shadow_nw.png deleted file mode 100644 index 7182cd938a..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_nw.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_s.png b/apps/files_imageviewer/img/fancy_shadow_s.png deleted file mode 100644 index d8858bfb78..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_s.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_se.png b/apps/files_imageviewer/img/fancy_shadow_se.png deleted file mode 100644 index 541e3ffd3e..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_se.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_sw.png b/apps/files_imageviewer/img/fancy_shadow_sw.png deleted file mode 100644 index b451689fa7..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_sw.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_shadow_w.png b/apps/files_imageviewer/img/fancy_shadow_w.png deleted file mode 100644 index 8a4e4a887f..0000000000 Binary files a/apps/files_imageviewer/img/fancy_shadow_w.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_left.png b/apps/files_imageviewer/img/fancy_title_left.png deleted file mode 100644 index 6049223d1e..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_left.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_main.png b/apps/files_imageviewer/img/fancy_title_main.png deleted file mode 100644 index 8044271f29..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_main.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_over.png b/apps/files_imageviewer/img/fancy_title_over.png deleted file mode 100644 index d9f458f4bb..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_over.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancy_title_right.png b/apps/files_imageviewer/img/fancy_title_right.png deleted file mode 100644 index e36d9db2a7..0000000000 Binary files a/apps/files_imageviewer/img/fancy_title_right.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox-x.png b/apps/files_imageviewer/img/fancybox-x.png deleted file mode 100644 index c2130f8698..0000000000 Binary files a/apps/files_imageviewer/img/fancybox-x.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox-y.png b/apps/files_imageviewer/img/fancybox-y.png deleted file mode 100644 index 7ef399b990..0000000000 Binary files a/apps/files_imageviewer/img/fancybox-y.png and /dev/null differ diff --git a/apps/files_imageviewer/img/fancybox.png b/apps/files_imageviewer/img/fancybox.png deleted file mode 100644 index 65e14f68fd..0000000000 Binary files a/apps/files_imageviewer/img/fancybox.png and /dev/null differ diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js deleted file mode 100644 index a1db7b6198..0000000000 --- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js +++ /dev/null @@ -1,1158 +0,0 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. - * - * Version: 1.3.4 (11/11/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -;(function($) { - var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right, - - selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], - - ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, - - loadingTimer, loadingFrame = 1, - - titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('
    ')[0], { prop: 0 }), - - isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest, - - /* - * Private methods - */ - - _abort = function() { - loading.hide(); - - imgPreloader.onerror = imgPreloader.onload = null; - - if (ajaxLoader) { - ajaxLoader.abort(); - } - - tmp.empty(); - }, - - _error = function() { - if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) { - loading.hide(); - busy = false; - return; - } - - selectedOpts.titleShow = false; - - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - - tmp.html( '

    The requested content cannot be loaded.
    Please try again later.

    ' ); - - _process_inline(); - }, - - _start = function() { - var obj = selectedArray[ selectedIndex ], - href, - type, - title, - str, - emb, - ret; - - _abort(); - - selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); - - ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts); - - if (ret === false) { - busy = false; - return; - } else if (typeof ret == 'object') { - selectedOpts = $.extend(selectedOpts, ret); - } - - title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || ''; - - if (obj.nodeName && !selectedOpts.orig) { - selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); - } - - if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) { - title = selectedOpts.orig.attr('alt'); - } - - title = title.replace(//, ">"); - - href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null; - - if ((/^(?:javascript)/i).test(href) || href == '#') { - href = null; - } - - if (selectedOpts.type) { - type = selectedOpts.type; - - if (!href) { - href = selectedOpts.content; - } - - } else if (selectedOpts.content) { - type = 'html'; - - } else if (href) { - if (href.match(imgRegExp)) { - type = 'image'; - - } else if (href.match(swfRegExp)) { - type = 'swf'; - - } else if ($(obj).hasClass("iframe")) { - type = 'iframe'; - - } else if (href.indexOf("#") === 0) { - type = 'inline'; - - } else { - type = 'ajax'; - } - } - - if (!type) { - _error(); - return; - } - - if (type == 'inline') { - obj = href.substr(href.indexOf("#")); - type = $(obj).length > 0 ? 'inline' : 'ajax'; - } - - selectedOpts.type = type; - selectedOpts.href = href; - selectedOpts.title = title; - - if (selectedOpts.autoDimensions) { - if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') { - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - } else { - selectedOpts.autoDimensions = false; - } - } - - if (selectedOpts.modal) { - selectedOpts.overlayShow = true; - selectedOpts.hideOnOverlayClick = false; - selectedOpts.hideOnContentClick = false; - selectedOpts.enableEscapeButton = false; - selectedOpts.showCloseButton = false; - } - - selectedOpts.padding = parseInt(selectedOpts.padding, 10); - selectedOpts.margin = parseInt(selectedOpts.margin, 10); - - tmp.css('padding', (selectedOpts.padding + selectedOpts.margin)); - - $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { - $(this).replaceWith(content.children()); - }); - - switch (type) { - case 'html' : - tmp.html( selectedOpts.content ); - _process_inline(); - break; - - case 'inline' : - if ( $(obj).parent().is('#fancybox-content') === true) { - busy = false; - return; - } - - $('
    ') - .hide() - .insertBefore( $(obj) ) - .bind('fancybox-cleanup', function() { - $(this).replaceWith(content.children()); - }).bind('fancybox-cancel', function() { - $(this).replaceWith(tmp.children()); - }); - - $(obj).appendTo(tmp); - - _process_inline(); - break; - - case 'image': - busy = false; - - $.fancybox.showActivity(); - - imgPreloader = new Image(); - - imgPreloader.onerror = function() { - _error(); - }; - - imgPreloader.onload = function() { - busy = true; - - imgPreloader.onerror = imgPreloader.onload = null; - - _process_image(); - }; - - imgPreloader.src = href; - break; - - case 'swf': - selectedOpts.scrolling = 'no'; - - str = ''; - emb = ''; - - $.each(selectedOpts.swf, function(name, val) { - str += ''; - emb += ' ' + name + '="' + val + '"'; - }); - - str += ''; - - tmp.html(str); - - _process_inline(); - break; - - case 'ajax': - busy = false; - - $.fancybox.showActivity(); - - selectedOpts.ajax.win = selectedOpts.ajax.success; - - ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, { - url : href, - data : selectedOpts.ajax.data || {}, - error : function(XMLHttpRequest, textStatus, errorThrown) { - if ( XMLHttpRequest.status > 0 ) { - _error(); - } - }, - success : function(data, textStatus, XMLHttpRequest) { - var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader; - if (o.status == 200) { - if ( typeof selectedOpts.ajax.win == 'function' ) { - ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest); - - if (ret === false) { - loading.hide(); - return; - } else if (typeof ret == 'string' || typeof ret == 'object') { - data = ret; - } - } - - tmp.html( data ); - _process_inline(); - } - } - })); - - break; - - case 'iframe': - _show(); - break; - } - }, - - _process_inline = function() { - var - w = selectedOpts.width, - h = selectedOpts.height; - - if (w.toString().indexOf('%') > -1) { - w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px'; - - } else { - w = w == 'auto' ? 'auto' : w + 'px'; - } - - if (h.toString().indexOf('%') > -1) { - h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px'; - - } else { - h = h == 'auto' ? 'auto' : h + 'px'; - } - - tmp.wrapInner('
    '); - - selectedOpts.width = tmp.width(); - selectedOpts.height = tmp.height(); - - _show(); - }, - - _process_image = function() { - selectedOpts.width = imgPreloader.width; - selectedOpts.height = imgPreloader.height; - - $("").attr({ - 'id' : 'fancybox-img', - 'src' : imgPreloader.src, - 'alt' : selectedOpts.title - }).appendTo( tmp ); - - _show(); - }, - - _show = function() { - var pos, equal; - - loading.hide(); - - if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - $.event.trigger('fancybox-cancel'); - - busy = false; - return; - } - - busy = true; - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') { - wrap.css('height', wrap.height()); - } - - currentArray = selectedArray; - currentIndex = selectedIndex; - currentOpts = selectedOpts; - - if (currentOpts.overlayShow) { - overlay.css({ - 'background-color' : currentOpts.overlayColor, - 'opacity' : currentOpts.overlayOpacity, - 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto', - 'height' : $(document).height() - }); - - if (!overlay.is(':visible')) { - if (isIE6) { - $('select:not(#fancybox-tmp select)').filter(function() { - return this.style.visibility !== 'hidden'; - }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() { - this.style.visibility = 'inherit'; - }); - } - - overlay.show(); - } - } else { - overlay.hide(); - } - - final_pos = _get_zoom_to(); - - _process_title(); - - if (wrap.is(":visible")) { - $( close.add( nav_left ).add( nav_right ) ).hide(); - - pos = wrap.position(), - - start_pos = { - top : pos.top, - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); - - content.fadeTo(currentOpts.changeFade, 0.3, function() { - var finish_resizing = function() { - content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish); - }; - - $.event.trigger('fancybox-change'); - - content - .empty() - .removeAttr('filter') - .css({ - 'border-width' : currentOpts.padding, - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }); - - if (equal) { - finish_resizing(); - - } else { - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.changeSpeed, - easing : currentOpts.easingChange, - step : _draw, - complete : finish_resizing - }); - } - }); - - return; - } - - wrap.removeAttr("style"); - - content.css('border-width', currentOpts.padding); - - if (currentOpts.transitionIn == 'elastic') { - start_pos = _get_zoom_from(); - - content.html( tmp.contents() ); - - wrap.show(); - - if (currentOpts.opacity) { - final_pos.opacity = 0; - } - - fx.prop = 0; - - $(fx).animate({prop: 1}, { - duration : currentOpts.speedIn, - easing : currentOpts.easingIn, - step : _draw, - complete : _finish - }); - - return; - } - - if (currentOpts.titlePosition == 'inside' && titleHeight > 0) { - title.show(); - } - - content - .css({ - 'width' : final_pos.width - currentOpts.padding * 2, - 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2 - }) - .html( tmp.contents() ); - - wrap - .css(final_pos) - .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); - }, - - _format_title = function(title) { - if (title && title.length) { - if (currentOpts.titlePosition == 'float') { - return '
    ' + title + '
    '; - } - - return '
    ' + title + '
    '; - } - - return false; - }, - - _process_title = function() { - titleStr = currentOpts.title || ''; - titleHeight = 0; - - title - .empty() - .removeAttr('style') - .removeClass(); - - if (currentOpts.titleShow === false) { - title.hide(); - return; - } - - titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr); - - if (!titleStr || titleStr === '') { - title.hide(); - return; - } - - title - .addClass('fancybox-title-' + currentOpts.titlePosition) - .html( titleStr ) - .appendTo( 'body' ) - .show(); - - switch (currentOpts.titlePosition) { - case 'inside': - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'marginLeft' : currentOpts.padding, - 'marginRight' : currentOpts.padding - }); - - titleHeight = title.outerHeight(true); - - title.appendTo( outer ); - - final_pos.height += titleHeight; - break; - - case 'over': - title - .css({ - 'marginLeft' : currentOpts.padding, - 'width' : final_pos.width - (currentOpts.padding * 2), - 'bottom' : currentOpts.padding - }) - .appendTo( outer ); - break; - - case 'float': - title - .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1) - .appendTo( wrap ); - break; - - default: - title - .css({ - 'width' : final_pos.width - (currentOpts.padding * 2), - 'paddingLeft' : currentOpts.padding, - 'paddingRight' : currentOpts.padding - }) - .appendTo( wrap ); - break; - } - - title.hide(); - }, - - _set_navigation = function() { - if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) { - $(document).bind('keydown.fb', function(e) { - if (e.keyCode == 27 && currentOpts.enableEscapeButton) { - e.preventDefault(); - $.fancybox.close(); - - } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') { - e.preventDefault(); - $.fancybox[ e.keyCode == 37 ? 'prev' : 'next'](); - } - }); - } - - if (!currentOpts.showNavArrows) { - nav_left.hide(); - nav_right.hide(); - return; - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { - nav_left.show(); - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { - nav_right.show(); - } - }, - - _finish = function () { - if (!$.support.opacity) { - content.get(0).style.removeAttribute('filter'); - wrap.get(0).style.removeAttribute('filter'); - } - - if (selectedOpts.autoDimensions) { - content.css('height', 'auto'); - } - - wrap.css('height', 'auto'); - - if (titleStr && titleStr.length) { - title.show(); - } - - if (currentOpts.showCloseButton) { - close.show(); - } - - _set_navigation(); - - if (currentOpts.hideOnContentClick) { - content.bind('click', $.fancybox.close); - } - - if (currentOpts.hideOnOverlayClick) { - overlay.bind('click', $.fancybox.close); - } - - $(window).bind("resize.fb", $.fancybox.resize); - - if (currentOpts.centerOnScroll) { - $(window).bind("scroll.fb", $.fancybox.center); - } - - if (currentOpts.type == 'iframe') { - $('').appendTo(content); - } - - wrap.show(); - - busy = false; - - $.fancybox.center(); - - currentOpts.onComplete(currentArray, currentIndex, currentOpts); - - _preload_images(); - }, - - _preload_images = function() { - var href, - objNext; - - if ((currentArray.length -1) > currentIndex) { - href = currentArray[ currentIndex + 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - - if (currentIndex > 0) { - href = currentArray[ currentIndex - 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - }, - - _draw = function(pos) { - var dim = { - width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10), - height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10), - - top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10), - left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10) - }; - - if (typeof final_pos.opacity !== 'undefined') { - dim.opacity = pos < 0.5 ? 0.5 : pos; - } - - wrap.css(dim); - - content.css({ - 'width' : dim.width - currentOpts.padding * 2, - 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2 - }); - }, - - _get_viewport = function() { - return [ - $(window).width() - (currentOpts.margin * 2), - $(window).height() - (currentOpts.margin * 2), - $(document).scrollLeft() + currentOpts.margin, - $(document).scrollTop() + currentOpts.margin - ]; - }, - - _get_zoom_to = function () { - var view = _get_viewport(), - to = {}, - resize = currentOpts.autoScale, - double_padding = currentOpts.padding * 2, - ratio; - - if (currentOpts.width.toString().indexOf('%') > -1) { - to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10); - } else { - to.width = currentOpts.width + double_padding; - } - - if (currentOpts.height.toString().indexOf('%') > -1) { - to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10); - } else { - to.height = currentOpts.height + double_padding; - } - - if (resize && (to.width > view[0] || to.height > view[1])) { - if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { - ratio = (currentOpts.width ) / (currentOpts.height ); - - if ((to.width ) > view[0]) { - to.width = view[0]; - to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10); - } - - if ((to.height) > view[1]) { - to.height = view[1]; - to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10); - } - - } else { - to.width = Math.min(to.width, view[0]); - to.height = Math.min(to.height, view[1]); - } - } - - to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10); - to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10); - - return to; - }, - - _get_obj_pos = function(obj) { - var pos = obj.offset(); - - pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0; - pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0; - - pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0; - pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0; - - pos.width = obj.width(); - pos.height = obj.height(); - - return pos; - }, - - _get_zoom_from = function() { - var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, - from = {}, - pos, - view; - - if (orig && orig.length) { - pos = _get_obj_pos(orig); - - from = { - width : pos.width + (currentOpts.padding * 2), - height : pos.height + (currentOpts.padding * 2), - top : pos.top - currentOpts.padding - 20, - left : pos.left - currentOpts.padding - 20 - }; - - } else { - view = _get_viewport(); - - from = { - width : currentOpts.padding * 2, - height : currentOpts.padding * 2, - top : parseInt(view[3] + view[1] * 0.5, 10), - left : parseInt(view[2] + view[0] * 0.5, 10) - }; - } - - return from; - }, - - _animate_loading = function() { - if (!loading.is(':visible')){ - clearInterval(loadingTimer); - return; - } - - $('div', loading).css('top', (loadingFrame * -40) + 'px'); - - loadingFrame = (loadingFrame + 1) % 12; - }; - - /* - * Public methods - */ - - $.fn.fancybox = function(options) { - if (!$(this).length) { - return this; - } - - $(this) - .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) - .unbind('click.fb') - .bind('click.fb', function(e) { - e.preventDefault(); - - if (busy) { - return; - } - - busy = true; - - $(this).blur(); - - selectedArray = []; - selectedIndex = 0; - - var rel = $(this).attr('rel') || ''; - - if (!rel || rel == '' || rel === 'nofollow') { - selectedArray.push(this); - - } else { - selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); - selectedIndex = selectedArray.index( this ); - } - - _start(); - - return; - }); - - return this; - }; - - $.fancybox = function(obj) { - var opts; - - if (busy) { - return; - } - - busy = true; - opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; - - selectedArray = []; - selectedIndex = parseInt(opts.index, 10) || 0; - - if ($.isArray(obj)) { - for (var i = 0, j = obj.length; i < j; i++) { - if (typeof obj[i] == 'object') { - $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); - } else { - obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); - } - } - - selectedArray = jQuery.merge(selectedArray, obj); - - } else { - if (typeof obj == 'object') { - $(obj).data('fancybox', $.extend({}, opts, obj)); - } else { - obj = $({}).data('fancybox', $.extend({content : obj}, opts)); - } - - selectedArray.push(obj); - } - - if (selectedIndex > selectedArray.length || selectedIndex < 0) { - selectedIndex = 0; - } - - _start(); - }; - - $.fancybox.showActivity = function() { - clearInterval(loadingTimer); - - loading.show(); - loadingTimer = setInterval(_animate_loading, 66); - }; - - $.fancybox.hideActivity = function() { - loading.hide(); - }; - - $.fancybox.next = function() { - return $.fancybox.pos( currentIndex + 1); - }; - - $.fancybox.prev = function() { - return $.fancybox.pos( currentIndex - 1); - }; - - $.fancybox.pos = function(pos) { - if (busy) { - return; - } - - pos = parseInt(pos); - - selectedArray = currentArray; - - if (pos > -1 && pos < currentArray.length) { - selectedIndex = pos; - _start(); - - } else if (currentOpts.cyclic && currentArray.length > 1) { - selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1; - _start(); - } - - return; - }; - - $.fancybox.cancel = function() { - if (busy) { - return; - } - - busy = true; - - $.event.trigger('fancybox-cancel'); - - _abort(); - - selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); - - busy = false; - }; - - // Note: within an iframe use - parent.$.fancybox.close(); - $.fancybox.close = function() { - if (busy || wrap.is(':hidden')) { - return; - } - - busy = true; - - if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) { - busy = false; - return; - } - - _abort(); - - $(close.add( nav_left ).add( nav_right )).hide(); - - $(content.add( overlay )).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank'); - - if (currentOpts.titlePosition !== 'inside') { - title.empty(); - } - - wrap.stop(); - - function _cleanup() { - overlay.fadeOut('fast'); - - title.empty().hide(); - wrap.hide(); - - $.event.trigger('fancybox-cleanup'); - - content.empty(); - - currentOpts.onClosed(currentArray, currentIndex, currentOpts); - - currentArray = selectedOpts = []; - currentIndex = selectedIndex = 0; - currentOpts = selectedOpts = {}; - - busy = false; - } - - if (currentOpts.transitionOut == 'elastic') { - start_pos = _get_zoom_from(); - - var pos = wrap.position(); - - final_pos = { - top : pos.top , - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - if (currentOpts.opacity) { - final_pos.opacity = 1; - } - - title.empty().hide(); - - fx.prop = 1; - - $(fx).animate({ prop: 0 }, { - duration : currentOpts.speedOut, - easing : currentOpts.easingOut, - step : _draw, - complete : _cleanup - }); - - } else { - wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); - } - }; - - $.fancybox.resize = function() { - if (overlay.is(':visible')) { - overlay.css('height', $(document).height()); - } - - $.fancybox.center(true); - }; - - $.fancybox.center = function() { - var view, align; - - if (busy) { - return; - } - - align = arguments[0] === true ? 1 : 0; - view = _get_viewport(); - - if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) { - return; - } - - wrap - .stop() - .animate({ - 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)), - 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding)) - }, typeof arguments[0] == 'number' ? arguments[0] : 200); - }; - - $.fancybox.init = function() { - if ($("#fancybox-wrap").length) { - return; - } - - $('body').append( - tmp = $('
    '), - loading = $('
    '), - overlay = $('
    '), - wrap = $('
    ') - ); - - outer = $('
    ') - .append('
    ') - .appendTo( wrap ); - - outer.append( - content = $('
    '), - close = $(''), - title = $('
    '), - - nav_left = $(''), - nav_right = $('') - ); - - close.click($.fancybox.close); - loading.click($.fancybox.cancel); - - nav_left.click(function(e) { - e.preventDefault(); - $.fancybox.prev(); - }); - - nav_right.click(function(e) { - e.preventDefault(); - $.fancybox.next(); - }); - - if ($.fn.mousewheel) { - wrap.bind('mousewheel.fb', function(e, delta) { - if (busy) { - e.preventDefault(); - - } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) { - e.preventDefault(); - $.fancybox[ delta > 0 ? 'prev' : 'next'](); - } - }); - } - - if (!$.support.opacity) { - wrap.addClass('fancybox-ie'); - } - - if (isIE6) { - loading.addClass('fancybox-ie6'); - wrap.addClass('fancybox-ie6'); - - $('').prependTo(outer); - } - }; - - $.fn.fancybox.defaults = { - padding : 10, - margin : 40, - opacity : false, - modal : false, - cyclic : false, - scrolling : 'auto', // 'auto', 'yes' or 'no' - - width : 560, - height : 340, - - autoScale : true, - autoDimensions : true, - centerOnScroll : false, - - ajax : {}, - swf : { wmode: 'transparent' }, - - hideOnOverlayClick : true, - hideOnContentClick : false, - - overlayShow : true, - overlayOpacity : 0.7, - overlayColor : '#777', - - titleShow : true, - titlePosition : 'float', // 'float', 'outside', 'inside' or 'over' - titleFormat : null, - titleFromAlt : false, - - transitionIn : 'fade', // 'elastic', 'fade' or 'none' - transitionOut : 'fade', // 'elastic', 'fade' or 'none' - - speedIn : 300, - speedOut : 300, - - changeSpeed : 300, - changeFade : 'fast', - - easingIn : 'swing', - easingOut : 'swing', - - showCloseButton : true, - showNavArrows : true, - enableEscapeButton : true, - enableKeyboardNav : true, - - onStart : function(){}, - onCancel : function(){}, - onComplete : function(){}, - onCleanup : function(){}, - onClosed : function(){}, - onError : function(){} - }; - - $(document).ready(function() { - $.fancybox.init(); - }); - -})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js deleted file mode 100644 index e5ee2ae359..0000000000 --- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js +++ /dev/null @@ -1 +0,0 @@ -(function(B){var L,T,Q,M,d,m,J,A,O,z,C=0,H={},j=[],e=0,G={},y=[],f=null,o=new Image(),i=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,k=/[^\.]\.(swf)\s*$/i,p,N=1,h=0,t="",b,c,P=false,s=B.extend(B("
    ")[0],{prop:0}),S=B.browser.msie&&B.browser.version<7&&!window.XMLHttpRequest,r=function(){T.hide();o.onerror=o.onload=null;if(f){f.abort()}L.empty()},x=function(){if(false===H.onError(j,C,H)){T.hide();P=false;return}H.titleShow=false;H.width="auto";H.height="auto";L.html('

    The requested content cannot be loaded.
    Please try again later.

    ');n()},w=function(){var Z=j[C],W,Y,ab,aa,V,X;r();H=B.extend({},B.fn.fancybox.defaults,(typeof B(Z).data("fancybox")=="undefined"?H:B(Z).data("fancybox")));X=H.onStart(j,C,H);if(X===false){P=false;return}else{if(typeof X=="object"){H=B.extend(H,X)}}ab=H.title||(Z.nodeName?B(Z).attr("title"):Z.title)||"";if(Z.nodeName&&!H.orig){H.orig=B(Z).children("img:first").length?B(Z).children("img:first"):B(Z)}if(ab===""&&H.orig&&H.titleFromAlt){ab=H.orig.attr("alt")}ab=ab.replace(//,">");W=H.href||(Z.nodeName?B(Z).attr("href"):Z.href)||null;if((/^(?:javascript)/i).test(W)||W=="#"){W=null}if(H.type){Y=H.type;if(!W){W=H.content}}else{if(H.content){Y="html"}else{if(W){if(W.match(i)){Y="image"}else{if(W.match(k)){Y="swf"}else{if(B(Z).hasClass("iframe")){Y="iframe"}else{if(W.indexOf("#")===0){Y="inline"}else{Y="ajax"}}}}}}}if(!Y){x();return}if(Y=="inline"){Z=W.substr(W.indexOf("#"));Y=B(Z).length>0?"inline":"ajax"}H.type=Y;H.href=W;H.title=ab;if(H.autoDimensions){if(H.type=="html"||H.type=="inline"||H.type=="ajax"){H.width="auto";H.height="auto"}else{H.autoDimensions=false}}if(H.modal){H.overlayShow=true;H.hideOnOverlayClick=false;H.hideOnContentClick=false;H.enableEscapeButton=false;H.showCloseButton=false}H.padding=parseInt(H.padding,10);H.margin=parseInt(H.margin,10);L.css("padding",(H.padding+H.margin));B(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){B(this).replaceWith(m.children())});switch(Y){case"html":L.html(H.content);n();break;case"inline":if(B(Z).parent().is("#fancybox-content")===true){P=false;return}B('
    ').hide().insertBefore(B(Z)).bind("fancybox-cleanup",function(){B(this).replaceWith(m.children())}).bind("fancybox-cancel",function(){B(this).replaceWith(L.children())});B(Z).appendTo(L);n();break;case"image":P=false;B.fancybox.showActivity();o=new Image();o.onerror=function(){x()};o.onload=function(){P=true;o.onerror=o.onload=null;F()};o.src=W;break;case"swf":H.scrolling="no";aa='';V="";B.each(H.swf,function(ac,ad){aa+='';V+=" "+ac+'="'+ad+'"'});aa+='";L.html(aa);n();break;case"ajax":P=false;B.fancybox.showActivity();H.ajax.win=H.ajax.success;f=B.ajax(B.extend({},H.ajax,{url:W,data:H.ajax.data||{},error:function(ac,ae,ad){if(ac.status>0){x()}},success:function(ad,af,ac){var ae=typeof ac=="object"?ac:f;if(ae.status==200){if(typeof H.ajax.win=="function"){X=H.ajax.win(W,ad,af,ac);if(X===false){T.hide();return}else{if(typeof X=="string"||typeof X=="object"){ad=X}}}L.html(ad);n()}}}));break;case"iframe":E();break}},n=function(){var V=H.width,W=H.height;if(V.toString().indexOf("%")>-1){V=parseInt((B(window).width()-(H.margin*2))*parseFloat(V)/100,10)+"px"}else{V=V=="auto"?"auto":V+"px"}if(W.toString().indexOf("%")>-1){W=parseInt((B(window).height()-(H.margin*2))*parseFloat(W)/100,10)+"px"}else{W=W=="auto"?"auto":W+"px"}L.wrapInner('
    ');H.width=L.width();H.height=L.height();E()},F=function(){H.width=o.width;H.height=o.height;B("").attr({id:"fancybox-img",src:o.src,alt:H.title}).appendTo(L);E()},E=function(){var W,V;T.hide();if(M.is(":visible")&&false===G.onCleanup(y,e,G)){B.event.trigger("fancybox-cancel");P=false;return}P=true;B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");if(M.is(":visible")&&G.titlePosition!=="outside"){M.css("height",M.height())}y=j;e=C;G=H;if(G.overlayShow){Q.css({"background-color":G.overlayColor,opacity:G.overlayOpacity,cursor:G.hideOnOverlayClick?"pointer":"auto",height:B(document).height()});if(!Q.is(":visible")){if(S){B("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"})}Q.show()}}else{Q.hide()}c=R();l();if(M.is(":visible")){B(J.add(O).add(z)).hide();W=M.position(),b={top:W.top,left:W.left,width:M.width(),height:M.height()};V=(b.width==c.width&&b.height==c.height);m.fadeTo(G.changeFade,0.3,function(){var X=function(){m.html(L.contents()).fadeTo(G.changeFade,1,v)};B.event.trigger("fancybox-change");m.empty().removeAttr("filter").css({"border-width":G.padding,width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2});if(V){X()}else{s.prop=0;B(s).animate({prop:1},{duration:G.changeSpeed,easing:G.easingChange,step:U,complete:X})}});return}M.removeAttr("style");m.css("border-width",G.padding);if(G.transitionIn=="elastic"){b=I();m.html(L.contents());M.show();if(G.opacity){c.opacity=0}s.prop=0;B(s).animate({prop:1},{duration:G.speedIn,easing:G.easingIn,step:U,complete:v});return}if(G.titlePosition=="inside"&&h>0){A.show()}m.css({width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2}).html(L.contents());M.css(c).fadeIn(G.transitionIn=="none"?0:G.speedIn,v)},D=function(V){if(V&&V.length){if(G.titlePosition=="float"){return'
    '+V+'
    '}return'
    '+V+"
    "}return false},l=function(){t=G.title||"";h=0;A.empty().removeAttr("style").removeClass();if(G.titleShow===false){A.hide();return}t=B.isFunction(G.titleFormat)?G.titleFormat(t,y,e,G):D(t);if(!t||t===""){A.hide();return}A.addClass("fancybox-title-"+G.titlePosition).html(t).appendTo("body").show();switch(G.titlePosition){case"inside":A.css({width:c.width-(G.padding*2),marginLeft:G.padding,marginRight:G.padding});h=A.outerHeight(true);A.appendTo(d);c.height+=h;break;case"over":A.css({marginLeft:G.padding,width:c.width-(G.padding*2),bottom:G.padding}).appendTo(d);break;case"float":A.css("left",parseInt((A.width()-c.width-40)/2,10)*-1).appendTo(M);break;default:A.css({width:c.width-(G.padding*2),paddingLeft:G.padding,paddingRight:G.padding}).appendTo(M);break}A.hide()},g=function(){if(G.enableEscapeButton||G.enableKeyboardNav){B(document).bind("keydown.fb",function(V){if(V.keyCode==27&&G.enableEscapeButton){V.preventDefault();B.fancybox.close()}else{if((V.keyCode==37||V.keyCode==39)&&G.enableKeyboardNav&&V.target.tagName!=="INPUT"&&V.target.tagName!=="TEXTAREA"&&V.target.tagName!=="SELECT"){V.preventDefault();B.fancybox[V.keyCode==37?"prev":"next"]()}}})}if(!G.showNavArrows){O.hide();z.hide();return}if((G.cyclic&&y.length>1)||e!==0){O.show()}if((G.cyclic&&y.length>1)||e!=(y.length-1)){z.show()}},v=function(){if(!B.support.opacity){m.get(0).style.removeAttribute("filter");M.get(0).style.removeAttribute("filter")}if(H.autoDimensions){m.css("height","auto")}M.css("height","auto");if(t&&t.length){A.show()}if(G.showCloseButton){J.show()}g();if(G.hideOnContentClick){m.bind("click",B.fancybox.close)}if(G.hideOnOverlayClick){Q.bind("click",B.fancybox.close)}B(window).bind("resize.fb",B.fancybox.resize);if(G.centerOnScroll){B(window).bind("scroll.fb",B.fancybox.center)}if(G.type=="iframe"){B('').appendTo(m)}M.show();P=false;B.fancybox.center();G.onComplete(y,e,G);K()},K=function(){var V,W;if((y.length-1)>e){V=y[e+1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}if(e>0){V=y[e-1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}},U=function(W){var V={width:parseInt(b.width+(c.width-b.width)*W,10),height:parseInt(b.height+(c.height-b.height)*W,10),top:parseInt(b.top+(c.top-b.top)*W,10),left:parseInt(b.left+(c.left-b.left)*W,10)};if(typeof c.opacity!=="undefined"){V.opacity=W<0.5?0.5:W}M.css(V);m.css({width:V.width-G.padding*2,height:V.height-(h*W)-G.padding*2})},u=function(){return[B(window).width()-(G.margin*2),B(window).height()-(G.margin*2),B(document).scrollLeft()+G.margin,B(document).scrollTop()+G.margin]},R=function(){var V=u(),Z={},W=G.autoScale,X=G.padding*2,Y;if(G.width.toString().indexOf("%")>-1){Z.width=parseInt((V[0]*parseFloat(G.width))/100,10)}else{Z.width=G.width+X}if(G.height.toString().indexOf("%")>-1){Z.height=parseInt((V[1]*parseFloat(G.height))/100,10)}else{Z.height=G.height+X}if(W&&(Z.width>V[0]||Z.height>V[1])){if(H.type=="image"||H.type=="swf"){Y=(G.width)/(G.height);if((Z.width)>V[0]){Z.width=V[0];Z.height=parseInt(((Z.width-X)/Y)+X,10)}if((Z.height)>V[1]){Z.height=V[1];Z.width=parseInt(((Z.height-X)*Y)+X,10)}}else{Z.width=Math.min(Z.width,V[0]);Z.height=Math.min(Z.height,V[1])}}Z.top=parseInt(Math.max(V[3]-20,V[3]+((V[1]-Z.height-40)*0.5)),10);Z.left=parseInt(Math.max(V[2]-20,V[2]+((V[0]-Z.width-40)*0.5)),10);return Z},q=function(V){var W=V.offset();W.top+=parseInt(V.css("paddingTop"),10)||0;W.left+=parseInt(V.css("paddingLeft"),10)||0;W.top+=parseInt(V.css("border-top-width"),10)||0;W.left+=parseInt(V.css("border-left-width"),10)||0;W.width=V.width();W.height=V.height();return W},I=function(){var Y=H.orig?B(H.orig):false,X={},W,V;if(Y&&Y.length){W=q(Y);X={width:W.width+(G.padding*2),height:W.height+(G.padding*2),top:W.top-G.padding-20,left:W.left-G.padding-20}}else{V=u();X={width:G.padding*2,height:G.padding*2,top:parseInt(V[3]+V[1]*0.5,10),left:parseInt(V[2]+V[0]*0.5,10)}}return X},a=function(){if(!T.is(":visible")){clearInterval(p);return}B("div",T).css("top",(N*-40)+"px");N=(N+1)%12};B.fn.fancybox=function(V){if(!B(this).length){return this}B(this).data("fancybox",B.extend({},V,(B.metadata?B(this).metadata():{}))).unbind("click.fb").bind("click.fb",function(X){X.preventDefault();if(P){return}P=true;B(this).blur();j=[];C=0;var W=B(this).attr("rel")||"";if(!W||W==""||W==="nofollow"){j.push(this)}else{j=B("a[rel="+W+"], area[rel="+W+"]");C=j.index(this)}w();return});return this};B.fancybox=function(Y){var X;if(P){return}P=true;X=typeof arguments[1]!=="undefined"?arguments[1]:{};j=[];C=parseInt(X.index,10)||0;if(B.isArray(Y)){for(var W=0,V=Y.length;Wj.length||C<0){C=0}w()};B.fancybox.showActivity=function(){clearInterval(p);T.show();p=setInterval(a,66)};B.fancybox.hideActivity=function(){T.hide()};B.fancybox.next=function(){return B.fancybox.pos(e+1)};B.fancybox.prev=function(){return B.fancybox.pos(e-1)};B.fancybox.pos=function(V){if(P){return}V=parseInt(V);j=y;if(V>-1&&V1){C=V>=y.length?0:y.length-1;w()}}return};B.fancybox.cancel=function(){if(P){return}P=true;B.event.trigger("fancybox-cancel");r();H.onCancel(j,C,H);P=false};B.fancybox.close=function(){if(P||M.is(":hidden")){return}P=true;if(G&&false===G.onCleanup(y,e,G)){P=false;return}r();B(J.add(O).add(z)).hide();B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");m.find("iframe").attr("src",S&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");if(G.titlePosition!=="inside"){A.empty()}M.stop();function V(){Q.fadeOut("fast");A.empty().hide();M.hide();B.event.trigger("fancybox-cleanup");m.empty();G.onClosed(y,e,G);y=H=[];e=C=0;G=H={};P=false}if(G.transitionOut=="elastic"){b=I();var W=M.position();c={top:W.top,left:W.left,width:M.width(),height:M.height()};if(G.opacity){c.opacity=1}A.empty().hide();s.prop=1;B(s).animate({prop:0},{duration:G.speedOut,easing:G.easingOut,step:U,complete:V})}else{M.fadeOut(G.transitionOut=="none"?0:G.speedOut,V)}};B.fancybox.resize=function(){if(Q.is(":visible")){Q.css("height",B(document).height())}B.fancybox.center(true)};B.fancybox.center=function(){var V,W;if(P){return}W=arguments[0]===true?1:0;V=u();if(!W&&(M.width()>V[0]||M.height()>V[1])){return}M.stop().animate({top:parseInt(Math.max(V[3]-20,V[3]+((V[1]-m.height()-40)*0.5)-G.padding)),left:parseInt(Math.max(V[2]-20,V[2]+((V[0]-m.width()-40)*0.5)-G.padding))},typeof arguments[0]=="number"?arguments[0]:200)};B.fancybox.init=function(){if(B("#fancybox-wrap").length){return}B("body").append(L=B('
    '),T=B('
    '),Q=B('
    '),M=B('
    '));d=B('
    ').append('
    ').appendTo(M);d.append(m=B('
    '),J=B(''),A=B('
    '),O=B(''),z=B(''));J.click(B.fancybox.close);T.click(B.fancybox.cancel);O.click(function(V){V.preventDefault();B.fancybox.prev()});z.click(function(V){V.preventDefault();B.fancybox.next()});if(B.fn.mousewheel){M.bind("mousewheel.fb",function(V,W){if(P){V.preventDefault()}else{if(B(V.target).get(0).clientHeight==0||B(V.target).get(0).scrollHeight===B(V.target).get(0).clientHeight){V.preventDefault();B.fancybox[W>0?"prev":"next"]()}}})}if(!B.support.opacity){M.addClass("fancybox-ie")}if(S){T.addClass("fancybox-ie6");M.addClass("fancybox-ie6");B('').prependTo(d)}};B.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};B(document).ready(function(){B.fancybox.init()})})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js b/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js deleted file mode 100644 index b7932415ce..0000000000 --- a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js +++ /dev/null @@ -1,78 +0,0 @@ -/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.0.4 - * - * Requires: 1.2.2+ - */ - -(function($) { - -var types = ['DOMMouseScroll', 'mousewheel']; - -$.event.special.mousewheel = { - setup: function() { - if ( this.addEventListener ) { - for ( var i=types.length; i; ) { - this.addEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i=types.length; i; ) { - this.removeEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - } -}; - -$.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); - }, - - unmousewheel: function(fn) { - return this.unbind("mousewheel", fn); - } -}); - - -function handler(event) { - var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; - event = $.event.fix(orgEvent); - event.type = "mousewheel"; - - // Old school scrollwheel delta - if ( event.wheelDelta ) { delta = event.wheelDelta/120; } - if ( event.detail ) { delta = -event.detail/3; } - - // New school multidimensional scroll (touchpads) deltas - deltaY = delta; - - // Gecko - if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaY = 0; - deltaX = -1*delta; - } - - // Webkit - if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } - if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - return $.event.handle.apply(this, args); -} - -})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js b/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js deleted file mode 100644 index cb66588e29..0000000000 --- a/apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js +++ /dev/null @@ -1,14 +0,0 @@ -/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) -* Licensed under the MIT License (LICENSE.txt). -* -* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. -* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. -* Thanks to: Seamus Leahy for adding deltaX and deltaY -* -* Version: 3.0.4 -* -* Requires: 1.2.2+ -*/ - -(function(d){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0,e=0;a=d.event.fix(b);a.type="mousewheel";if(a.wheelDelta)c=a.wheelDelta/120;if(a.detail)c=-a.detail/3;e=c;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){e=0;h=-1*c}if(b.wheelDeltaY!==undefined)e=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,c,h,e);return d.event.handle.apply(this,i)}var f=["DOMMouseScroll","mousewheel"];d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a= -f.length;a;)this.addEventListener(f[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],g,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery); \ No newline at end of file diff --git a/apps/files_imageviewer/js/lightbox.js b/apps/files_imageviewer/js/lightbox.js deleted file mode 100644 index 31f08456d2..0000000000 --- a/apps/files_imageviewer/js/lightbox.js +++ /dev/null @@ -1,31 +0,0 @@ -$(document).ready(function() { - if(typeof FileActions!=='undefined'){ - FileActions.register('image','View','',function(filename){ - viewImage($('#dir').val(),filename); - }); - FileActions.setDefault('image','View'); - } - OC.search.customResults.Images=function(row,item){ - var image=item.link.substr(item.link.indexOf('?file=')+6); - var a=row.find('a'); - a.attr('href','#'); - a.click(function(){ - var pos=image.lastIndexOf('/') - var file=image.substr(pos + 1); - var dir=image.substr(0,pos); - viewImage(dir,file); - }); - } -}); - -function viewImage(dir, file) { - if(file.indexOf('.psd')>0){//can't view those - return; - } - var location=OC.filePath('files','ajax','download.php')+encodeURIComponent('?files='+encodeURIComponent(file)+'&dir='+encodeURIComponent(dir)); - $.fancybox({ - "href": location, - "title": file.replace(//, ">"), - "titlePosition": "inside" - }); -} diff --git a/apps/files_pdfviewer/appinfo/app.php b/apps/files_pdfviewer/appinfo/app.php deleted file mode 100644 index e4771ee517..0000000000 --- a/apps/files_pdfviewer/appinfo/app.php +++ /dev/null @@ -1,8 +0,0 @@ - - - files_pdfviewer - PDF Viewer - Inline PDF viewer (pdfjs-based) - GPL - Joan Creus, Thomas Müller - 4 - true - - diff --git a/apps/files_pdfviewer/appinfo/version b/apps/files_pdfviewer/appinfo/version deleted file mode 100644 index ceab6e11ec..0000000000 --- a/apps/files_pdfviewer/appinfo/version +++ /dev/null @@ -1 +0,0 @@ -0.1 \ No newline at end of file diff --git a/apps/files_pdfviewer/css/history.png b/apps/files_pdfviewer/css/history.png deleted file mode 100644 index afa0e4ab70..0000000000 Binary files a/apps/files_pdfviewer/css/history.png and /dev/null differ diff --git a/apps/files_pdfviewer/css/viewer.css b/apps/files_pdfviewer/css/viewer.css deleted file mode 100644 index f9ce929d8b..0000000000 --- a/apps/files_pdfviewer/css/viewer.css +++ /dev/null @@ -1,267 +0,0 @@ -/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- / -/* vim: set shiftwidth=4 tabstop=8 autoindent cindent expandtab: */ - -#viewer { - font-family: 'Lucida Grande', 'Lucida Sans Unicode', Helvetica, Arial, Verdana, sans-serif; - /*margin: 0px;*/ - padding: 0px; - /*position:absolute;*/ -} - -[hidden] { - display: none; -} - -#controls2 > a > img { - margin: 4px; - height: 10px; -} - -#controls2 > button { - line-height: 10px; -} - -#controls2 > button > img { - width: 10px; - height: 10px; -} - -#controls2 > button[disabled] > img { - opacity: 0.5; -} - -#pageNumber { - text-align: right; -} - -span#info { - display: none; -} - -@-moz-document regexp("http:.*debug=1.*") { - span#info { - display: inline-block; - } -} - -/* === Sidebar === */ -#sidebar { - position: fixed; - width: 350px; - top: 62px; - bottom: 18px; - left: -290px; - transition: left 0.25s ease-in-out 1s; - -moz-transition: left 0.25s ease-in-out 1s; - -webkit-transition: left 0.25s ease-in-out 1s; - z-index: 1; -} - -#sidebar:hover { - left: 0px; - transition: left 0.25s ease-in-out 0s; - -moz-transition: left 0.25s ease-in-out 0s; - -webkit-transition: left 0.25s ease-in-out 0s; -} - -#sidebarBox { - background-color: rgba(0, 0, 0, 0.7); - width: 300px; - height: 100%; - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; - -moz-border-radius-topright: 8px; - -moz-border-radius-bottomright: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - box-shadow: 0px 2px 8px #000; - -moz-box-shadow: 0px 2px 8px #000; - -webkit-box-shadow: 0px 2px 8px #000; -} - -#sidebarScrollView { - position: absolute; - overflow: hidden; - overflow-y: auto; - top: 10px; - bottom: 10px; - left: 10px; - width: 280px; -} - -.thumbnail { - width: 134px; - height: 134px; - margin-top: 5px; - margin-bottom: 5px; - margin-left:auto; - margin-right:auto; - line-height: 134px; - text-align: center; - overflow: hidden; -} - -.thumbnail:not([data-loaded]) { - background-color: gray; -} - -.thumbnail > canvas { - vertical-align: middle; - display: inline-block; -} - -#outlineScrollView { - position: absolute; - background-color: #fff; - overflow: auto; - top: 10px; - bottom: 10px; - left: 10px; - width: 280px; -} - -#outlineView { - padding-top: 4px; - padding-bottom: 100px; - padding-left: 6px; - padding-right: 6px; - font-size: smaller; -} - -.outlineItem > .outlineItems { - margin-left: 20px; -} - -.outlineItem > a { - text-decoration: none; - color: black; -} - -.outlineItem > a:hover { - background: #ff0; - box-shadow: 0px 2px 10px #ff0; -} - -#sidebarControls { - position:absolute; - width: 120px; - height: 32px; - left: 15px; - bottom: 35px; -} - -#sidebarControls > button { - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; - -webkit-box-shadow: 0px 4px 10px #000; -} - -#sidebarControls > button > img { - width: 32px; - height: 32px; -} - -#sidebarControls > button[disabled] > img { - opacity: 0.5; -} - -#sidebarControls > button[data-selected] { - box-shadow: 0px 4px 10px #ff0; - -moz-box-shadow: 0px 4px 10px #ff0; - -webkit-box-shadow: 0px 4px 10px #ff0; -} - -/* === Content view === */ -canvas { - margin: auto; - display: block; -} - -.page { - width: 816px; - height: 1056px; - margin: 10px auto; - position: relative; - overflow: hidden; - box-shadow: 0px 4px 10px #000; - -moz-box-shadow: 0px 4px 10px #000; - -webkit-box-shadow: 0px 4px 10px #000; - background-color: white; -} - -.page > a { - display: block; - position: absolute; -} - -.page > a:hover { - opacity: 0.2; - background: #ff0; - box-shadow: 0px 2px 10px #ff0; - -moz-box-shadow: 0px 2px 10px #ff0; - -webkit-box-shadow: 0px 2px 10px #ff0; -} - -#viewer { - /*overflow:auto;*/ - margin: 6.3em 0 0 0; - margin-right:12.5em; - padding: 8px 0px; - position:static; - height:100%; - width:100%; - text-align:center; -} - -#sidebarView canvas:hover { - background: #ff0; - box-shadow: 0px 2px 10px #ff0; - -moz-box-shadow: 0px 2px 10px #ff0; - -webkit-box-shadow: 0px 2px 10px #ff0; -} - -#pageWidthOption { - border-top: 1px solid black; -} - -#customScaleOption { - display: none; -} - -/* === Printed media overrides === */ -@media print { - #sidebar { - display: none; - } - - #controls2 { - display: none; - } - - #viewer { - margin: 0; - padding: 0; - } - - .page { - display: none; - margin: 0; - } - - .page canvas { - box-shadow: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - } - - .page[data-loaded] { - display: block; - page-break-after: always; - } -} - -#loading { - margin: 100px 0; - text-align: center; -} - diff --git a/apps/files_pdfviewer/js/pdfjs/LICENSE b/apps/files_pdfviewer/js/pdfjs/LICENSE deleted file mode 100644 index f8a8482057..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ - - Copyright (c) 2011 Mozilla Foundation - - Contributors: Andreas Gal - Chris G Jones - Shaon Barman - Vivien Nicolas <21@vingtetun.org> - Justin D'Arcangelo - Yury Delendik - Kalervo Kujala - Adil Allawi <@ironymark> - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - diff --git a/apps/files_pdfviewer/js/pdfjs/README b/apps/files_pdfviewer/js/pdfjs/README deleted file mode 100644 index ec6a1e1ab1..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/README +++ /dev/null @@ -1,7 +0,0 @@ -Upstream (http://mozilla.github.com/pdf.js/) does not yet provide releases. -The latest version of git master can be taken from http://mozilla.github.com/pdf.js/build/pdf.js - -Please update pdf.js from time to time and test it! - - - diff --git a/apps/files_pdfviewer/js/pdfjs/build/pdf.js b/apps/files_pdfviewer/js/pdfjs/build/pdf.js deleted file mode 100644 index b1fc9d9747..0000000000 --- a/apps/files_pdfviewer/js/pdfjs/build/pdf.js +++ /dev/null @@ -1,33830 +0,0 @@ -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -var PDFJS = {}; - -(function pdfjsWrapper() { - // Use strict in our context only - users might not want it - 'use strict'; - - PDFJS.build = '2aae4fd'; - - // Files are inserted below - see Makefile -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var globalScope = (typeof window === 'undefined') ? this : window; - -var isWorker = (typeof window == 'undefined'); - -var ERRORS = 0, WARNINGS = 1, INFOS = 5; -var verbosity = WARNINGS; - -// The global PDFJS object exposes the API -// In production, it will be declared outside a global wrapper -// In development, it will be declared here -if (!globalScope.PDFJS) { - globalScope.PDFJS = {}; -} - -// getPdf() -// Convenience function to perform binary Ajax GET -// Usage: getPdf('http://...', callback) -// getPdf({ -// url:String , -// [,progress:Function, error:Function] -// }, -// callback) -function getPdf(arg, callback) { - var params = arg; - if (typeof arg === 'string') - params = { url: arg }; - - var xhr = new XMLHttpRequest(); - - xhr.open('GET', params.url); - - var headers = params.headers; - if (headers) { - for (var property in headers) { - if (typeof headers[property] === 'undefined') - continue; - - xhr.setRequestHeader(property, params.headers[property]); - } - } - - xhr.mozResponseType = xhr.responseType = 'arraybuffer'; - var protocol = params.url.indexOf(':') < 0 ? window.location.protocol : - params.url.substring(0, params.url.indexOf(':') + 1); - xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0; - - if ('progress' in params) - xhr.onprogress = params.progress || undefined; - - if ('error' in params) - xhr.onerror = params.error || undefined; - - xhr.onreadystatechange = function getPdfOnreadystatechange(e) { - if (xhr.readyState === 4) { - if (xhr.status === xhr.expected) { - var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || - xhr.responseArrayBuffer || xhr.response); - callback(data); - } else if (params.error) { - params.error(e); - } - } - }; - xhr.send(null); -} -globalScope.PDFJS.getPdf = getPdf; -globalScope.PDFJS.pdfBug = false; - -var Page = (function PageClosure() { - function Page(xref, pageNumber, pageDict, ref) { - this.pageNumber = pageNumber; - this.pageDict = pageDict; - this.xref = xref; - this.ref = ref; - - this.displayReadyPromise = null; - } - - Page.prototype = { - getPageProp: function Page_getPageProp(key) { - return this.pageDict.get(key); - }, - inheritPageProp: function Page_inheritPageProp(key) { - var dict = this.pageDict; - var obj = dict.get(key); - while (obj === undefined) { - dict = dict.get('Parent'); - if (!dict) - break; - obj = dict.get(key); - } - return obj; - }, - get content() { - return shadow(this, 'content', this.getPageProp('Contents')); - }, - get resources() { - return shadow(this, 'resources', this.inheritPageProp('Resources')); - }, - get mediaBox() { - var obj = this.inheritPageProp('MediaBox'); - // Reset invalid media box to letter size. - if (!isArray(obj) || obj.length !== 4) - obj = [0, 0, 612, 792]; - return shadow(this, 'mediaBox', obj); - }, - get view() { - var mediaBox = this.mediaBox; - var cropBox = this.inheritPageProp('CropBox'); - if (!isArray(cropBox) || cropBox.length !== 4) - return shadow(this, 'view', mediaBox); - - // From the spec, 6th ed., p.963: - // "The crop, bleed, trim, and art boxes should not ordinarily - // extend beyond the boundaries of the media box. If they do, they are - // effectively reduced to their intersection with the media box." - cropBox = Util.intersect(cropBox, mediaBox); - if (!cropBox) - return shadow(this, 'view', mediaBox); - - return shadow(this, 'view', cropBox); - }, - get annotations() { - return shadow(this, 'annotations', this.inheritPageProp('Annots')); - }, - get rotate() { - var rotate = this.inheritPageProp('Rotate') || 0; - // Normalize rotation so it's a multiple of 90 and between 0 and 270 - if (rotate % 90 != 0) { - rotate = 0; - } else if (rotate >= 360) { - rotate = rotate % 360; - } else if (rotate < 0) { - // The spec doesn't cover negatives, assume its counterclockwise - // rotation. The following is the other implementation of modulo. - rotate = ((rotate % 360) + 360) % 360; - } - return shadow(this, 'rotate', rotate); - }, - - getOperatorList: function Page_getOperatorList(handler, dependency) { - var xref = this.xref; - var content = this.content; - var resources = this.resources; - if (isArray(content)) { - // fetching items - var streams = []; - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) - streams.push(xref.fetchIfRef(content[i])); - content = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - content.reset(); - } else if (!content) { - // replacing non-existent page content with empty one - content = new Stream(new Uint8Array(0)); - } - - var pe = this.pe = new PartialEvaluator( - xref, handler, 'p' + this.pageNumber + '_'); - - return pe.getOperatorList(content, resources, dependency); - }, - extractTextContent: function Page_extractTextContent() { - var handler = { - on: function nullHandlerOn() {}, - send: function nullHandlerSend() {} - }; - - var xref = this.xref; - var content = xref.fetchIfRef(this.content); - var resources = xref.fetchIfRef(this.resources); - if (isArray(content)) { - // fetching items - var i, n = content.length; - var streams = []; - for (i = 0; i < n; ++i) - streams.push(xref.fetchIfRef(content[i])); - content = new StreamsSequenceStream(streams); - } else if (isStream(content)) { - content.reset(); - } - - var pe = new PartialEvaluator( - xref, handler, 'p' + this.pageNumber + '_'); - return pe.getTextContent(content, resources); - }, - - ensureFonts: function Page_ensureFonts(fonts, callback) { - this.stats.time('Font Loading'); - // Convert the font names to the corresponding font obj. - for (var i = 0, ii = fonts.length; i < ii; i++) { - fonts[i] = this.objs.objs[fonts[i]].data; - } - - // Load all the fonts - FontLoader.bind( - fonts, - function pageEnsureFontsFontObjs(fontObjs) { - this.stats.timeEnd('Font Loading'); - - callback.call(this); - }.bind(this) - ); - }, - getLinks: function Page_getLinks() { - var links = []; - var annotations = pageGetAnnotations(); - var i, n = annotations.length; - for (i = 0; i < n; ++i) { - if (annotations[i].type != 'Link') - continue; - links.push(annotations[i]); - } - return links; - }, - getAnnotations: function Page_getAnnotations() { - var xref = this.xref; - function getInheritableProperty(annotation, name) { - var item = annotation; - while (item && !item.has(name)) { - item = item.get('Parent'); - } - if (!item) - return null; - return item.get(name); - } - function isValidUrl(url) { - if (!url) - return false; - var colon = url.indexOf(':'); - if (colon < 0) - return false; - var protocol = url.substr(0, colon); - switch (protocol) { - case 'http': - case 'https': - case 'ftp': - case 'mailto': - return true; - default: - return false; - } - } - - var annotations = this.annotations || []; - var i, n = annotations.length; - var items = []; - for (i = 0; i < n; ++i) { - var annotationRef = annotations[i]; - var annotation = xref.fetch(annotationRef); - if (!isDict(annotation)) - continue; - var subtype = annotation.get('Subtype'); - if (!isName(subtype)) - continue; - var rect = annotation.get('Rect'); - - var item = {}; - item.type = subtype.name; - item.rect = rect; - switch (subtype.name) { - case 'Link': - var a = annotation.get('A'); - if (a) { - switch (a.get('S').name) { - case 'URI': - var url = a.get('URI'); - // TODO: pdf spec mentions urls can be relative to a Base - // entry in the dictionary. - if (!isValidUrl(url)) - url = ''; - item.url = url; - break; - case 'GoTo': - item.dest = a.get('D'); - break; - default: - TODO('other link types'); - } - } else if (annotation.has('Dest')) { - // simple destination link - var dest = annotation.get('Dest'); - item.dest = isName(dest) ? dest.name : dest; - } - break; - case 'Widget': - var fieldType = getInheritableProperty(annotation, 'FT'); - if (!isName(fieldType)) - break; - item.fieldType = fieldType.name; - // Building the full field name by collecting the field and - // its ancestors 'T' properties and joining them using '.'. - var fieldName = []; - var namedItem = annotation, ref = annotationRef; - while (namedItem) { - var parent = namedItem.get('Parent'); - var parentRef = namedItem.getRaw('Parent'); - var name = namedItem.get('T'); - if (name) { - fieldName.unshift(stringToPDFString(name)); - } else { - // The field name is absent, that means more than one field - // with the same name may exist. Replacing the empty name - // with the '`' plus index in the parent's 'Kids' array. - // This is not in the PDF spec but necessary to id the - // the input controls. - var kids = parent.get('Kids'); - var j, jj; - for (j = 0, jj = kids.length; j < jj; j++) { - var kidRef = kids[j]; - if (kidRef.num == ref.num && kidRef.gen == ref.gen) - break; - } - fieldName.unshift('`' + j); - } - namedItem = parent; - ref = parentRef; - } - item.fullName = fieldName.join('.'); - var alternativeText = stringToPDFString(annotation.get('TU') || ''); - item.alternativeText = alternativeText; - var da = getInheritableProperty(annotation, 'DA') || ''; - var m = /([\d\.]+)\sTf/.exec(da); - if (m) - item.fontSize = parseFloat(m[1]); - item.textAlignment = getInheritableProperty(annotation, 'Q'); - item.flags = getInheritableProperty(annotation, 'Ff') || 0; - break; - case 'Text': - var content = annotation.get('Contents'); - var title = annotation.get('T'); - item.content = stringToPDFString(content || ''); - item.title = stringToPDFString(title || ''); - item.name = !annotation.has('Name') ? 'Note' : - annotation.get('Name').name; - break; - default: - TODO('unimplemented annotation type: ' + subtype.name); - break; - } - items.push(item); - } - return items; - } - }; - - return Page; -})(); - -/** - * The `PDFDocument` holds all the data of the PDF file. Compared to the - * `PDFDoc`, this one doesn't have any job management code. - * Right now there exists one PDFDocument on the main thread + one object - * for each worker. If there is no worker support enabled, there are two - * `PDFDocument` objects on the main thread created. - */ -var PDFDocument = (function PDFDocumentClosure() { - function PDFDocument(arg, password) { - if (isStream(arg)) - init.call(this, arg, password); - else if (isArrayBuffer(arg)) - init.call(this, new Stream(arg), password); - else - error('PDFDocument: Unknown argument type'); - } - - function init(stream, password) { - assertWellFormed(stream.length > 0, 'stream must have data'); - this.stream = stream; - this.setup(password); - this.acroForm = this.catalog.catDict.get('AcroForm'); - } - - function find(stream, needle, limit, backwards) { - var pos = stream.pos; - var end = stream.end; - var str = ''; - if (pos + limit > end) - limit = end - pos; - for (var n = 0; n < limit; ++n) - str += stream.getChar(); - stream.pos = pos; - var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); - if (index == -1) - return false; /* not found */ - stream.pos += index; - return true; /* found */ - } - - PDFDocument.prototype = { - get linearization() { - var length = this.stream.length; - var linearization = false; - if (length) { - linearization = new Linearization(this.stream); - if (linearization.length != length) - linearization = false; - } - // shadow the prototype getter with a data property - return shadow(this, 'linearization', linearization); - }, - get startXRef() { - var stream = this.stream; - var startXRef = 0; - var linearization = this.linearization; - if (linearization) { - // Find end of first obj. - stream.reset(); - if (find(stream, 'endobj', 1024)) - startXRef = stream.pos + 6; - } else { - // Find startxref by jumping backward from the end of the file. - var step = 1024; - var found = false, pos = stream.end; - while (!found && pos > 0) { - pos -= step - 'startxref'.length; - if (pos < 0) - pos = 0; - stream.pos = pos; - found = find(stream, 'startxref', step, true); - } - if (found) { - stream.skip(9); - var ch; - do { - ch = stream.getChar(); - } while (Lexer.isSpace(ch)); - var str = ''; - while ((ch - '0') <= 9) { - str += ch; - ch = stream.getChar(); - } - startXRef = parseInt(str, 10); - if (isNaN(startXRef)) - startXRef = 0; - } - } - // shadow the prototype getter with a data property - return shadow(this, 'startXRef', startXRef); - }, - get mainXRefEntriesOffset() { - var mainXRefEntriesOffset = 0; - var linearization = this.linearization; - if (linearization) - mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; - // shadow the prototype getter with a data property - return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); - }, - // Find the header, remove leading garbage and setup the stream - // starting from the header. - checkHeader: function PDFDocument_checkHeader() { - var stream = this.stream; - stream.reset(); - if (find(stream, '%PDF-', 1024)) { - // Found the header, trim off any garbage before it. - stream.moveStart(); - return; - } - // May not be a PDF file, continue anyway. - }, - setup: function PDFDocument_setup(password) { - this.checkHeader(); - var xref = new XRef(this.stream, - this.startXRef, - this.mainXRefEntriesOffset, - password); - this.xref = xref; - this.catalog = new Catalog(xref); - }, - get numPages() { - var linearization = this.linearization; - var num = linearization ? linearization.numPages : this.catalog.numPages; - // shadow the prototype getter - return shadow(this, 'numPages', num); - }, - getDocumentInfo: function PDFDocument_getDocumentInfo() { - var info; - if (this.xref.trailer.has('Info')) { - var infoDict = this.xref.trailer.get('Info'); - - info = {}; - infoDict.forEach(function(key, value) { - info[key] = typeof value !== 'string' ? value : - stringToPDFString(value); - }); - } - - return shadow(this, 'getDocumentInfo', info); - }, - getFingerprint: function PDFDocument_getFingerprint() { - var xref = this.xref, fileID; - if (xref.trailer.has('ID')) { - fileID = ''; - var id = xref.trailer.get('ID')[0]; - id.split('').forEach(function(el) { - fileID += Number(el.charCodeAt(0)).toString(16); - }); - } else { - // If we got no fileID, then we generate one, - // from the first 100 bytes of PDF - var data = this.stream.bytes.subarray(0, 100); - var hash = calculateMD5(data, 0, data.length); - fileID = ''; - for (var i = 0, length = hash.length; i < length; i++) { - fileID += Number(hash[i]).toString(16); - } - } - - return shadow(this, 'getFingerprint', fileID); - }, - getPage: function PDFDocument_getPage(n) { - return this.catalog.getPage(n); - } - }; - - return PDFDocument; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -// Use only for debugging purposes. This should not be used in any code that is -// in mozilla master. -function log(msg) { - if (console && console.log) - console.log(msg); - else if (print) - print(msg); -} - -// A notice for devs that will not trigger the fallback UI. These are good -// for things that are helpful to devs, such as warning that Workers were -// disabled, which is important to devs but not end users. -function info(msg) { - if (verbosity >= INFOS) { - log('Info: ' + msg); - PDFJS.LogManager.notify('info', msg); - } -} - -// Non-fatal warnings that should trigger the fallback UI. -function warn(msg) { - if (verbosity >= WARNINGS) { - log('Warning: ' + msg); - PDFJS.LogManager.notify('warn', msg); - } -} - -// Fatal errors that should trigger the fallback UI and halt execution by -// throwing an exception. -function error(msg) { - log('Error: ' + msg); - log(backtrace()); - PDFJS.LogManager.notify('error', msg); - throw new Error(msg); -} - -// Missing features that should trigger the fallback UI. -function TODO(what) { - warn('TODO: ' + what); -} - -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} - -function assert(cond, msg) { - if (!cond) - error(msg); -} - -// In a well-formed PDF, |cond| holds. If it doesn't, subsequent -// behavior is undefined. -function assertWellFormed(cond, msg) { - if (!cond) - error(msg); -} - -var LogManager = PDFJS.LogManager = (function LogManagerClosure() { - var loggers = []; - return { - addLogger: function logManager_addLogger(logger) { - loggers.push(logger); - }, - notify: function(type, message) { - for (var i = 0, ii = loggers.length; i < ii; i++) { - var logger = loggers[i]; - if (logger[type]) - logger[type](message); - } - } - }; -})(); - -function shadow(obj, prop, value) { - Object.defineProperty(obj, prop, { value: value, - enumerable: true, - configurable: true, - writable: false }); - return value; -} - -var PasswordException = (function PasswordExceptionClosure() { - function PasswordException(msg, code) { - this.name = 'PasswordException'; - this.message = msg; - this.code = code; - } - - PasswordException.prototype = new Error(); - PasswordException.constructor = PasswordException; - - return PasswordException; -})(); - -function bytesToString(bytes) { - var str = ''; - var length = bytes.length; - for (var n = 0; n < length; ++n) - str += String.fromCharCode(bytes[n]); - return str; -} - -function stringToBytes(str) { - var length = str.length; - var bytes = new Uint8Array(length); - for (var n = 0; n < length; ++n) - bytes[n] = str.charCodeAt(n) & 0xFF; - return bytes; -} - -var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; - -var Util = PDFJS.Util = (function UtilClosure() { - function Util() {} - - Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { - var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0; - return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; - }; - - Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) { - c = (new DeviceCmykCS()).getRgb([c, m, y, k]); - var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0; - return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; - }; - - // For 2d affine transforms - Util.applyTransform = function Util_applyTransform(p, m) { - var xt = p[0] * m[0] + p[1] * m[2] + m[4]; - var yt = p[0] * m[1] + p[1] * m[3] + m[5]; - return [xt, yt]; - }; - - Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { - var d = m[0] * m[3] - m[1] * m[2]; - var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; - var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; - return [xt, yt]; - }; - - Util.inverseTransform = function Util_inverseTransform(m) { - var d = m[0] * m[3] - m[1] * m[2]; - return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, - (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; - }; - - // Apply a generic 3d matrix M on a 3-vector v: - // | a b c | | X | - // | d e f | x | Y | - // | g h i | | Z | - // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], - // with v as [X,Y,Z] - Util.apply3dTransform = function Util_apply3dTransform(m, v) { - return [ - m[0] * v[0] + m[1] * v[1] + m[2] * v[2], - m[3] * v[0] + m[4] * v[1] + m[5] * v[2], - m[6] * v[0] + m[7] * v[1] + m[8] * v[2] - ]; - } - - // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) - // For coordinate systems whose origin lies in the bottom-left, this - // means normalization to (BL,TR) ordering. For systems with origin in the - // top-left, this means (TL,BR) ordering. - Util.normalizeRect = function Util_normalizeRect(rect) { - var r = rect.slice(0); // clone rect - if (rect[0] > rect[2]) { - r[0] = rect[2]; - r[2] = rect[0]; - } - if (rect[1] > rect[3]) { - r[1] = rect[3]; - r[3] = rect[1]; - } - return r; - } - - // Returns a rectangle [x1, y1, x2, y2] corresponding to the - // intersection of rect1 and rect2. If no intersection, returns 'false' - // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] - Util.intersect = function Util_intersect(rect1, rect2) { - function compare(a, b) { - return a - b; - }; - - // Order points along the axes - var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), - orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), - result = []; - - rect1 = Util.normalizeRect(rect1); - rect2 = Util.normalizeRect(rect2); - - // X: first and second points belong to different rectangles? - if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || - (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { - // Intersection must be between second and third points - result[0] = orderedX[1]; - result[2] = orderedX[2]; - } else { - return false; - } - - // Y: first and second points belong to different rectangles? - if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || - (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { - // Intersection must be between second and third points - result[1] = orderedY[1]; - result[3] = orderedY[2]; - } else { - return false; - } - - return result; - }; - - Util.sign = function Util_sign(num) { - return num < 0 ? -1 : 1; - }; - - return Util; -})(); - -var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { - function PageViewport(viewBox, scale, rotate, offsetX, offsetY) { - // creating transform to convert pdf coordinate system to the normal - // canvas like coordinates taking in account scale and rotation - var centerX = (viewBox[2] + viewBox[0]) / 2; - var centerY = (viewBox[3] + viewBox[1]) / 2; - var rotateA, rotateB, rotateC, rotateD; - switch (rotate) { - case -180: - case 180: - rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; - break; - case -270: - case 90: - rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; - break; - case -90: - case 270: - rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; - break; - case 360: - case 0: - default: - rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; - break; - } - var offsetCanvasX, offsetCanvasY; - var width, height; - if (rotateA == 0) { - offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; - offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; - width = Math.abs(viewBox[3] - viewBox[1]) * scale; - height = Math.abs(viewBox[2] - viewBox[0]) * scale; - } else { - offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; - offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; - width = Math.abs(viewBox[2] - viewBox[0]) * scale; - height = Math.abs(viewBox[3] - viewBox[1]) * scale; - } - // creating transform for the following operations: - // translate(-centerX, -centerY), rotate and flip vertically, - // scale, and translate(offsetCanvasX, offsetCanvasY) - this.transform = [ - rotateA * scale, - rotateB * scale, - rotateC * scale, - rotateD * scale, - offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, - offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY - ]; - - this.offsetX = offsetX; - this.offsetY = offsetY; - this.width = width; - this.height = height; - this.fontScale = scale; - } - PageViewport.prototype = { - convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { - return Util.applyTransform([x, y], this.transform); - }, - convertToViewportRectangle: - function PageViewport_convertToViewportRectangle(rect) { - var tl = Util.applyTransform([rect[0], rect[1]], this.transform); - var br = Util.applyTransform([rect[2], rect[3]], this.transform); - return [tl[0], tl[1], br[0], br[1]]; - }, - convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { - return Util.applyInverseTransform([x, y], this.transform); - } - }; - return PageViewport; -})(); - -var PDFStringTranslateTable = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, - 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, - 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, - 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC -]; - -function stringToPDFString(str) { - var i, n = str.length, str2 = ''; - if (str[0] === '\xFE' && str[1] === '\xFF') { - // UTF16BE BOM - for (i = 2; i < n; i += 2) - str2 += String.fromCharCode( - (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)); - } else { - for (i = 0; i < n; ++i) { - var code = PDFStringTranslateTable[str.charCodeAt(i)]; - str2 += code ? String.fromCharCode(code) : str.charAt(i); - } - } - return str2; -} - -function stringToUTF8String(str) { - return decodeURIComponent(escape(str)); -} - -function isBool(v) { - return typeof v == 'boolean'; -} - -function isInt(v) { - return typeof v == 'number' && ((v | 0) == v); -} - -function isNum(v) { - return typeof v == 'number'; -} - -function isString(v) { - return typeof v == 'string'; -} - -function isNull(v) { - return v === null; -} - -function isName(v) { - return v instanceof Name; -} - -function isCmd(v, cmd) { - return v instanceof Cmd && (!cmd || v.cmd == cmd); -} - -function isDict(v, type) { - return v instanceof Dict && (!type || v.get('Type').name == type); -} - -function isArray(v) { - return v instanceof Array; -} - -function isStream(v) { - return typeof v == 'object' && v != null && ('getChar' in v); -} - -function isArrayBuffer(v) { - return typeof v == 'object' && v != null && ('byteLength' in v); -} - -function isRef(v) { - return v instanceof Ref; -} - -function isPDFFunction(v) { - var fnDict; - if (typeof v != 'object') - return false; - else if (isDict(v)) - fnDict = v; - else if (isStream(v)) - fnDict = v.dict; - else - return false; - return fnDict.has('FunctionType'); -} - -/** - * 'Promise' object. - * Each object that is stored in PDFObjects is based on a Promise object that - * contains the status of the object and the data. There migth be situations, - * where a function want to use the value of an object, but it isn't ready at - * that time. To get a notification, once the object is ready to be used, s.o. - * can add a callback using the `then` method on the promise that then calls - * the callback once the object gets resolved. - * A promise can get resolved only once and only once the data of the promise - * can be set. If any of these happens twice or the data is required before - * it was set, an exception is throw. - */ -var Promise = PDFJS.Promise = (function PromiseClosure() { - var EMPTY_PROMISE = {}; - - /** - * If `data` is passed in this constructor, the promise is created resolved. - * If there isn't data, it isn't resolved at the beginning. - */ - function Promise(name, data) { - this.name = name; - this.isRejected = false; - this.error = null; - // If you build a promise and pass in some data it's already resolved. - if (data != null) { - this.isResolved = true; - this._data = data; - this.hasData = true; - } else { - this.isResolved = false; - this._data = EMPTY_PROMISE; - } - this.callbacks = []; - this.errbacks = []; - this.progressbacks = []; - }; - /** - * Builds a promise that is resolved when all the passed in promises are - * resolved. - * @param {Promise[]} promises Array of promises to wait for. - * @return {Promise} New dependant promise. - */ - Promise.all = function Promise_all(promises) { - var deferred = new Promise(); - var unresolved = promises.length; - var results = []; - if (unresolved === 0) { - deferred.resolve(results); - return deferred; - } - for (var i = 0, ii = promises.length; i < ii; ++i) { - var promise = promises[i]; - promise.then((function(i) { - return function(value) { - results[i] = value; - unresolved--; - if (unresolved === 0) - deferred.resolve(results); - }; - })(i)); - } - return deferred; - }; - Promise.prototype = { - hasData: false, - - set data(value) { - if (value === undefined) { - return; - } - if (this._data !== EMPTY_PROMISE) { - error('Promise ' + this.name + - ': Cannot set the data of a promise twice'); - } - this._data = value; - this.hasData = true; - - if (this.onDataCallback) { - this.onDataCallback(value); - } - }, - - get data() { - if (this._data === EMPTY_PROMISE) { - error('Promise ' + this.name + ': Cannot get data that isn\'t set'); - } - return this._data; - }, - - onData: function Promise_onData(callback) { - if (this._data !== EMPTY_PROMISE) { - callback(this._data); - } else { - this.onDataCallback = callback; - } - }, - - resolve: function Promise_resolve(data) { - if (this.isResolved) { - error('A Promise can be resolved only once ' + this.name); - } - if (this.isRejected) { - error('The Promise was already rejected ' + this.name); - } - - this.isResolved = true; - this.data = (typeof data !== 'undefined') ? data : null; - var callbacks = this.callbacks; - - for (var i = 0, ii = callbacks.length; i < ii; i++) { - callbacks[i].call(null, data); - } - }, - - progress: function Promise_progress(data) { - var callbacks = this.progressbacks; - for (var i = 0, ii = callbacks.length; i < ii; i++) { - callbacks[i].call(null, data); - } - }, - - reject: function Promise_reject(reason, exception) { - if (this.isRejected) { - error('A Promise can be rejected only once ' + this.name); - } - if (this.isResolved) { - error('The Promise was already resolved ' + this.name); - } - - this.isRejected = true; - this.error = reason || null; - var errbacks = this.errbacks; - - for (var i = 0, ii = errbacks.length; i < ii; i++) { - errbacks[i].call(null, reason, exception); - } - }, - - then: function Promise_then(callback, errback, progressback) { - if (!callback) { - error('Requiring callback' + this.name); - } - - // If the promise is already resolved, call the callback directly. - if (this.isResolved) { - var data = this.data; - callback.call(null, data); - } else if (this.isRejected && errback) { - var error = this.error; - errback.call(null, error); - } else { - this.callbacks.push(callback); - if (errback) - this.errbacks.push(errback); - } - - if (progressback) - this.progressbacks.push(progressback); - } - }; - - return Promise; -})(); - -var StatTimer = (function StatTimerClosure() { - function rpad(str, pad, length) { - while (str.length < length) - str += pad; - return str; - } - function StatTimer() { - this.started = {}; - this.times = []; - this.enabled = true; - } - StatTimer.prototype = { - time: function StatTimer_time(name) { - if (!this.enabled) - return; - if (name in this.started) - throw 'Timer is already running for ' + name; - this.started[name] = Date.now(); - }, - timeEnd: function StatTimer_timeEnd(name) { - if (!this.enabled) - return; - if (!(name in this.started)) - throw 'Timer has not been started for ' + name; - this.times.push({ - 'name': name, - 'start': this.started[name], - 'end': Date.now() - }); - // Remove timer from started so it can be called again. - delete this.started[name]; - }, - toString: function StatTimer_toString() { - var times = this.times; - var out = ''; - // Find the longest name for padding purposes. - var longest = 0; - for (var i = 0, ii = times.length; i < ii; ++i) { - var name = times[i]['name']; - if (name.length > longest) - longest = name.length; - } - for (var i = 0, ii = times.length; i < ii; ++i) { - var span = times[i]; - var duration = span.end - span.start; - out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; - } - return out; - } - }; - return StatTimer; -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -/** - * This is the main entry point for loading a PDF and interacting with it. - * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) - * is used, which means it must follow the same origin rules that any XHR does - * e.g. No cross domain requests without CORS. - * - * @param {string|TypedAray|object} source Can be an url to where a PDF is - * located, a typed array (Uint8Array) already populated with data or - * and parameter object with the following possible fields: - * - url - The URL of the PDF. - * - data - A typed array with PDF data. - * - httpHeaders - Basic authentication headers. - * - password - For decrypting password-protected PDFs. - * - * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object. - */ -PDFJS.getDocument = function getDocument(source) { - var url, data, headers, password, parameters = {}; - if (typeof source === 'string') { - url = source; - } else if (isArrayBuffer(source)) { - data = source; - } else if (typeof source === 'object') { - url = source.url; - data = source.data; - headers = source.httpHeaders; - password = source.password; - parameters.password = password || null; - - if (!url && !data) - error('Invalid parameter array, need either .data or .url'); - } else { - error('Invalid parameter in getDocument, need either Uint8Array, ' + - 'string or a parameter object'); - } - - var promise = new PDFJS.Promise(); - var transport = new WorkerTransport(promise); - if (data) { - // assuming the data is array, instantiating directly from it - transport.sendData(data, parameters); - } else if (url) { - // fetch url - PDFJS.getPdf( - { - url: url, - progress: function getPDFProgress(evt) { - if (evt.lengthComputable) - promise.progress({ - loaded: evt.loaded, - total: evt.total - }); - }, - error: function getPDFError(e) { - promise.reject('Unexpected server response of ' + - e.target.status + '.'); - }, - headers: headers - }, - function getPDFLoad(data) { - transport.sendData(data, parameters); - }); - } - - return promise; -}; - -/** - * Proxy to a PDFDocument in the worker thread. Also, contains commonly used - * properties that can be read synchronously. - */ -var PDFDocumentProxy = (function PDFDocumentProxyClosure() { - function PDFDocumentProxy(pdfInfo, transport) { - this.pdfInfo = pdfInfo; - this.transport = transport; - } - PDFDocumentProxy.prototype = { - /** - * @return {number} Total number of pages the PDF contains. - */ - get numPages() { - return this.pdfInfo.numPages; - }, - /** - * @return {string} A unique ID to identify a PDF. Not guaranteed to be - * unique. - */ - get fingerprint() { - return this.pdfInfo.fingerprint; - }, - /** - * @param {number} The page number to get. The first page is 1. - * @return {Promise} A promise that is resolved with a {PDFPageProxy} - * object. - */ - getPage: function PDFDocumentProxy_getPage(number) { - return this.transport.getPage(number); - }, - /** - * @return {Promise} A promise that is resolved with a lookup table for - * mapping named destinations to reference numbers. - */ - getDestinations: function PDFDocumentProxy_getDestinations() { - var promise = new PDFJS.Promise(); - var destinations = this.pdfInfo.destinations; - promise.resolve(destinations); - return promise; - }, - /** - * @return {Promise} A promise that is resolved with an {array} that is a - * tree outline (if it has one) of the PDF. The tree is in the format of: - * [ - * { - * title: string, - * bold: boolean, - * italic: boolean, - * color: rgb array, - * dest: dest obj, - * items: array of more items like this - * }, - * ... - * ]. - */ - getOutline: function PDFDocumentProxy_getOutline() { - var promise = new PDFJS.Promise(); - var outline = this.pdfInfo.outline; - promise.resolve(outline); - return promise; - }, - /** - * @return {Promise} A promise that is resolved with an {object} that has - * info and metadata properties. Info is an {object} filled with anything - * available in the information dictionary and similarly metadata is a - * {Metadata} object with information from the metadata section of the PDF. - */ - getMetadata: function PDFDocumentProxy_getMetadata() { - var promise = new PDFJS.Promise(); - var info = this.pdfInfo.info; - var metadata = this.pdfInfo.metadata; - promise.resolve({ - info: info, - metadata: metadata ? new PDFJS.Metadata(metadata) : null - }); - return promise; - }, - isEncrypted: function PDFDocumentProxy_isEncrypted() { - var promise = new PDFJS.Promise(); - promise.resolve(this.pdfInfo.encrypted); - return promise; - }, - /** - * @return {Promise} A promise that is resolved with a TypedArray that has - * the raw data from the PDF. - */ - getData: function PDFDocumentProxy_getData() { - var promise = new PDFJS.Promise(); - this.transport.getData(promise); - return promise; - }, - destroy: function PDFDocumentProxy_destroy() { - this.transport.destroy(); - } - }; - return PDFDocumentProxy; -})(); - -var PDFPageProxy = (function PDFPageProxyClosure() { - function PDFPageProxy(pageInfo, transport) { - this.pageInfo = pageInfo; - this.transport = transport; - this.stats = new StatTimer(); - this.stats.enabled = !!globalScope.PDFJS.enableStats; - this.objs = transport.objs; - this.renderInProgress = false; - } - PDFPageProxy.prototype = { - /** - * @return {number} Page number of the page. First page is 1. - */ - get pageNumber() { - return this.pageInfo.pageIndex + 1; - }, - /** - * @return {number} The number of degrees the page is rotated clockwise. - */ - get rotate() { - return this.pageInfo.rotate; - }, - /** - * @return {object} The reference that points to this page. It has 'num' and - * 'gen' properties. - */ - get ref() { - return this.pageInfo.ref; - }, - /** - * @return {array} An array of the visible portion of the PDF page in the - * user space units - [x1, y1, x2, y2]. - */ - get view() { - return this.pageInfo.view; - }, - /** - * @param {number} scale The desired scale of the viewport. - * @param {number} rotate Degrees to rotate the viewport. If omitted this - * defaults to the page rotation. - * @return {PageViewport} Contains 'width' and 'height' properties along - * with transforms required for rendering. - */ - getViewport: function PDFPageProxy_getViewport(scale, rotate) { - if (arguments.length < 2) - rotate = this.rotate; - return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); - }, - /** - * @return {Promise} A promise that is resolved with an {array} of the - * annotation objects. - */ - getAnnotations: function PDFPageProxy_getAnnotations() { - if (this.annotationsPromise) - return this.annotationsPromise; - - var promise = new PDFJS.Promise(); - this.annotationsPromise = promise; - this.transport.getAnnotations(this.pageInfo.pageIndex); - return promise; - }, - /** - * Begins the process of rendering a page to the desired context. - * @param {object} params A parameter object that supports: - * { - * canvasContext(required): A 2D context of a DOM Canvas object., - * textLayer(optional): An object that has beginLayout, endLayout, and - * appendText functions. - * }. - * @return {Promise} A promise that is resolved when the page finishes - * rendering. - */ - render: function PDFPageProxy_render(params) { - this.renderInProgress = true; - - var promise = new Promise(); - var stats = this.stats; - stats.time('Overall'); - // If there is no displayReadyPromise yet, then the operatorList was never - // requested before. Make the request and create the promise. - if (!this.displayReadyPromise) { - this.displayReadyPromise = new Promise(); - this.destroyed = false; - - this.stats.time('Page Request'); - this.transport.messageHandler.send('RenderPageRequest', { - pageIndex: this.pageNumber - 1 - }); - } - - var self = this; - function complete(error) { - self.renderInProgress = false; - if (self.destroyed) { - delete self.operatorList; - delete self.displayReadyPromise; - } - - if (error) - promise.reject(error); - else - promise.resolve(); - }; - - // Once the operatorList and fonts are loaded, do the actual rendering. - this.displayReadyPromise.then( - function pageDisplayReadyPromise() { - if (self.destroyed) { - complete(); - return; - } - - var gfx = new CanvasGraphics(params.canvasContext, - this.objs, params.textLayer); - try { - this.display(gfx, params.viewport, complete); - } catch (e) { - complete(e); - } - }.bind(this), - function pageDisplayReadPromiseError(reason) { - complete(reason); - } - ); - - return promise; - }, - /** - * For internal use only. - */ - startRenderingFromOperatorList: - function PDFPageProxy_startRenderingFromOperatorList(operatorList, - fonts) { - var self = this; - this.operatorList = operatorList; - - var displayContinuation = function pageDisplayContinuation() { - // Always defer call to display() to work around bug in - // Firefox error reporting from XHR callbacks. - setTimeout(function pageSetTimeout() { - self.displayReadyPromise.resolve(); - }); - }; - - this.ensureFonts(fonts, - function pageStartRenderingFromOperatorListEnsureFonts() { - displayContinuation(); - } - ); - }, - /** - * For internal use only. - */ - ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) { - this.stats.time('Font Loading'); - // Convert the font names to the corresponding font obj. - for (var i = 0, ii = fonts.length; i < ii; i++) { - fonts[i] = this.objs.objs[fonts[i]].data; - } - - // Load all the fonts - FontLoader.bind( - fonts, - function pageEnsureFontsFontObjs(fontObjs) { - this.stats.timeEnd('Font Loading'); - - callback.call(this); - }.bind(this) - ); - }, - /** - * For internal use only. - */ - display: function PDFPageProxy_display(gfx, viewport, callback) { - var stats = this.stats; - stats.time('Rendering'); - - gfx.beginDrawing(viewport); - - var startIdx = 0; - var length = this.operatorList.fnArray.length; - var operatorList = this.operatorList; - var stepper = null; - if (PDFJS.pdfBug && StepperManager.enabled) { - stepper = StepperManager.create(this.pageNumber - 1); - stepper.init(operatorList); - stepper.nextBreakPoint = stepper.getNextBreakPoint(); - } - - var self = this; - function next() { - startIdx = - gfx.executeOperatorList(operatorList, startIdx, next, stepper); - if (startIdx == length) { - gfx.endDrawing(); - stats.timeEnd('Rendering'); - stats.timeEnd('Overall'); - if (callback) callback(); - } - } - next(); - }, - /** - * @return {Promise} That is resolved with the a {string} that is the text - * content from the page. - */ - getTextContent: function PDFPageProxy_getTextContent() { - var promise = new PDFJS.Promise(); - this.transport.messageHandler.send('GetTextContent', { - pageIndex: this.pageNumber - 1 - }, - function textContentCallback(textContent) { - promise.resolve(textContent); - } - ); - return promise; - }, - /** - * Stub for future feature. - */ - getOperationList: function PDFPageProxy_getOperationList() { - var promise = new PDFJS.Promise(); - var operationList = { // not implemented - dependencyFontsID: null, - operatorList: null - }; - promise.resolve(operationList); - return promise; - }, - /** - * Destroys resources allocated by the page. - */ - destroy: function PDFPageProxy_destroy() { - this.destroyed = true; - - if (!this.renderInProgress) { - delete this.operatorList; - delete this.displayReadyPromise; - } - } - }; - return PDFPageProxy; -})(); -/** - * For internal use only. - */ -var WorkerTransport = (function WorkerTransportClosure() { - function WorkerTransport(promise) { - this.workerReadyPromise = promise; - this.objs = new PDFObjects(); - - this.pageCache = []; - this.pagePromises = []; - this.fontsLoading = {}; - - // If worker support isn't disabled explicit and the browser has worker - // support, create a new web worker and test if it/the browser fullfills - // all requirements to run parts of pdf.js in a web worker. - // Right now, the requirement is, that an Uint8Array is still an Uint8Array - // as it arrives on the worker. Chrome added this with version 15. - if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') { - var workerSrc = PDFJS.workerSrc; - if (typeof workerSrc === 'undefined') { - error('No PDFJS.workerSrc specified'); - } - - try { - var worker; - if (PDFJS.isFirefoxExtension) { - // The firefox extension can't load the worker from the resource:// - // url so we have to inline the script and then use the blob loader. - var bb = new MozBlobBuilder(); - bb.append(document.querySelector('#PDFJS_SCRIPT_TAG').textContent); - var blobUrl = window.URL.createObjectURL(bb.getBlob()); - worker = new Worker(blobUrl); - } else { - // Some versions of FF can't create a worker on localhost, see: - // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 - worker = new Worker(workerSrc); - } - - var messageHandler = new MessageHandler('main', worker); - this.messageHandler = messageHandler; - - messageHandler.on('test', function transportTest(supportTypedArray) { - if (supportTypedArray) { - this.worker = worker; - this.setupMessageHandler(messageHandler); - } else { - globalScope.PDFJS.disableWorker = true; - this.setupFakeWorker(); - } - }.bind(this)); - - var testObj = new Uint8Array(1); - // Some versions of Opera throw a DATA_CLONE_ERR on - // serializing the typed array. - messageHandler.send('test', testObj); - return; - } catch (e) { - info('The worker has been disabled.'); - } - } - // Either workers are disabled, not supported or have thrown an exception. - // Thus, we fallback to a faked worker. - globalScope.PDFJS.disableWorker = true; - this.setupFakeWorker(); - } - WorkerTransport.prototype = { - destroy: function WorkerTransport_destroy() { - if (this.worker) - this.worker.terminate(); - - this.pageCache = []; - this.pagePromises = []; - }, - setupFakeWorker: function WorkerTransport_setupFakeWorker() { - // If we don't use a worker, just post/sendMessage to the main thread. - var fakeWorker = { - postMessage: function WorkerTransport_postMessage(obj) { - fakeWorker.onmessage({data: obj}); - }, - terminate: function WorkerTransport_terminate() {} - }; - - var messageHandler = new MessageHandler('main', fakeWorker); - this.setupMessageHandler(messageHandler); - - // If the main thread is our worker, setup the handling for the messages - // the main thread sends to it self. - WorkerMessageHandler.setup(messageHandler); - }, - - setupMessageHandler: - function WorkerTransport_setupMessageHandler(messageHandler) { - this.messageHandler = messageHandler; - - messageHandler.on('GetDoc', function transportDoc(data) { - var pdfInfo = data.pdfInfo; - var pdfDocument = new PDFDocumentProxy(pdfInfo, this); - this.pdfDocument = pdfDocument; - this.workerReadyPromise.resolve(pdfDocument); - }, this); - - messageHandler.on('NeedPassword', function transportPassword(data) { - this.workerReadyPromise.reject(data.exception.message, data.exception); - }, this); - - messageHandler.on('IncorrectPassword', function transportBadPass(data) { - this.workerReadyPromise.reject(data.exception.message, data.exception); - }, this); - - messageHandler.on('GetPage', function transportPage(data) { - var pageInfo = data.pageInfo; - var page = new PDFPageProxy(pageInfo, this); - this.pageCache[pageInfo.pageIndex] = page; - var promise = this.pagePromises[pageInfo.pageIndex]; - promise.resolve(page); - }, this); - - messageHandler.on('GetAnnotations', function transportAnnotations(data) { - var annotations = data.annotations; - var promise = this.pageCache[data.pageIndex].annotationsPromise; - promise.resolve(annotations); - }, this); - - messageHandler.on('RenderPage', function transportRender(data) { - var page = this.pageCache[data.pageIndex]; - var depFonts = data.depFonts; - - page.stats.timeEnd('Page Request'); - page.startRenderingFromOperatorList(data.operatorList, depFonts); - }, this); - - messageHandler.on('obj', function transportObj(data) { - var id = data[0]; - var type = data[1]; - if (this.objs.hasData(id)) - return; - - switch (type) { - case 'JpegStream': - var imageData = data[2]; - loadJpegStream(id, imageData, this.objs); - break; - case 'Image': - var imageData = data[2]; - this.objs.resolve(id, imageData); - break; - case 'Font': - var name = data[2]; - var file = data[3]; - var properties = data[4]; - - if (file) { - // Rewrap the ArrayBuffer in a stream. - var fontFileDict = new Dict(); - file = new Stream(file, 0, file.length, fontFileDict); - } - - // At this point, only the font object is created but the font is - // not yet attached to the DOM. This is done in `FontLoader.bind`. - var font = new Font(name, file, properties); - this.objs.resolve(id, font); - break; - default: - error('Got unkown object type ' + type); - } - }, this); - - messageHandler.on('PageError', function transportError(data) { - var page = this.pageCache[data.pageNum - 1]; - if (page.displayReadyPromise) - page.displayReadyPromise.reject(data.error); - else - error(data.error); - }, this); - - messageHandler.on('JpegDecode', function(data, promise) { - var imageData = data[0]; - var components = data[1]; - if (components != 3 && components != 1) - error('Only 3 component or 1 component can be returned'); - - var img = new Image(); - img.onload = (function messageHandler_onloadClosure() { - var width = img.width; - var height = img.height; - var size = width * height; - var rgbaLength = size * 4; - var buf = new Uint8Array(size * components); - var tmpCanvas = createScratchCanvas(width, height); - var tmpCtx = tmpCanvas.getContext('2d'); - tmpCtx.drawImage(img, 0, 0); - var data = tmpCtx.getImageData(0, 0, width, height).data; - - if (components == 3) { - for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) { - buf[j] = data[i]; - buf[j + 1] = data[i + 1]; - buf[j + 2] = data[i + 2]; - } - } else if (components == 1) { - for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) { - buf[j] = data[i]; - } - } - promise.resolve({ data: buf, width: width, height: height}); - }).bind(this); - var src = 'data:image/jpeg;base64,' + window.btoa(imageData); - img.src = src; - }); - }, - - sendData: function WorkerTransport_sendData(data, params) { - this.messageHandler.send('GetDocRequest', {data: data, params: params}); - }, - - getData: function WorkerTransport_sendData(promise) { - this.messageHandler.send('GetData', null, function(data) { - promise.resolve(data); - }); - }, - - getPage: function WorkerTransport_getPage(pageNumber, promise) { - var pageIndex = pageNumber - 1; - if (pageIndex in this.pagePromises) - return this.pagePromises[pageIndex]; - var promise = new PDFJS.Promise('Page ' + pageNumber); - this.pagePromises[pageIndex] = promise; - this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex }); - return promise; - }, - - getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { - this.messageHandler.send('GetAnnotationsRequest', - { pageIndex: pageIndex }); - } - }; - return WorkerTransport; - -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -// contexts store most of the state we need natively. -// However, PDF needs a bit more state, which we store here. - -var TextRenderingMode = { - FILL: 0, - STROKE: 1, - FILL_STROKE: 2, - INVISIBLE: 3, - FILL_ADD_TO_PATH: 4, - STROKE_ADD_TO_PATH: 5, - FILL_STROKE_ADD_TO_PATH: 6, - ADD_TO_PATH: 7 -}; - -// Minimal font size that would be used during canvas fillText operations. -var MIN_FONT_SIZE = 1; - -function createScratchCanvas(width, height) { - var canvas = document.createElement('canvas'); - canvas.width = width; - canvas.height = height; - return canvas; -} - -function addContextCurrentTransform(ctx) { - // If the context doesn't expose a `mozCurrentTransform`, add a JS based on. - if (!ctx.mozCurrentTransform) { - // Store the original context - ctx._originalSave = ctx.save; - ctx._originalRestore = ctx.restore; - ctx._originalRotate = ctx.rotate; - ctx._originalScale = ctx.scale; - ctx._originalTranslate = ctx.translate; - ctx._originalTransform = ctx.transform; - - ctx._transformMatrix = [1, 0, 0, 1, 0, 0]; - ctx._transformStack = []; - - Object.defineProperty(ctx, 'mozCurrentTransform', { - get: function getCurrentTransform() { - return this._transformMatrix; - } - }); - - Object.defineProperty(ctx, 'mozCurrentTransformInverse', { - get: function getCurrentTransformInverse() { - // Calculation done using WolframAlpha: - // http://www.wolframalpha.com/input/? - // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} - - var m = this._transformMatrix; - var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; - - var ad_bc = a * d - b * c; - var bc_ad = b * c - a * d; - - return [ - d / ad_bc, - b / bc_ad, - c / bc_ad, - a / ad_bc, - (d * e - c * f) / bc_ad, - (b * e - a * f) / ad_bc - ]; - } - }); - - ctx.save = function ctxSave() { - var old = this._transformMatrix; - this._transformStack.push(old); - this._transformMatrix = old.slice(0, 6); - - this._originalSave(); - }; - - ctx.restore = function ctxRestore() { - var prev = this._transformStack.pop(); - if (prev) { - this._transformMatrix = prev; - this._originalRestore(); - } - }; - - ctx.translate = function ctxTranslate(x, y) { - var m = this._transformMatrix; - m[4] = m[0] * x + m[2] * y + m[4]; - m[5] = m[1] * x + m[3] * y + m[5]; - - this._originalTranslate(x, y); - }; - - ctx.scale = function ctxScale(x, y) { - var m = this._transformMatrix; - m[0] = m[0] * x; - m[1] = m[1] * x; - m[2] = m[2] * y; - m[3] = m[3] * y; - - this._originalScale(x, y); - }; - - ctx.transform = function ctxTransform(a, b, c, d, e, f) { - var m = this._transformMatrix; - this._transformMatrix = [ - m[0] * a + m[2] * b, - m[1] * a + m[3] * b, - m[0] * c + m[2] * d, - m[1] * c + m[3] * d, - m[0] * e + m[2] * f + m[4], - m[1] * e + m[3] * f + m[5] - ]; - - ctx._originalTransform(a, b, c, d, e, f); - }; - - ctx.rotate = function ctxRotate(angle) { - var cosValue = Math.cos(angle); - var sinValue = Math.sin(angle); - - var m = this._transformMatrix; - this._transformMatrix = [ - m[0] * cosValue + m[2] * sinValue, - m[1] * cosValue + m[3] * sinValue, - m[0] * (-sinValue) + m[2] * cosValue, - m[1] * (-sinValue) + m[3] * cosValue, - m[4], - m[5] - ]; - - this._originalRotate(angle); - }; - } -} - -var CanvasExtraState = (function CanvasExtraStateClosure() { - function CanvasExtraState(old) { - // Are soft masks and alpha values shapes or opacities? - this.alphaIsShape = false; - this.fontSize = 0; - this.fontSizeScale = 1; - this.textMatrix = IDENTITY_MATRIX; - this.fontMatrix = IDENTITY_MATRIX; - this.leading = 0; - // Current point (in user coordinates) - this.x = 0; - this.y = 0; - // Start of text line (in text coordinates) - this.lineX = 0; - this.lineY = 0; - // Character and word spacing - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - this.textRenderingMode = TextRenderingMode.FILL; - // Color spaces - this.fillColorSpace = new DeviceGrayCS(); - this.fillColorSpaceObj = null; - this.strokeColorSpace = new DeviceGrayCS(); - this.strokeColorSpaceObj = null; - this.fillColorObj = null; - this.strokeColorObj = null; - // Default fore and background colors - this.fillColor = '#000000'; - this.strokeColor = '#000000'; - // Note: fill alpha applies to all non-stroking operations - this.fillAlpha = 1; - this.strokeAlpha = 1; - this.lineWidth = 1; - - this.old = old; - } - - CanvasExtraState.prototype = { - clone: function CanvasExtraState_clone() { - return Object.create(this); - }, - setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) { - this.x = x; - this.y = y; - } - }; - return CanvasExtraState; -})(); - -var CanvasGraphics = (function CanvasGraphicsClosure() { - // Defines the time the executeOperatorList is going to be executing - // before it stops and shedules a continue of execution. - var kExecutionTime = 15; - - function CanvasGraphics(canvasCtx, objs, textLayer) { - this.ctx = canvasCtx; - this.current = new CanvasExtraState(); - this.stateStack = []; - this.pendingClip = null; - this.res = null; - this.xobjs = null; - this.objs = objs; - this.textLayer = textLayer; - if (canvasCtx) { - addContextCurrentTransform(canvasCtx); - } - } - - var LINE_CAP_STYLES = ['butt', 'round', 'square']; - var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; - var NORMAL_CLIP = {}; - var EO_CLIP = {}; - - CanvasGraphics.prototype = { - slowCommands: { - 'stroke': true, - 'closeStroke': true, - 'fill': true, - 'eoFill': true, - 'fillStroke': true, - 'eoFillStroke': true, - 'closeFillStroke': true, - 'closeEOFillStroke': true, - 'showText': true, - 'showSpacedText': true, - 'setStrokeColorSpace': true, - 'setFillColorSpace': true, - 'setStrokeColor': true, - 'setStrokeColorN': true, - 'setFillColor': true, - 'setFillColorN': true, - 'setStrokeGray': true, - 'setFillGray': true, - 'setStrokeRGBColor': true, - 'setFillRGBColor': true, - 'setStrokeCMYKColor': true, - 'setFillCMYKColor': true, - 'paintJpegXObject': true, - 'paintImageXObject': true, - 'paintImageMaskXObject': true, - 'shadingFill': true - }, - - beginDrawing: function CanvasGraphics_beginDrawing(viewport) { - var transform = viewport.transform; - this.ctx.save(); - this.ctx.transform.apply(this.ctx, transform); - - if (this.textLayer) - this.textLayer.beginLayout(); - }, - - executeOperatorList: function CanvasGraphics_executeOperatorList( - operatorList, - executionStartIdx, continueCallback, - stepper) { - var argsArray = operatorList.argsArray; - var fnArray = operatorList.fnArray; - var i = executionStartIdx || 0; - var argsArrayLen = argsArray.length; - - // Sometimes the OperatorList to execute is empty. - if (argsArrayLen == i) { - return i; - } - - var executionEndIdx; - var endTime = Date.now() + kExecutionTime; - - var objs = this.objs; - var fnName; - var slowCommands = this.slowCommands; - - while (true) { - if (stepper && i === stepper.nextBreakPoint) { - stepper.breakIt(i, continueCallback); - return i; - } - - fnName = fnArray[i]; - - if (fnName !== 'dependency') { - this[fnName].apply(this, argsArray[i]); - } else { - var deps = argsArray[i]; - for (var n = 0, nn = deps.length; n < nn; n++) { - var depObjId = deps[n]; - - // If the promise isn't resolved yet, add the continueCallback - // to the promise and bail out. - if (!objs.isResolved(depObjId)) { - objs.get(depObjId, continueCallback); - return i; - } - } - } - - i++; - - // If the entire operatorList was executed, stop as were done. - if (i == argsArrayLen) { - return i; - } - - // If the execution took longer then a certain amount of time, shedule - // to continue exeution after a short delay. - // However, this is only possible if a 'continueCallback' is passed in. - if (continueCallback && slowCommands[fnName] && Date.now() > endTime) { - setTimeout(continueCallback, 0); - return i; - } - - // If the operatorList isn't executed completely yet OR the execution - // time was short enough, do another execution round. - } - }, - - endDrawing: function CanvasGraphics_endDrawing() { - this.ctx.restore(); - - if (this.textLayer) - this.textLayer.endLayout(); - }, - - // Graphics state - setLineWidth: function CanvasGraphics_setLineWidth(width) { - this.current.lineWidth = width; - this.ctx.lineWidth = width; - }, - setLineCap: function CanvasGraphics_setLineCap(style) { - this.ctx.lineCap = LINE_CAP_STYLES[style]; - }, - setLineJoin: function CanvasGraphics_setLineJoin(style) { - this.ctx.lineJoin = LINE_JOIN_STYLES[style]; - }, - setMiterLimit: function CanvasGraphics_setMiterLimit(limit) { - this.ctx.miterLimit = limit; - }, - setDash: function CanvasGraphics_setDash(dashArray, dashPhase) { - this.ctx.mozDash = dashArray; - this.ctx.mozDashOffset = dashPhase; - this.ctx.webkitLineDash = dashArray; - this.ctx.webkitLineDashOffset = dashPhase; - }, - setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) { - // Maybe if we one day fully support color spaces this will be important - // for now we can ignore. - // TODO set rendering intent? - }, - setFlatness: function CanvasGraphics_setFlatness(flatness) { - // There's no way to control this with canvas, but we can safely ignore. - // TODO set flatness? - }, - setGState: function CanvasGraphics_setGState(states) { - for (var i = 0, ii = states.length; i < ii; i++) { - var state = states[i]; - var key = state[0]; - var value = state[1]; - - switch (key) { - case 'LW': - this.setLineWidth(value); - break; - case 'LC': - this.setLineCap(value); - break; - case 'LJ': - this.setLineJoin(value); - break; - case 'ML': - this.setMiterLimit(value); - break; - case 'D': - this.setDash(value[0], value[1]); - break; - case 'RI': - this.setRenderingIntent(value); - break; - case 'FL': - this.setFlatness(value); - break; - case 'Font': - this.setFont(state[1], state[2]); - break; - case 'CA': - this.current.strokeAlpha = state[1]; - break; - case 'ca': - this.current.fillAlpha = state[1]; - this.ctx.globalAlpha = state[1]; - break; - } - } - }, - save: function CanvasGraphics_save() { - this.ctx.save(); - var old = this.current; - this.stateStack.push(old); - this.current = old.clone(); - }, - restore: function CanvasGraphics_restore() { - var prev = this.stateStack.pop(); - if (prev) { - this.current = prev; - this.ctx.restore(); - } - }, - transform: function CanvasGraphics_transform(a, b, c, d, e, f) { - this.ctx.transform(a, b, c, d, e, f); - }, - - // Path - moveTo: function CanvasGraphics_moveTo(x, y) { - this.ctx.moveTo(x, y); - this.current.setCurrentPoint(x, y); - }, - lineTo: function CanvasGraphics_lineTo(x, y) { - this.ctx.lineTo(x, y); - this.current.setCurrentPoint(x, y); - }, - curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) { - this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); - this.current.setCurrentPoint(x3, y3); - }, - curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) { - var current = this.current; - this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3); - current.setCurrentPoint(x3, y3); - }, - curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) { - this.curveTo(x1, y1, x3, y3, x3, y3); - this.current.setCurrentPoint(x3, y3); - }, - closePath: function CanvasGraphics_closePath() { - this.ctx.closePath(); - }, - rectangle: function CanvasGraphics_rectangle(x, y, width, height) { - this.ctx.rect(x, y, width, height); - }, - stroke: function CanvasGraphics_stroke(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var strokeColor = this.current.strokeColor; - if (this.current.lineWidth === 0) - ctx.lineWidth = this.getSinglePixelWidth(); - // For stroke we want to temporarily change the global alpha to the - // stroking alpha. - ctx.globalAlpha = this.current.strokeAlpha; - if (strokeColor && strokeColor.hasOwnProperty('type') && - strokeColor.type === 'Pattern') { - // for patterns, we transform to pattern space, calculate - // the pattern, call stroke, and restore to user space - ctx.save(); - ctx.strokeStyle = strokeColor.getPattern(ctx); - ctx.stroke(); - ctx.restore(); - } else { - ctx.stroke(); - } - if (consumePath) - this.consumePath(); - // Restore the global alpha to the fill alpha - ctx.globalAlpha = this.current.fillAlpha; - }, - closeStroke: function CanvasGraphics_closeStroke() { - this.closePath(); - this.stroke(); - }, - fill: function CanvasGraphics_fill(consumePath) { - consumePath = typeof consumePath !== 'undefined' ? consumePath : true; - var ctx = this.ctx; - var fillColor = this.current.fillColor; - - if (fillColor && fillColor.hasOwnProperty('type') && - fillColor.type === 'Pattern') { - ctx.save(); - ctx.fillStyle = fillColor.getPattern(ctx); - ctx.fill(); - ctx.restore(); - } else { - ctx.fill(); - } - if (consumePath) - this.consumePath(); - }, - eoFill: function CanvasGraphics_eoFill() { - var savedFillRule = this.setEOFillRule(); - this.fill(); - this.restoreFillRule(savedFillRule); - }, - fillStroke: function CanvasGraphics_fillStroke() { - this.fill(false); - this.stroke(false); - - this.consumePath(); - }, - eoFillStroke: function CanvasGraphics_eoFillStroke() { - var savedFillRule = this.setEOFillRule(); - this.fillStroke(); - this.restoreFillRule(savedFillRule); - }, - closeFillStroke: function CanvasGraphics_closeFillStroke() { - this.closePath(); - this.fillStroke(); - }, - closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() { - var savedFillRule = this.setEOFillRule(); - this.closePath(); - this.fillStroke(); - this.restoreFillRule(savedFillRule); - }, - endPath: function CanvasGraphics_endPath() { - this.consumePath(); - }, - - // Clipping - clip: function CanvasGraphics_clip() { - this.pendingClip = NORMAL_CLIP; - }, - eoClip: function CanvasGraphics_eoClip() { - this.pendingClip = EO_CLIP; - }, - - // Text - beginText: function CanvasGraphics_beginText() { - this.current.textMatrix = IDENTITY_MATRIX; - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - endText: function CanvasGraphics_endText() { - }, - setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) { - this.current.charSpacing = spacing; - }, - setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) { - this.current.wordSpacing = spacing; - }, - setHScale: function CanvasGraphics_setHScale(scale) { - this.current.textHScale = scale / 100; - }, - setLeading: function CanvasGraphics_setLeading(leading) { - this.current.leading = -leading; - }, - setFont: function CanvasGraphics_setFont(fontRefName, size) { - var fontObj = this.objs.get(fontRefName); - var current = this.current; - - if (!fontObj) - error('Can\'t find font for ' + fontRefName); - - // Slice-clone matrix so we can manipulate it without affecting original - if (fontObj.fontMatrix) - current.fontMatrix = fontObj.fontMatrix.slice(0); - else - current.fontMatrix = IDENTITY_MATRIX.slice(0); - - // A valid matrix needs all main diagonal elements to be non-zero - // This also ensures we bypass FF bugzilla bug #719844. - if (current.fontMatrix[0] === 0 || - current.fontMatrix[3] === 0) { - warn('Invalid font matrix for font ' + fontRefName); - } - - // The spec for Tf (setFont) says that 'size' specifies the font 'scale', - // and in some docs this can be negative (inverted x-y axes). - // We implement this condition with fontMatrix. - if (size < 0) { - size = -size; - current.fontMatrix[0] *= -1; - current.fontMatrix[3] *= -1; - } - - this.current.font = fontObj; - this.current.fontSize = size; - - if (fontObj.coded) - return; // we don't need ctx.font for Type3 fonts - - var name = fontObj.loadedName || 'sans-serif'; - var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : - (fontObj.bold ? 'bold' : 'normal'); - - var italic = fontObj.italic ? 'italic' : 'normal'; - var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif'; - var typeface = '"' + name + '", ' + serif; - - // Some font backends cannot handle fonts below certain size. - // Keeping the font at minimal size and using the fontSizeScale to change - // the current transformation matrix before the fillText/strokeText. - // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227 - var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE; - this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 : - size / MIN_FONT_SIZE; - - var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; - this.ctx.font = rule; - }, - setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) { - if (mode >= TextRenderingMode.FILL_ADD_TO_PATH) - TODO('unsupported text rendering mode: ' + mode); - this.current.textRenderingMode = mode; - }, - setTextRise: function CanvasGraphics_setTextRise(rise) { - TODO('text rise: ' + rise); - }, - moveText: function CanvasGraphics_moveText(x, y) { - this.current.x = this.current.lineX += x; - this.current.y = this.current.lineY += y; - }, - setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) { - this.setLeading(-y); - this.moveText(x, y); - }, - setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { - this.current.textMatrix = [a, b, c, d, e, f]; - - this.current.x = this.current.lineX = 0; - this.current.y = this.current.lineY = 0; - }, - nextLine: function CanvasGraphics_nextLine() { - this.moveText(0, this.current.leading); - }, - applyTextTransforms: function CanvasGraphics_applyTextTransforms() { - var ctx = this.ctx; - var current = this.current; - var textHScale = current.textHScale; - var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; - - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.transform.apply(ctx, fontMatrix); - ctx.scale(textHScale, 1); - }, - getTextGeometry: function CanvasGraphics_getTextGeometry() { - var geometry = {}; - var ctx = this.ctx; - var font = this.current.font; - var ctxMatrix = ctx.mozCurrentTransform; - if (ctxMatrix) { - var bl = Util.applyTransform([0, 0], ctxMatrix); - var tr = Util.applyTransform([1, 1], ctxMatrix); - geometry.x = bl[0]; - geometry.y = bl[1]; - geometry.hScale = tr[0] - bl[0]; - geometry.vScale = tr[1] - bl[1]; - } - geometry.spaceWidth = font.spaceWidth; - return geometry; - }, - - showText: function CanvasGraphics_showText(str, skipTextSelection) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var glyphs = font.charsToGlyphs(str); - var fontSize = current.fontSize; - var fontSizeScale = current.fontSizeScale; - var charSpacing = current.charSpacing; - var wordSpacing = current.wordSpacing; - var textHScale = current.textHScale; - var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; - var textHScale2 = textHScale * fontMatrix[0]; - var glyphsLength = glyphs.length; - var textLayer = this.textLayer; - var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; - var textSelection = textLayer && !skipTextSelection ? true : false; - var textRenderingMode = current.textRenderingMode; - - // Type3 fonts - each glyph is a "mini-PDF" - if (font.coded) { - ctx.save(); - ctx.transform.apply(ctx, current.textMatrix); - ctx.translate(current.x, current.y); - - ctx.scale(textHScale, 1); - - if (textSelection) { - this.save(); - ctx.scale(1, -1); - text.geom = this.getTextGeometry(); - this.restore(); - } - for (var i = 0; i < glyphsLength; ++i) { - - var glyph = glyphs[i]; - if (glyph === null) { - // word break - this.ctx.translate(wordSpacing, 0); - continue; - } - - this.save(); - ctx.scale(fontSize, fontSize); - ctx.transform.apply(ctx, fontMatrix); - this.executeOperatorList(glyph.operatorList); - this.restore(); - - var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); - var width = transformed[0] * fontSize + - Util.sign(current.fontMatrix[0]) * charSpacing; - - ctx.translate(width, 0); - current.x += width * textHScale; - - text.str += glyph.unicode; - text.length++; - text.canvasWidth += width; - } - ctx.restore(); - } else { - ctx.save(); - this.applyTextTransforms(); - - var lineWidth = current.lineWidth; - var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]); - if (scale == 0 || lineWidth == 0) - lineWidth = this.getSinglePixelWidth(); - else - lineWidth /= scale; - - if (textSelection) - text.geom = this.getTextGeometry(); - - if (fontSizeScale != 1.0) { - ctx.scale(fontSizeScale, fontSizeScale); - lineWidth /= fontSizeScale; - } - - ctx.lineWidth = lineWidth; - - var x = 0; - for (var i = 0; i < glyphsLength; ++i) { - var glyph = glyphs[i]; - if (glyph === null) { - // word break - x += Util.sign(current.fontMatrix[0]) * wordSpacing; - continue; - } - - var character = glyph.fontChar; - var charWidth = glyph.width * fontSize * 0.001 + - Util.sign(current.fontMatrix[0]) * charSpacing; - - if (!glyph.disabled) { - var scaledX = x / fontSizeScale; - switch (textRenderingMode) { - default: // other unsupported rendering modes - case TextRenderingMode.FILL: - case TextRenderingMode.FILL_ADD_TO_PATH: - ctx.fillText(character, scaledX, 0); - break; - case TextRenderingMode.STROKE: - case TextRenderingMode.STROKE_ADD_TO_PATH: - ctx.strokeText(character, scaledX, 0); - break; - case TextRenderingMode.FILL_STROKE: - case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: - ctx.fillText(character, scaledX, 0); - ctx.strokeText(character, scaledX, 0); - break; - case TextRenderingMode.INVISIBLE: - break; - } - } - - x += charWidth; - - var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode; - var glyphUnicodeLength = glyphUnicode.length; - //reverse an arabic ligature - if (glyphUnicodeLength > 1 && - isRTLRangeFor(glyphUnicode.charCodeAt(0))) { - for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--) - text.str += glyphUnicode[ii]; - } else - text.str += glyphUnicode; - text.length += glyphUnicodeLength; - text.canvasWidth += charWidth; - } - current.x += x * textHScale2; - ctx.restore(); - } - - if (textSelection) - this.textLayer.appendText(text, font.loadedName, fontSize); - - return text; - }, - showSpacedText: function CanvasGraphics_showSpacedText(arr) { - var ctx = this.ctx; - var current = this.current; - var font = current.font; - var fontSize = current.fontSize; - var textHScale = current.textHScale; - if (!font.coded) - textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0]; - var arrLength = arr.length; - var textLayer = this.textLayer; - var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; - var textSelection = textLayer ? true : false; - - if (textSelection) { - ctx.save(); - // Type3 fonts - each glyph is a "mini-PDF" (see also showText) - if (font.coded) { - ctx.transform.apply(ctx, current.textMatrix); - ctx.scale(1, -1); - ctx.translate(current.x, -1 * current.y); - ctx.scale(textHScale, 1); - } else - this.applyTextTransforms(); - text.geom = this.getTextGeometry(); - ctx.restore(); - } - - for (var i = 0; i < arrLength; ++i) { - var e = arr[i]; - if (isNum(e)) { - var spacingLength = -e * 0.001 * fontSize * textHScale; - current.x += spacingLength; - - if (textSelection) { - // Emulate precise spacing via HTML spaces - text.canvasWidth += spacingLength; - if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero - var numFakeSpaces = Math.round(-e / text.geom.spaceWidth); - if (numFakeSpaces > 0) { - text.str += '\u00A0'; - text.length++; - } - } - } - } else if (isString(e)) { - var shownText = this.showText(e, true); - - if (textSelection) { - if (shownText.str === ' ') { - text.str += '\u00A0'; - } else { - text.str += shownText.str; - } - text.canvasWidth += shownText.canvasWidth; - text.length += shownText.length; - } - } else { - error('TJ array element ' + e + ' is not string or num'); - } - } - - if (textSelection) - this.textLayer.appendText(text, font.loadedName, fontSize); - }, - nextLineShowText: function CanvasGraphics_nextLineShowText(text) { - this.nextLine(); - this.showText(text); - }, - nextLineSetSpacingShowText: - function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing, - charSpacing, - text) { - this.setWordSpacing(wordSpacing); - this.setCharSpacing(charSpacing); - this.nextLineShowText(text); - }, - - // Type3 fonts - setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) { - // We can safely ignore this since the width should be the same - // as the width in the Widths array. - }, - setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, - yWidth, - llx, - lly, - urx, - ury) { - // TODO According to the spec we're also suppose to ignore any operators - // that set color or include images while processing this type3 font. - this.rectangle(llx, lly, urx - llx, ury - lly); - this.clip(); - this.endPath(); - }, - - // Color - setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) { - this.current.strokeColorSpace = ColorSpace.fromIR(raw); - }, - setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) { - this.current.fillColorSpace = ColorSpace.fromIR(raw); - }, - setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) { - var cs = this.current.strokeColorSpace; - var rgbColor = cs.getRgb(arguments); - var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) { - if (IR[0] == 'TilingPattern') { - var args = IR[1]; - var base = cs.base; - var color; - if (base) { - var baseComps = base.numComps; - - color = []; - for (var i = 0; i < baseComps; ++i) - color.push(args[i]); - - color = base.getRgb(color); - } - var pattern = new TilingPattern(IR, color, this.ctx, this.objs); - } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') { - var pattern = Pattern.shadingFromIR(IR); - } else { - error('Unkown IR type ' + IR[0]); - } - return pattern; - }, - setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { - var cs = this.current.strokeColorSpace; - - if (cs.name == 'Pattern') { - this.current.strokeColor = this.getColorN_Pattern(arguments, cs); - } else { - this.setStrokeColor.apply(this, arguments); - } - }, - setFillColor: function CanvasGraphics_setFillColor(/*...*/) { - var cs = this.current.fillColorSpace; - var rgbColor = cs.getRgb(arguments); - var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { - var cs = this.current.fillColorSpace; - - if (cs.name == 'Pattern') { - this.current.fillColor = this.getColorN_Pattern(arguments, cs); - } else { - this.setFillColor.apply(this, arguments); - } - }, - setStrokeGray: function CanvasGraphics_setStrokeGray(gray) { - if (!(this.current.strokeColorSpace instanceof DeviceGrayCS)) - this.current.strokeColorSpace = new DeviceGrayCS(); - - var color = Util.makeCssRgb(gray, gray, gray); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillGray: function CanvasGraphics_setFillGray(gray) { - if (!(this.current.fillColorSpace instanceof DeviceGrayCS)) - this.current.fillColorSpace = new DeviceGrayCS(); - - var color = Util.makeCssRgb(gray, gray, gray); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { - if (!(this.current.strokeColorSpace instanceof DeviceRgbCS)) - this.current.strokeColorSpace = new DeviceRgbCS(); - - var color = Util.makeCssRgb(r, g, b); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { - if (!(this.current.fillColorSpace instanceof DeviceRgbCS)) - this.current.fillColorSpace = new DeviceRgbCS(); - - var color = Util.makeCssRgb(r, g, b); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) { - if (!(this.current.strokeColorSpace instanceof DeviceCmykCS)) - this.current.strokeColorSpace = new DeviceCmykCS(); - - var color = Util.makeCssCmyk(c, m, y, k); - this.ctx.strokeStyle = color; - this.current.strokeColor = color; - }, - setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) { - if (!(this.current.fillColorSpace instanceof DeviceCmykCS)) - this.current.fillColorSpace = new DeviceCmykCS(); - - var color = Util.makeCssCmyk(c, m, y, k); - this.ctx.fillStyle = color; - this.current.fillColor = color; - }, - - shadingFill: function CanvasGraphics_shadingFill(patternIR) { - var ctx = this.ctx; - - this.save(); - var pattern = Pattern.shadingFromIR(patternIR); - ctx.fillStyle = pattern.getPattern(ctx); - - var inv = ctx.mozCurrentTransformInverse; - if (inv) { - var canvas = ctx.canvas; - var width = canvas.width; - var height = canvas.height; - - var bl = Util.applyTransform([0, 0], inv); - var br = Util.applyTransform([0, height], inv); - var ul = Util.applyTransform([width, 0], inv); - var ur = Util.applyTransform([width, height], inv); - - var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); - var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); - var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); - var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); - - this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); - } else { - // HACK to draw the gradient onto an infinite rectangle. - // PDF gradients are drawn across the entire image while - // Canvas only allows gradients to be drawn in a rectangle - // The following bug should allow us to remove this. - // https://bugzilla.mozilla.org/show_bug.cgi?id=664884 - - this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); - } - - this.restore(); - }, - - // Images - beginInlineImage: function CanvasGraphics_beginInlineImage() { - error('Should not call beginInlineImage'); - }, - beginImageData: function CanvasGraphics_beginImageData() { - error('Should not call beginImageData'); - }, - - paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, - bbox) { - this.save(); - - if (matrix && isArray(matrix) && 6 == matrix.length) - this.transform.apply(this, matrix); - - if (bbox && isArray(bbox) && 4 == bbox.length) { - var width = bbox[2] - bbox[0]; - var height = bbox[3] - bbox[1]; - this.rectangle(bbox[0], bbox[1], width, height); - this.clip(); - this.endPath(); - } - }, - - paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { - this.restore(); - }, - - paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { - var domImage = this.objs.get(objId); - if (!domImage) { - error('Dependent image isn\'t ready yet'); - } - - this.save(); - - var ctx = this.ctx; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, - 0, -h, w, h); - - this.restore(); - }, - - paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject( - imgArray, inverseDecode, width, height) { - function applyStencilMask(buffer, inverseDecode) { - var imgArrayPos = 0; - var i, j, mask, buf; - // removing making non-masked pixels transparent - var bufferPos = 3; // alpha component offset - for (i = 0; i < height; i++) { - mask = 0; - for (j = 0; j < width; j++) { - if (!mask) { - buf = imgArray[imgArrayPos++]; - mask = 128; - } - if (!(buf & mask) == inverseDecode) { - buffer[bufferPos] = 0; - } - bufferPos += 4; - mask >>= 1; - } - } - } - function rescaleImage(pixels, widthScale, heightScale) { - var scaledWidth = Math.ceil(width / widthScale); - var scaledHeight = Math.ceil(height / heightScale); - - var itemsSum = new Uint32Array(scaledWidth * scaledHeight * 4); - var itemsCount = new Uint32Array(scaledWidth * scaledHeight); - for (var i = 0, position = 0; i < height; i++) { - var lineOffset = (0 | (i / heightScale)) * scaledWidth; - for (var j = 0; j < width; j++) { - var countOffset = lineOffset + (0 | (j / widthScale)); - var sumOffset = countOffset << 2; - itemsSum[sumOffset] += pixels[position]; - itemsSum[sumOffset + 1] += pixels[position + 1]; - itemsSum[sumOffset + 2] += pixels[position + 2]; - itemsSum[sumOffset + 3] += pixels[position + 3]; - itemsCount[countOffset]++; - position += 4; - } - } - var tmpCanvas = createScratchCanvas(scaledWidth, scaledHeight); - var tmpCtx = tmpCanvas.getContext('2d'); - var imgData = tmpCtx.getImageData(0, 0, scaledWidth, scaledHeight); - pixels = imgData.data; - for (var i = 0, j = 0, ii = scaledWidth * scaledHeight; i < ii; i++) { - var count = itemsCount[i]; - pixels[j] = itemsSum[j] / count; - pixels[j + 1] = itemsSum[j + 1] / count; - pixels[j + 2] = itemsSum[j + 2] / count; - pixels[j + 3] = itemsSum[j + 3] / count; - j += 4; - } - tmpCtx.putImageData(imgData, 0, 0); - return tmpCanvas; - } - - this.save(); - - var ctx = this.ctx; - var w = width, h = height; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - var tmpCanvas = createScratchCanvas(w, h); - var tmpCtx = tmpCanvas.getContext('2d'); - - var fillColor = this.current.fillColor; - tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') && - fillColor.type === 'Pattern') ? - fillColor.getPattern(tmpCtx) : fillColor; - tmpCtx.fillRect(0, 0, w, h); - - var imgData = tmpCtx.getImageData(0, 0, w, h); - var pixels = imgData.data; - - applyStencilMask(pixels, inverseDecode); - - var currentTransform = ctx.mozCurrentTransformInverse; - var widthScale = Math.max(Math.abs(currentTransform[0]), 1); - var heightScale = Math.max(Math.abs(currentTransform[3]), 1); - if (widthScale >= 2 || heightScale >= 2) { - // canvas does not resize well large images to small -- using simple - // algorithm to perform pre-scaling - tmpCanvas = rescaleImage(imgData.data, widthScale, heightScale); - ctx.scale(widthScale, heightScale); - ctx.drawImage(tmpCanvas, 0, -h / heightScale); - } else { - tmpCtx.putImageData(imgData, 0, 0); - ctx.drawImage(tmpCanvas, 0, -h); - } - this.restore(); - }, - - paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { - var imgData = this.objs.get(objId); - if (!imgData) - error('Dependent image isn\'t ready yet'); - - this.save(); - var ctx = this.ctx; - var w = imgData.width; - var h = imgData.height; - // scale the image to the unit square - ctx.scale(1 / w, -1 / h); - - var tmpCanvas = createScratchCanvas(w, h); - var tmpCtx = tmpCanvas.getContext('2d'); - this.putBinaryImageData(tmpCtx, imgData, w, h); - - ctx.drawImage(tmpCanvas, 0, -h); - this.restore(); - }, - - putBinaryImageData: function CanvasGraphics_putBinaryImageData() { - // - }, - - // Marked content - - markPoint: function CanvasGraphics_markPoint(tag) { - TODO('Marked content'); - }, - markPointProps: function CanvasGraphics_markPointProps(tag, properties) { - TODO('Marked content'); - }, - beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) { - TODO('Marked content'); - }, - beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps( - tag, properties) { - TODO('Marked content'); - }, - endMarkedContent: function CanvasGraphics_endMarkedContent() { - TODO('Marked content'); - }, - - // Compatibility - - beginCompat: function CanvasGraphics_beginCompat() { - TODO('ignore undefined operators (should we do that anyway?)'); - }, - endCompat: function CanvasGraphics_endCompat() { - TODO('stop ignoring undefined operators'); - }, - - // Helper functions - - consumePath: function CanvasGraphics_consumePath() { - if (this.pendingClip) { - var savedFillRule = null; - if (this.pendingClip == EO_CLIP) - savedFillRule = this.setEOFillRule(); - - this.ctx.clip(); - - this.pendingClip = null; - if (savedFillRule !== null) - this.restoreFillRule(savedFillRule); - } - this.ctx.beginPath(); - }, - // We generally keep the canvas context set for - // nonzero-winding, and just set evenodd for the operations - // that need them. - setEOFillRule: function CanvasGraphics_setEOFillRule() { - var savedFillRule = this.ctx.mozFillRule; - this.ctx.mozFillRule = 'evenodd'; - return savedFillRule; - }, - restoreFillRule: function CanvasGraphics_restoreFillRule(rule) { - this.ctx.mozFillRule = rule; - }, - getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { - var inverse = this.ctx.mozCurrentTransformInverse; - return Math.abs(inverse[0] + inverse[2]); - } - }; - - return CanvasGraphics; -})(); - -if (!isWorker) { - // Feature detection if the browser can use an Uint8Array directly as imgData. - var canvas = document.createElement('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - - try { - ctx.putImageData({ - width: 1, - height: 1, - data: new Uint8Array(4) - }, 0, 0); - - CanvasGraphics.prototype.putBinaryImageData = - function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) { - ctx.putImageData(imgData, 0, 0); - }; - } catch (e) { - CanvasGraphics.prototype.putBinaryImageData = - function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) { - var tmpImgData = ctx.getImageData(0, 0, w, h); - - // Copy over the imageData pixel by pixel. - var tmpImgDataPixels = tmpImgData.data; - var len = tmpImgDataPixels.length; - - while (len--) { - tmpImgDataPixels[len] = imgData.data[len]; - } - - ctx.putImageData(tmpImgData, 0, 0); - }; - } -} - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var Name = (function NameClosure() { - function Name(name) { - this.name = name; - } - - Name.prototype = {}; - - return Name; -})(); - -var Cmd = (function CmdClosure() { - function Cmd(cmd) { - this.cmd = cmd; - } - - Cmd.prototype = {}; - - var cmdCache = {}; - - Cmd.get = function Cmd_get(cmd) { - var cmdValue = cmdCache[cmd]; - if (cmdValue) - return cmdValue; - - return cmdCache[cmd] = new Cmd(cmd); - }; - - return Cmd; -})(); - -var Dict = (function DictClosure() { - // xref is optional - function Dict(xref) { - // Map should only be used internally, use functions below to access. - var map = Object.create(null); - - this.assignXref = function Dict_assignXref(newXref) { - xref = newXref; - }; - - // automatically dereferences Ref objects - this.get = function Dict_get(key1, key2, key3) { - var value; - if (typeof (value = map[key1]) != 'undefined' || key1 in map || - typeof key2 == 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - if (typeof (value = map[key2]) != 'undefined' || key2 in map || - typeof key3 == 'undefined') { - return xref ? xref.fetchIfRef(value) : value; - } - value = map[key3] || null; - return xref ? xref.fetchIfRef(value) : value; - }; - - // no dereferencing - this.getRaw = function Dict_getRaw(key) { - return map[key]; - }; - - // creates new map and dereferences all Refs - this.getAll = function Dict_getAll() { - var all = {}; - for (var key in map) { - var obj = this.get(key); - all[key] = obj instanceof Dict ? obj.getAll() : obj; - } - return all; - }; - - this.set = function Dict_set(key, value) { - map[key] = value; - }; - - this.has = function Dict_has(key) { - return key in map; - }; - - this.forEach = function Dict_forEach(callback) { - for (var key in map) { - callback(key, this.get(key)); - } - }; - }; - - return Dict; -})(); - -var Ref = (function RefClosure() { - function Ref(num, gen) { - this.num = num; - this.gen = gen; - } - - Ref.prototype = {}; - - return Ref; -})(); - -// The reference is identified by number and generation, -// this structure stores only one instance of the reference. -var RefSet = (function RefSetClosure() { - function RefSet() { - this.dict = {}; - } - - RefSet.prototype = { - has: function RefSet_has(ref) { - return !!this.dict['R' + ref.num + '.' + ref.gen]; - }, - - put: function RefSet_put(ref) { - this.dict['R' + ref.num + '.' + ref.gen] = ref; - } - }; - - return RefSet; -})(); - -var Catalog = (function CatalogClosure() { - function Catalog(xref) { - this.xref = xref; - var obj = xref.getCatalogObj(); - assertWellFormed(isDict(obj), 'catalog object is not a dictionary'); - this.catDict = obj; - } - - Catalog.prototype = { - get metadata() { - var streamRef = this.catDict.getRaw('Metadata'); - if (!isRef(streamRef)) - return shadow(this, 'metadata', null); - - var encryptMetadata = !this.xref.encrypt ? false : - this.xref.encrypt.encryptMetadata; - - var stream = this.xref.fetch(streamRef, !encryptMetadata); - var metadata; - if (stream && isDict(stream.dict)) { - var type = stream.dict.get('Type'); - var subtype = stream.dict.get('Subtype'); - - if (isName(type) && isName(subtype) && - type.name === 'Metadata' && subtype.name === 'XML') { - // XXX: This should examine the charset the XML document defines, - // however since there are currently no real means to decode - // arbitrary charsets, let's just hope that the author of the PDF - // was reasonable enough to stick with the XML default charset, - // which is UTF-8. - try { - metadata = stringToUTF8String(bytesToString(stream.getBytes())); - } catch (e) { - info('Skipping invalid metadata.'); - } - } - } - - return shadow(this, 'metadata', metadata); - }, - get toplevelPagesDict() { - var pagesObj = this.catDict.get('Pages'); - assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary'); - // shadow the prototype getter - return shadow(this, 'toplevelPagesDict', pagesObj); - }, - get documentOutline() { - var xref = this.xref; - var obj = this.catDict.get('Outlines'); - var root = { items: [] }; - if (isDict(obj)) { - obj = obj.getRaw('First'); - var processed = new RefSet(); - if (isRef(obj)) { - var queue = [{obj: obj, parent: root}]; - // to avoid recursion keeping track of the items - // in the processed dictionary - processed.put(obj); - while (queue.length > 0) { - var i = queue.shift(); - var outlineDict = xref.fetchIfRef(i.obj); - if (outlineDict === null) - continue; - if (!outlineDict.has('Title')) - error('Invalid outline item'); - var dest = outlineDict.get('A'); - if (dest) - dest = dest.get('D'); - else if (outlineDict.has('Dest')) { - dest = outlineDict.getRaw('Dest'); - if (isName(dest)) - dest = dest.name; - } - var title = outlineDict.get('Title'); - var outlineItem = { - dest: dest, - title: stringToPDFString(title), - color: outlineDict.get('C') || [0, 0, 0], - count: outlineDict.get('Count'), - bold: !!(outlineDict.get('F') & 2), - italic: !!(outlineDict.get('F') & 1), - items: [] - }; - i.parent.items.push(outlineItem); - obj = outlineDict.getRaw('First'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: outlineItem}); - processed.put(obj); - } - obj = outlineDict.getRaw('Next'); - if (isRef(obj) && !processed.has(obj)) { - queue.push({obj: obj, parent: i.parent}); - processed.put(obj); - } - } - } - } - obj = root.items.length > 0 ? root.items : null; - return shadow(this, 'documentOutline', obj); - }, - get numPages() { - var obj = this.toplevelPagesDict.get('Count'); - assertWellFormed( - isInt(obj), - 'page count in top level pages object is not an integer' - ); - // shadow the prototype getter - return shadow(this, 'num', obj); - }, - traverseKids: function Catalog_traverseKids(pagesDict) { - var pageCache = this.pageCache; - var kids = pagesDict.get('Kids'); - assertWellFormed(isArray(kids), - 'page dictionary kids object is not an array'); - for (var i = 0, ii = kids.length; i < ii; ++i) { - var kid = kids[i]; - assertWellFormed(isRef(kid), - 'page dictionary kid is not a reference'); - var obj = this.xref.fetch(kid); - if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { - pageCache.push(new Page(this.xref, pageCache.length, obj, kid)); - } else { // must be a child page dictionary - assertWellFormed( - isDict(obj), - 'page dictionary kid reference points to wrong type of object' - ); - this.traverseKids(obj); - } - } - }, - get destinations() { - function fetchDestination(dest) { - return isDict(dest) ? dest.get('D') : dest; - } - - var xref = this.xref; - var dests = {}, nameTreeRef, nameDictionaryRef; - var obj = this.catDict.get('Names'); - if (obj) - nameTreeRef = obj.getRaw('Dests'); - else if (this.catDict.has('Dests')) - nameDictionaryRef = this.catDict.get('Dests'); - - if (nameDictionaryRef) { - // reading simple destination dictionary - obj = nameDictionaryRef; - obj.forEach(function catalogForEach(key, value) { - if (!value) return; - dests[key] = fetchDestination(value); - }); - } - if (nameTreeRef) { - // reading name tree - var processed = new RefSet(); - processed.put(nameTreeRef); - var queue = [nameTreeRef]; - while (queue.length > 0) { - var i, n; - obj = xref.fetch(queue.shift()); - if (obj.has('Kids')) { - var kids = obj.get('Kids'); - for (i = 0, n = kids.length; i < n; i++) { - var kid = kids[i]; - if (processed.has(kid)) - error('invalid destinations'); - queue.push(kid); - processed.put(kid); - } - continue; - } - var names = obj.get('Names'); - for (i = 0, n = names.length; i < n; i += 2) { - dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1])); - } - } - } - return shadow(this, 'destinations', dests); - }, - getPage: function Catalog_getPage(n) { - var pageCache = this.pageCache; - if (!pageCache) { - pageCache = this.pageCache = []; - this.traverseKids(this.toplevelPagesDict); - } - return this.pageCache[n - 1]; - } - }; - - return Catalog; -})(); - -var XRef = (function XRefClosure() { - function XRef(stream, startXRef, mainXRefEntriesOffset, password) { - this.stream = stream; - this.entries = []; - this.xrefstms = {}; - var trailerDict = this.readXRef(startXRef); - trailerDict.assignXref(this); - this.trailer = trailerDict; - // prepare the XRef cache - this.cache = []; - - var encrypt = trailerDict.get('Encrypt'); - if (encrypt) { - var fileId = trailerDict.get('ID'); - this.encrypt = new CipherTransformFactory(encrypt, fileId[0], password); - } - - // get the root dictionary (catalog) object - if (!(this.root = trailerDict.get('Root'))) - error('Invalid root reference'); - } - - XRef.prototype = { - readXRefTable: function XRef_readXRefTable(parser) { - // Example of cross-reference table: - // xref - // 0 1 <-- subsection header (first obj #, obj count) - // 0000000000 65535 f <-- actual object (offset, generation #, f/n) - // 23 2 <-- subsection header ... and so on ... - // 0000025518 00002 n - // 0000025635 00000 n - // trailer - // ... - - // Outer loop is over subsection headers - var obj; - while (!isCmd(obj = parser.getObj(), 'trailer')) { - var first = obj, - count = parser.getObj(); - - if (!isInt(first) || !isInt(count)) - error('Invalid XRef table: wrong types in subsection header'); - - // Inner loop is over objects themselves - for (var i = 0; i < count; i++) { - var entry = {}; - entry.offset = parser.getObj(); - entry.gen = parser.getObj(); - var type = parser.getObj(); - - if (isCmd(type, 'f')) - entry.free = true; - else if (isCmd(type, 'n')) - entry.uncompressed = true; - - // Validate entry obj - if (!isInt(entry.offset) || !isInt(entry.gen) || - !(entry.free || entry.uncompressed)) { - error('Invalid entry in XRef subsection: ' + first + ', ' + count); - } - - if (!this.entries[i + first]) - this.entries[i + first] = entry; - } - } - - // Sanity check: as per spec, first object must be free - if (this.entries[0] && !this.entries[0].free) - error('Invalid XRef table: unexpected first object'); - - // Sanity check - if (!isCmd(obj, 'trailer')) - error('Invalid XRef table: could not find trailer dictionary'); - - // Read trailer dictionary, e.g. - // trailer - // << /Size 22 - // /Root 20R - // /Info 10R - // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ] - // >> - // The parser goes through the entire stream << ... >> and provides - // a getter interface for the key-value table - var dict = parser.getObj(); - if (!isDict(dict)) - error('Invalid XRef table: could not parse trailer dictionary'); - - return dict; - }, - readXRefStream: function XRef_readXRefStream(stream) { - var streamParameters = stream.parameters; - var byteWidths = streamParameters.get('W'); - var range = streamParameters.get('Index'); - if (!range) - range = [0, streamParameters.get('Size')]; - var i, j; - while (range.length > 0) { - var first = range[0], n = range[1]; - if (!isInt(first) || !isInt(n)) - error('Invalid XRef range fields: ' + first + ', ' + n); - var typeFieldWidth = byteWidths[0]; - var offsetFieldWidth = byteWidths[1]; - var generationFieldWidth = byteWidths[2]; - if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || - !isInt(generationFieldWidth)) { - error('Invalid XRef entry fields length: ' + first + ', ' + n); - } - for (i = 0; i < n; ++i) { - var type = 0, offset = 0, generation = 0; - for (j = 0; j < typeFieldWidth; ++j) - type = (type << 8) | stream.getByte(); - // if type field is absent, its default value = 1 - if (typeFieldWidth == 0) - type = 1; - for (j = 0; j < offsetFieldWidth; ++j) - offset = (offset << 8) | stream.getByte(); - for (j = 0; j < generationFieldWidth; ++j) - generation = (generation << 8) | stream.getByte(); - var entry = {}; - entry.offset = offset; - entry.gen = generation; - switch (type) { - case 0: - entry.free = true; - break; - case 1: - entry.uncompressed = true; - break; - case 2: - break; - default: - error('Invalid XRef entry type: ' + type); - } - if (!this.entries[first + i]) - this.entries[first + i] = entry; - } - range.splice(0, 2); - } - return streamParameters; - }, - indexObjects: function XRef_indexObjects() { - // Simple scan through the PDF content to find objects, - // trailers and XRef streams. - function readToken(data, offset) { - var token = '', ch = data[offset]; - while (ch !== 13 && ch !== 10) { - if (++offset >= data.length) - break; - token += String.fromCharCode(ch); - ch = data[offset]; - } - return token; - } - function skipUntil(data, offset, what) { - var length = what.length, dataLength = data.length; - var skipped = 0; - // finding byte sequence - while (offset < dataLength) { - var i = 0; - while (i < length && data[offset + i] == what[i]) - ++i; - if (i >= length) - break; // sequence found - - offset++; - skipped++; - } - return skipped; - } - var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); - var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, - 101, 102]); - var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]); - var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); - - var stream = this.stream; - stream.pos = 0; - var buffer = stream.getBytes(); - var position = stream.start, length = buffer.length; - var trailers = [], xrefStms = []; - var state = 0; - var currentToken; - while (position < length) { - var ch = buffer[position]; - if (ch === 32 || ch === 9 || ch === 13 || ch === 10) { - ++position; - continue; - } - if (ch === 37) { // %-comment - do { - ++position; - ch = buffer[position]; - } while (ch !== 13 && ch !== 10); - continue; - } - var token = readToken(buffer, position); - var m; - if (token === 'xref') { - position += skipUntil(buffer, position, trailerBytes); - trailers.push(position); - position += skipUntil(buffer, position, startxrefBytes); - } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) { - this.entries[m[1]] = { - offset: position, - gen: m[2] | 0, - uncompressed: true - }; - - var contentLength = skipUntil(buffer, position, endobjBytes) + 7; - var content = buffer.subarray(position, position + contentLength); - - // checking XRef stream suspect - // (it shall have '/XRef' and next char is not a letter) - var xrefTagOffset = skipUntil(content, 0, xrefBytes); - if (xrefTagOffset < contentLength && - content[xrefTagOffset + 5] < 64) { - xrefStms.push(position); - this.xrefstms[position] = 1; // don't read it recursively - } - - position += contentLength; - } else - position += token.length + 1; - } - // reading XRef streams - for (var i = 0, ii = xrefStms.length; i < ii; ++i) { - this.readXRef(xrefStms[i], true); - } - // finding main trailer - var dict; - for (var i = 0, ii = trailers.length; i < ii; ++i) { - stream.pos = trailers[i]; - var parser = new Parser(new Lexer(stream), true, null); - var obj = parser.getObj(); - if (!isCmd(obj, 'trailer')) - continue; - // read the trailer dictionary - if (!isDict(dict = parser.getObj())) - continue; - // taking the first one with 'ID' - if (dict.has('ID')) - return dict; - } - // no tailer with 'ID', taking last one (if exists) - if (dict) - return dict; - // nothing helps - error('Invalid PDF structure'); - }, - readXRef: function XRef_readXRef(startXRef, recoveryMode) { - var stream = this.stream; - stream.pos = startXRef; - - try { - var parser = new Parser(new Lexer(stream), true, null); - var obj = parser.getObj(); - var dict; - - // Get dictionary - if (isCmd(obj, 'xref')) { - // Parse end-of-file XRef - dict = this.readXRefTable(parser); - - // Recursively get other XRefs 'XRefStm', if any - obj = dict.get('XRefStm'); - if (isInt(obj)) { - var pos = obj; - // ignore previously loaded xref streams - // (possible infinite recursion) - if (!(pos in this.xrefstms)) { - this.xrefstms[pos] = 1; - this.readXRef(pos); - } - } - } else if (isInt(obj)) { - // Parse in-stream XRef - if (!isInt(parser.getObj()) || - !isCmd(parser.getObj(), 'obj') || - !isStream(obj = parser.getObj())) { - error('Invalid XRef stream'); - } - dict = this.readXRefStream(obj); - if (!dict) - error('Failed to read XRef stream'); - } - - // Recursively get previous dictionary, if any - obj = dict.get('Prev'); - if (isInt(obj)) - this.readXRef(obj, recoveryMode); - else if (isRef(obj)) { - // The spec says Prev must not be a reference, i.e. "/Prev NNN" - // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" - this.readXRef(obj.num, recoveryMode); - } - - return dict; - } catch (e) { - log('(while reading XRef): ' + e); - } - - if (recoveryMode) - return; - - warn('Indexing all PDF objects'); - return this.indexObjects(); - }, - getEntry: function XRef_getEntry(i) { - var e = this.entries[i]; - if (e === null) - return null; - return e.free ? null : e; // returns null is the entry is free - }, - fetchIfRef: function XRef_fetchIfRef(obj) { - if (!isRef(obj)) - return obj; - return this.fetch(obj); - }, - fetch: function XRef_fetch(ref, suppressEncryption) { - assertWellFormed(isRef(ref), 'ref object is not a reference'); - var num = ref.num; - if (num in this.cache) - return this.cache[num]; - - var e = this.getEntry(num); - - // the referenced entry can be free - if (e === null) - return (this.cache[num] = e); - - var gen = ref.gen; - var stream, parser; - if (e.uncompressed) { - if (e.gen != gen) - error('inconsistent generation in XRef'); - stream = this.stream.makeSubStream(e.offset); - parser = new Parser(new Lexer(stream), true, this); - var obj1 = parser.getObj(); - var obj2 = parser.getObj(); - var obj3 = parser.getObj(); - if (!isInt(obj1) || obj1 != num || - !isInt(obj2) || obj2 != gen || - !isCmd(obj3)) { - error('bad XRef entry'); - } - if (!isCmd(obj3, 'obj')) { - // some bad pdfs use "obj1234" and really mean 1234 - if (obj3.cmd.indexOf('obj') == 0) { - num = parseInt(obj3.cmd.substring(3), 10); - if (!isNaN(num)) - return num; - } - error('bad XRef entry'); - } - if (this.encrypt && !suppressEncryption) { - try { - e = parser.getObj(this.encrypt.createCipherTransform(num, gen)); - } catch (ex) { - // almost all streams must be encrypted, but sometimes - // they are not probably due to some broken generators - // re-trying without encryption - return this.fetch(ref, true); - } - } else { - e = parser.getObj(); - } - // Don't cache streams since they are mutable (except images). - if (!isStream(e) || e instanceof JpegStream) - this.cache[num] = e; - return e; - } - - // compressed entry - stream = this.fetch(new Ref(e.offset, 0)); - if (!isStream(stream)) - error('bad ObjStm stream'); - var first = stream.parameters.get('First'); - var n = stream.parameters.get('N'); - if (!isInt(first) || !isInt(n)) { - error('invalid first and n parameters for ObjStm stream'); - } - parser = new Parser(new Lexer(stream), false, this); - var i, entries = [], nums = []; - // read the object numbers to populate cache - for (i = 0; i < n; ++i) { - num = parser.getObj(); - if (!isInt(num)) { - error('invalid object number in the ObjStm stream: ' + num); - } - nums.push(num); - var offset = parser.getObj(); - if (!isInt(offset)) { - error('invalid object offset in the ObjStm stream: ' + offset); - } - } - // read stream objects for cache - for (i = 0; i < n; ++i) { - entries.push(parser.getObj()); - this.cache[nums[i]] = entries[i]; - } - e = entries[e.gen]; - if (!e) { - error('bad XRef entry for compressed object'); - } - return e; - }, - getCatalogObj: function XRef_getCatalogObj() { - return this.root; - } - }; - - return XRef; -})(); - -/** - * A PDF document and page is built of many objects. E.g. there are objects - * for fonts, images, rendering code and such. These objects might get processed - * inside of a worker. The `PDFObjects` implements some basic functions to - * manage these objects. - */ -var PDFObjects = (function PDFObjectsClosure() { - function PDFObjects() { - this.objs = {}; - } - - PDFObjects.prototype = { - objs: null, - - /** - * Internal function. - * Ensures there is an object defined for `objId`. Stores `data` on the - * object *if* it is created. - */ - ensureObj: function PDFObjects_ensureObj(objId, data) { - if (this.objs[objId]) - return this.objs[objId]; - return this.objs[objId] = new Promise(objId, data); - }, - - /** - * If called *without* callback, this returns the data of `objId` but the - * object needs to be resolved. If it isn't, this function throws. - * - * If called *with* a callback, the callback is called with the data of the - * object once the object is resolved. That means, if you call this - * function and the object is already resolved, the callback gets called - * right away. - */ - get: function PDFObjects_get(objId, callback) { - // If there is a callback, then the get can be async and the object is - // not required to be resolved right now - if (callback) { - this.ensureObj(objId).then(callback); - return null; - } - - // If there isn't a callback, the user expects to get the resolved data - // directly. - var obj = this.objs[objId]; - - // If there isn't an object yet or the object isn't resolved, then the - // data isn't ready yet! - if (!obj || !obj.isResolved) - error('Requesting object that isn\'t resolved yet ' + objId); - - return obj.data; - }, - - /** - * Resolves the object `objId` with optional `data`. - */ - resolve: function PDFObjects_resolve(objId, data) { - var objs = this.objs; - - // In case there is a promise already on this object, just resolve it. - if (objs[objId]) { - objs[objId].resolve(data); - } else { - this.ensureObj(objId, data); - } - }, - - onData: function PDFObjects_onData(objId, callback) { - this.ensureObj(objId).onData(callback); - }, - - isResolved: function PDFObjects_isResolved(objId) { - var objs = this.objs; - if (!objs[objId]) { - return false; - } else { - return objs[objId].isResolved; - } - }, - - hasData: function PDFObjects_hasData(objId) { - var objs = this.objs; - if (!objs[objId]) { - return false; - } else { - return objs[objId].hasData; - } - }, - - /** - * Sets the data of an object but *doesn't* resolve it. - */ - setData: function PDFObjects_setData(objId, data) { - // Watchout! If you call `this.ensureObj(objId, data)` you're going to - // create a *resolved* promise which shouldn't be the case! - this.ensureObj(objId).data = data; - } - }; - return PDFObjects; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var PDFFunction = (function PDFFunctionClosure() { - var CONSTRUCT_SAMPLED = 0; - var CONSTRUCT_INTERPOLATED = 2; - var CONSTRUCT_STICHED = 3; - var CONSTRUCT_POSTSCRIPT = 4; - - return { - getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, - str) { - var length = 1; - for (var i = 0, ii = size.length; i < ii; i++) - length *= size[i]; - length *= outputSize; - - var array = []; - var codeSize = 0; - var codeBuf = 0; - // 32 is a valid bps so shifting won't work - var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1); - - var strBytes = str.getBytes((length * bps + 7) / 8); - var strIdx = 0; - for (var i = 0; i < length; i++) { - while (codeSize < bps) { - codeBuf <<= 8; - codeBuf |= strBytes[strIdx++]; - codeSize += 8; - } - codeSize -= bps; - array.push((codeBuf >> codeSize) * sampleMul); - codeBuf &= (1 << codeSize) - 1; - } - return array; - }, - - getIR: function PDFFunction_getIR(xref, fn) { - var dict = fn.dict; - if (!dict) - dict = fn; - - var types = [this.constructSampled, - null, - this.constructInterpolated, - this.constructStiched, - this.constructPostScript]; - - var typeNum = dict.get('FunctionType'); - var typeFn = types[typeNum]; - if (!typeFn) - error('Unknown type of function'); - - return typeFn.call(this, fn, dict, xref); - }, - - fromIR: function PDFFunction_fromIR(IR) { - var type = IR[0]; - switch (type) { - case CONSTRUCT_SAMPLED: - return this.constructSampledFromIR(IR); - case CONSTRUCT_INTERPOLATED: - return this.constructInterpolatedFromIR(IR); - case CONSTRUCT_STICHED: - return this.constructStichedFromIR(IR); - case CONSTRUCT_POSTSCRIPT: - default: - return this.constructPostScriptFromIR(IR); - } - }, - - parse: function PDFFunction_parse(xref, fn) { - var IR = this.getIR(xref, fn); - return this.fromIR(IR); - }, - - constructSampled: function PDFFunction_constructSampled(str, dict) { - function toMultiArray(arr) { - var inputLength = arr.length; - var outputLength = arr.length / 2; - var out = []; - var index = 0; - for (var i = 0; i < inputLength; i += 2) { - out[index] = [arr[i], arr[i + 1]]; - ++index; - } - return out; - } - var domain = dict.get('Domain'); - var range = dict.get('Range'); - - if (!domain || !range) - error('No domain or range'); - - var inputSize = domain.length / 2; - var outputSize = range.length / 2; - - domain = toMultiArray(domain); - range = toMultiArray(range); - - var size = dict.get('Size'); - var bps = dict.get('BitsPerSample'); - var order = dict.get('Order'); - if (!order) - order = 1; - if (order !== 1) - error('No support for cubic spline interpolation: ' + order); - - var encode = dict.get('Encode'); - if (!encode) { - encode = []; - for (var i = 0; i < inputSize; ++i) { - encode.push(0); - encode.push(size[i] - 1); - } - } - encode = toMultiArray(encode); - - var decode = dict.get('Decode'); - if (!decode) - decode = range; - else - decode = toMultiArray(decode); - - var samples = this.getSampleArray(size, outputSize, bps, str); - - return [ - CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, - outputSize, Math.pow(2, bps) - 1, range - ]; - }, - - constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) { - // See chapter 3, page 109 of the PDF reference - function interpolate(x, xmin, xmax, ymin, ymax) { - return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin))); - } - - return function constructSampledFromIRResult(args) { - // See chapter 3, page 110 of the PDF reference. - var m = IR[1]; - var domain = IR[2]; - var encode = IR[3]; - var decode = IR[4]; - var samples = IR[5]; - var size = IR[6]; - var n = IR[7]; - var mask = IR[8]; - var range = IR[9]; - - if (m != args.length) - error('Incorrect number of arguments: ' + inputSize + ' != ' + - args.length); - - var x = args; - - // Building the cube vertices: its part and sample index - // http://rjwagner49.com/Mathematics/Interpolation.pdf - var cubeVertices = 1 << m; - var cubeN = new Float64Array(cubeVertices); - var cubeVertex = new Uint32Array(cubeVertices); - for (var j = 0; j < cubeVertices; j++) - cubeN[j] = 1; - - var k = n, pos = 1; - // Map x_i to y_j for 0 <= i < m using the sampled function. - for (var i = 0; i < m; ++i) { - // x_i' = min(max(x_i, Domain_2i), Domain_2i+1) - var domain_2i = domain[i][0]; - var domain_2i_1 = domain[i][1]; - var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1); - - // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1, - // Encode_2i, Encode_2i+1) - var e = interpolate(xi, domain_2i, domain_2i_1, - encode[i][0], encode[i][1]); - - // e_i' = min(max(e_i, 0), Size_i - 1) - var size_i = size[i]; - e = Math.min(Math.max(e, 0), size_i - 1); - - // Adjusting the cube: N and vertex sample index - var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1; - var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0); - var n1 = e - e0; // (e - e0) / (e1 - e0); - var offset0 = e0 * k; - var offset1 = offset0 + k; // e1 * k - for (var j = 0; j < cubeVertices; j++) { - if (j & pos) { - cubeN[j] *= n1; - cubeVertex[j] += offset1; - } else { - cubeN[j] *= n0; - cubeVertex[j] += offset0; - } - } - - k *= size_i; - pos <<= 1; - } - - var y = new Float64Array(n); - for (var j = 0; j < n; ++j) { - // Sum all cube vertices' samples portions - var rj = 0; - for (var i = 0; i < cubeVertices; i++) - rj += samples[cubeVertex[i] + j] * cubeN[i]; - - // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1, - // Decode_2j, Decode_2j+1) - rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); - - // y_j = min(max(r_j, range_2j), range_2j+1) - y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); - } - - return y; - } - }, - - constructInterpolated: function PDFFunction_constructInterpolated(str, - dict) { - var c0 = dict.get('C0') || [0]; - var c1 = dict.get('C1') || [1]; - var n = dict.get('N'); - - if (!isArray(c0) || !isArray(c1)) - error('Illegal dictionary for interpolated function'); - - var length = c0.length; - var diff = []; - for (var i = 0; i < length; ++i) - diff.push(c1[i] - c0[i]); - - return [CONSTRUCT_INTERPOLATED, c0, diff, n]; - }, - - constructInterpolatedFromIR: - function PDFFunction_constructInterpolatedFromIR(IR) { - var c0 = IR[1]; - var diff = IR[2]; - var n = IR[3]; - - var length = diff.length; - - return function constructInterpolatedFromIRResult(args) { - var x = n == 1 ? args[0] : Math.pow(args[0], n); - - var out = []; - for (var j = 0; j < length; ++j) - out.push(c0[j] + (x * diff[j])); - - return out; - - } - }, - - constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { - var domain = dict.get('Domain'); - - if (!domain) - error('No domain'); - - var inputSize = domain.length / 2; - if (inputSize != 1) - error('Bad domain for stiched function'); - - var fnRefs = dict.get('Functions'); - var fns = []; - for (var i = 0, ii = fnRefs.length; i < ii; ++i) - fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i]))); - - var bounds = dict.get('Bounds'); - var encode = dict.get('Encode'); - - return [CONSTRUCT_STICHED, domain, bounds, encode, fns]; - }, - - constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) { - var domain = IR[1]; - var bounds = IR[2]; - var encode = IR[3]; - var fnsIR = IR[4]; - var fns = []; - - for (var i = 0, ii = fnsIR.length; i < ii; i++) { - fns.push(PDFFunction.fromIR(fnsIR[i])); - } - - return function constructStichedFromIRResult(args) { - var clip = function constructStichedFromIRClip(v, min, max) { - if (v > max) - v = max; - else if (v < min) - v = min; - return v; - }; - - // clip to domain - var v = clip(args[0], domain[0], domain[1]); - // calulate which bound the value is in - for (var i = 0, ii = bounds.length; i < ii; ++i) { - if (v < bounds[i]) - break; - } - - // encode value into domain of function - var dmin = domain[0]; - if (i > 0) - dmin = bounds[i - 1]; - var dmax = domain[1]; - if (i < bounds.length) - dmax = bounds[i]; - - var rmin = encode[2 * i]; - var rmax = encode[2 * i + 1]; - - var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); - - // call the appropropriate function - return fns[i]([v2]); - }; - }, - - constructPostScript: function PDFFunction_constructPostScript(fn, dict, - xref) { - var domain = dict.get('Domain'); - var range = dict.get('Range'); - - if (!domain) - error('No domain.'); - - if (!range) - error('No range.'); - - var lexer = new PostScriptLexer(fn); - var parser = new PostScriptParser(lexer); - var code = parser.parse(); - - return [CONSTRUCT_POSTSCRIPT, domain, range, code]; - }, - - constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR( - IR) { - var domain = IR[1]; - var range = IR[2]; - var code = IR[3]; - var numOutputs = range.length / 2; - var evaluator = new PostScriptEvaluator(code); - // Cache the values for a big speed up, the cache size is limited though - // since the number of possible values can be huge from a PS function. - var cache = new FunctionCache(); - return function constructPostScriptFromIRResult(args) { - var initialStack = []; - for (var i = 0, ii = (domain.length / 2); i < ii; ++i) { - initialStack.push(args[i]); - } - - var key = initialStack.join('_'); - if (cache.has(key)) - return cache.get(key); - - var stack = evaluator.execute(initialStack); - var transformed = []; - for (i = numOutputs - 1; i >= 0; --i) { - var out = stack.pop(); - var rangeIndex = 2 * i; - if (out < range[rangeIndex]) - out = range[rangeIndex]; - else if (out > range[rangeIndex + 1]) - out = range[rangeIndex + 1]; - transformed[i] = out; - } - cache.set(key, transformed); - return transformed; - }; - } - }; -})(); - -var FunctionCache = (function FunctionCacheClosure() { - // Of 10 PDF's with type4 functions the maxium number of distinct values seen - // was 256. This still may need some tweaking in the future though. - var MAX_CACHE_SIZE = 1024; - function FunctionCache() { - this.cache = {}; - this.total = 0; - } - FunctionCache.prototype = { - has: function FunctionCache_has(key) { - return key in this.cache; - }, - get: function FunctionCache_get(key) { - return this.cache[key]; - }, - set: function FunctionCache_set(key, value) { - if (this.total < MAX_CACHE_SIZE) { - this.cache[key] = value; - this.total++; - } - } - }; - return FunctionCache; -})(); - -var PostScriptStack = (function PostScriptStackClosure() { - var MAX_STACK_SIZE = 100; - function PostScriptStack(initialStack) { - this.stack = initialStack || []; - } - - PostScriptStack.prototype = { - push: function PostScriptStack_push(value) { - if (this.stack.length >= MAX_STACK_SIZE) - error('PostScript function stack overflow.'); - this.stack.push(value); - }, - pop: function PostScriptStack_pop() { - if (this.stack.length <= 0) - error('PostScript function stack underflow.'); - return this.stack.pop(); - }, - copy: function PostScriptStack_copy(n) { - if (this.stack.length + n >= MAX_STACK_SIZE) - error('PostScript function stack overflow.'); - var stack = this.stack; - for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) - stack.push(stack[i]); - }, - index: function PostScriptStack_index(n) { - this.push(this.stack[this.stack.length - n - 1]); - }, - // rotate the last n stack elements p times - roll: function PostScriptStack_roll(n, p) { - var stack = this.stack; - var l = stack.length - n; - var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t; - for (i = l, j = r; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - for (i = l, j = c - 1; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - for (i = c, j = r; i < j; i++, j--) { - t = stack[i]; stack[i] = stack[j]; stack[j] = t; - } - } - }; - return PostScriptStack; -})(); -var PostScriptEvaluator = (function PostScriptEvaluatorClosure() { - function PostScriptEvaluator(operators, operands) { - this.operators = operators; - this.operands = operands; - } - PostScriptEvaluator.prototype = { - execute: function PostScriptEvaluator_execute(initialStack) { - var stack = new PostScriptStack(initialStack); - var counter = 0; - var operators = this.operators; - var length = operators.length; - var operator, a, b; - while (counter < length) { - operator = operators[counter++]; - if (typeof operator == 'number') { - // Operator is really an operand and should be pushed to the stack. - stack.push(operator); - continue; - } - switch (operator) { - // non standard ps operators - case 'jz': // jump if false - b = stack.pop(); - a = stack.pop(); - if (!a) - counter = b; - break; - case 'j': // jump - a = stack.pop(); - counter = a; - break; - - // all ps operators in alphabetical order (excluding if/ifelse) - case 'abs': - a = stack.pop(); - stack.push(Math.abs(a)); - break; - case 'add': - b = stack.pop(); - a = stack.pop(); - stack.push(a + b); - break; - case 'and': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) - stack.push(a && b); - else - stack.push(a & b); - break; - case 'atan': - a = stack.pop(); - stack.push(Math.atan(a)); - break; - case 'bitshift': - b = stack.pop(); - a = stack.pop(); - if (a > 0) - stack.push(a << b); - else - stack.push(a >> b); - break; - case 'ceiling': - a = stack.pop(); - stack.push(Math.ceil(a)); - break; - case 'copy': - a = stack.pop(); - stack.copy(a); - break; - case 'cos': - a = stack.pop(); - stack.push(Math.cos(a)); - break; - case 'cvi': - a = stack.pop() | 0; - stack.push(a); - break; - case 'cvr': - // noop - break; - case 'div': - b = stack.pop(); - a = stack.pop(); - stack.push(a / b); - break; - case 'dup': - stack.copy(1); - break; - case 'eq': - b = stack.pop(); - a = stack.pop(); - stack.push(a == b); - break; - case 'exch': - stack.roll(2, 1); - break; - case 'exp': - b = stack.pop(); - a = stack.pop(); - stack.push(Math.pow(a, b)); - break; - case 'false': - stack.push(false); - break; - case 'floor': - a = stack.pop(); - stack.push(Math.floor(a)); - break; - case 'ge': - b = stack.pop(); - a = stack.pop(); - stack.push(a >= b); - break; - case 'gt': - b = stack.pop(); - a = stack.pop(); - stack.push(a > b); - break; - case 'idiv': - b = stack.pop(); - a = stack.pop(); - stack.push((a / b) | 0); - break; - case 'index': - a = stack.pop(); - stack.index(a); - break; - case 'le': - b = stack.pop(); - a = stack.pop(); - stack.push(a <= b); - break; - case 'ln': - a = stack.pop(); - stack.push(Math.log(a)); - break; - case 'log': - a = stack.pop(); - stack.push(Math.log(a) / Math.LN10); - break; - case 'lt': - b = stack.pop(); - a = stack.pop(); - stack.push(a < b); - break; - case 'mod': - b = stack.pop(); - a = stack.pop(); - stack.push(a % b); - break; - case 'mul': - b = stack.pop(); - a = stack.pop(); - stack.push(a * b); - break; - case 'ne': - b = stack.pop(); - a = stack.pop(); - stack.push(a != b); - break; - case 'neg': - a = stack.pop(); - stack.push(-b); - break; - case 'not': - a = stack.pop(); - if (isBool(a) && isBool(b)) - stack.push(a && b); - else - stack.push(a & b); - break; - case 'or': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) - stack.push(a || b); - else - stack.push(a | b); - break; - case 'pop': - stack.pop(); - break; - case 'roll': - b = stack.pop(); - a = stack.pop(); - stack.roll(a, b); - break; - case 'round': - a = stack.pop(); - stack.push(Math.round(a)); - break; - case 'sin': - a = stack.pop(); - stack.push(Math.sin(a)); - break; - case 'sqrt': - a = stack.pop(); - stack.push(Math.sqrt(a)); - break; - case 'sub': - b = stack.pop(); - a = stack.pop(); - stack.push(a - b); - break; - case 'true': - stack.push(true); - break; - case 'truncate': - a = stack.pop(); - a = a < 0 ? Math.ceil(a) : Math.floor(a); - stack.push(a); - break; - case 'xor': - b = stack.pop(); - a = stack.pop(); - if (isBool(a) && isBool(b)) - stack.push(a != b); - else - stack.push(a ^ b); - break; - default: - error('Unknown operator ' + operator); - break; - } - } - return stack.stack; - } - }; - return PostScriptEvaluator; -})(); - -var PostScriptParser = (function PostScriptParserClosure() { - function PostScriptParser(lexer) { - this.lexer = lexer; - this.operators = []; - this.token; - this.prev; - } - PostScriptParser.prototype = { - nextToken: function PostScriptParser_nextToken() { - this.prev = this.token; - this.token = this.lexer.getToken(); - }, - accept: function PostScriptParser_accept(type) { - if (this.token.type == type) { - this.nextToken(); - return true; - } - return false; - }, - expect: function PostScriptParser_expect(type) { - if (this.accept(type)) - return true; - error('Unexpected symbol: found ' + this.token.type + ' expected ' + - type + '.'); - }, - parse: function PostScriptParser_parse() { - this.nextToken(); - this.expect(PostScriptTokenTypes.LBRACE); - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - return this.operators; - }, - parseBlock: function PostScriptParser_parseBlock() { - while (true) { - if (this.accept(PostScriptTokenTypes.NUMBER)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { - this.operators.push(this.prev.value); - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - this.parseCondition(); - } else { - return; - } - } - }, - parseCondition: function PostScriptParser_parseCondition() { - // Add two place holders that will be updated later - var conditionLocation = this.operators.length; - this.operators.push(null, null); - - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - if (this.accept(PostScriptTokenTypes.IF)) { - // The true block is right after the 'if' so it just falls through on - // true else it jumps and skips the true block. - this.operators[conditionLocation] = this.operators.length; - this.operators[conditionLocation + 1] = 'jz'; - } else if (this.accept(PostScriptTokenTypes.LBRACE)) { - var jumpLocation = this.operators.length; - this.operators.push(null, null); - var endOfTrue = this.operators.length; - this.parseBlock(); - this.expect(PostScriptTokenTypes.RBRACE); - this.expect(PostScriptTokenTypes.IFELSE); - // The jump is added at the end of the true block to skip the false - // block. - this.operators[jumpLocation] = this.operators.length; - this.operators[jumpLocation + 1] = 'j'; - - this.operators[conditionLocation] = endOfTrue; - this.operators[conditionLocation + 1] = 'jz'; - } else { - error('PS Function: error parsing conditional.'); - } - } - }; - return PostScriptParser; -})(); - -var PostScriptTokenTypes = { - LBRACE: 0, - RBRACE: 1, - NUMBER: 2, - OPERATOR: 3, - IF: 4, - IFELSE: 5 -}; - -var PostScriptToken = (function PostScriptTokenClosure() { - function PostScriptToken(type, value) { - this.type = type; - this.value = value; - } - - var opCache = {}; - - PostScriptToken.getOperator = function PostScriptToken_getOperator(op) { - var opValue = opCache[op]; - if (opValue) - return opValue; - - return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); - }; - - PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, - '{'); - PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, - '}'); - PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF'); - PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, - 'IFELSE'); - return PostScriptToken; -})(); - -var PostScriptLexer = (function PostScriptLexerClosure() { - function PostScriptLexer(stream) { - this.stream = stream; - } - PostScriptLexer.prototype = { - getToken: function PostScriptLexer_getToken() { - var s = ''; - var ch; - var comment = false; - var stream = this.stream; - - // skip comments - while (true) { - if (!(ch = stream.getChar())) - return EOF; - - if (comment) { - if (ch == '\x0a' || ch == '\x0d') - comment = false; - } else if (ch == '%') { - comment = true; - } else if (!Lexer.isSpace(ch)) { - break; - } - } - switch (ch) { - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - case '+': case '-': case '.': - return new PostScriptToken(PostScriptTokenTypes.NUMBER, - this.getNumber(ch)); - case '{': - return PostScriptToken.LBRACE; - case '}': - return PostScriptToken.RBRACE; - } - // operator - var str = ch.toLowerCase(); - while (true) { - ch = stream.lookChar(); - if (ch === null) - break; - ch = ch.toLowerCase(); - if (ch >= 'a' && ch <= 'z') - str += ch; - else - break; - stream.skip(); - } - switch (str) { - case 'if': - return PostScriptToken.IF; - case 'ifelse': - return PostScriptToken.IFELSE; - default: - return PostScriptToken.getOperator(str); - } - }, - getNumber: function PostScriptLexer_getNumber(ch) { - var str = ch; - var stream = this.stream; - while (true) { - ch = stream.lookChar(); - if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.') - str += ch; - else - break; - stream.skip(); - } - var value = parseFloat(str); - if (isNaN(value)) - error('Invalid floating point number: ' + value); - return value; - } - }; - return PostScriptLexer; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var ISOAdobeCharset = [ - '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', - 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', - 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', - 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', - 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', - 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', - 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', - 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', - 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', - 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', - 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', - 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', - 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', - 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', - 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', - 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', - 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', - 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', - 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', - 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', - 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', - 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', - 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', - 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', - 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', - 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', - 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', - 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', - 'ugrave', 'yacute', 'ydieresis', 'zcaron' -]; - -var ExpertCharset = [ - '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', - 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', - 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', - 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', - 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', - 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', - 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', - 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', - 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', - 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', - 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', - 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', - 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', - 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', - 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', - 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', - 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', - 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', - 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', - 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', - 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', - 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', - 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', - 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', - 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', - 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', - 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', - 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', - 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', - 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', - 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', - 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', - 'Ydieresissmall' -]; - -var ExpertSubsetCharset = [ - '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', - 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', - 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', - 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', - 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', - 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', - 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', - 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', - 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', - 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', - 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', - 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', - 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', - 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', - 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', - 'periodinferior', 'commainferior' -]; - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var CIDToUnicodeMaps = { - 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165, - {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771], - [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402, - 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0, - [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769}, - [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212], - 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172, - 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192}, - {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0, - {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194, - {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288], - {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281, - {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541}, - {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295, - 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288}, - {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291, - [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806}, - 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284, - {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675, - 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306, - 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838}, - {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704, - 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730, - 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834, - {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313}, - {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913}, - {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025, - {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463, - 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569, - 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451, - 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433, - 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301, - 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944, - 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806, - [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946, - 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419, - 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139, - 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879, - [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867, - [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, - 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180, - 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, - 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, - 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, - 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, - 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, - 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, - 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, - [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742, - 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899], - 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025, - 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827, - [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499, - 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942, - 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469, - 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602, - 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913, - 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809, - 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830, - 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012, - 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275, - 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, - [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398, - 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949, - 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, - 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, - 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, - 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223, - 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185, - 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454, - 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475, - 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694, - 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867, - 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721, - 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916, - 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582, - 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671, - 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020, - 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096], - 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097, - 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507, - 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458, - 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, - [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, - 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435, - 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, - 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689, - 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659, - 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841, - 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911, - 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997, - [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670, - [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465, - 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061, - 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368, - 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533, - 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705, - 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531, - 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670, - 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693, - 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054, - 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336, - 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119, - 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500, - [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537, - 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, - 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486, - 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562, - 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187, - 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328], - 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396, - [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392, - 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431, - 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566, - 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, - 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, - 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897, - 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055, - 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511, - 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946, - 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024, - 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618, - [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783, - 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083, - 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811, - 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425, - 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915, - 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681, - 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449, - 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782, - 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622, - 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319, - 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555, - 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018, - 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662, - 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545, - 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217, - 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977, - 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642, - 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, - 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, - [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107, - 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525, - [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992], - 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430, - 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284, - 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835, - 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819], - [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235, - 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460, - 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612, - 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012, - 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034, - 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509, - 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530, - 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463, - 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447, - 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333, - 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655, - 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313], - 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460, - 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899, - 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490, - 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981, - 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210, - 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207, - 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, - 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, - [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, - 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, - 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, - 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, - 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, - 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, - 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, - 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, - 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394], - 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767, - 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862, - 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051, - [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763], - 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563, - 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, - 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700], - 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, - 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, - 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990, - 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, - 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298, - [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488, - 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246, - 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707], - 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889, - 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634, - 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554, - 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, - 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, - 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983, - 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, - 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, - 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, - 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489, - 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, - 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, - 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, - 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783, - 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419, - 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895, - 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384, - 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409, - 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364, - 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907, - 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864, - 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261, - 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299, - 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552, - 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466, - 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336, - 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701, - 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727, - 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320, - 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933, - 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378, - 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609, - 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710, - 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086, - 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397, - 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548, - 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189, - 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, - 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, - 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, - 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302, - 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237, - 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118, - 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336, - [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969, - 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635, - 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857, - 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615, - 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077, - 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900, - 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616, - 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812, - 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095, - 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342, - 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472, - 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643, - 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499, - 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233, - 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702, - 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, - 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, - 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, - [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425, - 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219, - 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105, - 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492, - 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468, - 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110, - 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479, - 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757, - 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204, - 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333], - 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707, - 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368, - 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271, - 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532, - 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495, - 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009, - 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436, - 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754, - 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382], - 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, - [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503, - 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305, - [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050, - 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426, - 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551, - 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428, - 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184, - 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975, - 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676, - 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310, - 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239, - 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, - 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, - 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862, - 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, - 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887, - 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232, - 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303, - 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675, - 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253, - 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447, - 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990, - 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165, - 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125, - {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938, - 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693, - [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187, - 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705, - 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737, - 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451, - [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, - 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637, - 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, - [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695, - 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855, - 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236, - [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611], - 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665, - [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, - 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822, - 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493, - 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, - 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, - 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480, - 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313, - 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562, - 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992], - 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965, - 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096, - 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853, - 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033, - 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041, - [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504, - 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, - [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142, - 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, - 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147], - 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563, - 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363, - 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646, - 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265, - 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676, - 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266, - 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725, - [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682, - 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434, - 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109, - 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031], - 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333, - 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174, - 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233, - 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376, - 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447, - 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520, - 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478, - 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570, - 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681}, - 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725, - 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791, - 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834, - 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873, - 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898, - {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917, - 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976, - [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038, - 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108, - 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137, - 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214, - 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254, - 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283, - 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321, - 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367, - [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430], - 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498, - 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533, - 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627, - 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676, - 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720, - {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817, - 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811, - 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918, - 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956, - 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009, - 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063, - 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190, - 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225, - 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280, - 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327}, - 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409, - 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484, - {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561, - 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687, - 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743, - 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777, - {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790, - 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862, - 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941, - 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001}, - 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, - {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, - 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318, - 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, - {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, - [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, - 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, - {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592, - [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409, - 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939, - 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785, - 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839, - 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886, - 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980, - 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022, - [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091, - {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162, - 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636, - [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291, - 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305, - 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413, - 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392, - 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409, - [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458, - 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, - 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, - 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, - 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, - 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, - 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760, - 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, - 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817, - {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, - 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948, - 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, - 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, - 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, - 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096], - 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, - {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, - 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303, - 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, - 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, - 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, - 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, - 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, - 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, - 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, - 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, - {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, - 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908], - [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933, - 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015, - 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073, - [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483, - {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205, - 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249, - 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296, - 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359, - 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433, - 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480, - 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607, - 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606, - 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701, - 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767, - 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784, - 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918, - 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839, - 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913, - 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937, - 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058, - 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101, - 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102, - 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057, - 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204, - 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192, - 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323, - 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354, - 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448, - 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476, - 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523, - 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569, - [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628, - 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684, - 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, - 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, - 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, - 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, - 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, - 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, - 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, - 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, - 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, - 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, - 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748, - 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, - 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, - 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, - 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, - 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, - 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, - 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, - 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, - 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, - 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, - 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, - 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254, - 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346, - 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410, - {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469, - 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546, - 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627, - 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746, - 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795, - 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681, - 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943, - 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990, - 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057, - 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090, - 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147, - 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179, - 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194}, - 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256, - 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305}, - {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332, - 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384, - 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437, - 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494, - {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571, - 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622, - 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679, - 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018, - 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890, - 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956, - 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019, - 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114, - 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189, - 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263, - 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329}, - 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382, - 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434, - 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457}, - 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512}, - 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564, - 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645, - 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641, - 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764, - 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757, - 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811, - 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852, - 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923, - 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954, - 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002, - 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070, - 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137, - 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189, - 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221, - 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274, - 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313, - 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345}, - 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383, - {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398, - {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592, - [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616}, - 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, - 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, - {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, - 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801, - 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, - 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900, - 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997, - 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065, - 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137, - 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184, - 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208, - 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224, - 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281}, - 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331, - 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384, - {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426, - 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523, - 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497, - 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583, - 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571, - 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704, - 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783, - 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787, - 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922, - 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983, - 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953, - 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044, - 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212, - 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204, - 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269, - 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338, - 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417, - 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500, - 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527, - 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569, - 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586, - 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649, - 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749, - 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799, - 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833, - 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884, - 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933, - 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957, - 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032}, - 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082, - 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126, - 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183, - 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233, - 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290, - {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, - 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, - 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493}, - 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, - 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, - 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, - 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, - 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730}, - 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920, - [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973, - 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029, - {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, - {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112, - 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225, - 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299, - {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351, - {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423, - 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437, - 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499, - 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542, - 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618, - 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646, - 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686, - 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791, - 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857}, - 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917, - 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958, - 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, - 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, - 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, - 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, - 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343, - 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397, - 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, - 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, - 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, - 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780, - 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832, - 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, - 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, - 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, - 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311, - 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, - 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440, - {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493, - 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567, - {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585], - 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660, - 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698, - 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748, - 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780, - 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819, - {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876, - [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, - 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023}, - 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145, - 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204, - 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243, - {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341}, - 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405}, - {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, - 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, - 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, - 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647], - {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675, - 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717], - {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747, - 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825, - {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865, - 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994, - 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, - 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, - 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, - 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, - 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, - {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, - 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, - 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, - 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584, - {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632, - 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669, - 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697], - {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737, - 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803, - {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822, - 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0, - {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0, - 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0, - {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470, - 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180, - 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976, - 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0, - 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171, - 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070, - {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4}, - 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625, - 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0, - 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802, - 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584, - {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432, - 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0, - {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0, - {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, - {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508, - 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825, - 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235, - 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090, - 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056, - 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3}, - {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560}, - {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856, - 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976, - 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947, - 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260, - 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256, - 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824, - 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953, - 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612, - 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, - 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20}, - 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575, - 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0, - 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704, - 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389, - [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362, - 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546, - 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148, - 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014, - 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471, - 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970, - 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0, - 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542, - 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, - 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, - 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, - 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831, - 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262, - 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039, - 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199, - 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843, - 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374, - 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685, - 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364, - 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842, - 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467, - 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030, - 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155, - 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495, - 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214, - 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335, - 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434, - 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495}, - 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665, - 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830, - 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707, - 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013, - {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794, - 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636}, - 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256, - 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304, - {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0, - 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593, - 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0, - 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108}, - {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424}, - {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944, - {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963, - 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111, - {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0, - 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3}, - {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0, - 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082}, - {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0, - {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0, - 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128, - {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139, - {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0, - {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265, - {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312}, - {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121, - {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8}, - 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855, - {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598}, - 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0, - 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093}, - {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069, - 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105, - 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072, - 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885, - 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095, - 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075, - 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150, - 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0, - 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5}, - 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478, - 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10}, - 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7}, - 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555, - 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4}, - 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600, - 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577, - {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136], - [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155], - 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237, - {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4}, - [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842, - {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741, - 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9}, - 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46}, - 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0, - 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0, - 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210, - 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669, - 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0, - 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818, - {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570, - 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5}, - 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094], - [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4}, - 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0, - 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206, - {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972}, - 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058], - 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245, - 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431, - 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586, - 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747, - 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993, - [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232, - {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478, - 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677, - 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896, - 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118, - 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193, - 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348, - 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537, - 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761, - 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011}, - 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207, - 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420, - {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676, - 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956, - 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088, - 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274, - 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384, - [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504, - [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627, - 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850}, - 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155, - 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368, - 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502, - 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723, - {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959, - 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209, - 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486, - 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672}, - 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856, - 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979, - 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137, - 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227, - 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428, - 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699, - [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856, - 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950, - 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194, - 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506, - 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583}, - 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772, - [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892, - 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139, - 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276, - 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489, - 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598}, - 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693, - 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743}, - 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809, - 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867, - 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096, - [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229}, - 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321, - 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556, - {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726, - 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926, - 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035], - 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163, - 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308, - 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430, - 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602, - 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798, - 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959, - 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083, - 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249, - 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401, - 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657, - 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785, - 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934, - 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156, - 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359, - 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670, - 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866, - 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142, - 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415, - 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579, - 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741, - 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911, - [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035, - {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195, - 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455, - 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924, - 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228, - 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460, - 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662, - 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866, - 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085, - 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220, - 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371, - 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570, - {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0, - 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885, - 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0, - 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564, - 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755, - 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922, - 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096, - 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263, - 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463, - {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673, - 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895, - 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001, - 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316, - 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469, - 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729, - 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848, - 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665, - 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435, - 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668, - 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0, - 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094, - 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836}, - {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741}, - {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209}, - {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472, - 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711, - 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336, - 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345, - 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365, - 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607, - 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644, - 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674, - 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0, - 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828, - 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3}, - {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695, - 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0, - {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0, - {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649, - {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0, - 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258, - {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842}, - {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504, - 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938, - 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631, - 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391, - 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369, - 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421, - 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760, - 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320, - 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647, - 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302, - 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155, - 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344, - 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953, - 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215, - 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565, - 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967, - 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432, - 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750, - 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063, - 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602, - 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242, - 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420, - 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688, - 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028, - 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052, - 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853, - 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194, - 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120, - {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463, - 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581, - 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887, - 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148, - 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988, - 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898, - 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399, - 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944, - 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638, - 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054, - {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167, - 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939, - 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355, - 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857, - 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682, - 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909, - 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274, - 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623, - 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049, - 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186, - 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343}, - 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499, - 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650, - 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686, - 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851, - 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010, - 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144, - 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314, - 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917, - {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602, - 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740, - 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831, - 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765, - 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056, - 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112, - 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239, - 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341}, - 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895, - 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004, - 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585, - 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671}, - 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771}, - {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974, - 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984, - 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079, - 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221, - 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319, - 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468, - {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555, - 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616, - 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642, - 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837, - 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333, - 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036, - 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433, - {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317, - 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519, - 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610, - 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793, - 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928, - 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077, - 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301, - 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397, - {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246, - 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568, - {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715, - 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828, - 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963, - 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062, - 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082, - 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256, - 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386, - 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341, - 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587, - 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683, - 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748, - 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794}, - 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841, - {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950, - 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072, - 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309, - 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209, - 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307, - 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389, - 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480, - 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581, - {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662, - 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799, - 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940, - {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016, - {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937, - 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150, - 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239, - {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469, - 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326, - 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591, - 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715, - 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806, - 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934, - 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056, - 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877, - 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311, - 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427, - 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501, - 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588, - 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689, - 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832, - 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882, - 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215, - 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074, - {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135, - {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183, - 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227, - {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273, - 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375}, - 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517, - 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618, - 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622, - 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868, - 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999, - 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137, - 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524, - 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324, - 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820, - 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549, - 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609, - 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676, - 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747, - 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222, - 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949, - 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616, - 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090, - 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167, - 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272, - 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195, - 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294, - {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662, - 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790, - 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952, - 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054, - 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436, - 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252, - 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238, - 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379, - 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458, - 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620, - 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587, - {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785, - 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881}, - 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982, - 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042, - 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129, - {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205, - 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264}, - 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343, - 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441, - {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531, - 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609, - 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731, - 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784, - 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856, - 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329, - 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550, - 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231, - 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345, - 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472, - 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188, - 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901, - 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986, - 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110, - 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374, - {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461, - 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616, - 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806, - 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919, - 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613, - 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106, - 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177, - {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302, - {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251, - 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503, - 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554, - {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673, - 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605, - 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852, - 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997, - 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419, - 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530, - 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616, - 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743, - 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860, - 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132, - 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423, - 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146, - {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753, - {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246, - 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182, - 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500, - 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632, - 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708, - 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787}, - {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896, - 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958, - {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028, - 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031, - {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178, - 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058, - 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310}, - 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416, - 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581, - 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762, - 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813, - 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326, - 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267, - 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578, - 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743, - {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943, - 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035, - {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112}, - 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298, - 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434, - 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556}, - 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768, - 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924, - 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008, - 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149, - 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257, - 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333}, - 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541, - 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815, - 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218, - 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520, - 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860, - 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155, - 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276}, - 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829, - 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989, - 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149, - 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419, - 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578, - {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663, - 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840, - 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056, - 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405, - 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664, - 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051, - 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336}, - 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657, - 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001, - 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348, - {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685, - 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207, - 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385, - 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528, - 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015, - 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191, - 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397, - 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521, - 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596, - {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681, - 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931, - 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147, - 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380, - 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730, - 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826}, - {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962, - 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208, - 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573, - 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674, - {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980, - 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135, - 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249, - 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389, - 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622, - 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134, - 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617, - 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751, - 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901, - 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086}, - 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260, - 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537, - 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704, - 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041, - 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241, - 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363, - 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465, - 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584, - 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679, - 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955, - 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104, - 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307, - 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551, - {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720, - 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901}, - 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368, - 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527, - 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696, - 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861, - 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170, - 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459, - 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693}, - 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856, - 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040, - 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578}, - 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742, - {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044, - 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790, - {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488, - {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339, - 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5}, - 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207, - 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532, - 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819, - 38315, 38741, 171581, 173594], - 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644], - {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211}, - 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308}, - {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176, - {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736, - 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679, - 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594, - {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757, - {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745, - {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733, - 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240, - 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673, - 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641, - 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598, - 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250, - 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507, - {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544}, - {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472, - 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, - 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512, - 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494, - 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510}, - {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525}, - {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539}, - {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209}, - 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223}, - {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200}, - 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229}, - 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254, - 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330, - {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189, - {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307, - 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800}, - {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319, - {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040}, - 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036, - {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068, - {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107, - 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151}, - 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180, - {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204, - {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232, - 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266, - 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288, - 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329, - {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359, - 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400, - {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417}, - {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471, - {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512, - 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555, - 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602, - {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624, - 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648}, - 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684, - {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751}, - {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796, - {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852, - {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880, - {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936, - {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992, - {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032}, - {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072, - 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132, - 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184, - 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212, - {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233, - {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255}, - {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320}, - {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336}, - {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364}, - {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392}, - {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440, - 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468, - 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544}, - 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576, - {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628, - 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692, - {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720}, - {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748, - {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789, - 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811}, - {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840}, - {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915}, - {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934, - {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964, - 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024, - {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043, - 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112, - {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168, - {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248, - 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293, - {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319, - 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372}, - {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400}, - {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428}, - {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506}, - {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532, - {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612, - 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752, - 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840, - {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895}, - {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944, - 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976, - 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008, - {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049, - {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103}, - {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133, - {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168, - 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212}, - 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288, - {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329, - {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364, - 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441, - {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469, - {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497}, - {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551, - 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579, - {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604}, - {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676, - 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699}, - 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732, - 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787}, - 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816, - {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900, - 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931}, - {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960, - 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052, - 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124, - {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145, - {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173, - {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201, - {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267}, - 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292, - {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316}, - 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348, - {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400, - 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464, - {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519}, - {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560, - 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640, - 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671, - {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727, - {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752}, - {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780}, - {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852, - {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904}, - {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968, - {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104, - 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248, - {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315, - 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331}, - {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360, - {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388, - {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429, - {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452}, - {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480}, - {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508}, - {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552, - 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576}, - 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632, - 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668, - {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695}, - {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736, - {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776, - 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816, - 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844}, - 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899}, - 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920, - {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948, - {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032, - 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112, - {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157, - {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228, - {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292}, - 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420, - 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460, - {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493, - {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515}, - {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536, - {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567, - {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592, - 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619}, - {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648, - {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676, - {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704, - {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728, - {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747, - {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771}, - {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812, - 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844, - {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872}, - {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900, - {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928, - {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964}, - 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995, - 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020}, - 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060}, - 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086, - {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104}, - {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132}, - {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165, - 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210, - {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236, - {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272}, - {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322, - {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357, - 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404, - {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445, - {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473, - 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552}, - 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600, - {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655}, - 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673}, - {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692}, - {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720}, - {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796, - {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864, - {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923, - {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992, - {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056}, - 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201, - {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257}, - {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283}, - {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320, - 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384, - {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412, - {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481, - {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516, - 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593, - 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647, - 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728}, - 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772, - 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828, - {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856, - 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888, - {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929, - {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980}, - {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011, - 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048, - {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097, - {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168, - 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237, - 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308, - {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344, - {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412}, - 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444, - {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468}, - 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517, - {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571}, - {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608, - 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672, - {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752, - 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820}, - 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896, - {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937, - {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963, - 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008, - {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038, - {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064, - {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140}, - 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172, - 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204, - {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243, - {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280, - 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392}, - 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420, - 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520, - 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551, - {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609, - {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637, - {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672, - 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747, - 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777, - {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812, - 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853, - {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876, - 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924}, - 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971, - {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012, - 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057, - {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085, - {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120}, - 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148, - 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184, - {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487, - 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468, - 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747], - 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580, - 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904, - 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567, - 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393, - 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, - 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, - 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039, - {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083, - 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074, - 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611, - 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887, - 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445, - 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520, - 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067, - 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062], - 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625, - 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163, - 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, - 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937, - [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080, - 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435, - 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465, - 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039, - 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478, - 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857, - 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395, - 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926, - 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476, - 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911, - 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295, - 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996, - 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741, - 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825, - 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592], - 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329, - 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521, - [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328, - 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448, - 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733, - 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809, - 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009, - 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871, - 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676, - 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350, - 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171, - 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312, - [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943, - 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628, - 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127, - 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544, - 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407, - [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628, - 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, - 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240, - 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, - 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512, - 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789, - 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343, - 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840, - 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135, - 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935, - 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167, - 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834, - 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522, - 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190, - 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231, - 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859, - 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000, - 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215, - 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342, - 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062, - [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423, - 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064, - 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873], - [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684, - 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361, - [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126, - [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612, - [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998], - [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086, - 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170, - 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812, - 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203, - 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530, - 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680, - 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140, - 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503, - 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648, - 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691, - 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153, - 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117, - 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167, - 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788, - 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205, - 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643, - 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168, - 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929, - 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588, - 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758], - [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762], - [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097, - [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771], - [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774], - [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900, - 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261, - [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784], - [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690, - [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790], - [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864], - [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867], - [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791, - [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150, - [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851, - [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881], - [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019, - [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891, - [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894], - [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898], - [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916, - [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909], - 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278, - [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917], - 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921], - [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925], - 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791], - 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794], - [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798], - [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802], - [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805], - [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595, - [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903, - [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814], - [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817], - [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934], - [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938], - [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105, - [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267, - [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825], - [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946], - [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244, - [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954], - [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958], - 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962], - [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828], - [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832], - [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774, - [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432, - [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673, - [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328, - [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982], - [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986], - [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990], - 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705, - 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518, - 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, - 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, - 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, - 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579, - 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, - 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, - 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906, - 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236, - [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269, - 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528, - 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720}, - 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520, - [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408], - 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818, - 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218, - 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287, - 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045, - 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664, - 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862, - 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614, - 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, - [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758, - 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225, - 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420, - 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180, - 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856, - 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928, - [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187, - 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747, - 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918, - [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, - 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, - 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403, - 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271, - 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146, - 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624, - 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539, - 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887, - 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029, - 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, - 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, - 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, - 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264, - [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068, - 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472, - 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299, - 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613, - 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500, - 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807, - [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000, - 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385, - 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575, - 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452, - 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844, - 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138, - 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604], - {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875, - 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692, - 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338, - 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, - 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, - 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, - [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, - 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, - 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, - 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, - 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632, - 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948, - 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441, - 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978, - 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120, - 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248, - [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937, - 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850], - [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996, - 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360, - 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298, - 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736], - [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101, - 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808, - 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764, - 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337, - 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352, - 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373, - [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814, - 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615, - 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596, - 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237, - 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569, - 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703, - 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032, - 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902, - 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895, - 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435, - 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862, - 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234, - 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628, - 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159, - 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, - 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, - 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539, - {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460, - 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901, - 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529, - 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600, - 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899, - 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629, - [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, - 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, - [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, - 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997, - 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335, - 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996], - 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480, - 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251], - 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805, - 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145, - 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617, - [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105, - [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187, - 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569, - [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823, - 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, - 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, - 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, - 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, - 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, - 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825, - 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903, - 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965, - 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344, - [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044, - 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014, - 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578, - 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989, - 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349, - 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123, - 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310, - 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895, - 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893, - 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814, - 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121, - [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704, - 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787, - 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034, - 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454, - 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116, - 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, - 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595, - 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779, - 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314, - 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252, - 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113, - 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233, - 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352], - 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806, - 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002, - 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796, - 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953, - 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, - 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, - 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362, - 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491, - 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760, - 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398, - 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423, - 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550, - 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074, - 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435, - 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304, - 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219, - [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996, - 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806, - 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759, - 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188}, - 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586, - {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788, - 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400, - 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603, - [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103, - 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681, - 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093, - 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033, - 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885, - 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516, - 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347, - 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780], - [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180, - 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995, - 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106, - 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777, - [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001, - 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381, - 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383, - 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133, - 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039, - 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, - 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, - 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, - 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, - 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144, - 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, - [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685, - 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782, - 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213, - 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672, - 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048, - 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380, - 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042, - [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346, - 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637, - 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728, - [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399, - 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019, - 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118, - 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509, - 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450, - 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230, - 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254, - 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357, - 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478, - 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137, - 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532, - 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988, - [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, - 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, - 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199, - 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, - 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165], - 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469, - 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066, - 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038, - 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610, - 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666, - 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044, - 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659, - 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737, - 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, - 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, - 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, - 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, - 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088, - 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757, - 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584, - 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767, - 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941, - 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206, - 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587, - [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489, - 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, - 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878, - 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919, - 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974, - 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158, - 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013, - 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851], - 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513, - 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274, - 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980, - 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081, - 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389, - 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364, - 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029, - 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368, - 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, - 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, - 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, - 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, - 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558, - 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, - 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245, - 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259, - 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534, - 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880, - 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894, - 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861, - 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985, - 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600, - 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798, - 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068, - 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, - 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, - 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, - 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, - [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, - 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756, - 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, - 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, - 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, - 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187, - 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067, - 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526, - 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580, - 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171, - 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, - 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, - 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, - 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, - 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726, - 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429, - 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255], - 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, - 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, - 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, - 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071, - 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133, - [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451, - 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697, - 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130, - [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848], - 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979, - 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032, - 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680, - 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289}, - 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323, - 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532, - 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239, - 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565, - 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809, - 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184, - 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141, - 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010, - 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203, - [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843, - [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335, - 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880], - [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433, - 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418, - 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610, - 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935, - 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778, - 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009, - 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786, - 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382, - 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239, - 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700, - 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270, - 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457, - 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339, - 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, - 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748], - 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, - {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, - 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238, - 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, - 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, - 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, - 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402, - 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869, - 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347, - [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585, - 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658, - 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958, - 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007, - 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288, - 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, - 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690, - 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314}, - {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759, - {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61}, - {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0, - 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771, - 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045, - 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711, - {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102}, - {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787, - 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649, - 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716, - {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3}, - 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327}, - {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0, - 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144}, - {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673, - 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944, - {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540, - 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056, - {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078, - {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097}, - 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121}, - {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153, - {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173}, - {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203, - {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222}, - {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237}, - 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267, - {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286}, - {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306}, - {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330}, - {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349}, - 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373}, - {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398}, - {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419}, - {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446}, - {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485}, - {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509}, - {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541}, - {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565}, - {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612, - {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631}, - 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650}, - {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670}, - {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737}, - {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762}, - {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782}, - {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809}, - {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851, - {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874}, - {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922}, - {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946}, - {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989}, - {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013}, - {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045}, - {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069}, - {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097}, - {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144, - {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185}, - {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213}, - {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241}, - {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266}, - {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286}, - 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342}, - {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366, - {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385}, - {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405}, - {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441, - {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461}, - {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517}, - {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536}, - {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564, - {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581}, - 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621}, - {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665}, - {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702}, - {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723}, - 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745}, - {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777, - {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799, - {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820}, - {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842, - {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917, - {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935, - {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954, - {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973}, - {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022}, - {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042, - 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053}, - {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105}, - {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124}, - {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169}, - 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209}, - {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249}, - {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273}, - {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294}, - {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320, - {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361}, - {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386}, - {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406}, - {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430, - {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505, - {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526}, - {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546}, - {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613}, - {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645}, - {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750}, - {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770}, - {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841}, - {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893}, - {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917}, - {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945}, - {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966}, - {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990, - {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009}, - 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048, - {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093}, - 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117}, - {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142}, - {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162}, - {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188}, - {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216, - {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246}, - {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289}, - 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313}, - {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338}, - {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358}, - {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422}, - {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440, - {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457}, - 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481}, - {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503}, - {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552, - {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580, - {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593}, - {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618}, - {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677}, - 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702}, - {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722}, - {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750, - {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793, - {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813}, - {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873}, - {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897}, - {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927, - {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950, - {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970, - {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013}, - {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045}, - {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069}, - {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122}, - {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144, - {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168, - {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181}, - {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202}, - {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262}, - {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283}, - {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306, - {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325}, - 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345}, - {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392, - {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421}, - {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461}, - {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489}, - {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532, - {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549}, - {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601}, - {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629}, - {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646}, - {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670, - {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717, - {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738}, - {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758}, - {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782, - {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850}, - {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870}, - {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922, - {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969}, - {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073}, - {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109}, - {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213}, - {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249}, - {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305}, - 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335}, - 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354}, - {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374}, - {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400, - {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417}, - {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445, - {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466}, - {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486}, - {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510, - {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529}, - {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566, - 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578}, - {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605}, - {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625}, - {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650, - {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669}, - 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693}, - {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717}, - {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753}, - {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777}, - {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802}, - {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822}, - {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848, - {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893}, - 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917}, - {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942}, - {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962}, - {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033, - {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053}, - {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138}, - {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154}, - {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185}, - {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225}, - {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278}, - {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298}, - {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361}, - {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421}, - 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445}, - {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474}, - {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494}, - {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527, - {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546, - {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565}, - {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585}, - {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614}, - 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642}, - {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671, - {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690}, - {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714, - {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735, - {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754}, - {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774}, - {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800, - {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817}, - 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841}, - {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866}, - {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886}, - {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910}, - {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929}, - {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953}, - {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978}, - {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000}, - {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024, - {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049}, - {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071}, - 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097, - {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118}, - {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138}, - {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161}, - {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181}, - {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220, - {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237}, - 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261}, - {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285}, - {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332, - {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360, - {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397}, - {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418}, - {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454}, - {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474}, - {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538}, - {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556}, - {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581}, - {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612, - {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657, - {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678}, - 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698}, - {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722, - {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754}, - {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806, - {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845}, - {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909}, - 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937}, - {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985}, - {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034}, - {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058}, - {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125}, - {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200, - {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245}, - {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271, - {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294}, - {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314}, - {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337}, - {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385}, - 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409}, - {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433}, - {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465}, - {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497}, - 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521}, - {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577}, - {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601}, - {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637}, - 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677}, - {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717}, - {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741}, - {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762}, - {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788, - {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834}, - 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857}, - {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882}, - {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902}, - {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969}, - {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994}, - {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014}, - {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038, - {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081}, - {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106}, - {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126}, - {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169}, - {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225}, - 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249}, - {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294}, - {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320, - {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337}, - {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365}, - {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417}, - {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442}, - {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462}, - {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486, - {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554}, - {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574}, - {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600, - {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629}, - {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669}, - {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693}, - {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753}, - 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806}, - {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826}, - {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890}, - {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910}, - {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933}, - {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953, - {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973}, - {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002}, - {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031, - {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050}, - {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065}, - 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142}, - {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162}, - {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188, - {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205}, - {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233}, - 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257}, - {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281}, - {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365}, - {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384}, - {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412, - {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477}, - {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496}, - {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521}, - 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537}, - {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590}, - {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610}, - {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630}, - 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649}, - {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673}, - {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737, - {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758}, - {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778}, - {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802, - {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821}, - {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849}, - {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866}, - {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888, - {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916, - {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933}, - 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957}, - {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982}, - {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997}, - 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013}, - {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038}, - {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066}, - {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086}, - {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109}, - 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138, - 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149}, - {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170}, - {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196, - {f: 6, c: 55198}], - 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294, - 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106, - 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288}, - {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308}, - {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298}, - {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300}, - {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113}, - {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283, - 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733, - 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0, - {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119}, - 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806}, - 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869, - 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793, - 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0, - 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451, - 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217, - {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835], - [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044], - [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609, - 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492, - 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698}, - 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544}, - {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313}, - {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, - {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153], - [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158], - [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163], - [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168], - [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173], - [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178], - [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008], - [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185], - [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188], - [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191], - [12057, 21353, 63192], [12059, 21430, 63193], - [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195], - [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198], - [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201], - [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204], - [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216}, - 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102, - [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837], - [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147], - [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977, - 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062, - 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475], - [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823], - [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544], - [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029, - [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062], - [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165, - 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, - 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173, - {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844, - 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305, - 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825, - 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187, - 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142], - [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007], - [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352], - [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490], - [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611], - [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226], - [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273], - [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992, - 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180}, - {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908, - {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271, - 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487, - 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483, - 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234, - 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039, - 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098, - {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412, - {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712, - 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916], - [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993, - [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333], - [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683], - [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166], - [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073, - 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237, - {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225, - 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015, - {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280, - {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508, - 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237, - 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809}, - {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913, - {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673, - 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102, - {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088, - {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421, - 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728, - 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334, - [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566], - [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780], - [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905], - {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267], - [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311], - [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880], - [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303, - 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285, - 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, - 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, - {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163, - {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566, - 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545, - 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568, - 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353, - 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846, - 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931, - 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596, - {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043, - 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439, - 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106, - 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212, - 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233, - 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460, - 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599, - 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770, - 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774, - 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796}, - 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995, - {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995, - 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426, - 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328], - [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997], - [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523], - [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804, - 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193], - [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006, - 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365, - 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360, - 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821, - 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050, - 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329, - 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624, - 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617, - 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403, - 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857, - {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993, - 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981, - 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578, - 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731, - 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220, - {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447, - 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, - 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, - 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, - 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276, - [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304, - {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106, - 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122, - 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487, - 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485, - 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667, - 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837}, - 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822, - 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887, - 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228}, - 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609, - 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402, - 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354, - 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933, - 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278, - 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452, - 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021, - 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319, - [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464, - 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738, - [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448, - 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398, - 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881, - 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193, - 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672, - 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697, - 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271, - 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865, - 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013, - 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458, - 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093, - 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456, - 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613, - 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684, - 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345, - 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361, - 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151, - 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580, - 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548, - 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589, - 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915, - 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963, - {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950, - 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856, - 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623, - 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028, - 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328, - {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473, - 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046, - 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359, - 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004, - 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997, - 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989, - 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509, - 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502, - 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923, - 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276, - 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836, - 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480, - {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859], - [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080], - [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056, - 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375], - 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, - 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, - 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934, - 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407, - 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766, - 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799, - 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537, - 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059, - 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472, - 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637, - 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796, - 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464, - 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735, - 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343, - 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424, - 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009, - 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177, - 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681, - 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704, - 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529, - 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040, - 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994, - 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888, - 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432, - 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045, - 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140, - 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505, - {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775, - 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062, - 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206, - 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023, - 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013, - 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792, - 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005, - 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261, - 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618, - 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593, - 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451, - 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941, - 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350, - 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524, - 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852, - 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197, - 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497, - 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340], - [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730], - [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556, - 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559, - 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209, - 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364, - 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846, - 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811, - 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496, - 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105, - 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408, - 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648, - {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849, - 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119, - {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425, - 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739, - 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757, - 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775, - {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463, - 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512, - 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449, - 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944, - 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205, - 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799, - 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755, - 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754, - 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082, - 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113, - 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085, - 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074, - 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309, - 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699, - 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986, - {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154, - 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, - 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, - 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, - 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, - 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, - 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, - 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, - 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, - {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, - 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, - 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, - 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, - 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, - 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, - 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207, - 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517, - 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633, - 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165], - [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642, - 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, - 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883, - 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, - 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, - 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, - 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880, - [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506, - 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879, - 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260, - 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800, - 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846, - 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536, - 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558, - {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950, - 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786], - 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397, - 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855, - 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825, - 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631, - {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263, - 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270, - 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901], - 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255, - {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260, - 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730, - 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736, - {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, - 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813, - 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, - 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, - 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043, - 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724}, - 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, - 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, - 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802, - 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756, - 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532, - 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424, - 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386, - 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027, - 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302, - 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604, - 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129, - 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389, - 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286, - 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593, - 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917}, - 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341, - [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661, - {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119, - 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992, - 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978, - 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609, - 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, - 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, - 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, - 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, - 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, - {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, - 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032, - 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028, - 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, - 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, - 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, - 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, - 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, - 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, - 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, - 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072, - 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, - {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, - 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860, - 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, - 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680, - 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, - 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854, - 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, - {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, - 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, - 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, - 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033, - 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, - {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, - 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, - 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037, - 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, - 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, - 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, - 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, - 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, - 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603, - {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774, - {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156, - {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718], - [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903], - 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123, - 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022, - 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296, - 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781, - 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254, - 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522, - 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151, - 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907, - 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688, - 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723, - 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029, - 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088, - 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467, - 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418, - 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459, - 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081, - 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796, - 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217, - 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887, - 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401, - 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631, - [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156, - {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, - 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736}, - 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, - 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, - 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, - 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, - 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, - 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, - 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, - 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629, - 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, - 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548, - 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, - 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604, - 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171, - 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745}, - 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736, - 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956, - {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066, - 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063}, - 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305, - 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531, - {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287, - 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942, - 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003, - 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721, - 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769, - 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973, - {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137, - 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117, - 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497, - 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528, - 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105, - 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824, - 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394, - 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922, - 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291, - 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648, - 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232, - 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631, - 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109, - 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028, - 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664, - 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090}, - 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506, - 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916, - 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076}, - {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368, - 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635, - 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968, - 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251, - 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575, - 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797, - 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192, - 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607, - {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195, - 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752, - 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, - 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, - 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, - 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, - 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799, - 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, - 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, - 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, - 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, - 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138, - 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852, - 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266, - 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951, - 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689, - 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264, - 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690, - {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288, - {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121, - 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114, - 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563, - 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565, - 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404, - 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981, - 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624, - 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665, - 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673, - 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960, - 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195, - 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720, - 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660, - [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158, - 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, - 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, - 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, - 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, - {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, - 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, - 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641, - 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157, - 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, - 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, - 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, - 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, - 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, - 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, - 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883, - 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, - 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, - 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758, - 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133, - 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600, - 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425, - 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989, - 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762, - 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744, - 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684, - 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, - 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667, - 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, - 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332, - 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487, - 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687, - {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294, - 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150, - {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774, - 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345, - 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217, - 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784, - 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441, - 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995, - 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806, - 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626, - 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989, - 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333, - 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933, - 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181, - 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078, - 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699, - 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346, - 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663, - 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808, - 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696, - 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821, - 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672, - 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466, - 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002}, - 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846, - 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698, - 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241, - 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306, - 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196, - 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880, - 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563, - 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820, - 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768, - 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314, - {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679, - 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912, - 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472, - 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803, - 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084, - 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748, - 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700, - 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261, - 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306, - 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712}, - 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486, - 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605, - 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217, - 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760, - 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893, - 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705, - 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019, - 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403, - 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899, - 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406, - 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984, - 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635}, - 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900, - 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914, - 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724, - 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441}, - {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, - 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, - 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, - 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924, - 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060, - [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109, - [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014, - 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787, - 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668], - [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186, - 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428, - 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168, - 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160], - 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215, - 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913, - 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239, - 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903, - 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031, - [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180, - 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911, - 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419, - 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723}, - 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593], - [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198], - 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435, - 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319, - 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022, - 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552, - 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583, - 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348, - 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926, - 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693, - 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032, - 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440, - 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548, - 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228, - {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224, - 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437, - 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600, - {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759, - 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749, - 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377, - 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009, - {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924, - 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411}, - [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024, - 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352, - 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378, - 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373, - 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041, - 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649, - 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645, - 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383, - 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395, - {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991, - 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973, - 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623, - 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725, - 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084, - 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549, - 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602, - 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585, - 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290, - 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043, - 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117, - 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486, - 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513, - 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518, - 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821, - 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858, - 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847, - 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806, - 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400, - 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613, - 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014, - 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713, - 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861, - 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440, - 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438, - 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442, - 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822, - 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460, - 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436, - 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416, - 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398, - 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687, - 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694, - 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429, - 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797, - 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036, - 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038, - 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771, - 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752, - 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240, - 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631, - 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652, - 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154}, - 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356, - 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921, - 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146, - 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561, - 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565, - 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595, - 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572, - 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432, - 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956, - 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929, - 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907, - 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855, - 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249, - {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419, - 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625, - 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624, - 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404, - 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695}, - 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723, - 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190, - 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864}, - {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775, - {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962, - 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983, - 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512, - 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525, - 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517, - 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283, - 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055, - 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484, - 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, - 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503, - 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, - 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074, - {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, - 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, - 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771, - {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, - 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, - 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404, - 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, - 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, - 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, - 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, - 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572, - 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, - 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, - 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193, - {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699, - 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692, - 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661, - 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622, - 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022, - 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143, - 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999, - 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035, - 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569, - 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890, - 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438, - 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671, - 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655}, - 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128, - 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493, - 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498, - 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753, - 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058, - 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197, - 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492, - 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889, - 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024, - 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608, - 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825, - 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317, - 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574, - 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558, - 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566, - 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445, - 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457, - 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883}, - 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942, - 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216, - 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859, - 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093, - 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346, - 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095, - 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552, - 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587, - {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099, - 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820, - 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842, - 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824, - 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528, - 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499, - 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540, - 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125, - [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148, - 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182, - 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106, - 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834, - 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843, - 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374, - 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762, - {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759, - 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469, - 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488, - 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503, - 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209, - 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, - {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, - 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, - 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, - 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535, - {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, - 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, - 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144, - 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, - 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, - 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, - 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447, - 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, - 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, - 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155}, - 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513}, - 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, - 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075, - 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376, - 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, - 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, - 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, - 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661, - {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711, - 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, - 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, - 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, - 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, - 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, - 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, - 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, - 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499, - {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, - 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, - 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, - 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284, - 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, - {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, - 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206, - 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348, - 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524, - 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635, - 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584, - 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415, - 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903, - 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909, - 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568, - 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585, - 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202, - 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172, - 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183, - 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564, - 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886, - 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881, - 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673], - 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852, - 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769, - 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521, - 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568, - 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540, - 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561, - 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013}, - 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218, - 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865, - 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849, - 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872, - 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824, - {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917, - 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581, - 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233, - 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275, - 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264, - 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208, - 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262, - {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963, - 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274, - {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489, - 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740, - 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725, - 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177, - 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534}, - 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816, - {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824, - 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244, - 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566, - 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099, - 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084, - 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674, - {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091, - 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, - {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595, - [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, - 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, - 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801, - [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735, - 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751, - 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522, - 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888, - 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004, - 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293, - {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415}, - {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969, - 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312, - 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311, - 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597, - {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916, - 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115, - 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216, - 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394, - 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399, - 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536}, - 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766, - 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669, - 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, - 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, - {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981, - [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973, - 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632, - 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629, - 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224, - 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242, - 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603, - 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906, - 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267, - 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886, - 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123, - 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636, - 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612, - 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637, - 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067, - 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400, - 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937, - 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941, - 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968, - 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930, - 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457, - 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360, - 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370, - 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338, - 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321, - 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010, - 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025, - 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005, - 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499, - 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783, - 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951, - 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199, - 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197, - 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554, - 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863, - 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870, - 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255, - 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590, - 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585, - 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141, - 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132, - 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679, - {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122, - 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353, - 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935, - 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882, - 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914, - 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837, - 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851, - 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902, - 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552, - 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021}, - 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300, - 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391, - 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915, - 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044, - {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243}, - 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323, - 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613, - {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925, - 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230}, - 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422, - 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473, - 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462, - 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606, - 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927, - {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, - 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692, - 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, - 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420, - 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, - 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, - 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, - 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, - 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, - 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, - 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, - 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270, - 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, - 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960, - 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, - 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714}, - 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, - 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, - 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, - 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, - 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, - 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, - 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550}, - {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, - 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434, - 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, - 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, - 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, - 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, - 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, - 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230, - 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, - 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, - 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, - {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, - 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470, - 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, - 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, - 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, - 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166, - 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804, - 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, - 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, - 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, - 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327], - 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, - 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, - 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, - 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616, - 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070, - 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, - 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, - 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351, - 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, - {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, - 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, - 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, - 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, - 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, - 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, - 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, - {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, - 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742}, - {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739, - 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733, - 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081, - 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078, - 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703, - 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299, - 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959, - 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966, - 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498, - 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007, - 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710, - 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740, - 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979, - {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136, - 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116, - 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111, - 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160, - 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555, - 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551, - 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566, - 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563, - 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521, - 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104, - 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098, - 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533, - 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825, - 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245, - 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364}, - 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929, - 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132, - 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691, - 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948, - 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230, - 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749, - 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182, - 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358, - 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079, - 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090, - 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070, - 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086, - {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073, - 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644, - 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638, - 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683, - 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083, - {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235, - 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540}, - 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545, - 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071, - 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373, - 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371, - 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643, - {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163, - {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258, - {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593, - 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, - 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, - 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268, - 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, - 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, - 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, - {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374, - 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659, - 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798, - 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183, - 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659, - {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473, - 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135, - 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726, - 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539], - 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984, - 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166, - 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989, - 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016, - 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819, - 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304, - {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238, - 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217, - 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220, - 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206, - 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651, - 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612, - 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586, - 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592, - 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130, - 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146}, - {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546, - 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, - 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, - 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615, - 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957, - {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, - 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, - 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, - {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275, - 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, - 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809, - 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, - 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125, - 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, - 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, - 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, - 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, - 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716, - 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106, - 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570, - {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553, - 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081, - 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416, - 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329], - 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998, - 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263, - 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659, - 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626, - 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685, - 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332, - 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612, - 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959, - 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396, - 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670, - 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803, - 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215, - 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223, - 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722, - 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163, - {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742, - 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334, - 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027, - 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833, - 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277, - 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283, - 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269, - 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643, - 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153, - 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847, - 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968}, - 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635, - 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978, - {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144, - 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749, - 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746, - 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760, - 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329, - 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581, - 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226, - 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191, - 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167, - 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189, - 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200, - 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745, - 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756, - 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123, - 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246, - {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599, - 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919, - 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429, - 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274, - 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807, - 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712}, - 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711, - 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343, - 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687, - 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868, - 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211}, - 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329, - 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421}, - 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848, - 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855, - 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261, - {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585, - 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788, - [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173, - 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048, - 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855, - 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330}, - 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335, - 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677, - 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682, - [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, - 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, - 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988, - {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772, - 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781, - 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352, - 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233}, - 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, - 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, - 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, - 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, - 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147, - 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635, - 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622, - 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992, - 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438, - 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, - {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285, - 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, - 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760, - 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354}, - 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, - 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, - 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226, - 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430, - 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755, - 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876, - 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278, - 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671, - 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780, - 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189, - {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802, - {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865, - 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345, - 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488, - 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713, - 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349}, - 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, - {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, - 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978, - 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, - 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237, - 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280, - 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257, - 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806}, - 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170, - {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255, - 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659, - 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994, - {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467, - 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788, - 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840, - 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859, - 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362}, - 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838, - {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102, - 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460, - 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691, - 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910, - 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905, - 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326, - {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325, - 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593, - 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303, - 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302}, - {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344, - {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377, - {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, - 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203}, - 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, - {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012, - 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815, - 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243, - 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294, - 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835, - 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, - 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694}, - 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298}, - 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, - 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, - 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894, - 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909}, - 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257, - 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465, - 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947, - 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959, - 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347, - 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350, - 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677, - 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793, - 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367, - 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392, - {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210, - 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827, - 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699, - 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343, - 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848, - 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705, - 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702, - 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929, - 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372, - 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256, - 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629, - 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980, - 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391, - 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377}, - 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604, - 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804, - 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017, - 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661, - {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909, - 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836, - 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387, - {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858, - 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717, - 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704, - 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957, - {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259, - 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504, - 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004, - 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411, - 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409, - 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754, - 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373, - 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347, - {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571, - 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364, - 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187, - 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707, - 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510, - 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021, - 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420, - 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436, - 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760, - 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221, - 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768, - 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649, - 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732}, - {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992}, - 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, - 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, - 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774, - {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418, - 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410, - 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193}, - 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997, - 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, - 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, - 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, - 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049, - 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, - 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027}, - 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776, - 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528, - 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, - {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0, - 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210], - [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216], - [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339], - [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224], - [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228], - [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232], - [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236], - [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240], - [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244], - [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248], - [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252], - [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256], - [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260], - [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264], - [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268], - [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272], - [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276], - [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280], - [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284], - [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288], - [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292], - [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296], - [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300], - [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304], - [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308], - [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312], - [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316], - [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320], - [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324], - [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328], - [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332], - [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336], - [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340], - [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344], - [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348], - [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352], - [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356], - [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360], - [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364], - [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368], - [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372], - [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376], - [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380], - [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384], - [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388], - [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392], - [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397], - [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402], - [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407], - [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412], - [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417], - [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422], - [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427], - [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432], - [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437], - [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442], - [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447], - [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452], - [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457], - [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461], - [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465], - [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287], - {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287], - [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849, - [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568, - 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563, - 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619, - {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132], - [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137], - [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141], - [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145], - [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813], - [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153], - [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157], - [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878], - [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548], - [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0, - [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177], - [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634], - [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186], - [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192], - [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446], - [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214, - [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206], - [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0, - [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216], - [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220], - [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224], - [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801], - [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666], - [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0, - [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243], - [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247], - [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251], - [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255], - [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824], - [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310], - [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268], - [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273], - [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927], - [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282], - [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286], - [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140], - [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294], - [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139], - [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302], - [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306], - [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444], - [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298], - [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321], - [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0, - [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0, - [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336], - [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340], - [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345], - [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413], - [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353], - [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357], - [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361], - [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366], - [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990], - [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374], - [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873], - [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382], - [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551], - [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437], - [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399], - [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393], - [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616], - [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624], - [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417], - [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421], - [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425], - [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429], - [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261], - [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437], - [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443], - [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447], - [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451], - [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455], - [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459], - [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0, - [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468], - [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475], - [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494], - [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483], - [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0, - [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493], - [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497], - [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598], - [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449], - [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891], - [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515], - [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911], - [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523], - [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527], - [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990], - [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536], - [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541, - [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545], - [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688], - [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493], - [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557], - [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249], - [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405], - [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570], - [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548], - [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578], - [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684], - [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587], - [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591], - [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595], - [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804], - [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603], - [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915], - [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611], - [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615], - [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619], - [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381], - [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627], - [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631], - [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635], - [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640], - [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315], - [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649], - [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434], - [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511], - [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661], - [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531], - [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724], - [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675], - [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324], - [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683], - [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687], - [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138], - [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696], - [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700], - [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705], - [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947], - [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097], - [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717], - [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721], - [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725], - [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729], - [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595], - [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737], - [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349], - [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955], - [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425], - [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753], - [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134], - [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762], - [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924], - [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134], - [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774], - [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506], - [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681], - [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786], - [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135], - [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795], - [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534], - [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804], - [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043], - [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812], - [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701], - [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820], - [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030], - [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828], - [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832], - [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001], - [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081], - [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848], - [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852], - [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856], - [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861], - [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396], - [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870], - [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874], - [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878], - [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909], - [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886], - [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891], - [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470], - [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899], - [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904], - [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117], - [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912], - [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115], - [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920], - [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924], - [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928], - [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158], - [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476], - [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958], - [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682], - [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948], - [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019], - [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957], - [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961], - [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603], - [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827], - [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491], - [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977], - [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114], - [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985], - [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987], - [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994], - [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502], - [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002], - [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006], - [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964], - [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923], - [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258], - [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746], - [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027], - [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731], - [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035], - [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340], - [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043], - [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049], - [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054], - [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490], - [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062], - [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586], - [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603], - [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074], - [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080], - [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084], - [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088], - [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085], - [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285], - [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100], - [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783], - [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239], - [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112], - [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116], - [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120], - [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124], - [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070], - [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133], - [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957], - [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141], - [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097], - [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149], - [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281], - [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157], - [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161], - [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961], - [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169], - [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315], - [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194], - [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934], - [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476], - [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070], - [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195], - [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199], - [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203], - [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566], - [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211], - [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302], - [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219], - [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223], - [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257], - [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266], - [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235], - [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690], - [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164], - [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150], - [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252], - [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257], - [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262], - [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266], - [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274], - [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274], - [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278], - [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377], - [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004], - [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290], - [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294], - [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219], - [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901], - [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306], - [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310], - [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314], - [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318], - [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322], - [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326], - [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331], - [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335], - [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339], - [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343], - [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348], - [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475], - [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941], - [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360], - [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220], - [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082], - [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372], - [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376], - [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380], - [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112], - [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0, - [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703], - [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397], - [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0, - [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853], - [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410], - [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736], - [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469], - [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422], - [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0, - [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757], - [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435], - [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312], - [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443], - [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944], - [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872], - [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455], - [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459], - [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463], - [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565], - [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471], - [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475], - [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275], - [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250], - [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487], - [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491], - [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748], - [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982], - [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504], - [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508], - [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925], - [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516], - [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520], - [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525], - [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529], - [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533], - [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784], - [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542], - [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616], - [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550], - [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554], - [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374], - [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505], - [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945], - [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570], - [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375], - [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578], - [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164], - [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228], - [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590], - [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594], - [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422], - [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602], - [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399], - [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328], - [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614], - [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618], - [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933], - [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900], - [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630], - [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314], - [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638], - [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642], - [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376], - [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650], - [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654], - [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658], - [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662], - [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666], - [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670], - [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674], - [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322], - [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221], - [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613], - [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366], - [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069], - [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698], - [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0, - [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848], - [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712], - [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477], - [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020], - [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724], - [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115], - [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571], - [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369], - [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686], - [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054], - [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749], - [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757], - [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334], - [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797], - [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832], - [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853], - [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898], - [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920], - [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984], - [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038], - [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075], - [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102], - [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132], - [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143], - [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166], - [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194], - [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201], - [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0, - [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233], - [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418], - [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515], - [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625], - [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687], - [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266], - [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274], - [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283], - [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290], - [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299], - [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0, - [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834], - [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327], - [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006], - [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341], - [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0, - [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352], - [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0, - [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369], - [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105], - [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384], - [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390], - [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642], - [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904], - [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979], - [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248], - [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181], - [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714], - [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133], - [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438], - [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446], - [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451], - [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455], - [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133], - [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960], - [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470], - [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474], - [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478], - [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496], - [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0, - [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546], - [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554], - [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876], - [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248], - [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0, - [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416], - [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595], - [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604], - [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608], - [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612], - [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616], - [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620], - [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624], - [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578], - [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632], - [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294], - [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818], - [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646], - [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650], - [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654], - [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027], - [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662], - [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666], - [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670], - [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675], - [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683], - [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697], - [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704], - [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0, - [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719], - [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726], - [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739, - [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744], - [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752], - [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761], - [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765], - [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769], - [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773], - [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777], - [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0, - [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788], - [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797], - [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802], - [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807], - [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023], - [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818], - [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822], - [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826], - [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831], - [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982, - [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842], - [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847], - [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851], - [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855], - [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859], - [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863], - [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867], - [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871], - [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876], - 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882], - [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886], - [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894], - [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898], - [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0, - [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908], - [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913], - [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919], - [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923], - [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927], - [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933], - 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938], - 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943], - [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947], - [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952], - [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957], - [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961], - [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966], - [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203], - [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975, - [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981, - [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985], - [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0, - [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994], - [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998], - [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003], - [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008], - [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013], - [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018], - [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025], - [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030, - [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035], - [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039], - [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043], - [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047], - [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051], - [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056], - [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060], - [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064], - [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0, - [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074], - [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078], - [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0, - [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345], - [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349], - [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826], - [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357], - [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361], - [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643], - [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369], - [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193], - [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968], - [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383], - [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387], - [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391], - [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516], - [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923], - [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531], - [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407], - [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411], - [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417], - [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421], - [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425], - [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429], - [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433], - [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438], - [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0, - [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447], - [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451], - [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455], - [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598], - [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555], - [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468], - [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472], - [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476], - [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480], - [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263], - [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488], - [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516], - [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496], - [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477], - [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504], - [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0, - [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533], - [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517], - [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522], - [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526], - [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758], - [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877], - [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538], - [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542], - [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0, - [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551], - [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555], - [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559], - [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563], - [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568], - [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018], - [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138], - [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917], - [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584], - [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589], - [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628], - [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598], - [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602], - [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588], - [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517], - [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615], - [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619], - [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623], - [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627], - [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631], - [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635], - [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337], - [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643], - [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355], - [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073], - [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659], - [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663], - [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667], - [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240], - [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678], - [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682], - [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992], - [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441], - [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695], - [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699], - [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903], - [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709], - [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442], - [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718], - [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722], - [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726], - [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730], - [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734], - [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738], - [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742], - [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0, - [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753], - [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757], - [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761], - [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824], - [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771, - [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775], - [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780], - [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783], - [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364], - [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559], - [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049], - [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803], - [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807], - [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811], - [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495], - [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819], - [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823], - [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828], - [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832], - [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836], - [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562], - [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844], - [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848], - [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852], - [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0, - [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266], - [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865], - [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869], - [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873], - [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760], - [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450], - [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885], - [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211], - [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893], - [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897], - [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0, - [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908], - [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912], - [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916], - [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920], - [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924], - [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780], - [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513], - [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936], - [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125], - [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945], - [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949], - [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087], - [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0, - [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161], - [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050], - [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971], - [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975], - [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979], - [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983], - [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987], - [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539], - [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996], - [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202], - [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938], - [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008], - [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012], - [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016], - [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602], - [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026], - [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031], - [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807], - [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915], - [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043], - [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048], - [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052], - [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056], - [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060], - [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064], - [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069], - [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966], - [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077], - [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933], - [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085], - [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044], - [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897], - [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100], - [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056], - [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292], - [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114], - [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687], - [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122], - [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126], - [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210], - [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534], - [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968], - [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392], - [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194], - [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092], - [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0, - [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0, - [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564], - [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568], - [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263], - [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0, - [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0, - [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208], - [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0, - [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497], - [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936], - [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0, - [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325], - [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620], - [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624], - [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665], - [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635], - [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209], - [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645], - [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987], - [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778], - [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417], - [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122], - [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630], - [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489], - [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436], - [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0, - [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0, - [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0, - 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030], - [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042], - [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063], - [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924], - [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0, - [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818], - [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388], - [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863], - [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0, - [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963], - [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233], - [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051], - [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078], - [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148], - [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056], - {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520], - {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277], - {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274], - {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776}, - [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206], - [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785], - [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789], - [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793], - [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797], - [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801], - [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491], - [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033], - [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970], - [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818], - [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822], - [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826], - [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830], - [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207], - [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521], - [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525], - [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529], - [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534], - [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538], - [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543], - [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969], - [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375], - [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382], - [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387], - [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391], - [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395], - [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399], - [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403], - [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407], - [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411], - [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415], - [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419], - [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423], - [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427], - [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431], - [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435], - [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447], - [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453], - [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510], - [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461], - [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467], - [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471], - [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054], - [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480], - [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484], - [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490], - [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496], - [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501], - [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507], - [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511], - [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515], - [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519], - [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524], - [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155], - [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287], - [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611], - [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724], - [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662], - [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826], - [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503], - [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472], - [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950], - [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526], - [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958], - [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701], - [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830], - [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713], - [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906], - [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019], - [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237], - [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288], - [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777], - [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197], - [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743], - [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093], - [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094], - [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978], - [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759], - [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763], - [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767], - [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484], - [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775], - [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032], - [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039], - [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044], - [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048], - [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053], - [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059], - [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064], - [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070], - [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074], - [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078], - [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083], - [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087], - [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091], - [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096], - [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100], - [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104], - [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108], - [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112], - [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116], - [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120], - [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336], - [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128], - [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132], - [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136], - [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140], - [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144], - [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877], - [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134], - [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188], - [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480], - [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087], - [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385], - [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415], - [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564], - [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922], - [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611], - [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888], - [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010], - [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996], - [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254], - [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427], - [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746], - [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756], - [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761], - [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766], - [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166], - [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774], - [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779], - [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787], - [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794], - [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802], - [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806], - [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810], - [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815], - [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822], - [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827], - [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833], - [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837], - [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844], - [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850], - [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856], - [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864], - [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868], - [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873], - [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878], - [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882], - [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351], - [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891], - [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896], - [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901], - [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906], - [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911], - [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916], - [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921], - [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927], - [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931], - [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937], - [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942], - [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947], - [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951], - [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955], - [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959], - [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965], - [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970], - [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975], - [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979], - [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985], - [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992], - [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996], - [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001], - [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006], - [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010], - [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014], - [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018], - [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022], - [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028], - [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032], - [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036], - [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041], - [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047], - [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052], - [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059], - [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063], - [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069], - [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178], - [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079], - [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086], - [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090], - [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220], - [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311], - [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726], - [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826], - [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091], - [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227], - [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325], - [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578], - [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871], - [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100], - [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304], - [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471], - [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053], - [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155], - [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578], - [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352], - [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029], - [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183], - [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098], - [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715], - [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143], - [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600], - [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741], - [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411], - [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743], - [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231], - [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737], - [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374], - [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108], - [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037], - [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596], - [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646], - [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930], - [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859], - [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316], - [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674], - [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946], - [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436], - [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790], - [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202], - [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621], - [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205], - [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486], - [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740], - [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301], - [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849], - [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984], - [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271], - [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746], - [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230], - [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726], - [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172], - [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286], - [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392], - [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313], - [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766], - [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768], - [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691], - [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543], - [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464], - [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700], - [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809], - [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942], - [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080], - [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698], - [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600], - [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880], - [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254], - [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119], - [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438], - [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828], - [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752], - [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559], - [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727], - [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382], - [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389], - [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374], - [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191], - [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790], - [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100], - [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822], - [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685], - [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928], - [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275], - [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566], - [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088], - [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366], - [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196], - [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015], - [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106], - [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110], - [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520], - [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608], - [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703], - [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486], - [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021], - [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028], - [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779], - [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237], - [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242], - [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248], - [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253], - [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258], - [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263], - [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268], - [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273], - [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279], - [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553], - [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558], - [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530], - [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842, - [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848], - [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450], - 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295], - [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910, - [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871], - 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284, - [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464, - 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678], - 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203, - [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911], - [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237], - 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537, - 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255], - [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333, - 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951], - [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956}, - 23446, 62959, 32347], - 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168, - 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216}, - {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310}, - {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746, - 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, - 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757, - 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504}, - 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632, - 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352}, - {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544}, - {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353}, - {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, - {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081}, - {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284}, - {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075}, - {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225, - 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363, - 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609, - {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467, - 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, - 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, - 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, - 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, - [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365, - 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133, - 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256, - 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758, - 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502, - 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453, - 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329, - 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953, - 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454, - 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887, - 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, - 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, - 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631, - 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, - 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, - 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187, - 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850, - 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493, - 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572, - 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813, - 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133, - 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554, - 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815, - 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130, - 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607, - 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046, - 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, - 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561, - 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, - 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, - 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, - 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411], - 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167, - 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148, - 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788, - 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383, - 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149, - 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576, - 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425, - 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751, - 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929, - 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514, - 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574, - [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, - 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086, - 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826, - 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548, - 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783, - 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932, - 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532, - 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856, - 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583, - 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300, - 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025, - 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891, - 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, - [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602, - 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230, - 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817, - 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462, - 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333, - 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077, - 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780], - [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144, - 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070, - 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820, - 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938, - 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750], - 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153, - 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881, - 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792, - 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964, - 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133, - 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343, - 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104, - 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428], - [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, - 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178], - [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954, - 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464, - 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295, - 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106, - [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508, - 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775, - [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, - [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807, - 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629, - 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592], - [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916], - 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448, - 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809, - [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394, - 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053, - 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, - 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039, - 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421, - 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741, - 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917, - 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977, - 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657], - 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720, - 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399, - 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774, - 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252, - 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, - 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, - 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, - 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, - 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, - 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, - 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, - 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785, - 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, - 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521, - 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762, - 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015, - 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490, - 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551, - 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551, - 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546, - 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604, - 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099, - 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073, - 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, - 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, - 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, - 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478, - 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, - 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, - 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, - 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020], - [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827, - 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834, - 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, - 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, - 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, - [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087, - [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141, - 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298, - 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844, - 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899, - 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740, - 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888, - 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570, - 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130, - 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933, - 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838, - 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511, - 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239, - 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393, - 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103, - 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304, - 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420, - 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182, - 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597, - 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070, - 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226, - 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769, - 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792, - 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324], - 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782, - 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813, - [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830, - 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, - 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, - 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, - 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, - 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, - 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, - 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, - 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, - 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699, - 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383, - 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108, - 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649, - 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402, - 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814, - 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064, - 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434, - 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033, - 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426, - 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611], - [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040, - 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209, - 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804, - 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753, - 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588, - 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517, - [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937, - 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126, - 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169, - 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, - 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, - 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446], - 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435, - 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376, - 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958, - 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346, - 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479, - 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592, - 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445, - 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262, - 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572, - 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750, - 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928, - 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243, - 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060, - 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921, - 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447, - 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860, - 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687, - 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629, - 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179, - 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748, - 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970, - 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450, - 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827, - 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569, - 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668], - 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190, - 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, - 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424], - 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, - 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, - 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, - 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, - 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, - 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, - 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, - 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275, - 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820, - 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123, - 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469, - 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748, - 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993, - 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580, - [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, - [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, - 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, - 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234, - 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049, - 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441, - [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203, - 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978, - 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569, - 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198, - 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280, - [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978, - 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499, - 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287, - 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102, - 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351, - 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623, - 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, - 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797, - 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463, - 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298, - 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626, - 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463, - 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684, - 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, - [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, - 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, - 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, - 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, - 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, - 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, - 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, - 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, - 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488, - 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393, - 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899, - 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776, - 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486, - 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150, - 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884, - 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635, - [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522, - 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572, - 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, - 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, - 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, - [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581, - 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464, - 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964, - 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609, - 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451, - 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448, - 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829, - 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996, - 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890, - 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442, - [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, - 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, - 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436, - 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310, - 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, - 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, - 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796, - 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219, - 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283, - 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523, - 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335, - 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146, - 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262, - [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819, - 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813, - 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, - [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123, - 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856, - 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218, - 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449, - 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026, - [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016, - 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152, - 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464, - 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167, - 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873, - 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634, - [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033, - 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493, - 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597, - 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005, - 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839, - 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746, - 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495, - 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687, - 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671, - 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768, - 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994, - 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558, - 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202, - 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050, - [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673, - 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589, - 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764, - 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035, - 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521, - 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631, - 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, - 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, - 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001, - 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491, - 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402, - 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189, - 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431, - 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935, - 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507, - 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, - 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, - 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053, - 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248, - 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776, - 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874, - 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531, - 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131, - 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166, - 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643, - 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651, - 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360, - 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467, - 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260, - 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903, - 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825, - 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390, - 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529, - 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151, - 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930, - 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540, - 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535, - 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234, - 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405, - 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247, - [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090, - 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482, - 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065, - 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880, - 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776, - 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894, - 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331, - 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672, - 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371, - [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447, - 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199, - [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386, - 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590, - 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317, - 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162, - [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664, - 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720, - 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405, - 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294, - 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043, - {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121, - 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200, - 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263, - 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274, - 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, - 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, - 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, - 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, - 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, - 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, - [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804, - [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128], - 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819, - 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898, - 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767, - {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798, - {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822, - 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847, - 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864, - 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886}, - {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434, - 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503, - 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021, - 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071, - 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, - 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, - 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759, - 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981], - 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441, - 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329, - {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396, - 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479, - 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456, - 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528, - 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656, - 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412, - 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482, - 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441, - 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551, - 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562, - 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627}, - 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, - 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, - 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656, - {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705, - 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793, - 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848, - 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733, - 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907, - {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932, - 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994, - 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060, - 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044, - 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, - 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, - 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, - [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, - [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, - 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, - 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, - 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, - 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, - 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815, - 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337, - 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579, - {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634, - 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661, - 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618, - 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724, - {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757, - 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903, - 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846, - {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, - 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949}, - 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972, - 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964}, - 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, - 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, - 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139}, - 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251, - 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081, - 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692, - 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708, - 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748, - 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844, - 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919, - 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955, - 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469, - 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357, - 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416, - 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434}, - 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477, - 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566, - [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267, - {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309, - {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229, - 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296, - 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545, - 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614, - 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696}, - 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707, - 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794, - 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906, - 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377, - 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403}, - 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421}, - {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722, - 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782, - 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872, - 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943, - 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, - 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, - 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101, - 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, - 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294, - {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461, - 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303, - 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470, - 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530, - 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654, - 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766, - [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652, - 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837, - 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902, - 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932, - {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989, - 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611, - 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, - 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953}, - 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999, - 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049, - 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100, - 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218, - 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260, - 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397, - 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549, - {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574, - 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591, - 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446, - {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475, - {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525, - 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519}, - {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539, - 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565, - [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614, - 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640, - 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711, - 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722, - 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, - {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863, - 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533, - 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, - 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, - 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, - 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724, - 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697, - 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876, - {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896, - 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000, - 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035, - 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029, - 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204, - 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224, - 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521}, - 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562, - 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727, - {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747, - {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122, - 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969, - 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133, - 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207, - 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279, - 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150, - 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173, - 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343, - 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330, - 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637, - 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689, - 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232, - 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939, - 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973, - 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010, - 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096, - 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129, - {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373, - 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447, - 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129}, - [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, - 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, - 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, - 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, - 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, - 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160}, - 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063, - 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, - 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838, - 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895], - 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737, - 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757, - 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791, - 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898, - 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995, - 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468, - 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517, - 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591, - 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653, - 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, - 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, - 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028}, - {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051}, - 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068, - {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088}, - {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110}, - 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123, - {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143, - 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157}, - {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186}, - 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204, - {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220, - {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235, - {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255, - {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211, - 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655, - 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, - 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503, - {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518}, - {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542, - 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102, - 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128, - 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183, - 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218, - 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253, - 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300, - 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368, - 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930, - 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022, - 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097, - 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195, - [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790, - 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821, - 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, - 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070}, - {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414, - 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471, - 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490, - 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547, - 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552, - 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586, - 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594, - {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659, - 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696, - 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, - 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, - 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578, - {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509, - 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520, - 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564, - 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654}, - 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668, - 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742, - 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808, - 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325, - 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353, - 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039, - 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889, - 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943, - {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703, - 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992], - 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, - 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198}, - 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236, - 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290, - {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331, - 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310}, - 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343}, - 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396, - 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425, - {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463, - 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970, - 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301, - 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657, - 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835, - {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585], - {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694, - 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267, - 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090}, - {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109}, - {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138}, - {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780, - 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601, - 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618, - {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761, - 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663, - 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, - {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846, - 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677, - 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772, - 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631, - 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165, - 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970, - 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722, - 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173, - 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922, - 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652, - 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369, - 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396, - [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425, - 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490, - 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659, - 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880, - 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934, - 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153, - 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958, - 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336, - 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346, - 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136, - 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818, - 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684, - 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027, - 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219, - 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489, - 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123, - 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499, - 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865, - 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512, - [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707, - 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703, - 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441, - 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036, - 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554, - 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221, - 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352, - 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381, - 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572, - 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068, - [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559, - 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308, - 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542, - 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180, - 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169, - 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273, - 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982, - 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744, - 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346, - 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348, - 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736, - 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023, - 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486, - 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832, - 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904, - 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936, - 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580, - 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796, - 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311, - 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650, - 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854, - 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393, - 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415, - 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683, - 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313, - 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126, - 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886, - 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016, - 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442, - 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315, - 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229, - [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467, - 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958, - 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434, - 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898, - 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306, - 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054, - 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632, - 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493, - 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086, - 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854, - 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218, - 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360, - 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918, - 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359, - 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403, - 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010, - 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295, - 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307, - 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213, - 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178, - [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702, - 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198, - 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209, - 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676, - 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289, - 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129, - 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406, - 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137, - 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416, - 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232, - 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421, - 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178, - 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291, - 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427, - 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387, - 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111, - 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438, - 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486, - 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729, - 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142, - 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106, - 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042, - 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028, - 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081, - 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806, - 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025, - 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886, - 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225, - 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674, - 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310, - 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013, - 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132, - 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712, - 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131, - 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382, - 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445, - 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535, - 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585, - 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606, - 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734, - 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233, - 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610, - 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338, - 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366, - 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133, - 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167, - 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759, - 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072, - 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118, - 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195, - 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151, - 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937, - 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136, - 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195, - 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082, - 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887, - 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284, - 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333, - 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711, - 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150, - 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703, - 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285, - 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338, - 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498, - 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470, - 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002, - {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272, - 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190, - 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199, - 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225, - 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309, - 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367, - 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908, - 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783, - 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194, - 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384, - 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567, - 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706, - 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636, - 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326, - 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058, - 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247, - 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051, - 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112, - 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152, - 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824, - 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558, - 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351, - 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377, - 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437, - 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453, - 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891, - 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523, - 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906, - 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622, - {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696, - 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703, - 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767, - 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858, - {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879, - 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951, - 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327, - 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275, - 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329, - 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410, - 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311, - 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313, - 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392, - 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481, - 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024, - 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760, - 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691, - 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677, - 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489, - 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451, - 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799, - 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703, - 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056, - 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851, - 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882, - 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906, - 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945, - 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008, - 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857, - 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695, - 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725, - 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339, - 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637, - [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890, - 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590, - 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634, - 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211, - 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786, - {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619}, - {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317}, - {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252, - 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208, - 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445}, - {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128}, - 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991, - {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019, - 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053, - 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071}, - {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095}, - {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118}, - 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148, - {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178, - {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205}, - 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226}, - {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259, - {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281, - 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308, - 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333}, - {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357, - 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373, - {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395, - 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416}, - {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450, - {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468}, - 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490, - 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512, - {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543}, - {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560}, - {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582}, - {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609}, - {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631, - {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662, - {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675}, - {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690}, - {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713}, - {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737, - 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758}, - {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779}, - {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810, - 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829}, - {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858, - {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874}, - {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897, - 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920}, - {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944, - {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962}, - {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990, - {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007}, - {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025}, - {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044}, - 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070}, - {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087}, - {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107, - {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134}, - 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166}, - {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194, - {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212, - {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234}, - {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255, - {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275}, - {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287}, - {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304], - {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328, - {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356}, - 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379, - {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398}, - {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418}, - {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440, - {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466, - {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506, - 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538, - {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565, - 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580}, - 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609}, - 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637, - {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660, - {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685}, - {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720, - 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743}, - {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768, - {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788}, - 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810, - {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829, - {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844, - {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858}, - {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887, - {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906}, - {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920}, - {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944, - 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967}, - 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991, - {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015, - {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037, - {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056, - {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080, - {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106}, - {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131, - 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152}, - 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170}, - {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197, - {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214}, - 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229}, - {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254}, - {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272}, - 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297}, - {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315, - {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337, - {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354}, - {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382, - {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397}, - {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428}, - 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453}, - {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480}, - 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498}, - {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517}, - {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531}, - {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546}, - {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562}, - {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582}, - {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617}, - {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637}, - {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662}, - {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688}, - {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717, - {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740, - {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762, - 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775}, - {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789}, - {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798, - {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813}, - {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834}, - {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853}, - 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875}, - 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895}, - 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921, - {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936, - {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956}, - {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972}, - {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997}, - 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017}, - {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050}, - {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065}, - {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078}, - {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101}, - {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126}, - {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147}, - {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168}, - {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211}, - 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231}, - {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253, - {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268}, - {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282}, - {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306, - {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330}, - {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353}, - {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392}, - {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417, - {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437}, - {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468}, - {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491, - {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523, - 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552, - {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577, - 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597}, - {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622}, - {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642}, - 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666}, - {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689}, - {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709}, - {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734, - {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749}, - {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778}, - 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797, - {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812}, - {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832}, - {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850}, - {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880}, - {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900, - {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920}, - {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960, - {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976}, - 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014}, - 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042, - {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063}, - 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087, - {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114, - {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129, - {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153}, - {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183, - {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216, - 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238}, - 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267}, - {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292}, - 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315}, - {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342, - {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360, - {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379, - {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399, - 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421, - {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440, - 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467}, - 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491}, - {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510}, - {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531}, - {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549}, - {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562}, - {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583}, - {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602, - {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624}, - {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652, - {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662}, - {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686, - {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704}, - {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725, - {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743, - {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761}, - {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786}, - {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821, - {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839, - {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861}, - {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876}, - {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909, - {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921, - {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937, - {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952}, - {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981}, - {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005, - {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023}, - {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045}, - {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065}, - {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107, - 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131, - 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154, - {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173}, - {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192, - {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210}, - 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241, - {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257}, - {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278, - {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309}, - {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333, - {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354}, - {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372, - {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392}, - {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412, - {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440, - {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459}, - {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485, - 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510, - 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533, - 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553, - {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570, - {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591, - {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614, - {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631, - {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653, - {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673, - {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693, - {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712}, - {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737}, - 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760}, - {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795, - 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813}, - 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831}, - {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855, - {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866}, - {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886}, - {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916}, - {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933}, - 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951}, - {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974, - {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997}, - 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016, - {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040, - {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061, - {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081, - {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104}, - {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125, - {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142, - {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162}, - {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180}, - {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203}, - 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217}, - {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235}, - {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250}, - {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270}, - {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287}, - {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312, - {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334}, - {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349}, - 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369}, - {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390, - {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416, - {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430}, - 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450, - {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466}, - {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488}, - 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506, - {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527}, - 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548, - {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591, - 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602}, - {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630, - 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654}, - {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682}, - 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730, - {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759}, - {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782, - {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798, - {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826, - 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843}, - {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863, - {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877}, - {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899}, - {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929}, - {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944}, - {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968}, - {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983, - {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998, - {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018}, - {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037}, - 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061}, - {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087, - {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105}, - {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136, - {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156}, - {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179}, - 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195}, - {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212}, - {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235}, - {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261}, - {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279, - {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293}, - 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312}, - {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332}, - {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373}, - {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397}, - {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415}, - 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448, - {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464, - {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482}, - 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514, - {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540}, - 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554}, - {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574, - {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587}, - {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610, - {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632}, - 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648}, - {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685, - 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710}, - {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734, - {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755}, - 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775}, - 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793}, - {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820, - {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840}, - {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857}, - {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881, - {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906}, - {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919}, - {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942, - {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956, - {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980, - 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001}, - {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016}, - {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035}, - 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054}, - 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083}, - {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104}, - {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127, - {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146, - 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175, - {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187}, - {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208}, - 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223}, - {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249}, - {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272}, - {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298}, - {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320}, - {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339, - 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358, - {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376}, - {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397}, - {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416, - {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432}, - {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464, - {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482}, - {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498}, - {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517, - {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539, - {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554}, - {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578}, - {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594, - {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612}, - {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633}, - {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652}, - {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682, - {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700, - 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721, - {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735}, - {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754}, - {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773}, - {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797, - {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815}, - 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850, - {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873, - {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892}, - {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917}, - 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939}, - {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962}, - {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998}, - 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023}, - 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044}, - 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061}, - {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077}, - {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101}, - 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122, - {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139, - {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153}, - {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178}, - 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198}, - {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227, - {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248}, - {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276, - 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296}, - {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314}, - {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331}, - {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352}, - 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381}, - {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402}, - 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429}, - {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451}, - {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471}, - {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487}, - {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506}, - {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523}, - {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555}, - 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576, - 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586}, - {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603}, - 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624}, - {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646, - {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672, - {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695}, - 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713}, - {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743, - {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760, - {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792}, - {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809}, - {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834, - {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855}, - {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883}, - {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907, - {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927}, - {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952}, - {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979, - {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998, - 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017}, - {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032}, - {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055}, - {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080}, - {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101, - 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125, - {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150, - {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172}, - {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194}, - {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212, - {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234, - {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257}, - {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280, - {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301, - {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326], - 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345}, - {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356}, - {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383}, - 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400}, - {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421, - {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440}, - 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463}, - {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478}, - {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510, - {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532}, - {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559}, - 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586}, - {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611}, - {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635, - {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654, - {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680}, - {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704}, - {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723}, - {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750, - {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766}, - {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788, - 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803}, - {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825, - {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856, - {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873, - {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890}, - {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911}, - {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929}, - {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953}, - {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965}, - {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978}, - {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002}, - {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021}, - {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047, - {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073, - {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097, - {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115}, - {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147}, - 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170, - {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182}, - {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200}, - 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225}, - 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244, - {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259}, - 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282, - {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303}, - {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331}, - 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362, - 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379}, - {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407}, - {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424}, - 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450}, - {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470, - {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486, - {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504, - {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519, - {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538, - {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562, - {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582}, - 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599}, - {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615, - {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630}, - {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646}, - {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669}, - {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693}, - 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710}, - {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727}, - 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745}, - {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778, - {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801}, - 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837}, - {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855}, - {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891}, - 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910}, - {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930}, - {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950}, - 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987, - 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012, - {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029}, - {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052}, - 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079, - {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103, - {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120, - {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138}, - {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159}, - {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188, - {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204}, - 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228}, - 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245, - {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268}, - {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292}, - {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316, - {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339, - {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355}, - 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378}, - {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400}, - 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436, - {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567, - 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591, - {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611}, - {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634}, - {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653, - {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672, - {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691}, - {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715, - 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729}, - {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754, - {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775}, - {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801, - {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820, - {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836}, - {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857, - {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888, - {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909}, - {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940, - 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965, - {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991}, - {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019, - {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035}, - 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069}, - 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095, - 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115}, - {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138}, - {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168, - {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185}, - {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212, - {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241, - {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259, - {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291, - {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312, - {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340}, - {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356}, - {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383, - {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400], - {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420, - 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442}, - 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471}, - {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497}, - 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522}, - {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549, - 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565}, - {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597}, - {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619, - {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657}, - {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679}, - {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697, - {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726}, - {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741}, - {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762}, - {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786}, - {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810}, - {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837}, - {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854}, - {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880, - {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904, - 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933, - {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946}, - {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971, - {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996, - {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014, - {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046, - {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069}, - {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084}, - {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114, - {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135, - {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149}, - {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168, - {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189}, - 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205}, - {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232, - {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257}, - 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278}, - {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300}, - {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322}, - {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339}, - 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365}, - {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397, - {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413, - {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446}, - 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475, - {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491}, - {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514}, - {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528}, - {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549}, - {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571}, - {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591}, - 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607}, - {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620}, - {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646, - 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671, - {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687}, - {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702}, - {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723}, - {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748, - {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764}, - {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785}, - 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803}, - {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820, - {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839}, - {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867}, - {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881}, - {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906, - 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929, - {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950}, - {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963}, - {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988, - {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005}, - {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024}, - 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040}, - {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061}, - {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080}, - {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100}, - {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127, - {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141}, - {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173, - {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184}, - {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202, - {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216}, - {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234}, - {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248}, - {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277, - {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300, - {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319, - {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343, - {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358, - {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371}, - {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383}, - {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399, - {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417}, - {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431}, - 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453}, - {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476, - {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495, - {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507}, - {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520}, - 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536, - {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557, - {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577, - 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595}, - 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614}, - {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630}, - {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658}, - {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687}, - {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704}, - {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727}, - 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792, - 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914}, - {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931}, - {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963}, - {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981}, - {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003}, - {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041, - {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069, - {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095}, - {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119}, - 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204, - {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226}, - {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246}, - {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265}, - {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293, - {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316, - {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333}, - {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358}, - 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373}, - {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402}, - {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419, - {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438}, - {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458}, - 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477}, - 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501}, - 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519}, - {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539}, - {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565}, - {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588}, - {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616, - {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640}, - {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660}, - {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675, - {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693}, - 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768}, - {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789], - {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806, - {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832}, - 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853}, - {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883, - 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912}, - {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931, - {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957, - 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975}, - 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001, - {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020, - {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042, - 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062, - {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076}, - {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100, - 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113}, - {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139, - 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151}, - {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175}, - {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203}, - {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222}, - 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256, - 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271}, - {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302}, - {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334, - {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352, - {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378}, - {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394}, - {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423, - {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441}, - {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458}, - 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471}, - {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493}, - 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510}, - {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531, - {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551}, - {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574, - {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587}, - 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618}, - 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634}, - {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654}, - {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673}, - {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687, - {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708, - {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724}, - {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745}, - {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763, - {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776}, - 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807, - {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817}, - {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838}, - {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861}, - {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892}, - {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914}, - {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935}, - 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952}, - {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973}, - {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001, - {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038, - 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176, - 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, - {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276}, - {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293}, - {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318}, - {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336}, - {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353}, - {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371}, - {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432, - {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455}, - 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481}, - {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501}, - 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535, - 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569, - {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594}, - 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611}, - {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628}, - {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650, - {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666}, - {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685, - {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702}, - 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723, - {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740}, - {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755}, - {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775}, - {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803, - {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820}, - {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837}, - {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858, - {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877, - {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912, - 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937}, - {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951}, - {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972, - {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997}, - 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014, - {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061, - 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092}, - {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113}, - {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137, - {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157}, - {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182}, - {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199}, - {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220}, - {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238}, - {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263}, - 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298}, - 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337}, - {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379, - {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395}, - {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426}, - {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450}, - 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494}, - {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512}, - {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538, - 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590, - {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613}, - {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639, - {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660, - {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687, - {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700}, - {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722}, - 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760, - {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771}, - {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810, - {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835}, - {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880, - {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907, - {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921}, - {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946}, - {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972, - {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992, - 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006}, - {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032}, - {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064, - {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086}, - 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136}, - {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163}, - {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181, - {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220, - 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233}, - {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259}, - {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299, - {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328, - {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347}, - {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373}, - {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408, - {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436}, - {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487, - 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528, - {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549, - {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576}, - {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596}, - {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615}, - {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633}, - 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645}, - {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661}, - {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683}, - {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704}, - 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728, - {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749}, - {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773}, - {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794}, - {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811, - {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833}, - {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861}, - {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024, - {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905, - [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383, - 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616, - 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584, - 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955, - {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622, - 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759, - 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871, - 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575, - 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351, - {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339}, - {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904, - {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917}, - {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947}, - {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964}, - {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384}, - {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839}, - {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703}, - {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964}, - {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585}, - {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208}, - {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374}, - {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018}, - {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318}, - {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820, - {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872}, - {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738}, - {f: 7, c: 19887}] -}; - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var ColorSpace = (function ColorSpaceClosure() { - // Constructor should define this.numComps, this.defaultColor, this.name - function ColorSpace() { - error('should not call ColorSpace constructor'); - } - - ColorSpace.prototype = { - // Input: array of size numComps representing color component values - // Output: array of rgb values, each value ranging from [0.1] - getRgb: function ColorSpace_getRgb(color) { - error('Should not call ColorSpace.getRgb: ' + color); - }, - // Input: Uint8Array of component values, each value scaled to [0,255] - // Output: Uint8Array of rgb values, each value scaled to [0,255] - getRgbBuffer: function ColorSpace_getRgbBuffer(input) { - error('Should not call ColorSpace.getRgbBuffer: ' + input); - } - }; - - ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { - var IR = ColorSpace.parseToIR(cs, xref, res); - if (IR instanceof AlternateCS) - return IR; - - return ColorSpace.fromIR(IR); - }; - - ColorSpace.fromIR = function ColorSpace_fromIR(IR) { - var name = isArray(IR) ? IR[0] : IR; - - switch (name) { - case 'DeviceGrayCS': - return new DeviceGrayCS(); - case 'DeviceRgbCS': - return new DeviceRgbCS(); - case 'DeviceCmykCS': - return new DeviceCmykCS(); - case 'PatternCS': - var basePatternCS = IR[1]; - if (basePatternCS) - basePatternCS = ColorSpace.fromIR(basePatternCS); - return new PatternCS(basePatternCS); - case 'IndexedCS': - var baseIndexedCS = IR[1]; - var hiVal = IR[2]; - var lookup = IR[3]; - return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); - case 'AlternateCS': - var numComps = IR[1]; - var alt = IR[2]; - var tintFnIR = IR[3]; - - return new AlternateCS(numComps, ColorSpace.fromIR(alt), - PDFFunction.fromIR(tintFnIR)); - case 'LabCS': - var whitePoint = IR[1].WhitePoint; - var blackPoint = IR[1].BlackPoint; - var range = IR[1].Range; - return new LabCS(whitePoint, blackPoint, range); - default: - error('Unkown name ' + name); - } - return null; - }; - - ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { - if (isName(cs)) { - var colorSpaces = res.get('ColorSpace'); - if (isDict(colorSpaces)) { - var refcs = colorSpaces.get(cs.name); - if (refcs) - cs = refcs; - } - } - - cs = xref.fetchIfRef(cs); - var mode; - - if (isName(cs)) { - mode = cs.name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'Pattern': - return ['PatternCS', null]; - default: - error('unrecognized colorspace ' + mode); - } - } else if (isArray(cs)) { - mode = cs[0].name; - this.mode = mode; - - switch (mode) { - case 'DeviceGray': - case 'G': - return 'DeviceGrayCS'; - case 'DeviceRGB': - case 'RGB': - return 'DeviceRgbCS'; - case 'DeviceCMYK': - case 'CMYK': - return 'DeviceCmykCS'; - case 'CalGray': - return 'DeviceGrayCS'; - case 'CalRGB': - return 'DeviceRgbCS'; - case 'ICCBased': - var stream = xref.fetchIfRef(cs[1]); - var dict = stream.dict; - var numComps = dict.get('N'); - if (numComps == 1) - return 'DeviceGrayCS'; - if (numComps == 3) - return 'DeviceRgbCS'; - if (numComps == 4) - return 'DeviceCmykCS'; - break; - case 'Pattern': - var basePatternCS = cs[1]; - if (basePatternCS) - basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); - return ['PatternCS', basePatternCS]; - case 'Indexed': - case 'I': - var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); - var hiVal = cs[2] + 1; - var lookup = xref.fetchIfRef(cs[3]); - return ['IndexedCS', baseIndexedCS, hiVal, lookup]; - case 'Separation': - case 'DeviceN': - var name = cs[1]; - var numComps = 1; - if (isName(name)) - numComps = 1; - else if (isArray(name)) - numComps = name.length; - var alt = ColorSpace.parseToIR(cs[2], xref, res); - var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); - return ['AlternateCS', numComps, alt, tintFnIR]; - case 'Lab': - var params = cs[1].getAll(); - return ['LabCS', params]; - default: - error('unimplemented color space object "' + mode + '"'); - } - } else { - error('unrecognized color space object: "' + cs + '"'); - } - return null; - }; - /** - * Checks if a decode map matches the default decode map for a color space. - * This handles the general decode maps where there are two values per - * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. - * This does not handle Lab, Indexed, or Pattern decode maps since they are - * slightly different. - * @param {Array} decode Decode map (usually from an image). - * @param {Number} n Number of components the color space has. - */ - ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { - if (!decode) - return true; - - if (n * 2 !== decode.length) { - warning('The decode map is not the correct length'); - return true; - } - for (var i = 0, ii = decode.length; i < ii; i += 2) { - if (decode[i] != 0 || decode[i + 1] != 1) - return false; - } - return true; - }; - - return ColorSpace; -})(); - -/** - * Alternate color space handles both Separation and DeviceN color spaces. A - * Separation color space is actually just a DeviceN with one color component. - * Both color spaces use a tinting function to convert colors to a base color - * space. - */ -var AlternateCS = (function AlternateCSClosure() { - function AlternateCS(numComps, base, tintFn) { - this.name = 'Alternate'; - this.numComps = numComps; - this.defaultColor = []; - for (var i = 0; i < numComps; ++i) - this.defaultColor.push(1); - this.base = base; - this.tintFn = tintFn; - } - - AlternateCS.prototype = { - getRgb: function AlternateCS_getRgb(color) { - var tinted = this.tintFn(color); - return this.base.getRgb(tinted); - }, - getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) { - var tintFn = this.tintFn; - var base = this.base; - var scale = 1 / ((1 << bits) - 1); - var length = input.length; - var pos = 0; - var baseNumComps = base.numComps; - var baseBuf = new Uint8Array(baseNumComps * length); - var numComps = this.numComps; - var scaled = []; - - for (var i = 0; i < length; i += numComps) { - for (var z = 0; z < numComps; ++z) - scaled[z] = input[i + z] * scale; - - var tinted = tintFn(scaled); - for (var j = 0; j < baseNumComps; ++j) - baseBuf[pos++] = 255 * tinted[j]; - } - return base.getRgbBuffer(baseBuf, 8); - }, - isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - - return AlternateCS; -})(); - -var PatternCS = (function PatternCSClosure() { - function PatternCS(baseCS) { - this.name = 'Pattern'; - this.base = baseCS; - } - PatternCS.prototype = {}; - - return PatternCS; -})(); - -var IndexedCS = (function IndexedCSClosure() { - function IndexedCS(base, highVal, lookup) { - this.name = 'Indexed'; - this.numComps = 1; - this.defaultColor = [0]; - this.base = base; - this.highVal = highVal; - - var baseNumComps = base.numComps; - var length = baseNumComps * highVal; - var lookupArray = new Uint8Array(length); - - if (isStream(lookup)) { - var bytes = lookup.getBytes(length); - lookupArray.set(bytes); - } else if (isString(lookup)) { - for (var i = 0; i < length; ++i) - lookupArray[i] = lookup.charCodeAt(i); - } else { - error('Unrecognized lookup table: ' + lookup); - } - this.lookup = lookupArray; - } - - IndexedCS.prototype = { - getRgb: function IndexedCS_getRgb(color) { - var numComps = this.base.numComps; - var start = color[0] * numComps; - var c = []; - - for (var i = start, ii = start + numComps; i < ii; ++i) - c.push(this.lookup[i]); - - return this.base.getRgb(c); - }, - getRgbBuffer: function IndexedCS_getRgbBuffer(input) { - var base = this.base; - var numComps = base.numComps; - var lookup = this.lookup; - var length = input.length; - var baseBuf = new Uint8Array(length * numComps); - var baseBufPos = 0; - - for (var i = 0; i < length; ++i) { - var lookupPos = input[i] * numComps; - for (var j = 0; j < numComps; ++j) { - baseBuf[baseBufPos++] = lookup[lookupPos + j]; - } - } - - return base.getRgbBuffer(baseBuf, 8); - }, - isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { - // indexed color maps shouldn't be changed - return true; - } - }; - return IndexedCS; -})(); - -var DeviceGrayCS = (function DeviceGrayCSClosure() { - function DeviceGrayCS() { - this.name = 'DeviceGray'; - this.numComps = 1; - this.defaultColor = [0]; - } - - DeviceGrayCS.prototype = { - getRgb: function DeviceGrayCS_getRgb(color) { - var c = color[0]; - return [c, c, c]; - }, - getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) { - var scale = 255 / ((1 << bits) - 1); - var length = input.length; - var rgbBuf = new Uint8Array(length * 3); - for (var i = 0, j = 0; i < length; ++i) { - var c = (scale * input[i]) | 0; - rgbBuf[j++] = c; - rgbBuf[j++] = c; - rgbBuf[j++] = c; - } - return rgbBuf; - }, - isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - return DeviceGrayCS; -})(); - -var DeviceRgbCS = (function DeviceRgbCSClosure() { - function DeviceRgbCS() { - this.name = 'DeviceRGB'; - this.numComps = 3; - this.defaultColor = [0, 0, 0]; - } - DeviceRgbCS.prototype = { - getRgb: function DeviceRgbCS_getRgb(color) { - return color; - }, - getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) { - if (bits == 8) - return input; - var scale = 255 / ((1 << bits) - 1); - var i, length = input.length; - var rgbBuf = new Uint8Array(length); - for (i = 0; i < length; ++i) - rgbBuf[i] = (scale * input[i]) | 0; - return rgbBuf; - }, - isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - return DeviceRgbCS; -})(); - -var DeviceCmykCS = (function DeviceCmykCSClosure() { - function DeviceCmykCS() { - this.name = 'DeviceCMYK'; - this.numComps = 4; - this.defaultColor = [0, 0, 0, 1]; - } - DeviceCmykCS.prototype = { - getRgb: function DeviceCmykCS_getRgb(color) { - var c = color[0], m = color[1], y = color[2], k = color[3]; - - // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14 - c = (c * (1 - k) + k); - m = (m * (1 - k) + k); - y = (y * (1 - k) + k); - - // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12 - var r = (1 - c); - var g = (1 - m); - var b = (1 - y); - - return [r, g, b]; - }, - getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) { - var scale = 1 / ((1 << bits) - 1); - var length = colorBuf.length / 4; - var rgbBuf = new Uint8Array(length * 3); - var rgbBufPos = 0; - var colorBufPos = 0; - - for (var i = 0; i < length; i++) { - var cmyk = []; - for (var j = 0; j < 4; ++j) - cmyk.push(scale * colorBuf[colorBufPos++]); - - var rgb = this.getRgb(cmyk); - for (var j = 0; j < 3; ++j) - rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255); - } - - return rgbBuf; - }, - isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { - return ColorSpace.isDefaultDecode(decodeMap, this.numComps); - } - }; - - return DeviceCmykCS; -})(); - -// -// LabCS: Based on "PDF Reference, Sixth Ed", p.250 -// -var LabCS = (function LabCSClosure() { - function LabCS(whitePoint, blackPoint, range) { - this.name = 'Lab'; - this.numComps = 3; - this.defaultColor = [0, 0, 0]; - - if (!whitePoint) - error('WhitePoint missing - required for color space Lab'); - blackPoint = blackPoint || [0, 0, 0]; - range = range || [-100, 100, -100, 100]; - - // Translate args to spec variables - this.XW = whitePoint[0]; - this.YW = whitePoint[1]; - this.ZW = whitePoint[2]; - this.amin = range[0]; - this.amax = range[1]; - this.bmin = range[2]; - this.bmax = range[3]; - - // These are here just for completeness - the spec doesn't offer any - // formulas that use BlackPoint in Lab - this.XB = blackPoint[0]; - this.YB = blackPoint[1]; - this.ZB = blackPoint[2]; - - // Validate vars as per spec - if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) - error('Invalid WhitePoint components, no fallback available'); - - if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { - info('Invalid BlackPoint, falling back to default'); - this.XB = this.YB = this.ZB = 0; - } - - if (this.amin > this.amax || this.bmin > this.bmax) { - info('Invalid Range, falling back to defaults'); - this.amin = -100; - this.amax = 100; - this.bmin = -100; - this.bmax = 100; - } - }; - - // Function g(x) from spec - function g(x) { - if (x >= 6 / 29) - return x * x * x; - else - return (108 / 841) * (x - 4 / 29); - } - - LabCS.prototype = { - getRgb: function LabCS_getRgb(color) { - // Ls,as,bs <---> L*,a*,b* in the spec - var Ls = color[0], as = color[1], bs = color[2]; - - // Adjust limits of 'as' and 'bs' - as = as > this.amax ? this.amax : as; - as = as < this.amin ? this.amin : as; - bs = bs > this.bmax ? this.bmax : bs; - bs = bs < this.bmin ? this.bmin : bs; - - // Computes intermediate variables X,Y,Z as per spec - var M = (Ls + 16) / 116; - var L = M + (as / 500); - var N = M - (bs / 200); - var X = this.XW * g(L); - var Y = this.YW * g(M); - var Z = this.ZW * g(N); - - // XYZ to RGB 3x3 matrix, from: - // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18 - var XYZtoRGB = [3.240479, -1.537150, -0.498535, - -0.969256, 1.875992, 0.041556, - 0.055648, -0.204043, 1.057311]; - - return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]); - }, - getRgbBuffer: function LabCS_getRgbBuffer(input, bits) { - if (bits == 8) - return input; - var scale = 255 / ((1 << bits) - 1); - var i, length = input.length / 3; - var rgbBuf = new Uint8Array(length); - - var j = 0; - for (i = 0; i < length; ++i) { - // Convert L*, a*, s* into RGB - var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]); - rgbBuf[j++] = rgb[0]; - rgbBuf[j++] = rgb[1]; - rgbBuf[j++] = rgb[2]; - } - - return rgbBuf; - }, - isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { - // From Table 90 in Adobe's: - // "Document management - Portable document format", 1st ed, 2008 - if (decodeMap[0] === 0 && decodeMap[1] === 100 && - decodeMap[2] === this.amin && decodeMap[3] === this.amax && - decodeMap[4] === this.bmin && decodeMap[5] === this.bmax) - return true; - else - return false; - } - }; - return LabCS; -})(); - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var ARCFourCipher = (function ARCFourCipherClosure() { - function ARCFourCipher(key) { - this.a = 0; - this.b = 0; - var s = new Uint8Array(256); - var i, j = 0, tmp, keyLength = key.length; - for (i = 0; i < 256; ++i) - s[i] = i; - for (i = 0; i < 256; ++i) { - tmp = s[i]; - j = (j + tmp + key[i % keyLength]) & 0xFF; - s[i] = s[j]; - s[j] = tmp; - } - this.s = s; - } - - ARCFourCipher.prototype = { - encryptBlock: function ARCFourCipher_encryptBlock(data) { - var i, n = data.length, tmp, tmp2; - var a = this.a, b = this.b, s = this.s; - var output = new Uint8Array(n); - for (i = 0; i < n; ++i) { - a = (a + 1) & 0xFF; - tmp = s[a]; - b = (b + tmp) & 0xFF; - tmp2 = s[b]; - s[a] = tmp2; - s[b] = tmp; - output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; - } - this.a = a; - this.b = b; - return output; - } - }; - ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; - - return ARCFourCipher; -})(); - -var calculateMD5 = (function calculateMD5Closure() { - var r = new Uint8Array([ - 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, - 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, - 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, - 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); - - var k = new Int32Array([ - -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, - -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, - 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, - 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, - 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, - 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, - -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, - -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, - -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, - -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, - -145523070, -1120210379, 718787259, -343485551]); - - function hash(data, offset, length) { - var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; - // pre-processing - var paddedLength = (length + 72) & ~63; // data + 9 extra bytes - var padded = new Uint8Array(paddedLength); - var i, j, n; - for (i = 0; i < length; ++i) - padded[i] = data[offset++]; - padded[i++] = 0x80; - n = paddedLength - 8; - while (i < n) - padded[i++] = 0; - padded[i++] = (length << 3) & 0xFF; - padded[i++] = (length >> 5) & 0xFF; - padded[i++] = (length >> 13) & 0xFF; - padded[i++] = (length >> 21) & 0xFF; - padded[i++] = (length >>> 29) & 0xFF; - padded[i++] = 0; - padded[i++] = 0; - padded[i++] = 0; - // chunking - // TODO ArrayBuffer ? - var w = new Int32Array(16); - for (i = 0; i < paddedLength;) { - for (j = 0; j < 16; ++j, i += 4) { - w[j] = (padded[i] | (padded[i + 1] << 8) | - (padded[i + 2] << 16) | (padded[i + 3] << 24)); - } - var a = h0, b = h1, c = h2, d = h3, f, g; - for (j = 0; j < 64; ++j) { - if (j < 16) { - f = (b & c) | ((~b) & d); - g = j; - } else if (j < 32) { - f = (d & b) | ((~d) & c); - g = (5 * j + 1) & 15; - } else if (j < 48) { - f = b ^ c ^ d; - g = (3 * j + 5) & 15; - } else { - f = c ^ (b | (~d)); - g = (7 * j) & 15; - } - var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; - d = c; - c = b; - b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; - a = tmp; - } - h0 = (h0 + a) | 0; - h1 = (h1 + b) | 0; - h2 = (h2 + c) | 0; - h3 = (h3 + d) | 0; - } - return new Uint8Array([ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF - ]); - } - return hash; -})(); - -var NullCipher = (function NullCipherClosure() { - function NullCipher() { - } - - NullCipher.prototype = { - decryptBlock: function NullCipher_decryptBlock(data) { - return data; - } - }; - - return NullCipher; -})(); - -var AES128Cipher = (function AES128CipherClosure() { - var rcon = new Uint8Array([ - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, - 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, - 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, - 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, - 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, - 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, - 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, - 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, - 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, - 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, - 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, - 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, - 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, - 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, - 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, - 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, - 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, - 0x74, 0xe8, 0xcb, 0x8d]); - - var s = new Uint8Array([ - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, - 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, - 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, - 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, - 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, - 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, - 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, - 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, - 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, - 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, - 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, - 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, - 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, - 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, - 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, - 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, - 0xb0, 0x54, 0xbb, 0x16]); - - var inv_s = new Uint8Array([ - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, - 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, - 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, - 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, - 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, - 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, - 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, - 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, - 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, - 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, - 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, - 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, - 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, - 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, - 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, - 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, - 0x55, 0x21, 0x0c, 0x7d]); - - var mix = new Uint32Array([ - 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, - 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, - 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, - 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, - 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, - 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, - 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, - 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, - 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, - 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, - 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, - 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, - 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, - 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, - 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, - 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, - 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, - 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, - 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, - 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, - 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, - 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, - 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, - 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, - 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, - 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, - 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, - 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, - 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, - 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, - 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, - 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, - 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, - 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, - 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, - 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, - 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, - 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, - 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, - 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, - 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, - 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, - 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); - - function expandKey128(cipherKey) { - var b = 176, result = new Uint8Array(b); - result.set(cipherKey); - for (var j = 16, i = 1; j < b; ++i) { - // RotWord - var t1 = result[j - 3], t2 = result[j - 2], - t3 = result[j - 1], t4 = result[j - 4]; - // SubWord - t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4]; - // Rcon - t1 = t1 ^ rcon[i]; - for (var n = 0; n < 4; ++n) { - result[j] = (t1 ^= result[j - 16]); j++; - result[j] = (t2 ^= result[j - 16]); j++; - result[j] = (t3 ^= result[j - 16]); j++; - result[j] = (t4 ^= result[j - 16]); j++; - } - } - return result; - } - - function decrypt128(input, key) { - var state = new Uint8Array(16); - state.set(input); - var i, j, k; - var t, u, v; - // AddRoundKey - for (j = 0, k = 160; j < 16; ++j, ++k) - state[j] ^= key[k]; - for (i = 9; i >= 1; --i) { - // InvShiftRows - t = state[13]; state[13] = state[9]; state[9] = state[5]; - state[5] = state[1]; state[1] = t; - t = state[14]; u = state[10]; state[14] = state[6]; - state[10] = state[2]; state[6] = t; state[2] = u; - t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; - state[11] = t; state[7] = u; state[3] = v; - // InvSubBytes - for (j = 0; j < 16; ++j) - state[j] = inv_s[state[j]]; - // AddRoundKey - for (j = 0, k = i * 16; j < 16; ++j, ++k) - state[j] ^= key[k]; - // InvMixColumns - for (j = 0; j < 16; j += 4) { - var s0 = mix[state[j]], s1 = mix[state[j + 1]], - s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; - t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ - (s3 >>> 24) ^ (s3 << 8)); - state[j] = (t >>> 24) & 0xFF; - state[j + 1] = (t >> 16) & 0xFF; - state[j + 2] = (t >> 8) & 0xFF; - state[j + 3] = t & 0xFF; - } - } - // InvShiftRows - t = state[13]; state[13] = state[9]; state[9] = state[5]; - state[5] = state[1]; state[1] = t; - t = state[14]; u = state[10]; state[14] = state[6]; - state[10] = state[2]; state[6] = t; state[2] = u; - t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; - state[11] = t; state[7] = u; state[3] = v; - for (j = 0; j < 16; ++j) { - // InvSubBytes - state[j] = inv_s[state[j]]; - // AddRoundKey - state[j] ^= key[j]; - } - return state; - } - - function AES128Cipher(key) { - this.key = expandKey128(key); - this.buffer = new Uint8Array(16); - this.bufferPosition = 0; - } - - function decryptBlock2(data) { - var i, j, ii, sourceLength = data.length, - buffer = this.buffer, bufferLength = this.bufferPosition, - result = [], iv = this.iv; - for (i = 0; i < sourceLength; ++i) { - buffer[bufferLength] = data[i]; - ++bufferLength; - if (bufferLength < 16) - continue; - // buffer is full, decrypting - var plain = decrypt128(buffer, this.key); - // xor-ing the IV vector to get plain text - for (j = 0; j < 16; ++j) - plain[j] ^= iv[j]; - iv = buffer; - result.push(plain); - buffer = new Uint8Array(16); - bufferLength = 0; - } - // saving incomplete buffer - this.buffer = buffer; - this.bufferLength = bufferLength; - this.iv = iv; - if (result.length == 0) - return new Uint8Array([]); - if (result.length == 1) - return result[0]; - // combining plain text blocks into one - var output = new Uint8Array(16 * result.length); - for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) - output.set(result[i], j); - return output; - } - - AES128Cipher.prototype = { - decryptBlock: function AES128Cipher_decryptBlock(data) { - var i, sourceLength = data.length; - var buffer = this.buffer, bufferLength = this.bufferPosition; - // waiting for IV values -- they are at the start of the stream - for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) - buffer[bufferLength] = data[i]; - if (bufferLength < 16) { - // need more data - this.bufferLength = bufferLength; - return new Uint8Array([]); - } - this.iv = buffer; - this.buffer = new Uint8Array(16); - this.bufferLength = 0; - // starting decryption - this.decryptBlock = decryptBlock2; - return this.decryptBlock(data.subarray(16)); - } - }; - - return AES128Cipher; -})(); - -var CipherTransform = (function CipherTransformClosure() { - function CipherTransform(stringCipherConstructor, streamCipherConstructor) { - this.stringCipherConstructor = stringCipherConstructor; - this.streamCipherConstructor = streamCipherConstructor; - } - CipherTransform.prototype = { - createStream: function CipherTransform_createStream(stream) { - var cipher = new this.streamCipherConstructor(); - return new DecryptStream(stream, - function cipherTransformDecryptStream(data) { - return cipher.decryptBlock(data); - } - ); - }, - decryptString: function CipherTransform_decryptString(s) { - var cipher = new this.stringCipherConstructor(); - var data = stringToBytes(s); - data = cipher.decryptBlock(data); - return bytesToString(data); - } - }; - return CipherTransform; -})(); - -var CipherTransformFactory = (function CipherTransformFactoryClosure() { - var defaultPasswordBytes = new Uint8Array([ - 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, - 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, - 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, - 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); - - function prepareKeyData(fileId, password, ownerPassword, userPassword, - flags, revision, keyLength, encryptMetadata) { - var hashData = new Uint8Array(100), i = 0, j, n; - if (password) { - n = Math.min(32, password.length); - for (; i < n; ++i) - hashData[i] = password[i]; - } - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - // as now the padded password in the hashData[0..i] - for (j = 0, n = ownerPassword.length; j < n; ++j) - hashData[i++] = ownerPassword[j]; - hashData[i++] = flags & 0xFF; - hashData[i++] = (flags >> 8) & 0xFF; - hashData[i++] = (flags >> 16) & 0xFF; - hashData[i++] = (flags >>> 24) & 0xFF; - for (j = 0, n = fileId.length; j < n; ++j) - hashData[i++] = fileId[j]; - if (revision >= 4 && !encryptMetadata) { - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - hashData[i++] = 0xFF; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, keyLengthInBytes); - } - } - var encryptionKey = hash.subarray(0, keyLengthInBytes); - var cipher, checkData; - - if (revision >= 3) { - for (i = 0; i < 32; ++i) - hashData[i] = defaultPasswordBytes[i]; - for (j = 0, n = fileId.length; j < n; ++j) - hashData[i++] = fileId[j]; - cipher = new ARCFourCipher(encryptionKey); - var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); - n = encryptionKey.length; - var derivedKey = new Uint8Array(n), k; - for (j = 1; j <= 19; ++j) { - for (k = 0; k < n; ++k) - derivedKey[k] = encryptionKey[k] ^ j; - cipher = new ARCFourCipher(derivedKey); - checkData = cipher.encryptBlock(checkData); - } - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] != checkData[j]) - return null; - } - } else { - cipher = new ARCFourCipher(encryptionKey); - checkData = cipher.encryptBlock(defaultPasswordBytes); - for (j = 0, n = checkData.length; j < n; ++j) { - if (userPassword[j] != checkData[j]) - return null; - } - } - return encryptionKey; - } - function decodeUserPassword(password, ownerPassword, revision, keyLength) { - var hashData = new Uint8Array(32), i = 0, j, n; - n = Math.min(32, password.length); - for (; i < n; ++i) - hashData[i] = password[i]; - j = 0; - while (i < 32) { - hashData[i++] = defaultPasswordBytes[j++]; - } - var hash = calculateMD5(hashData, 0, i); - var keyLengthInBytes = keyLength >> 3; - if (revision >= 3) { - for (j = 0; j < 50; ++j) { - hash = calculateMD5(hash, 0, hash.length); - } - } - - var cipher, userPassword; - if (revision >= 3) { - userPassword = ownerPassword; - var derivedKey = new Uint8Array(keyLengthInBytes), k; - for (j = 19; j >= 0; j--) { - for (k = 0; k < keyLengthInBytes; ++k) - derivedKey[k] = hash[k] ^ j; - cipher = new ARCFourCipher(derivedKey); - userPassword = cipher.encryptBlock(userPassword); - } - } else { - cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes)); - userPassword = cipher.encryptBlock(ownerPassword); - } - return userPassword; - } - - var identityName = new Name('Identity'); - - function CipherTransformFactory(dict, fileId, password) { - var filter = dict.get('Filter'); - if (!isName(filter) || filter.name != 'Standard') - error('unknown encryption method'); - this.dict = dict; - var algorithm = dict.get('V'); - if (!isInt(algorithm) || - (algorithm != 1 && algorithm != 2 && algorithm != 4)) - error('unsupported encryption algorithm'); - this.algorithm = algorithm; - var keyLength = dict.get('Length') || 40; - if (!isInt(keyLength) || - keyLength < 40 || (keyLength % 8) != 0) - error('invalid key length'); - // prepare keys - var ownerPassword = stringToBytes(dict.get('O')); - var userPassword = stringToBytes(dict.get('U')); - var flags = dict.get('P'); - var revision = dict.get('R'); - var encryptMetadata = algorithm == 4 && // meaningful when V is 4 - dict.get('EncryptMetadata') !== false; // makes true as default value - this.encryptMetadata = encryptMetadata; - - var fileIdBytes = stringToBytes(fileId); - var passwordBytes; - if (password) - passwordBytes = stringToBytes(password); - - var encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - if (!encryptionKey && !password) { - throw new PasswordException('No password given', 'needpassword'); - } else if (!encryptionKey && password) { - // Attempting use the password as an owner password - var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, - revision, keyLength); - encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, - ownerPassword, userPassword, flags, - revision, keyLength, encryptMetadata); - } - - if (!encryptionKey) - throw new PasswordException('Incorrect Password', 'incorrectpassword'); - - this.encryptionKey = encryptionKey; - - if (algorithm == 4) { - this.cf = dict.get('CF'); - this.stmf = dict.get('StmF') || identityName; - this.strf = dict.get('StrF') || identityName; - this.eff = dict.get('EFF') || this.strf; - } - } - - function buildObjectKey(num, gen, encryptionKey, isAes) { - var key = new Uint8Array(encryptionKey.length + 9), i, n; - for (i = 0, n = encryptionKey.length; i < n; ++i) - key[i] = encryptionKey[i]; - key[i++] = num & 0xFF; - key[i++] = (num >> 8) & 0xFF; - key[i++] = (num >> 16) & 0xFF; - key[i++] = gen & 0xFF; - key[i++] = (gen >> 8) & 0xFF; - if (isAes) { - key[i++] = 0x73; - key[i++] = 0x41; - key[i++] = 0x6C; - key[i++] = 0x54; - } - var hash = calculateMD5(key, 0, i); - return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); - } - - function buildCipherConstructor(cf, name, num, gen, key) { - var cryptFilter = cf.get(name.name); - var cfm; - if (cryptFilter != null) - cfm = cryptFilter.get('CFM'); - if (!cfm || cfm.name == 'None') { - return function cipherTransformFactoryBuildCipherConstructorNone() { - return new NullCipher(); - }; - } - if ('V2' == cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorV2() { - return new ARCFourCipher( - buildObjectKey(num, gen, key, false)); - }; - } - if ('AESV2' == cfm.name) { - return function cipherTransformFactoryBuildCipherConstructorAESV2() { - return new AES128Cipher( - buildObjectKey(num, gen, key, true)); - }; - } - error('Unknown crypto method'); - } - - CipherTransformFactory.prototype = { - createCipherTransform: - function CipherTransformFactory_createCipherTransform(num, gen) { - if (this.algorithm == 4) { - return new CipherTransform( - buildCipherConstructor(this.cf, this.stmf, - num, gen, this.encryptionKey), - buildCipherConstructor(this.cf, this.strf, - num, gen, this.encryptionKey)); - } - // algorithms 1 and 2 - var key = buildObjectKey(num, gen, this.encryptionKey, false); - var cipherConstructor = function buildCipherCipherConstructor() { - return new ARCFourCipher(key); - }; - return new CipherTransform(cipherConstructor, cipherConstructor); - } - }; - - return CipherTransformFactory; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -var PartialEvaluator = (function PartialEvaluatorClosure() { - function PartialEvaluator(xref, handler, uniquePrefix) { - this.state = new EvalState(); - this.stateStack = []; - - this.xref = xref; - this.handler = handler; - this.uniquePrefix = uniquePrefix; - this.objIdCounter = 0; - } - - var OP_MAP = { - // Graphics state - w: 'setLineWidth', - J: 'setLineCap', - j: 'setLineJoin', - M: 'setMiterLimit', - d: 'setDash', - ri: 'setRenderingIntent', - i: 'setFlatness', - gs: 'setGState', - q: 'save', - Q: 'restore', - cm: 'transform', - - // Path - m: 'moveTo', - l: 'lineTo', - c: 'curveTo', - v: 'curveTo2', - y: 'curveTo3', - h: 'closePath', - re: 'rectangle', - S: 'stroke', - s: 'closeStroke', - f: 'fill', - F: 'fill', - 'f*': 'eoFill', - B: 'fillStroke', - 'B*': 'eoFillStroke', - b: 'closeFillStroke', - 'b*': 'closeEOFillStroke', - n: 'endPath', - - // Clipping - W: 'clip', - 'W*': 'eoClip', - - // Text - BT: 'beginText', - ET: 'endText', - Tc: 'setCharSpacing', - Tw: 'setWordSpacing', - Tz: 'setHScale', - TL: 'setLeading', - Tf: 'setFont', - Tr: 'setTextRenderingMode', - Ts: 'setTextRise', - Td: 'moveText', - TD: 'setLeadingMoveText', - Tm: 'setTextMatrix', - 'T*': 'nextLine', - Tj: 'showText', - TJ: 'showSpacedText', - "'": 'nextLineShowText', - '"': 'nextLineSetSpacingShowText', - - // Type3 fonts - d0: 'setCharWidth', - d1: 'setCharWidthAndBounds', - - // Color - CS: 'setStrokeColorSpace', - cs: 'setFillColorSpace', - SC: 'setStrokeColor', - SCN: 'setStrokeColorN', - sc: 'setFillColor', - scn: 'setFillColorN', - G: 'setStrokeGray', - g: 'setFillGray', - RG: 'setStrokeRGBColor', - rg: 'setFillRGBColor', - K: 'setStrokeCMYKColor', - k: 'setFillCMYKColor', - - // Shading - sh: 'shadingFill', - - // Images - BI: 'beginInlineImage', - ID: 'beginImageData', - EI: 'endInlineImage', - - // XObjects - Do: 'paintXObject', - - // Marked content - MP: 'markPoint', - DP: 'markPointProps', - BMC: 'beginMarkedContent', - BDC: 'beginMarkedContentProps', - EMC: 'endMarkedContent', - - // Compatibility - BX: 'beginCompat', - EX: 'endCompat', - - // (reserved partial commands for the lexer) - BM: null, - BD: null, - 'true': null, - fa: null, - fal: null, - fals: null, - 'false': null, - nu: null, - nul: null, - 'null': null - }; - - PartialEvaluator.prototype = { - getOperatorList: function PartialEvaluator_getOperatorList(stream, - resources, - dependency, - queue) { - - var self = this; - var xref = this.xref; - var handler = this.handler; - var uniquePrefix = this.uniquePrefix || ''; - - function insertDependency(depList) { - fnArray.push('dependency'); - argsArray.push(depList); - for (var i = 0, ii = depList.length; i < ii; i++) { - var dep = depList[i]; - if (dependency.indexOf(dep) == -1) { - dependency.push(depList[i]); - } - } - } - - function handleSetFont(fontName, font) { - var loadedName = null; - - var fontRes = resources.get('Font'); - - assert(fontRes, 'fontRes not available'); - - font = xref.fetchIfRef(font) || fontRes.get(fontName); - assertWellFormed(isDict(font)); - - ++self.objIdCounter; - if (!font.loadedName) { - font.translated = self.translateFont(font, xref, resources, - dependency); - if (font.translated) { - // keep track of each font we translated so the caller can - // load them asynchronously before calling display on a page - loadedName = 'font_' + uniquePrefix + self.objIdCounter; - font.translated.properties.loadedName = loadedName; - font.loadedName = loadedName; - - var translated = font.translated; - // Convert the file to an ArrayBuffer which will be turned back into - // a Stream in the main thread. - if (translated.file) - translated.file = translated.file.getBytes(); - if (translated.properties.file) { - translated.properties.file = - translated.properties.file.getBytes(); - } - - handler.send('obj', [ - loadedName, - 'Font', - translated.name, - translated.file, - translated.properties - ]); - } - } - loadedName = loadedName || font.loadedName; - - // Ensure the font is ready before the font is set - // and later on used for drawing. - // OPTIMIZE: This should get insert to the operatorList only once per - // page. - insertDependency([loadedName]); - return loadedName; - } - - function buildPaintImageXObject(image, inline) { - var dict = image.dict; - var w = dict.get('Width', 'W'); - var h = dict.get('Height', 'H'); - - var imageMask = dict.get('ImageMask', 'IM') || false; - if (imageMask) { - // This depends on a tmpCanvas beeing filled with the - // current fillStyle, such that processing the pixel - // data can't be done here. Instead of creating a - // complete PDFImage, only read the information needed - // for later. - - var width = dict.get('Width', 'W'); - var height = dict.get('Height', 'H'); - var bitStrideLength = (width + 7) >> 3; - var imgArray = image.getBytes(bitStrideLength * height); - var decode = dict.get('Decode', 'D'); - var inverseDecode = !!decode && decode[0] > 0; - - fn = 'paintImageMaskXObject'; - args = [imgArray, inverseDecode, width, height]; - return; - } - - // If there is no imageMask, create the PDFImage and a lot - // of image processing can be done here. - var objId = 'img_' + uniquePrefix + (++self.objIdCounter); - insertDependency([objId]); - args = [objId, w, h]; - - var softMask = dict.get('SMask', 'IM') || false; - if (!softMask && image instanceof JpegStream && - image.isNativelySupported(xref, resources)) { - // These JPEGs don't need any more processing so we can just send it. - fn = 'paintJpegXObject'; - handler.send('obj', [objId, 'JpegStream', image.getIR()]); - return; - } - - fn = 'paintImageXObject'; - - PDFImage.buildImage(function(imageObj) { - var drawWidth = imageObj.drawWidth; - var drawHeight = imageObj.drawHeight; - var imgData = { - width: drawWidth, - height: drawHeight, - data: new Uint8Array(drawWidth * drawHeight * 4) - }; - var pixels = imgData.data; - imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight); - handler.send('obj', [objId, 'Image', imgData]); - }, handler, xref, resources, image, inline); - } - - if (!queue) - queue = {}; - - if (!queue.argsArray) { - queue.argsArray = []; - } - if (!queue.fnArray) { - queue.fnArray = []; - } - - var fnArray = queue.fnArray, argsArray = queue.argsArray; - var dependencyArray = dependency || []; - - resources = resources || new Dict(); - var xobjs = resources.get('XObject') || new Dict(); - var patterns = resources.get('Pattern') || new Dict(); - var parser = new Parser(new Lexer(stream, OP_MAP), false, xref); - var res = resources; - var args = [], obj; - var TILING_PATTERN = 1, SHADING_PATTERN = 2; - - while (true) { - obj = parser.getObj(); - if (isEOF(obj)) - break; - - if (isCmd(obj)) { - var cmd = obj.cmd; - var fn = OP_MAP[cmd]; - assertWellFormed(fn, 'Unknown command "' + cmd + '"'); - // TODO figure out how to type-check vararg functions - - if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) { - // compile tiling patterns - var patternName = args[args.length - 1]; - // SCN/scn applies patterns along with normal colors - if (isName(patternName)) { - var pattern = patterns.get(patternName.name); - if (pattern) { - var dict = isStream(pattern) ? pattern.dict : pattern; - var typeNum = dict.get('PatternType'); - - if (typeNum == TILING_PATTERN) { - // Create an IR of the pattern code. - var depIdx = dependencyArray.length; - var operatorList = this.getOperatorList(pattern, - dict.get('Resources') || resources, dependencyArray); - - // Add the dependencies that are required to execute the - // operatorList. - insertDependency(dependencyArray.slice(depIdx)); - - args = TilingPattern.getIR(operatorList, dict, args); - } - else if (typeNum == SHADING_PATTERN) { - var shading = dict.get('Shading'); - var matrix = dict.get('Matrix'); - var pattern = Pattern.parseShading(shading, matrix, xref, - res); - args = pattern.getIR(); - } else { - error('Unkown PatternType ' + typeNum); - } - } - } - } else if (cmd == 'Do' && !args[0].code) { - // eagerly compile XForm objects - var name = args[0].name; - var xobj = xobjs.get(name); - if (xobj) { - assertWellFormed(isStream(xobj), 'XObject should be a stream'); - - var type = xobj.dict.get('Subtype'); - assertWellFormed( - isName(type), - 'XObject should have a Name subtype' - ); - - if ('Form' == type.name) { - var matrix = xobj.dict.get('Matrix'); - var bbox = xobj.dict.get('BBox'); - - fnArray.push('paintFormXObjectBegin'); - argsArray.push([matrix, bbox]); - - // This adds the operatorList of the xObj to the current queue. - var depIdx = dependencyArray.length; - - // Pass in the current `queue` object. That means the `fnArray` - // and the `argsArray` in this scope is reused and new commands - // are added to them. - this.getOperatorList(xobj, - xobj.dict.get('Resources') || resources, - dependencyArray, queue); - - // Add the dependencies that are required to execute the - // operatorList. - insertDependency(dependencyArray.slice(depIdx)); - - fn = 'paintFormXObjectEnd'; - args = []; - } else if ('Image' == type.name) { - buildPaintImageXObject(xobj, false); - } else { - error('Unhandled XObject subtype ' + type.name); - } - } - } else if (cmd == 'Tf') { // eagerly collect all fonts - args[0] = handleSetFont(args[0].name); - } else if (cmd == 'EI') { - buildPaintImageXObject(args[0], true); - } - - switch (fn) { - // Parse the ColorSpace data to a raw format. - case 'setFillColorSpace': - case 'setStrokeColorSpace': - args = [ColorSpace.parseToIR(args[0], xref, resources)]; - break; - case 'shadingFill': - var shadingRes = res.get('Shading'); - if (!shadingRes) - error('No shading resource found'); - - var shading = shadingRes.get(args[0].name); - if (!shading) - error('No shading object found'); - - var shadingFill = Pattern.parseShading(shading, null, xref, res); - var patternIR = shadingFill.getIR(); - args = [patternIR]; - fn = 'shadingFill'; - break; - case 'setGState': - var dictName = args[0]; - var extGState = resources.get('ExtGState'); - - if (!isDict(extGState) || !extGState.has(dictName.name)) - break; - - var gsState = extGState.get(dictName.name); - - // This array holds the converted/processed state data. - var gsStateObj = []; - - gsState.forEach( - function canvasGraphicsSetGStateForEach(key, value) { - switch (key) { - case 'Type': - break; - case 'LW': - case 'LC': - case 'LJ': - case 'ML': - case 'D': - case 'RI': - case 'FL': - case 'CA': - case 'ca': - gsStateObj.push([key, value]); - break; - case 'Font': - gsStateObj.push([ - 'Font', - handleSetFont(null, value[0]), - value[1] - ]); - break; - case 'BM': - // We support the default so don't trigger the TODO. - if (!isName(value) || value.name != 'Normal') - TODO('graphic state operator ' + key); - break; - case 'SMask': - // We support the default so don't trigger the TODO. - if (!isName(value) || value.name != 'None') - TODO('graphic state operator ' + key); - break; - // Only generate info log messages for the following since - // they are unlikey to have a big impact on the rendering. - case 'OP': - case 'op': - case 'OPM': - case 'BG': - case 'BG2': - case 'UCR': - case 'UCR2': - case 'TR': - case 'TR2': - case 'HT': - case 'SM': - case 'SA': - case 'AIS': - case 'TK': - // TODO implement these operators. - info('graphic state operator ' + key); - break; - default: - info('Unknown graphic state operator ' + key); - break; - } - } - ); - args = [gsStateObj]; - break; - } // switch - - fnArray.push(fn); - argsArray.push(args); - args = []; - } else if (obj != null) { - assertWellFormed(args.length <= 33, 'Too many arguments'); - args.push(obj instanceof Dict ? obj.getAll() : obj); - } - } - - return queue; - }, - - getTextContent: function partialEvaluatorGetIRQueue(stream, resources) { - - var self = this; - var xref = this.xref; - - function handleSetFont(fontName, fontRef) { - var fontRes = resources.get('Font'); - - // TODO: TOASK: Is it possible to get here? If so, what does - // args[0].name should be like??? - assert(fontRes, 'fontRes not available'); - - fontRes = xref.fetchIfRef(fontRes); - fontRef = fontRef || fontRes.get(fontName); - var font = xref.fetchIfRef(fontRef), tra; - assertWellFormed(isDict(font)); - if (!font.translated) { - font.translated = self.translateFont(font, xref, resources); - } - return font; - } - - resources = xref.fetchIfRef(resources) || new Dict(); - - var parser = new Parser(new Lexer(stream), false); - var res = resources; - var args = [], obj; - - var text = ''; - var chunk = ''; - var font = null; - while (!isEOF(obj = parser.getObj())) { - if (isCmd(obj)) { - var cmd = obj.cmd; - switch (cmd) { - case 'Tf': - font = handleSetFont(args[0].name); - break; - case 'TJ': - var items = args[0]; - for (var j = 0, jj = items.length; j < jj; j++) { - if (typeof items[j] === 'string') { - chunk += items[j]; - } else if (items[j] < 0) { - // making all negative offsets a space - better to have - // a space in incorrect place than not have them at all - chunk += ' '; - } - } - break; - case 'Tj': - chunk += args[0]; - break; - case "'": - chunk += args[0] + ' '; - break; - case '"': - chunk += args[2] + ' '; - break; - } // switch - if (chunk !== '') { - text += fontCharsToUnicode(chunk, font.translated.properties); - chunk = ''; - } - - args = []; - } else if (obj != null) { - assertWellFormed(args.length <= 33, 'Too many arguments'); - args.push(obj); - } - } - - return text; - }, - - extractDataStructures: function - partialEvaluatorExtractDataStructures(dict, baseDict, - xref, properties) { - // 9.10.2 - var toUnicode = dict.get('ToUnicode') || - baseDict.get('ToUnicode'); - if (toUnicode) - properties.toUnicode = this.readToUnicode(toUnicode, xref, properties); - - if (properties.composite) { - // CIDSystemInfo helps to match CID to glyphs - var cidSystemInfo = dict.get('CIDSystemInfo'); - if (isDict(cidSystemInfo)) { - properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), - supplement: cidSystemInfo.get('Supplement') - }; - } - - var cidToGidMap = dict.get('CIDToGIDMap'); - if (isStream(cidToGidMap)) - properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); - } - - var flags = properties.flags; - var differences = []; - var baseEncoding = !!(flags & FontFlags.Symbolic) ? - Encodings.symbolsEncoding : Encodings.StandardEncoding; - var hasEncoding = dict.has('Encoding'); - if (hasEncoding) { - var encoding = dict.get('Encoding'); - if (isDict(encoding)) { - var baseName = encoding.get('BaseEncoding'); - if (baseName) - baseEncoding = Encodings[baseName.name]; - else - hasEncoding = false; // base encoding was not provided - - // Load the differences between the base and original - if (encoding.has('Differences')) { - var diffEncoding = encoding.get('Differences'); - var index = 0; - for (var j = 0, jj = diffEncoding.length; j < jj; j++) { - var data = diffEncoding[j]; - if (isNum(data)) - index = data; - else - differences[index++] = data.name; - } - } - } else if (isName(encoding)) { - baseEncoding = Encodings[encoding.name]; - } else { - error('Encoding is not a Name nor a Dict'); - } - } - - properties.differences = differences; - properties.baseEncoding = baseEncoding; - properties.hasEncoding = hasEncoding; - }, - - readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref, - properties) { - var cmapObj = toUnicode; - var charToUnicode = []; - if (isName(cmapObj)) { - var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-'; - if (!isIdentityMap) - error('ToUnicode file cmap translation not implemented'); - } else if (isStream(cmapObj)) { - var tokens = []; - var token = ''; - var beginArrayToken = {}; - - var cmap = cmapObj.getBytes(cmapObj.length); - for (var i = 0, ii = cmap.length; i < ii; i++) { - var octet = cmap[i]; - if (octet == 0x20 || octet == 0x0D || octet == 0x0A || - octet == 0x3C || octet == 0x5B || octet == 0x5D) { - switch (token) { - case 'usecmap': - error('usecmap is not implemented'); - break; - - case 'beginbfchar': - case 'beginbfrange': - case 'begincidchar': - case 'begincidrange': - token = ''; - tokens = []; - break; - - case 'endcidrange': - case 'endbfrange': - for (var j = 0, jj = tokens.length; j < jj; j += 3) { - var startRange = tokens[j]; - var endRange = tokens[j + 1]; - var code = tokens[j + 2]; - if (code == 0xFFFF) { - // CMap is broken, assuming code == startRange - code = startRange; - } - if (isArray(code)) { - var codeindex = 0; - while (startRange <= endRange) { - charToUnicode[startRange] = code[codeindex++]; - ++startRange; - } - } else { - while (startRange <= endRange) { - charToUnicode[startRange] = code++; - ++startRange; - } - } - } - break; - - case 'endcidchar': - case 'endbfchar': - for (var j = 0, jj = tokens.length; j < jj; j += 2) { - var index = tokens[j]; - var code = tokens[j + 1]; - charToUnicode[index] = code; - } - break; - - case '': - break; - - default: - if (token[0] >= '0' && token[0] <= '9') - token = parseInt(token, 10); // a number - tokens.push(token); - token = ''; - } - switch (octet) { - case 0x5B: - // begin list parsing - tokens.push(beginArrayToken); - break; - case 0x5D: - // collect array items - var items = [], item; - while (tokens.length && - (item = tokens.pop()) != beginArrayToken) - items.unshift(item); - tokens.push(items); - break; - } - } else if (octet == 0x3E) { - if (token.length) { - // Heuristic: guessing chars size by checking numbers sizes - // in the CMap entries. - if (token.length == 2 && properties.composite) - properties.wideChars = false; - - if (token.length <= 4) { - // parsing hex number - tokens.push(parseInt(token, 16)); - token = ''; - } else { - // parsing hex UTF-16BE numbers - var str = []; - for (var k = 0, kk = token.length; k < kk; k += 4) { - var b = parseInt(token.substr(k, 4), 16); - if (b <= 0x10) { - k += 4; - b = (b << 16) | parseInt(token.substr(k, 4), 16); - b -= 0x10000; - str.push(0xD800 | (b >> 10)); - str.push(0xDC00 | (b & 0x3FF)); - break; - } - str.push(b); - } - tokens.push(String.fromCharCode.apply(String, str)); - token = ''; - } - } - } else { - token += String.fromCharCode(octet); - } - } - } - return charToUnicode; - }, - readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { - // Extract the encoding from the CIDToGIDMap - var glyphsData = cidToGidStream.getBytes(); - - // Set encoding 0 to later verify the font has an encoding - var result = []; - for (var j = 0, jj = glyphsData.length; j < jj; j++) { - var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; - if (glyphID == 0) - continue; - - var code = j >> 1; - result[code] = glyphID; - } - return result; - }, - - extractWidths: function PartialEvaluator_extractWidths(dict, - xref, - descriptor, - properties) { - var glyphsWidths = []; - var defaultWidth = 0; - if (properties.composite) { - defaultWidth = dict.get('DW') || 1000; - - var widths = dict.get('W'); - if (widths) { - var start = 0, end = 0; - for (var i = 0, ii = widths.length; i < ii; i++) { - var code = widths[i]; - if (isArray(code)) { - for (var j = 0, jj = code.length; j < jj; j++) - glyphsWidths[start++] = code[j]; - start = 0; - } else if (start) { - var width = widths[++i]; - for (var j = start; j <= code; j++) - glyphsWidths[j] = width; - start = 0; - } else { - start = code; - } - } - } - } else { - var firstChar = properties.firstChar; - var widths = dict.get('Widths'); - if (widths) { - var j = firstChar; - for (var i = 0, ii = widths.length; i < ii; i++) - glyphsWidths[j++] = widths[i]; - defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0; - } else { - // Trying get the BaseFont metrics (see comment above). - var baseFontName = dict.get('BaseFont'); - if (isName(baseFontName)) { - var metrics = this.getBaseFontMetrics(baseFontName.name); - - glyphsWidths = metrics.widths; - defaultWidth = metrics.defaultWidth; - } - } - } - - properties.defaultWidth = defaultWidth; - properties.widths = glyphsWidths; - }, - - getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { - var defaultWidth = 0, widths = []; - var glyphWidths = Metrics[stdFontMap[name] || name]; - if (isNum(glyphWidths)) { - defaultWidth = glyphWidths; - } else { - widths = glyphWidths; - } - - return { - defaultWidth: defaultWidth, - widths: widths - }; - }, - - translateFont: function PartialEvaluator_translateFont(dict, - xref, - resources, - dependency) { - var baseDict = dict; - var type = dict.get('Subtype'); - assertWellFormed(isName(type), 'invalid font Subtype'); - - var composite = false; - if (type.name == 'Type0') { - // If font is a composite - // - get the descendant font - // - set the type according to the descendant font - // - get the FontDescriptor from the descendant font - var df = dict.get('DescendantFonts'); - if (!df) - return null; - - dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; - - type = dict.get('Subtype'); - assertWellFormed(isName(type), 'invalid font Subtype'); - composite = true; - } - var maxCharIndex = composite ? 0xFFFF : 0xFF; - - var descriptor = dict.get('FontDescriptor'); - if (!descriptor) { - if (type.name == 'Type3') { - // FontDescriptor is only required for Type3 fonts when the document - // is a tagged pdf. Create a barbebones one to get by. - descriptor = new Dict(); - descriptor.set('FontName', new Name(type.name)); - } else { - // Before PDF 1.5 if the font was one of the base 14 fonts, having a - // FontDescriptor was not required. - // This case is here for compatibility. - var baseFontName = dict.get('BaseFont'); - if (!isName(baseFontName)) - return null; - - // Using base font name as a font name. - baseFontName = baseFontName.name.replace(/[,_]/g, '-'); - var metrics = this.getBaseFontMetrics(baseFontName); - - // Simulating descriptor flags attribute - var fontNameWoStyle = baseFontName.split('-')[0]; - var flags = (serifFonts[fontNameWoStyle] || - (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) | - (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : - FontFlags.Nonsymbolic); - - var properties = { - type: type.name, - widths: metrics.widths, - defaultWidth: metrics.defaultWidth, - flags: flags, - firstChar: 0, - lastChar: maxCharIndex - }; - this.extractDataStructures(dict, dict, xref, properties); - - return { - name: baseFontName, - dict: baseDict, - properties: properties - }; - } - } - - // According to the spec if 'FontDescriptor' is declared, 'FirstChar', - // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem - // to ignore this rule when a variant of a standart font is used. - // TODO Fill the width array depending on which of the base font this is - // a variant. - var firstChar = dict.get('FirstChar') || 0; - var lastChar = dict.get('LastChar') || maxCharIndex; - var fontName = descriptor.get('FontName'); - // Some bad pdf's have a string as the font name. - if (isString(fontName)) - fontName = new Name(fontName); - assertWellFormed(isName(fontName), 'invalid font name'); - - var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); - if (fontFile) { - if (fontFile.dict) { - var subtype = fontFile.dict.get('Subtype'); - if (subtype) - subtype = subtype.name; - - var length1 = fontFile.dict.get('Length1'); - - var length2 = fontFile.dict.get('Length2'); - } - } - - var properties = { - type: type.name, - subtype: subtype, - file: fontFile, - length1: length1, - length2: length2, - composite: composite, - wideChars: composite, - fixedPitch: false, - fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX, - firstChar: firstChar || 0, - lastChar: lastChar || maxCharIndex, - bbox: descriptor.get('FontBBox'), - ascent: descriptor.get('Ascent'), - descent: descriptor.get('Descent'), - xHeight: descriptor.get('XHeight'), - capHeight: descriptor.get('CapHeight'), - flags: descriptor.get('Flags'), - italicAngle: descriptor.get('ItalicAngle'), - coded: false - }; - this.extractWidths(dict, xref, descriptor, properties); - this.extractDataStructures(dict, baseDict, xref, properties); - - if (type.name === 'Type3') { - properties.coded = true; - var charProcs = dict.get('CharProcs').getAll(); - var fontResources = dict.get('Resources') || resources; - properties.charProcOperatorList = {}; - for (var key in charProcs) { - var glyphStream = charProcs[key]; - properties.charProcOperatorList[key] = - this.getOperatorList(glyphStream, fontResources, dependency); - } - } - - return { - name: fontName.name, - dict: baseDict, - file: fontFile, - properties: properties - }; - } - }; - - return PartialEvaluator; -})(); - -var EvalState = (function EvalStateClosure() { - function EvalState() { - // Are soft masks and alpha values shapes or opacities? - this.alphaIsShape = false; - this.fontSize = 0; - this.textMatrix = IDENTITY_MATRIX; - this.leading = 0; - // Start of text line (in text coordinates) - this.lineX = 0; - this.lineY = 0; - // Character and word spacing - this.charSpacing = 0; - this.wordSpacing = 0; - this.textHScale = 1; - // Color spaces - this.fillColorSpace = null; - this.strokeColorSpace = null; - } - EvalState.prototype = { - }; - return EvalState; -})(); - - -/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ - -'use strict'; - -/** - * Maximum time to wait for a font to be loaded by font-face rules. - */ -var kMaxWaitForFontFace = 1000; - -// Unicode Private Use Area -var kCmapGlyphOffset = 0xE000; -var kSizeOfGlyphArea = 0x1900; -var kSymbolicFontGlyphOffset = 0xF000; - -// PDF Glyph Space Units are one Thousandth of a TextSpace Unit -// except for Type 3 fonts -var kPDFGlyphSpaceUnits = 1000; - -// Until hinting is fully supported this constant can be used -var kHintingEnabled = false; - -var FontFlags = { - FixedPitch: 1, - Serif: 2, - Symbolic: 4, - Script: 8, - Nonsymbolic: 32, - Italic: 64, - AllCap: 65536, - SmallCap: 131072, - ForceBold: 262144 -}; - -var Encodings = { - ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', - 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', - 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', - 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', - 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', - 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', - 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', - 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', - 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', - 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', - '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', - 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', - 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', - 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', - 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', - 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', - 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', - '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', - 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', - 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', - 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', - 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', - 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', - 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', - 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', - 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', - 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', - 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', - 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', - 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', - 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', - 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', - 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', - 'Ydieresissmall'], - MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', - 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', - 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', - 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', - 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', - 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', - 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', - 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', - 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', - 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', - 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', - 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', - 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', - 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', - 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', - 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', - 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', - 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', - 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', - 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', - 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', - 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', - 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', - 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', - 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', - 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', - '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', - 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', - 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', - 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', - 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', - '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', - 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', - 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'], - MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', - 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', - 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', - 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', - 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', - 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', - 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', - 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', - 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', - 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', - 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', - 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', - 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', - 'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE', - 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', - 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', - 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', - 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', - 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', - 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', - 'ogonek', 'caron'], - StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', - 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', - 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', - 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', - 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', - 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', - 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', - 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', - 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', - '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', - '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', - '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'], - WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', - 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', - 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', - 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', - 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', - 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', - 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', - 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', - 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', - 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', - 'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling', - 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', - 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', - 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', - 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', - 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', - 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', - 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', - 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', - 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', - 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', - 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', - 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', - 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', - 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', - 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', - 'ydieresis'], - symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', - 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', - 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', - 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', - 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', - 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', - 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', - 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', - 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', - 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', - 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', - 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', - 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', - 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', - 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', - 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', - 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', - 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', - 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', - 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', - 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', - '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', - 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', - 'bracerightbt'], - zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', - 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', - 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', - 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', - 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', - 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', - 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', - 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', - 'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', - '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', - 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', - 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', - 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', - 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', - 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', - 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', - 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', - 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', - 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', - 'a188', 'a189', 'a190', 'a191'] -}; - -/** - * Hold a map of decoded fonts and of the standard fourteen Type1 - * fonts and their acronyms. - */ -var stdFontMap = { - 'ArialNarrow': 'Helvetica', - 'ArialNarrow-Bold': 'Helvetica-Bold', - 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', - 'ArialNarrow-Italic': 'Helvetica-Oblique', - 'ArialBlack': 'Helvetica', - 'ArialBlack-Bold': 'Helvetica-Bold', - 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', - 'ArialBlack-Italic': 'Helvetica-Oblique', - 'Arial': 'Helvetica', - 'Arial-Bold': 'Helvetica-Bold', - 'Arial-BoldItalic': 'Helvetica-BoldOblique', - 'Arial-Italic': 'Helvetica-Oblique', - 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', - 'Arial-BoldMT': 'Helvetica-Bold', - 'Arial-ItalicMT': 'Helvetica-Oblique', - 'ArialMT': 'Helvetica', - 'Courier-Bold': 'Courier-Bold', - 'Courier-BoldItalic': 'Courier-BoldOblique', - 'Courier-Italic': 'Courier-Oblique', - 'CourierNew': 'Courier', - 'CourierNew-Bold': 'Courier-Bold', - 'CourierNew-BoldItalic': 'Courier-BoldOblique', - 'CourierNew-Italic': 'Courier-Oblique', - 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', - 'CourierNewPS-BoldMT': 'Courier-Bold', - 'CourierNewPS-ItalicMT': 'Courier-Oblique', - 'CourierNewPSMT': 'Courier', - 'Helvetica-Bold': 'Helvetica-Bold', - 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', - 'Helvetica-Italic': 'Helvetica-Oblique', - 'Symbol-Bold': 'Symbol', - 'Symbol-BoldItalic': 'Symbol', - 'Symbol-Italic': 'Symbol', - 'TimesNewRoman': 'Times-Roman', - 'TimesNewRoman-Bold': 'Times-Bold', - 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', - 'TimesNewRoman-Italic': 'Times-Italic', - 'TimesNewRomanPS': 'Times-Roman', - 'TimesNewRomanPS-Bold': 'Times-Bold', - 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', - 'TimesNewRomanPS-BoldMT': 'Times-Bold', - 'TimesNewRomanPS-Italic': 'Times-Italic', - 'TimesNewRomanPS-ItalicMT': 'Times-Italic', - 'TimesNewRomanPSMT': 'Times-Roman', - 'TimesNewRomanPSMT-Bold': 'Times-Bold', - 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', - 'TimesNewRomanPSMT-Italic': 'Times-Italic' -}; - -/** - * Holds the map of the non-standard fonts that might be included as a standard - * fonts without glyph data. - */ -var nonStdFontMap = { - 'ComicSansMS': 'Comic Sans MS', - 'ComicSansMS-Bold': 'Comic Sans MS-Bold', - 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', - 'ComicSansMS-Italic': 'Comic Sans MS-Italic', - 'LucidaConsole': 'Courier', - 'LucidaConsole-Bold': 'Courier-Bold', - 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', - 'LucidaConsole-Italic': 'Courier-Oblique' -}; - -var serifFonts = { - 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, - 'Aldus': true, 'Alexandria': true, 'Algerian': true, - 'American Typewriter': true, 'Antiqua': true, 'Apex': true, - 'Arno': true, 'Aster': true, 'Aurora': true, - 'Baskerville': true, 'Bell': true, 'Bembo': true, - 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, - 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, - 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, - 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, - 'Calvert': true, 'Capitals': true, 'Cambria': true, - 'Cartier': true, 'Caslon': true, 'Catull': true, - 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, - 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, - 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, - 'Cochin': true, 'Colonna': true, 'Computer Modern': true, - 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, - 'Corona': true, 'Ecotype': true, 'Egyptienne': true, - 'Elephant': true, 'Excelsior': true, 'Fairfield': true, - 'FF Scala': true, 'Folkard': true, 'Footlight': true, - 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, - 'Gentium': true, 'Georgia': true, 'Gloucester': true, - 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, - 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, - 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, - 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, - 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, - 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, - 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, - 'Lucida Bright': true, 'Melior': true, 'Memphis': true, - 'Miller': true, 'Minion': true, 'Modern': true, - 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, - 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, - 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, - 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, - 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, - 'Requiem': true, 'Rockwell': true, 'Roman': true, - 'Rotis Serif': true, 'Sabon': true, 'Scala': true, - 'Seagull': true, 'Sistina': true, 'Souvenir': true, - 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, - 'Sylfaen': true, 'Times': true, 'Trajan': true, - 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true, - 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, - 'Versailles': true, 'Wanted': true, 'Weiss': true, - 'Wide Latin': true, 'Windsor': true, 'XITS': true -}; - -var symbolsFonts = { - 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true -}; - -// Some characters, e.g. copyrightserif, mapped to the private use area and -// might not be displayed using standard fonts. Mapping/hacking well-known chars -// to the similar equivalents in the normal characters range. -function mapPrivateUseChars(code) { - switch (code) { - case 0xF8E9: // copyrightsans - case 0xF6D9: // copyrightserif - return 0x00A9; // copyright - default: - return code; - } -} - -var FontLoader = { - listeningForFontLoad: false, - - bind: function fontLoaderBind(fonts, callback) { - function checkFontsLoaded() { - for (var i = 0, ii = fonts.length; i < ii; i++) { - var fontObj = fonts[i]; - if (fontObj.loading) { - return false; - } - } - - document.documentElement.removeEventListener( - 'pdfjsFontLoad', checkFontsLoaded, false); - - callback(); - return true; - } - - var rules = [], names = [], fontsToLoad = []; - var fontCreateTimer = 0; - - for (var i = 0, ii = fonts.length; i < ii; i++) { - var font = fonts[i]; - - // Add the font to the DOM only once or skip if the font - // is already loaded. - if (font.attached || font.loading == false) { - continue; - } - font.attached = true; - - fontsToLoad.push(font); - - var str = ''; - var data = font.data; - if (data) { - var length = data.length; - for (var j = 0; j < length; j++) - str += String.fromCharCode(data[j]); - - var rule = font.bindDOM(str); - if (rule) { - rules.push(rule); - names.push(font.loadedName); - } - } - } - - this.listeningForFontLoad = false; - if (!isWorker && rules.length) { - FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad); - } - - if (!checkFontsLoaded()) { - document.documentElement.addEventListener( - 'pdfjsFontLoad', checkFontsLoaded, false); - } - }, - // Set things up so that at least one pdfjsFontLoad event is - // dispatched when all the @font-face |rules| for |names| have been - // loaded in a subdocument. It's expected that the load of |rules| - // has already started in this (outer) document, so that they should - // be ordered before the load in the subdocument. - prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names, - fonts) { - /** Hack begin */ - // There's no event when a font has finished downloading so the - // following code is a dirty hack to 'guess' when a font is - // ready. This code will be obsoleted by Mozilla bug 471915. - // - // The only reliable way to know if a font is loaded in Gecko - // (at the moment) is document.onload in a document with - // a @font-face rule defined in a "static" stylesheet. We use a - // subdocument in an