├── adminer ├── include │ ├── version.inc.php │ ├── tmpfile.inc.php │ ├── coverage.inc.php │ ├── pdo.inc.php │ ├── xxtea.inc.php │ ├── driver.inc.php │ ├── bootstrap.inc.php │ ├── connect.inc.php │ ├── design.inc.php │ └── lang.inc.php ├── static │ ├── down.gif │ ├── plus.gif │ ├── up.gif │ ├── arrow.gif │ ├── cross.gif │ ├── favicon.ico │ └── default.css ├── download.inc.php ├── variables.inc.php ├── type.inc.php ├── lang │ └── en.inc.php ├── sequence.inc.php ├── scheme.inc.php ├── privileges.inc.php ├── script.inc.php ├── file.inc.php ├── view.inc.php ├── processlist.inc.php ├── procedure.inc.php ├── trigger.inc.php ├── call.inc.php ├── index.php ├── plugin.php ├── database.inc.php ├── event.inc.php ├── edit.inc.php ├── foreign.inc.php ├── table.inc.php ├── schema.inc.php └── indexes.inc.php ├── .gitignore ├── editor ├── include │ ├── connect.inc.php │ └── editing.inc.php ├── script.inc.php ├── index.php ├── static │ └── editing.js ├── db.inc.php └── example.php ├── designs ├── readme.txt ├── price │ └── adminer.css ├── pilot │ └── adminer.css ├── jukin │ └── adminer.css ├── brade │ └── adminer.css ├── ng9 │ └── adminer.css └── kahi │ └── adminer.css ├── plugins ├── readme.txt ├── version-noverify.php ├── links-direct.php ├── edit-textarea.php ├── dump-date.php ├── frames.php ├── database-hide.php ├── sql-log.php ├── login-table.php ├── dump-bz2.php ├── enum-option.php ├── master-slave.php ├── edit-foreign.php ├── dump-php.php ├── tables-filter.php ├── dump-zip.php ├── json-column.php ├── slugify.php ├── dump-json.php ├── dump-xml.php ├── translation.php ├── login-servers.php ├── file-upload.php ├── email-table.php ├── edit-calendar.php ├── wymeditor.php └── tinymce.php ├── tests ├── iexplore.bat ├── 21-variables.html ├── 22-history.html ├── 16-processlist.html ├── 11-reference.html ├── 12-update.html ├── 24-explain.html ├── 14-truncate.html ├── logout.html ├── 10-clone.html ├── 7-create-trigger.html ├── 1-create-database.html ├── 8-create-view.html ├── 5-foreign-key.html ├── 13-delete.html ├── 0-login.html ├── 9-insert.html ├── 6-alter-table.html ├── 17-export.html ├── 3-create-index.html ├── 18-events.html ├── 23-editor.html ├── 2-create-table.html ├── selenium.html ├── 20-partitioning.html ├── 4-create-table-2.html ├── 15-privileges.html └── 19-procedures.html ├── .gitmodules ├── readme.txt ├── composer.json ├── lang.php ├── todo.txt └── coverage.php /adminer/include/version.inc.php: -------------------------------------------------------------------------------- 1 | select_db($adminer->database()); 3 | -------------------------------------------------------------------------------- /designs/readme.txt: -------------------------------------------------------------------------------- 1 | Copy adminer.css alongside Adminer PHP script to use an alternative design. 2 | -------------------------------------------------------------------------------- /adminer/static/down.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/down.gif -------------------------------------------------------------------------------- /adminer/static/plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/plus.gif -------------------------------------------------------------------------------- /adminer/static/up.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/up.gif -------------------------------------------------------------------------------- /adminer/static/arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/arrow.gif -------------------------------------------------------------------------------- /adminer/static/cross.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/cross.gif -------------------------------------------------------------------------------- /designs/price/adminer.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/designs/price/adminer.css -------------------------------------------------------------------------------- /adminer/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/natanfelles/adminer/master/adminer/static/favicon.ico -------------------------------------------------------------------------------- /plugins/readme.txt: -------------------------------------------------------------------------------- 1 | ../adminer/plugin.php - demo usage 2 | https://www.adminer.org/plugins/ - documentation 3 | -------------------------------------------------------------------------------- /tests/iexplore.bat: -------------------------------------------------------------------------------- 1 | java -jar "C:\Program Files\Selenium\selenium-server.jar" -htmlSuite "*iexplore" http://localhost/adminer/ "%CD%\selenium.html" results.html -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "jush"] 2 | path = externals/jush 3 | url = git://git.code.sf.net/p/jush/git 4 | [submodule "wymeditor"] 5 | path = externals/wymeditor 6 | url = git://github.com/wymeditor/wymeditor.git 7 | [submodule "JsShrink"] 8 | path = externals/JsShrink 9 | url = git://github.com/vrana/JsShrink.git 10 | -------------------------------------------------------------------------------- /adminer/include/tmpfile.inc.php: -------------------------------------------------------------------------------- 1 | handler = tmpfile(); 9 | } 10 | 11 | function write($contents) { 12 | $this->size += strlen($contents); 13 | fwrite($this->handler, $contents); 14 | } 15 | 16 | function send() { 17 | fseek($this->handler, 0); 18 | fpassthru($this->handler); 19 | fclose($this->handler); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /adminer/download.inc.php: -------------------------------------------------------------------------------- 1 | select($TABLE, $select, array(where($_GET, $fields)), $select); 8 | $row = ($result ? $result->fetch_row() : array()); 9 | echo $row[0]; 10 | exit; // don't output footer 11 | -------------------------------------------------------------------------------- /adminer/variables.inc.php: -------------------------------------------------------------------------------- 1 | " . lang('No rows.') . "\n"; 8 | } else { 9 | echo "\n"; 10 | foreach ($variables as $key => $val) { 11 | echo ""; 12 | echo "
" . h($key) . ""; 13 | echo "" . nbsp($val); 14 | } 15 | echo "
\n"; 16 | } 17 | -------------------------------------------------------------------------------- /plugins/version-noverify.php: -------------------------------------------------------------------------------- 1 | 13 | 17 | for char and varchar 4 | * @link https://www.adminer.org/plugins/#use 5 | * @author Jakub Vrana, http://www.vrana.cz/ 6 | * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0 7 | * @license http://www.gnu.org/licenses/gpl-2.0.html GNU General Public License, version 2 (one or other) 8 | */ 9 | class AdminerEditTextarea { 10 | 11 | function editInput($table, $field, $attrs, $value) { 12 | if (preg_match('~char~', $field["type"])) { 13 | return "'; 14 | } 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /plugins/dump-date.php: -------------------------------------------------------------------------------- 1 | result("SELECT NOW()")); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /readme.txt: -------------------------------------------------------------------------------- 1 | Adminer - Database management in a single PHP file 2 | Adminer Editor - Data manipulation for end-users 3 | 4 | https://www.adminer.org/ 5 | Supports: MySQL, PostgreSQL, SQLite, MS SQL, Oracle, SimpleDB, Elasticsearch 6 | Requirements: PHP 5+ 7 | Apache License 2.0 or GPL 2 8 | 9 | adminer/index.php - Run development version of Adminer 10 | editor/index.php - Run development version of Adminer Editor 11 | editor/example.php - Example customization 12 | plugins/readme.txt - Plugins for Adminer and Adminer Editor 13 | adminer/plugin.php - Plugin demo 14 | compile.php - Create a single file version 15 | lang.php - Update translations 16 | tests/selenium.html - Selenium test suite 17 | -------------------------------------------------------------------------------- /adminer/include/coverage.inc.php: -------------------------------------------------------------------------------- 1 | $lines) { 8 | foreach ($lines as $l => $val) { 9 | if (!$coverage[$filename][$l] || $val > 0) { 10 | $coverage[$filename][$l] = $val; 11 | } 12 | } 13 | file_put_contents($coverage_filename, serialize($coverage)); 14 | } 15 | } 16 | xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); 17 | register_shutdown_function('save_coverage'); 18 | } 19 | -------------------------------------------------------------------------------- /editor/script.inc.php: -------------------------------------------------------------------------------- 1 | query("KILL " . number($_POST["kill"])); 4 | 5 | } elseif (list($table, $id, $name) = $adminer->_foreignColumn(column_foreign_keys($_GET["source"]), $_GET["field"])) { 6 | $limit = 11; 7 | $result = $connection->query("SELECT $id, $name FROM " . table($table) . " WHERE " . (preg_match('~^[0-9]+$~', $_GET["value"]) ? "$id = $_GET[value] OR " : "") . "$name LIKE " . q("$_GET[value]%") . " ORDER BY 2 LIMIT $limit"); 8 | for ($i=1; ($row = $result->fetch_row()) && $i < $limit; $i++) { 9 | echo "" . h($row[1]) . "
\n"; 10 | } 11 | if ($row) { 12 | echo "...\n"; 13 | } 14 | } 15 | 16 | exit; // don't print footer 17 | -------------------------------------------------------------------------------- /plugins/frames.php: -------------------------------------------------------------------------------- 1 | sameOrigin = $sameOrigin; 18 | } 19 | 20 | function headers() { 21 | if ($this->sameOrigin) { 22 | header("X-Frame-Options: SameOrigin"); 23 | } 24 | header("X-XSS-Protection: 0"); 25 | return false; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /tests/21-variables.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Variables 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
Variables
openadminer/?username=ODBC&variables=
verifyTextPresentbasedir
25 | 26 | 27 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vrana/adminer", 3 | "description": "Database management in a single PHP file.", 4 | "homepage": "https://www.adminer.org/", 5 | "keywords": [ 6 | "database" 7 | ], 8 | "support": { 9 | "issues": "https://sourceforge.net/p/adminer/bugs-and-features/", 10 | "forum": "https://sourceforge.net/p/adminer/discussion/", 11 | "source": "https://github.com/vrana/adminer/" 12 | }, 13 | "authors": [ 14 | { 15 | "name": "Jakub Vrána", 16 | "homepage": "http://www.vrana.cz/" 17 | } 18 | ], 19 | "autoload": { 20 | "classmap": [ 21 | "plugins/" 22 | ] 23 | }, 24 | "license": [ 25 | "Apache-2.0", 26 | "GPL-2.0" 27 | ], 28 | "scripts": { 29 | "compile": "php compile.php" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /tests/22-history.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | History 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
History
openadminer/?username=ODBC&sql=
verifyTextPresentDROP DATABASE IF EXISTS adminer_test
25 | 26 | 27 | -------------------------------------------------------------------------------- /tests/16-processlist.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Process list 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
Process list
openadminer/?username=ODBC&processlist=
verifyTextPresentSHOW FULL PROCESSLIST
25 | 26 | 27 | -------------------------------------------------------------------------------- /plugins/database-hide.php: -------------------------------------------------------------------------------- 1 | disabled = array_map('strtolower', $disabled); 17 | } 18 | 19 | function databases($flush = true) { 20 | $return = array(); 21 | foreach (get_databases($flush) as $db) { 22 | if (!in_array(strtolower($db), $this->disabled)) { 23 | $return[] = $db; 24 | } 25 | } 26 | return $return; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /tests/11-reference.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Reference 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
Reference
openadminer/?username=ODBC&db=adminer_test&select=albums
clickAndWaitlink=1
verifyTextPresentMichael Jackson
30 | 31 | 32 | -------------------------------------------------------------------------------- /adminer/type.inc.php: -------------------------------------------------------------------------------- 1 | 20 | 21 |
22 |

23 | \n"; 26 | } else { 27 | echo "\n"; 28 | textarea("as", $row["as"]); 29 | echo "

\n"; 30 | } 31 | ?> 32 | 33 |

34 | -------------------------------------------------------------------------------- /plugins/sql-log.php: -------------------------------------------------------------------------------- 1 | filename = $filename; 18 | } 19 | 20 | function messageQuery($query, $time) { 21 | if ($this->filename == "") { 22 | $adminer = adminer(); 23 | $this->filename = $adminer->database() . ".sql"; // no database goes to ".sql" to avoid collisions 24 | } 25 | $fp = fopen($this->filename, "a"); 26 | flock($fp, LOCK_EX); 27 | fwrite($fp, $query); 28 | fwrite($fp, "\n\n"); 29 | flock($fp, LOCK_UN); 30 | fclose($fp); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /tests/12-update.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Update 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
Update
openadminer/?username=ODBC&db=adminer_test&edit=albums&where%5Bid%5D=2
typefields[title]Black or White
clickAndWait//input[@value='Save']
verifyTextPresentItem has been updated.
35 | 36 | 37 | -------------------------------------------------------------------------------- /editor/index.php: -------------------------------------------------------------------------------- 1 | database = $database; 27 | } 28 | 29 | function login($login, $password) { 30 | $connection = connection(); 31 | return (bool) $connection->result("SELECT COUNT(*) FROM " . idf_escape($this->database) . ".login WHERE login = " . q($login) . " AND password_sha1 = " . q(sha1($password))); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /tests/24-explain.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Explain 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
Explain
openadminer/?username=ODBC&db=adminer_test&select=albums
clickAndWaitlink=Edit
clickAndWait//input[@value='Execute']
clicklink=EXPLAIN
verifyTextPresentpossible_keys
40 | 41 | 42 | -------------------------------------------------------------------------------- /adminer/lang/en.inc.php: -------------------------------------------------------------------------------- 1 | array('Too many unsuccessful logins, try again in %d minute.', 'Too many unsuccessful logins, try again in %d minutes.'), 4 | 'Query executed OK, %d row(s) affected.' => array('Query executed OK, %d row affected.', 'Query executed OK, %d rows affected.'), 5 | '%d byte(s)' => array('%d byte', '%d bytes'), 6 | 'Routine has been called, %d row(s) affected.' => array('Routine has been called, %d row affected.', 'Routine has been called, %d rows affected.'), 7 | '%d process(es) have been killed.' => array('%d process has been killed.', '%d processes have been killed.'), 8 | '%d / ' => '%d / ', 9 | '%d row(s)' => array('%d row', '%d rows'), 10 | '%d item(s) have been affected.' => array('%d item has been affected.', '%d items have been affected.'), 11 | '%d row(s) have been imported.' => array('%d row has been imported.', '%d rows have been imported.'), 12 | '%d e-mail(s) have been sent.' => array('%d e-mail has been sent.', '%d e-mails have been sent.'), 13 | '%d in total' => '%d in total', 14 | '%d query(s) executed OK.' => array('%d query executed OK.', '%d queries executed OK.'), 15 | ); 16 | -------------------------------------------------------------------------------- /tests/14-truncate.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Truncate 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
Truncate
openadminer/?username=ODBC&db=adminer_test&select=albums
clickall
waitForCheckedall
clickAndWaitdelete
assertConfirmationAre you sure?
verifyTextPresentNo rows.
45 | 46 | 47 | -------------------------------------------------------------------------------- /tests/logout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Logout 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
Logout
openadminer/?username=ODBC
clickAndWaitlogout
verifyTextPresentLogout successful.
selectAndWait//select[@name='lang']label=Čeština
verifyTextPresentPřihlásit se
opencoverage.php
46 | 47 | 48 | -------------------------------------------------------------------------------- /plugins/dump-bz2.php: -------------------------------------------------------------------------------- 1 | 'bzip2'); 19 | } 20 | 21 | function _bz2($string, $state) { 22 | bzwrite($this->fp, $string); 23 | if ($state & PHP_OUTPUT_HANDLER_END) { 24 | bzclose($this->fp); 25 | $return = file_get_contents($this->filename); 26 | unlink($this->filename); 27 | return $return; 28 | } 29 | return ""; 30 | } 31 | 32 | function dumpHeaders($identifier, $multi_table = false) { 33 | if ($_POST["output"] == "bz2") { 34 | $this->filename = tempnam("", "bz2"); 35 | $this->fp = bzopen($this->filename, 'w'); 36 | header("Content-Type: application/x-bzip"); 37 | ob_start(array($this, '_bz2'), 1e6); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /tests/10-clone.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Clone 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
Clone
openadminer/?username=ODBC&db=adminer_test&select=albums
clickcheck[]
clickAndWaitclone
typefields[title]Black and White
clickAndWait//input[@value='Save']
verifyTextPresentItem 2 has been inserted.
45 | 46 | 47 | -------------------------------------------------------------------------------- /tests/7-create-trigger.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Create trigger 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
Create trigger
openadminer/?username=ODBC&db=adminer_test&trigger=albums
selectTiminglabel=AFTER
typeStatementUPDATE interprets SET albums = albums + 1 WHERE id = NEW.interpret
clickAndWait//input[@value='Save']
verifyTextPresentTrigger has been created.
40 | 41 | 42 | -------------------------------------------------------------------------------- /tests/1-create-database.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Create database 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
Create database
openadminer/?username=ODBC
clickAndWaitlink=Create new database
typenameadminer_test
selectcollationlabel=utf8_general_ci
clickAndWait//input[@value='Save']
verifyTextPresentDatabase has been created.
45 | 46 | 47 | -------------------------------------------------------------------------------- /adminer/sequence.inc.php: -------------------------------------------------------------------------------- 1 | 25 | 26 |
27 |

" autocapitalize="off"> 28 | 29 | \n"; 32 | } 33 | ?> 34 | 35 |

36 | -------------------------------------------------------------------------------- /tests/8-create-view.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Create view 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 |
Create view
openadminer/?username=ODBC&db=adminer_test&view=
typeselectSELECT albums.id, albums.title, interprets.name
FROM albums
LEFT JOIN interprets ON albums.interpret = interprets.id
typenamealbums_interprets
clickAndWait//input[@value='Save']
verifyTextPresentView has been created.
40 | 41 | 42 | -------------------------------------------------------------------------------- /tests/5-foreign-key.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Foreign key 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
Foreign key
openadminer/?username=ODBC&db=adminer_test&table=albums
clickAndWaitlink=Add foreign key
selectAndWaittablelabel=interprets
selectsource[0]label=interpret
clickAndWait//input[@value='Save']
verifyTextPresentForeign key has been created.
45 | 46 | 47 | -------------------------------------------------------------------------------- /plugins/enum-option.php: -------------------------------------------------------------------------------- 1 |