Update to SMF 2.1.3 - Installation Instructions for 2.1.2

Update to SMF 2.1.3
SMF 2.1.3

SMF 2.1.3 includes various bug fixes and security updates.

File Edits ALT + Click to collapse all the operations

./SSI.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
define('SMF_VERSION', '2.1.2');
Replace With: Select
define('SMF_VERSION', '2.1.3');
Find: Select
global $auth_secret;
Replace With: Select
global $auth_secret, $cache_accelerator, $cache_memcached;

./Sources/Cache/APIs/FileBased.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
if (($fp = fopen($file, 'rb')) !== false)
Replace With: Select
if (file_exists($file) && ($fp = fopen($file, 'rb')) !== false)
Find: Select
if (($value = smf_json_decode($raw, true, false)) !== array() && $value['expiration'] >= time())
Replace With: Select
if (($value = smf_json_decode($raw, true, false)) !== array() && isset($value['expiration']) && $value['expiration'] >= time())

./Sources/Class-Punycode.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
const DELIMITER = '-';

Add After: Select
/**
* IDNA Error constants
*/
const IDNA_ERROR_EMPTY_LABEL = 1;
const IDNA_ERROR_LABEL_TOO_LONG = 2;
const IDNA_ERROR_DOMAIN_NAME_TOO_LONG = 4;
const IDNA_ERROR_LEADING_HYPHEN = 8;
const IDNA_ERROR_TRAILING_HYPHEN = 16;
const IDNA_ERROR_HYPHEN_3_4 = 32;
const IDNA_ERROR_LEADING_COMBINING_MARK = 64;
const IDNA_ERROR_DISALLOWED = 128;
const IDNA_ERROR_PUNYCODE = 256;
const IDNA_ERROR_LABEL_HAS_DOT = 512;
const IDNA_ERROR_INVALID_ACE_LABEL = 1024;
const IDNA_ERROR_BIDI = 2048;
const IDNA_ERROR_CONTEXTJ = 4096;

Find: Select
protected $encoding;

Add After: Select
/**
* Whether to use Non-Transitional Processing.
* Setting this to true breaks backward compatibility with IDNA2003.
*
* @param bool
*/
protected $nonTransitional = false;

/**
* Whether to use STD3 ASCII rules.
*
* @param bool
*/
protected $std3 = false;

Find: Select
/**
* Encode a domain to its Punycode version
Add Before: Select
/**
* Enable/disable Non-Transitional Processing
*
* @param bool $nonTransitional Whether to use Non-Transitional Processing
*/
public function useNonTransitional(bool $nonTransitional)
{
$this->nonTransitional = $nonTransitional;
}

/**
* Enable/disable STD3 ASCII rules
*
* @param bool $std3 Whether to use STD3 ASCII rules
*/
public function useStd3(bool $std3)
{
$this->std3 = $std3;
}

Find: Select
$input = mb_strtolower($input, $this->encoding);
$parts = explode('.', $input);
foreach ($parts as &$part) {
Replace With: Select
// For compatibility with idn_to_* functions
if ($this->decode($input) === false)
return false;

$errors = array();
$preprocessed = $this->preprocess($input, $errors);

if (!empty($errors))
{
return false;
}

$parts = explode('.', $preprocessed);
foreach ($parts as $p => &$part) {
Find: Select
$part = $this->encodePart($part);
Add After: Select

$validation_status = $this->validateLabel($part, true);

switch ($validation_status) {
case self::IDNA_ERROR_LABEL_TOO_LONG:
case self::IDNA_ERROR_LEADING_HYPHEN:
case self::IDNA_ERROR_TRAILING_HYPHEN:
case self::IDNA_ERROR_LEADING_COMBINING_MARK:
case self::IDNA_ERROR_DISALLOWED:
case self::IDNA_ERROR_PUNYCODE:
case self::IDNA_ERROR_LABEL_HAS_DOT:
case self::IDNA_ERROR_INVALID_ACE_LABEL:
case self::IDNA_ERROR_BIDI:
case self::IDNA_ERROR_CONTEXTJ:
return false;
break;

case self::IDNA_ERROR_HYPHEN_3_4:
$part = $parts[$p];
break;

case self::IDNA_ERROR_EMPTY_LABEL:
$parts_count = count($parts);
if ($parts_count === 1 || $p !== $parts_count - 1)
return false;
break;

default:
break;
}
Find: Select
$length = strlen($output);
Replace With: Select

// IDNA_ERROR_DOMAIN_NAME_TOO_LONG
if (strlen(rtrim($output, '.')) > 253)
return false;
Find: Select
{
$input = strtolower($input);
$parts = explode('.', $input);
foreach ($parts as &$part)
Replace With: Select
{
$errors = array();
$preprocessed = $this->preprocess($input, $errors);

if (!empty($errors))
Find: Select
if (strpos($part, static::PREFIX) !== 0)
Replace With: Select
return false;
}

$parts = explode('.', $preprocessed);
foreach ($parts as $p => &$part)
{
if (strpos($part, static::PREFIX) === 0)
Find: Select
continue;
Replace With: Select
$part = substr($part, strlen(static::PREFIX));
$part = $this->decodePart($part);

if ($part === false)
return false;
Find: Select
$part = substr($part, strlen(static::PREFIX));
$part = $this->decodePart($part);
Replace With: Select
if ($this->validateLabel($part, false) !== 0)
{
if ($part === '')
{
$parts_count = count($parts);

if ($parts_count === 1 || $p !== $parts_count - 1)
return false;
}
else
return false;
}
Find: Select
$digit = static::$decodeTable[$input[$pos++]];
Add Before: Select
if (!isset($input[$pos]) || !isset(static::$decodeTable[$input[$pos]]))
return false;

Find: Select
return chr(($code >> 18) + 240) . chr((($code >> 12) & 63) + 128) . chr((($code >> 6) & 63) + 128) . chr(($code & 63) + 128);
}
}
Add After: Select

/**
* Prepare domain name string for Punycode processing.
* See https://www.unicode.org/reports/tr46/#Processing
*
* @param string $domain A domain name
* @param array $errors Will record any errors encountered during preprocessing
*/
protected function preprocess(string $domain, array &$errors = array())
{
global $sourcedir;

require_once($sourcedir . '/Unicode/Idna.php');
require_once($sourcedir . '/Subs-Charset.php');

$regexes = idna_regex();

if (preg_match('/[' . $regexes['disallowed'] . ($this->std3 ? $regexes['disallowed_std3'] : '') . ']/u', $domain))
$errors[] = 'disallowed';

$domain = preg_replace('/[' . $regexes['ignored'] . ']/u', '', $domain);

unset($regexes);

$maps = idna_maps();

if (!$this->nonTransitional)
$maps = array_merge($maps, idna_maps_deviation());

if (!$this->std3)
$maps = array_merge($maps, idna_maps_not_std3());

return utf8_normalize_c(strtr($domain, $maps));
}

/**
* Validates an individual part of a domain name.
*
* @param string $label Individual part of a domain name.
* @param bool $toPunycode True for encoding to Punycode, false for decoding.
*/
protected function validateLabel(string $label, bool $toPunycode = true)
{
global $sourcedir;

$length = strlen($label);

if ($length === 0)
{
return self::IDNA_ERROR_EMPTY_LABEL;
}

if ($toPunycode)
{
if ($length > 63)
{
return self::IDNA_ERROR_LABEL_TOO_LONG;
}

if ($this->std3 && $length !== strspn($label, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-'))
{
return self::IDNA_ERROR_PUNYCODE;
}
}

if (strpos($label, '-') === 0)
{
return self::IDNA_ERROR_LEADING_HYPHEN;
}

if (strrpos($label, '-') === $length - 1)
{
return self::IDNA_ERROR_TRAILING_HYPHEN;
}

if (substr($label, 2, 2) === '--')
{
return self::IDNA_ERROR_HYPHEN_3_4;
}

if (preg_match('/^\p{M}/u', $label))
{
return self::IDNA_ERROR_LEADING_COMBINING_MARK;
}

require_once($sourcedir . '/Unicode/Idna.php');
require_once($sourcedir . '/Subs-Charset.php');

$regexes = idna_regex();

if (preg_match('/[' . $regexes['disallowed'] . ($this->std3 ? $regexes['disallowed_std3'] : '') . ']/u', $label))
{
return self::IDNA_ERROR_INVALID_ACE_LABEL;
}

if (!$toPunycode && $label !== utf8_normalize_kc($label))
{
return self::IDNA_ERROR_INVALID_ACE_LABEL;
}

return 0;
}

./Sources/DbPackages-mysql.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Strip out the table name, we might not need it in some cases
$real_prefix = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $db_prefix, $match) === 1 ? $match[3] : $db_prefix;
Add After: Select
$database = !empty($match[2]) ? $match[2] : $db_name;
Find: Select
// With or without the database name, the fullname looks like this.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Replace With: Select
// With or without the database name, the fullname looks like this.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
// Do not overwrite $table_name, this causes issues if we pass it onto a helper function.
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Find: Select
// First - no way do we touch SMF tables.
if (in_array(strtolower($table_name), $reservedTables))
Replace With: Select
// First - no way do we touch SMF tables.
if (in_array(strtolower($short_table_name), $reservedTables))
Find: Select
$db_package_log[] = array('remove_table', $table_name);
Replace With: Select
$db_package_log[] = array('remove_table', $short_table_name);
Find: Select
$tables = $smcFunc['db_list_tables']();
Replace With: Select
$tables = $smcFunc['db_list_tables']($database);

Find: Select
$smcFunc['db_drop_table']($table_name . '_old');
Replace With: Select
$smcFunc['db_drop_table']($short_table_name . '_old');
Find: Select
RENAME TABLE ' . $table_name . ' TO ' . $table_name . '_old',
Replace With: Select
RENAME TABLE ' . $short_table_name . ' TO ' . $short_table_name . '_old',
Find: Select
$table_query = 'CREATE TABLE ' . $table_name . "\n" . '(';
Replace With: Select
$table_query = 'CREATE TABLE ' . $short_table_name . "\n" . '(';
Find: Select
$columns = implode(',', $index['columns']);
Replace With: Select
// MySQL If its a text column, we need to add a size.
foreach ($index['columns'] as &$c)
{
$c = trim($c);

// If a size was already specified, we won't be able to match it anyways.
$key = array_search($c, array_column($columns, 'name'));
$columns[$key]['size'] = isset($columns[$key]['size']) && is_numeric($columns[$key]['size']) ? $columns[$key]['size'] : null;
list ($type, $size) = $smcFunc['db_calculate_type']($columns[$key]['type'], $columns[$key]['size']);
if (
$key === false
|| !isset($columns[$key])
|| !in_array($columns[$key]['type'], array('text', 'mediumntext', 'largetext', 'varchar', 'char'))
|| (
isset($size)
&& $size <= 191
)
)
continue;

$c .= '(191)';
}

$idx_columns = implode(',', $index['columns']);
Find: Select
$index['name'] = implode('_', $index['columns']);
$table_query .= "\n\t" . (isset($index['type']) && $index['type'] == 'unique' ? 'UNIQUE' : 'KEY') . ' ' . $index['name'] . ' (' . $columns . '),';
Replace With: Select
$index['name'] = trim(implode('_', preg_replace('~(\(\d+\))~', '', $index['columns'])));

$table_query .= "\n\t" . (isset($index['type']) && $index['type'] == 'unique' ? 'UNIQUE' : 'KEY') . ' ' . $index['name'] . ' (' . $idx_columns . '),';
Find: Select
'table1' => $table_name,
'table2' => $table_name . '_old',
Replace With: Select
'table1' => $short_table_name,
'table2' => $short_table_name . '_old',
Find: Select
INSERT INTO ' . $table_name . '('
Replace With: Select
INSERT INTO ' . $short_table_name . '('
Find: Select
FROM ' . $table_name . '_old',
Replace With: Select
FROM ' . $short_table_name . '_old',
Find: Select
$smcFunc['db_drop_table']($table_name . '_old');
}
Replace With: Select
$smcFunc['db_drop_table']($short_table_name . '_old');
}
Find: Select
global $reservedTables, $smcFunc, $db_prefix;
Replace With: Select
global $reservedTables, $smcFunc, $db_prefix, $db_name;
Find: Select
// After stripping away the database name, this is what's left.
$real_prefix = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $db_prefix, $match) === 1 ? $match[3] : $db_prefix;
Add After: Select
$database = !empty($match[2]) ? $match[2] : $db_name;
Find: Select
// Get some aliases.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Replace With: Select
// Get some aliases.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
// Do not overwrite $table_name, this causes issues if we pass it onto a helper function.
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Find: Select
// God no - dropping one of these = bad.
if (in_array(strtolower($table_name), $reservedTables))
Replace With: Select
// God no - dropping one of these = bad.
if (in_array(strtolower($short_table_name), $reservedTables))
Find: Select
if (in_array($full_table_name, $smcFunc['db_list_tables']()))
Replace With: Select
$tables = $smcFunc['db_list_tables']($database);
if (in_array($full_table_name, $tables))
Find: Select
$query = 'DROP TABLE ' . $table_name;
Replace With: Select
$query = 'DROP TABLE ' . $short_table_name;
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Log that we will want to uninstall this!
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$column_info = array_change_key_case($column_info);

// Log that we will want to uninstall this!
Find: Select
$db_package_log[] = array('remove_column', $table_name, $column_info['name']);
Replace With: Select
$db_package_log[] = array('remove_column', $short_table_name, $column_info['name']);
Find: Select
ALTER TABLE ' . $table_name . '
ADD ' . smf_db_create_query_column($column_info) . (empty($column_info['auto']) ? '' : ' primary key'
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ADD ' . smf_db_create_query_column($column_info) . (empty($column_info['auto']) ? '' : ' primary key'
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Does it exist?
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Does it exist?
Find: Select
// Does it exist?
$columns = $smcFunc['db_list_columns']($table_name, true);
Replace With: Select
// Does it exist?
$columns = $smcFunc['db_list_columns']($table_name, true);

Find: Select
ALTER TABLE ' . $table_name . '
DROP COLUMN ' . $column_name,
Replace With: Select
ALTER TABLE ' . $short_table_name . '
DROP COLUMN ' . $column_name,
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Check it does exist!
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$column_info = array_change_key_case($column_info);

// Check it does exist!
Find: Select
// Get the right bits.
Replace With: Select

// Get the right bits.
Find: Select
$unsigned = in_array($type, array('int', 'tinyint', 'smallint', 'mediumint', 'bigint')) && !empty($column_info['unsigned']) ? 'unsigned ' : '';

Add After: Select
// Fix the default.
$default = '';
if (array_key_exists('default', $column_info) && is_null($column_info['default']))
$default = 'NULL';
elseif (isset($column_info['default']) && is_numeric($column_info['default']))
$default = strpos($column_info['default'], '.') ? floatval($column_info['default']) : intval($column_info['default']);
else
$default = '\'' . $smcFunc['db_escape_string']($column_info['default']) . '\'';

Find: Select
ALTER TABLE ' . $table_name . '
CHANGE COLUMN `' . $old_column . '` `' . $column_info['name'] . '` ' . $type . ' ' . (!empty($unsigned) ? $unsigned : '') . (!empty($column_info['not_null']) ? 'NOT NULL' : '') . ' ' .
(!isset($column_info['default']) ? '' : 'default \'' . $smcFunc['db_escape_string']($column_info['default']) . '\'') . ' ' .
Replace With: Select
ALTER TABLE ' . $short_table_name . '
CHANGE COLUMN `' . $old_column . '` `' . $column_info['name'] . '` ' . $type . ' ' .
(!empty($unsigned) ? $unsigned : '') . (!empty($column_info['not_null']) ? 'NOT NULL' : '') . ' ' .
($default === '' ? '' : 'DEFAULT ' . $default) . ' ' .
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// No columns = no index.
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// No columns = no index.
Find: Select
$columns = implode(',', $index_info['columns']);
Add Before: Select

// MySQL If its a text column, we need to add a size.
$cols = $smcFunc['db_list_columns']($table_name, true);
foreach ($index_info['columns'] as &$c)
{
$c = trim($c);
$cols[$c]['size'] = isset($cols[$c]['size']) && is_numeric($cols[$c]['size']) ? $cols[$c]['size'] : null;
list ($type, $size) = $smcFunc['db_calculate_type']($cols[$c]['type'], $cols[$c]['size']);

// If a size was already specified, we won't be able to match it anyways.
if (
!isset($cols[$c])
|| !in_array($cols[$c]['type'], array('text', 'mediumntext', 'largetext', 'varchar', 'char'))
|| (
isset($size)
&& $size <= 191
)
)
continue;

$c .= '(191)';
}

Find: Select
$index_info['name'] = implode('_', $index_info['columns']);
Replace With: Select
$index_info['name'] = trim(implode('_', preg_replace('~(\(\d+\))~', '', $index_info['columns'])));
Find: Select
$db_package_log[] = array('remove_index', $table_name, $index_info['name']);
Replace With: Select
$db_package_log[] = array('remove_index', $short_table_name, $index_info['name']);
Find: Select
ALTER TABLE ' . $table_name . '
ADD PRIMARY KEY (' . $columns . ')',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ADD PRIMARY KEY (' . $columns . ')',
Find: Select
ALTER TABLE ' . $table_name . '
ADD ' . (isset($index_info['type']) && $index_info['type'] == 'unique' ? 'UNIQUE' : 'INDEX') . ' ' . $index_info['name'] . ' (' . $columns . ')',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ADD ' . (isset($index_info['type']) && $index_info['type'] == 'unique' ? 'UNIQUE' : 'INDEX') . ' ' . $index_info['name'] . ' (' . $columns . ')',
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Better exist!
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Better exist!
Find: Select
ALTER TABLE ' . $table_name . '
DROP PRIMARY KEY',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
DROP PRIMARY KEY',
Find: Select
ALTER TABLE ' . $table_name . '
DROP INDEX ' . $index_name,
Replace With: Select
ALTER TABLE ' . $short_table_name . '
DROP INDEX ' . $index_name,
Find: Select
function smf_db_table_structure($table_name)
{
global $smcFunc, $db_prefix;
Replace With: Select
function smf_db_table_structure($table_name)
{
global $smcFunc, $db_prefix, $db_name;
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Find the table engine and add that to the info as well
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;
$database = !empty($match[2]) ? $match[2] : $db_name;

// Find the table engine and add that to the info as well
Find: Select
LIKE {string:table}',
Add Before: Select
IN {raw:db}
Find: Select
'table' => strtr($table_name, array('_' => '\\_', '%' => '\\%'))
Replace With: Select
'db' => $database,
'table' => $real_table_name
Find: Select
'name' => $table_name,
Replace With: Select
'name' => $parsed_table_name,
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

$result = $smcFunc['db_query']('', '
SELECT column_name "Field", COLUMN_TYPE "Type", is_nullable "Null", COLUMN_KEY "Key" , column_default "Default", extra "Extra"
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;
$database = !empty($match[2]) ? $match[2] : $db_name;

$result = $smcFunc['db_query']('', '
SELECT column_name "Field", COLUMN_TYPE "Type", is_nullable "Null", COLUMN_KEY "Key" , column_default "Default", extra "Extra"
Find: Select
'table_name' => $table_name,
'db_name' => $db_name,
Replace With: Select
'table_name' => $real_table_name,
'db_name' => $db_name,
Find: Select
function smf_db_list_indexes($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix;

$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

Replace With: Select
function smf_db_list_indexes($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix, $db_name;

$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;
$database = !empty($match[2]) ? $match[2] : $db_name;

Find: Select
FROM {raw:table_name}',
Replace With: Select
FROM {raw:table_name}
IN {raw:db}',
Find: Select
'table_name' => substr($table_name, 0, 1) == '`' ? $table_name : '`' . $table_name . '`',
Replace With: Select
'db' => $database,
'table_name' => $real_table_name,
Find: Select
// Auto increment is easy here!
Add Before: Select
$column = array_change_key_case($column);

Find: Select
{
$default = 'auto_increment';
Replace With: Select
$default = 'auto_increment';
Find: Select
}
elseif (isset($column['default']) && $column['default'] !== null)
$default = 'default \'' . $smcFunc['db_escape_string']($column['default']) . '\'';
Replace With: Select
// Make it null.
elseif (array_key_exists('default', $column) && is_null($column['default']))
$default = 'DEFAULT NULL';
// Numbers don't need quotes.
elseif (isset($column['default']) && is_numeric($column['default']))
$default = 'DEFAULT ' . (strpos($column['default'], '.') ? floatval($column['default']) : intval($column['default']));
// Non empty string.
elseif (isset($column['default']))
$default = 'DEFAULT \'' . $smcFunc['db_escape_string']($column['default']) . '\'';
Find: Select
// Sort out the size... and stuff...
Add Before: Select
// Backwards compatible with the nullable column.
if (isset($column['null']) && !isset($column['not_null']))
$column['not_null'] = !$column['null'];

./Sources/DbPackages-postgresql.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
global $reservedTables, $smcFunc, $db_package_log, $db_prefix;
Replace With: Select
global $reservedTables, $smcFunc, $db_package_log, $db_prefix, $db_name;
Find: Select
// Strip out the table name, we might not need it in some cases
$real_prefix = preg_match('~^("?)(.+?)\\1\\.(.*?)$~', $db_prefix, $match) === 1 ? $match[3] : $db_prefix;
Add After: Select
$database = !empty($match[2]) ? $match[2] : $db_name;
Find: Select
// With or without the database name, the fullname looks like this.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Replace With: Select
// With or without the database name, the fullname looks like this.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Find: Select
// First - no way do we touch SMF tables.
if (in_array(strtolower($table_name), $reservedTables))
Replace With: Select
// First - no way do we touch SMF tables.
if (in_array(strtolower($short_table_name), $reservedTables))
Find: Select
$db_package_log[] = array('remove_table', $table_name);
Replace With: Select
$db_package_log[] = array('remove_table', $short_table_name);
Find: Select
// This... my friends... is a function in a half - let's start by checking if the table exists!
$tables = $smcFunc['db_list_tables']();
Replace With: Select
// This... my friends... is a function in a half - let's start by checking if the table exists!
$tables = $smcFunc['db_list_tables']($database);
Find: Select
ALTER TABLE ' . $table_name . ' RENAME TO ' . $table_name . '_old',
Replace With: Select
ALTER TABLE ' . $short_table_name . ' RENAME TO ' . $short_table_name . '_old',
Find: Select
$table_query = 'CREATE TABLE ' . $table_name . "\n" . '(';
Replace With: Select
$table_query = 'CREATE TABLE ' . $short_table_name . "\n" . '(';
Find: Select
// If we have an auto increment do it!
Add Before: Select
$column = array_change_key_case($column);

Find: Select
if (!$old_table_exists)
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $table_name . '_seq',
Replace With: Select
if (!$old_table_exists)
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $short_table_name . '_seq',
Find: Select
CREATE SEQUENCE ' . $table_name . '_seq',
Replace With: Select
CREATE SEQUENCE ' . $short_table_name . '_seq',
Find: Select
$default = 'default nextval(\'' . $table_name . '_seq\')';
Replace With: Select
$default = 'default nextval(\'' . $short_table_name . '_seq\')';
Find: Select
if (isset($column['null']))
$column['not_null'] != $column['null'];
Replace With: Select
if (isset($column['null']) && !isset($column['not_null']))
$column['not_null'] = !$column['null'];
Find: Select
$columns = implode(',', $index['columns']);
Replace With: Select
// MySQL you can do a "column_name (length)", postgresql does not allow this. Strip it.
foreach ($index['columns'] as &$c)
$c = preg_replace('~\s+(\(\d+\))~', '', $c);

$idx_columns = implode(',', $index['columns']);
Find: Select
$index['name'] = implode('_', $index['columns']);
$index_queries[] = 'CREATE ' . (isset($index['type']) && $index['type'] == 'unique' ? 'UNIQUE' : '') . ' INDEX ' . $table_name . '_' . $index['name'] . ' ON ' . $table_name . ' (' . $columns . ')';
Replace With: Select
$index['name'] = trim(implode('_', preg_replace('~(\(\d+\))~', '', $index['columns'])));

$index_queries[] = 'CREATE ' . (isset($index['type']) && $index['type'] == 'unique' ? 'UNIQUE' : '') . ' INDEX ' . $short_table_name . '_' . $index['name'] . ' ON ' . $short_table_name . ' (' . $idx_columns . ')';
Find: Select
'table1' => $table_name,
'table2' => $table_name . '_old',
Replace With: Select
'table1' => $short_table_name,
'table2' => $short_table_name . '_old',
Find: Select
INSERT INTO ' . $table_name . '('
Replace With: Select
INSERT INTO ' . $short_table_name . '('
Find: Select
FROM ' . $table_name . '_old',
Replace With: Select
FROM ' . $short_table_name . '_old',
Find: Select
global $reservedTables, $smcFunc, $db_prefix;
Replace With: Select
global $reservedTables, $smcFunc, $db_prefix, $db_name;
Find: Select
// After stripping away the database name, this is what's left.
$real_prefix = preg_match('~^("?)(.+?)\\1\\.(.*?)$~', $db_prefix, $match) === 1 ? $match[3] : $db_prefix;
Add After: Select
$database = !empty($match[2]) ? $match[2] : $db_name;
Find: Select
// Get some aliases.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Replace With: Select
// Get some aliases.
$full_table_name = str_replace('{db_prefix}', $real_prefix, $table_name);
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
Find: Select
// Does it exist?
if (in_array($full_table_name, $smcFunc['db_list_tables']()))
Replace With: Select
// Does it exist?
$tables = $smcFunc['db_list_tables']($database);
if (in_array($full_table_name, $tables))
Find: Select
$table_query = 'DROP TABLE ' . $table_name;
Replace With: Select
$table_query = 'DROP TABLE ' . $short_table_name;
Find: Select
$sequence_query = 'DROP SEQUENCE IF EXISTS ' . $table_name . '_seq';
Replace With: Select
$sequence_query = 'DROP SEQUENCE IF EXISTS ' . $short_table_name . '_seq';
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Log that we will want to uninstall this!
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$column_info = array_change_key_case($column_info);

// Log that we will want to uninstall this!
Find: Select
$db_package_log[] = array('remove_column', $table_name, $column_info['name']);
Replace With: Select
$db_package_log[] = array('remove_column', $short_table_name, $column_info['name']);
Find: Select
ALTER TABLE ' . $table_name . '
ADD COLUMN ' . $column_info['name'] . ' ' . $type;
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ADD COLUMN ' . $column_info['name'] . ' ' . $type;
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Does it exist?
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Does it exist?
Find: Select
// Does it exist?
$columns = $smcFunc['db_list_columns']($table_name, true);
Replace With: Select
// Does it exist?
$columns = $smcFunc['db_list_columns']($table_name, true);

Find: Select
if ($column['name'] == $column_name)
Replace With: Select
if (strtolower($column['name']) == strtolower($column_name))
Find: Select
if ($column['auto'])
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $table_name . '_seq',
Replace With: Select
if ($column['auto'])
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $short_table_name . '_seq',
Find: Select
ALTER TABLE ' . $table_name . '
DROP COLUMN ' . $column_name,
Replace With: Select
ALTER TABLE ' . $short_table_name . '
DROP COLUMN ' . $column_name,
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// backward compatibility
Replace With: Select
$short_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$column_info = array_change_key_case($column_info);

// backward compatibility
Find: Select
if (isset($column_info['null']))
Replace With: Select
if (isset($column_info['null']) && !isset($column_info['not_null']))
Find: Select
ALTER TABLE ' . $table_name . '
RENAME COLUMN ' . $old_column . ' TO ' . $column_info['name'],
Replace With: Select
ALTER TABLE ' . $short_table_name . '
RENAME COLUMN ' . $old_column . ' TO ' . $column_info['name'],
Find: Select
if (isset($column_info['default']) && $column_info['default'] != $old_info['default'])
Replace With: Select
if (array_key_exists('default', $column_info) && $column_info['default'] != $old_info['default'])
Find: Select
$action = $column_info['default'] !== null ? 'SET DEFAULT \'' . $smcFunc['db_escape_string']($column_info['default']) . '\'' : 'DROP DEFAULT';
Replace With: Select
// Fix the default.
$default = '';
if (array_key_exists('default', $column_info) && is_null($column_info['default']))
$default = 'NULL';
elseif (isset($column_info['default']) && is_numeric($column_info['default']))
$default = strpos($column_info['default'], '.') ? floatval($column_info['default']) : intval($column_info['default']);
else
$default = '\'' . $smcFunc['db_escape_string']($column_info['default']) . '\'';

$action = $default === '' ? 'DROP DEFAULT' : 'SET DEFAULT ' . $default;
Find: Select
ALTER TABLE ' . $table_name . '
ALTER COLUMN ' . $column_info['name'] . ' ' . $action,
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ALTER COLUMN ' . $column_info['name'] . ' ' . $action,
Find: Select
// Is it null - or otherwise?
Replace With: Select

// Is it null - or otherwise?
Find: Select
UPDATE ' . $table_name . '
Replace With: Select
UPDATE ' . $short_table_name . '
Find: Select
ALTER TABLE ' . $table_name . '
ALTER COLUMN ' . $column_info['name'] . ' ' . $action . ' NOT NULL',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ALTER COLUMN ' . $column_info['name'] . ' ' . $action . ' NOT NULL',
Find: Select
ALTER TABLE ' . $table_name . '
ADD COLUMN ' . $column_info['name'] . '_tempxx ' . $type,
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ADD COLUMN ' . $column_info['name'] . '_tempxx ' . $type,
Find: Select
UPDATE ' . $table_name . '
SET ' . $column_info['name'] . '_tempxx = CAST(' . $column_info['name'] . ' AS ' . $type . ')',
Replace With: Select
UPDATE ' . $short_table_name . '
SET ' . $column_info['name'] . '_tempxx = CAST(' . $column_info['name'] . ' AS ' . $type . ')',
Find: Select
ALTER TABLE ' . $table_name . '
DROP COLUMN ' . $column_info['name'],
Replace With: Select
ALTER TABLE ' . $short_table_name . '
DROP COLUMN ' . $column_info['name'],
Find: Select
ALTER TABLE ' . $table_name . '
RENAME COLUMN ' . $column_info['name'] . '_tempxx TO ' . $column_info['name'],
Replace With: Select
ALTER TABLE ' . $short_table_name . '
RENAME COLUMN ' . $column_info['name'] . '_tempxx TO ' . $column_info['name'],
Find: Select
ALTER TABLE ' . $table_name . '
ALTER COLUMN ' . $column_info['name'] . ' SET DEFAULT \'0\'',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ALTER COLUMN ' . $column_info['name'] . ' SET DEFAULT \'0\'',
Find: Select
);
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $table_name . '_seq',
Replace With: Select
);
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $short_table_name . '_seq',
Find: Select
{
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $table_name . '_seq',
Replace With: Select
{
$smcFunc['db_query']('', '
DROP SEQUENCE IF EXISTS ' . $short_table_name . '_seq',
Find: Select
$smcFunc['db_query']('', '
CREATE SEQUENCE ' . $table_name . '_seq',
Replace With: Select
$smcFunc['db_query']('', '
CREATE SEQUENCE ' . $short_table_name . '_seq',
Find: Select
ALTER TABLE ' . $table_name . '
ALTER COLUMN ' . $column_info['name'] . ' SET DEFAULT nextval(\'' . $table_name . '_seq\')',
Replace With: Select
ALTER TABLE ' . $short_table_name . '
ALTER COLUMN ' . $column_info['name'] . ' SET DEFAULT nextval(\'' . $short_table_name . '_seq\')',
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// No columns = no index.
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;

// No columns = no index.
Find: Select
$columns = implode(',', $index_info['columns']);
Add Before: Select

// MySQL you can do a "column_name (length)", postgresql does not allow this. Strip it.
foreach ($index_info['columns'] as &$c)
$c = preg_replace('~\s+(\(\d+\))~', '', $c);

Find: Select
$index_info['name'] = $table_name . implode('_', $index_info['columns']);
Replace With: Select
$index_info['name'] = trim(implode('_', preg_replace('~(\(\d+\))~', '', $index_info['columns'])));
Find: Select
$index_info['name'] = $table_name . $index_info['name'];
Replace With: Select
$index_info['name'] = $index_info['name'];
Find: Select
$db_package_log[] = array('remove_index', $table_name, $index_info['name']);
Replace With: Select
$db_package_log[] = array('remove_index', $parsed_table_name, $index_info['name']);
Find: Select
// Do we already have it?
Replace With: Select

// Do we already have it?
Find: Select
ALTER TABLE ' . $table_name . '
ADD PRIMARY KEY (' . $columns . ')',
Replace With: Select
ALTER TABLE ' . $real_table_name . '
ADD PRIMARY KEY (' . $columns . ')',
Find: Select
CREATE ' . (isset($index_info['type']) && $index_info['type'] == 'unique' ? 'UNIQUE' : '') . ' INDEX ' . $index_info['name'] . ' ON ' . $table_name . ' (' . $columns . ')',
Replace With: Select
CREATE ' . (isset($index_info['type']) && $index_info['type'] == 'unique' ? 'UNIQUE' : '') . ' INDEX ' . $real_table_name . '_' . $index_info['name'] . ' ON ' . $real_table_name . ' (' . $columns . ')',
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

// Better exist!
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;

// Better exist!
Find: Select
if ($index_name != 'primary')
$index_name = $table_name . '_' . $index_name;
Replace With: Select

// Do not add the table name to the index if it is arleady there.
if ($index_name != 'primary' && strpos($index_name, $real_table_name) !== false)
$index_name = str_replace($real_table_name . '_', '', $index_name);
Find: Select
ALTER TABLE ' . $table_name . '
Replace With: Select
ALTER TABLE ' . $real_table_name . '
Find: Select
if ($index['name'] == $index_name)
Replace With: Select

if ($index['name'] == $index_name)
Find: Select
DROP INDEX ' . $index_name,
Replace With: Select
DROP INDEX ' . $real_table_name . '_' . $index_name,
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

return array(
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;

return array(
Find: Select
'name' => $table_name,
Replace With: Select
'name' => $real_table_name,
Find: Select
function smf_db_list_columns($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix;
Replace With: Select
function smf_db_list_columns($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix, $db_name;
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

$result = $smcFunc['db_query']('', '
SELECT column_name, column_default, is_nullable, data_type, character_maximum_length
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;
$database = !empty($match[2]) ? $match[2] : $db_name;

$result = $smcFunc['db_query']('', '
SELECT column_name, column_default, is_nullable, data_type, character_maximum_length
Find: Select
'schema_public' => 'public',
'table_name' => $table_name,
Replace With: Select
'schema_public' => 'public',
'table_name' => $real_table_name,
Find: Select
$default = strpos($row['column_default'], '::') === false ? $row['column_default'] : substr($row['column_default'], 0, strpos($row['column_default'], '::'));
Replace With: Select
$default = trim(strpos($row['column_default'], '::') === false ? $row['column_default'] : substr($row['column_default'], 0, strpos($row['column_default'], '::')), '\'');
Find: Select
'not_null' => !($row['is_nullable'] ? true : false),
'null' => $row['is_nullable'] ? true : false,
Replace With: Select
'not_null' => $row['is_nullable'] == 'YES' ? false : true,
'null' => $row['is_nullable'] == 'YES' ? true : false,
Find: Select
function smf_db_list_indexes($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix;
Replace With: Select
function smf_db_list_indexes($table_name, $detail = false, $parameters = array())
{
global $smcFunc, $db_prefix, $db_name;
Find: Select
$table_name = str_replace('{db_prefix}', $db_prefix, $table_name);

$result = $smcFunc['db_query']('', '
SELECT CASE WHEN i.indisprimary THEN 1 ELSE 0 END AS is_primary,
Replace With: Select
$parsed_table_name = str_replace('{db_prefix}', $db_prefix, $table_name);
$real_table_name = preg_match('~^(`?)(.+?)\\1\\.(.*?)$~', $parsed_table_name, $match) === 1 ? $match[3] : $parsed_table_name;
$database = !empty($match[2]) ? $match[2] : $db_name;

$result = $smcFunc['db_query']('', '
SELECT CASE WHEN i.indisprimary THEN 1 ELSE 0 END AS is_primary,
Find: Select
array(
'table_name' => $table_name,
Replace With: Select
array(
'table_name' => $real_table_name,
Find: Select
$row['name'] = str_replace($table_name . '_', '', $row['name']);
Replace With: Select
$row['name'] = str_replace($real_table_name . '_', '', $row['name']);

./Sources/Display.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$user_info['alerts'] = max(0, $user_info['alerts'] - max(0, $smcFunc['db_affected_rows']()));
updateMemberData($user_info['id'], array('alerts' => $user_info['alerts']));
Replace With: Select
// If changes made, update the member record as well
if ($smcFunc['db_affected_rows']() > 0)
{
require_once($sourcedir . '/Profile-Modify.php');
$user_info['alerts'] = alert_count($user_info['id'], true);
updateMemberData($user_info['id'], array('alerts' => $user_info['alerts']));
}

./Sources/Groups.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
// Default to sub action 'index'.
Add Before: Select
call_integration_hook('integrate_manage_groups', array(&$subActions));

Find: Select
// CRUD $subActions as needed.
call_integration_hook('integrate_manage_groups', array(&$subActions));

// Call the actual function.
Replace With: Select
// Call the actual function.

./Sources/Help.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Set the page title to something relevant.
$context['page_title'] = $context['forum_name'] . ' - ' . $txt['help'];

// Don't show any template layers, just the popup sub template.
$context['template_layers'] = array();
$context['sub_template'] = 'popup';

// What help string should be used?
Replace With: Select
// What help string should be used?
Find: Select
$context['help_text'] = $_GET['help'];
Replace With: Select
fatal_lang_error('not_found', false, array(), 404);
Find: Select
$context['help_text'] = sprintf($context['help_text'], $scripturl, $context['session_id'], $context['session_var']);
Add After: Select

// Set the page title to something relevant.
$context['page_title'] = $context['forum_name'] . ' - ' . $txt['help'];

// Don't show any template layers, just the popup sub template.
$context['template_layers'] = array();
$context['sub_template'] = 'popup';

./Sources/Likes.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
}

/**
* Likes::insert()
Add Before: Select

// Check to see if there is an unread alert to delete as well...
$result = $smcFunc['db_query']('', '
SELECT id_alert, id_member FROM {db_prefix}user_alerts
WHERE content_id = {int:like_content}
AND content_type = {string:like_type}
AND id_member_started = {int:id_member_started}
AND content_action = {string:content_action}
AND is_read = {int:unread}',
array(
'like_content' => $this->_content,
'like_type' => $this->_type,
'id_member_started' => $this->_user['id'],
'content_action' => 'like',
'unread' => 0,
)
);
// Found one?
if ($smcFunc['db_num_rows']($result) == 1)
{
list($alert, $member) = $smcFunc['db_fetch_row']($result);

// Delete it
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}user_alerts
WHERE id_alert = {int:alert}',
array(
'alert' => $alert,
)
);
// Decrement counter for member who received the like
updateMemberData($member, array('alerts' => '-'));
}

./Sources/Load.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
'strtolower' => $utf8 ? function($string) use ($sourcedir, &$smcFunc)
Replace With: Select
'strtolower' => function($string) use (&$smcFunc)
Find: Select
$string = $smcFunc['normalize']($string);

if (!function_exists('mb_strtolower'))
{
require_once($sourcedir . '/Subs-Charset.php');
return utf8_strtolower($string);
}

return mb_strtolower($string, 'UTF-8');
} : 'strtolower',
'strtoupper' => $utf8 ? function($string) use ($sourcedir, &$smcFunc)
Replace With: Select
return $smcFunc['convert_case']($string, 'lower');
},
'strtoupper' => function($string) use (&$smcFunc)
Find: Select
$string = $smcFunc['normalize']($string);

if (!function_exists('mb_strtolower'))
{
require_once($sourcedir . '/Subs-Charset.php');
return utf8_strtoupper($string);
}

return mb_strtoupper($string, 'UTF-8');
} : 'strtoupper',
Replace With: Select
return $smcFunc['convert_case']($string, 'upper');
},
Find: Select
'ucfirst' => $utf8 ? function($string) use (&$smcFunc)
Replace With: Select
'ucfirst' => function($string) use (&$smcFunc)
Find: Select
return $smcFunc['strtoupper']($smcFunc['substr']($string, 0, 1)) . $smcFunc['substr']($string, 1);
} : 'ucfirst',
'ucwords' => $utf8 ? function($string) use (&$smcFunc)
Replace With: Select
return $smcFunc['convert_case']($string, 'ucfirst');
},
'ucwords' => function($string) use (&$smcFunc)
{
return $smcFunc['convert_case']($string, 'ucwords');
},
'convert_case' => function($string, $case, $simple = false, $form = 'c') use (&$smcFunc, $utf8, $ent_check, $fix_utf8mb4, $sourcedir)
Find: Select
$words = preg_split('~([\s\r\n\t]+)~', $string, -1, PREG_SPLIT_DELIM_CAPTURE);
for ($i = 0, $n = count($words); $i < $n; $i += 2)
$words[$i] = $smcFunc['ucfirst']($words[$i]);
return implode('', $words);
} : 'ucwords',
Replace With: Select
if (!$utf8)
{
switch ($case)
{
case 'upper':
$string = strtoupper($string);
break;

case 'lower':
case 'fold';
$string = strtolower($string);
break;

case 'title':
$string = ucwords(strtolower($string));
break;

case 'ucwords':
$string = ucwords($string);
break;

case 'ucfirst':
$string = ucfirst($string);
break;

default:
break;
}
}
else
{
// Convert numeric entities to characters, except special ones.
if (function_exists('mb_decode_numericentity') && strpos($string, '&#') !== false)
{
$string = strtr($ent_check($string), array(
'&#34;' => '&quot;',
'&#38;' => '&amp;',
'&#39;' => '&apos;',
'&#60;' => '&lt;',
'&#62;' => '&gt;',
'&#160;' => '&nbsp;',
));

$string = mb_decode_numericentity($string, array(0, 0x10FFFF, 0, 0xFFFFFF), 'UTF-8');
}

// Use optmized function for compatibility casefolding.
if ($form === 'kc_casefold' || ($case === 'fold' && $form === 'kc'))
{
$string = $smcFunc['normalize']($string, 'kc_casefold');
}
// Everything else.
else
{
require_once($sourcedir . '/Subs-Charset.php');
$string = $smcFunc['normalize'](utf8_convert_case($string, $case, $simple), $form);
}
}

return $fix_utf8mb4($string);
},
Find: Select
$modSettings['attachmentSizeLimit'] = empty($modSettings['attachmentSizeLimit']) ? $file_max_kb : min($modSettings['attachmentSizeLimit'], $file_max_kb);
Add After: Select
$modSettings['attachmentNumPerPostLimit'] = !isset($modSettings['attachmentNumPerPostLimit']) ? 4 : $modSettings['attachmentNumPerPostLimit'];
Find: Select
if (!empty($txt['lang_locale']) && !empty($modSettings['global_character_set']))
setlocale(LC_CTYPE, $txt['lang_locale'] . '.' . $modSettings['global_character_set']);
Replace With: Select
if (!empty($txt['lang_locale']))
{
if (strpos($txt['lang_locale'], '.') !== false)
$locale_variants = $txt['lang_locale'];
else
$locale_variants = array_unique(array_merge(
!empty($modSettings['global_character_set']) ? array($txt['lang_locale'] . '.' . $modSettings['global_character_set']) : array(),
!empty($context['utf8']) ? array($txt['lang_locale'] . '.UTF-8', $txt['lang_locale'] . '.UTF8', $txt['lang_locale'] . '.utf-8', $txt['lang_locale'] . '.utf8') : array(),
array($txt['lang_locale'])
));

setlocale(LC_CTYPE, $locale_variants);
}
Find: Select
$cache_api->connect();
Replace With: Select
if ($cache_api->connect() === false) return false;

./Sources/LogInOut.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$other_passwords[] = hash_hmac('sha256', $_POST['passwrd'], $user_settings['password_salt']);
Add After: Select

// MyBB
$other_passwords[] = md5(md5($user_settings['password_salt']) . md5($_POST['passwrd']));

./Sources/ManageAttachments.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
array('int', 'attachmentNumPerPostLimit', 'subtext' => $txt['zero_for_no_limit'], 6),
Replace With: Select
array('int', 'attachmentNumPerPostLimit', 'subtext' => $txt['zero_for_no_limit'], 6, 'min' => 0),

./Sources/ManageBans.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default the sub-action to 'view ban list'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list';

$context['page_title'] = $txt['ban_title'];
$context['sub_action'] = $_REQUEST['sa'];

// Tabs for browsing the different ban functions.
Replace With: Select
// Tabs for browsing the different ban functions.
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// Default the sub-action to 'view ban list'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'list';

$context['page_title'] = $txt['ban_title'];
$context['sub_action'] = $_REQUEST['sa'];

./Sources/ManageCalendar.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : $default;

// Set up the two tabs here...
Replace With: Select
// Set up the two tabs here...
Find: Select
call_helper($subActions[$_REQUEST['sa']]);
Add Before: Select
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : $default;

./Sources/ManageErrors.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$context['filter']['value']['html'] = '<a href="' . $scripturl . '?action=profile;u=' . $id . '">' . $user_profile[$id]['real_name'] . '</a>';
Replace With: Select
$context['filter']['value']['html'] = '<a href="' . $scripturl . '?action=profile;u=' . $id . '">' . (isset($user_profile[$id]['real_name']) ? $user_profile[$id]['real_name'] : $txt['guest']) . '</a>';

./Sources/ManageLanguages.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// By default we're managing languages.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'edit';
$context['sub_action'] = $_REQUEST['sa'];

// Load up all the tabs...
Replace With: Select
// Load up all the tabs...
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// By default we're managing languages.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'edit';
$context['sub_action'] = $_REQUEST['sa'];

Find: Select
$primary_settings = array('native_name' => 'string', 'lang_character_set' => 'string', 'lang_locale' => 'string', 'lang_rtl' => 'bool', 'lang_dictionary' => 'string', 'lang_recaptcha' => 'string');
Replace With: Select
$primary_settings = array('native_name' => 'string', 'lang_character_set' => 'string', 'lang_locale' => 'string', 'lang_rtl' => 'string', 'lang_dictionary' => 'string', 'lang_recaptcha' => 'string');

./Sources/ManageMembergroups.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default to sub action 'index' or 'settings' depending on permissions.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('manage_membergroups') ? 'index' : 'settings');

// Is it elsewhere?
if (isset($subActions[$_REQUEST['sa']][2]))
require_once($sourcedir . '/' . $subActions[$_REQUEST['sa']][2]);

// Do the permission check, you might not be allowed her.
isAllowedTo($subActions[$_REQUEST['sa']][1]);

// Language and template stuff, the usual.
Replace With: Select
// Language and template stuff, the usual.
Find: Select
// Call the right function.
Add Before: Select
// Default to sub action 'index' or 'settings' depending on permissions.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('manage_membergroups') ? 'index' : 'settings');

// Is it elsewhere?
if (isset($subActions[$_REQUEST['sa']][2]))
require_once($sourcedir . '/' . $subActions[$_REQUEST['sa']][2]);

// Do the permission check, you might not be allowed here.
isAllowedTo($subActions[$_REQUEST['sa']][1]);

./Sources/ManageNews.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
call_integration_hook('integrate_manage_news', array(&$subActions));

// Default to sub action 'main' or 'settings' depending on permissions.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('edit_news') ? 'editnews' : (allowedTo('send_mail') ? 'mailingmembers' : 'settings'));

// Have you got the proper permissions?
isAllowedTo($subActions[$_REQUEST['sa']][1]);

// Create the tabs for the template.
Replace With: Select
// Create the tabs for the template.
Find: Select
// Force the right area...
Add Before: Select
call_integration_hook('integrate_manage_news', array(&$subActions));

// Default to sub action 'main' or 'settings' depending on permissions.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (allowedTo('edit_news') ? 'editnews' : (allowedTo('send_mail') ? 'mailingmembers' : 'settings'));

// Have you got the proper permissions?
isAllowedTo($subActions[$_REQUEST['sa']][1]);

./Sources/ManagePaid.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default the sub-action to 'view subscriptions', but only if they have already set things up..
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (!empty($modSettings['paid_currency_symbol']) && !empty($modSettings['paid_enabled']) ? 'view' : 'settings');

// Make sure you can do this.
isAllowedTo($subActions[$_REQUEST['sa']][1]);

$context['page_title'] = $txt['paid_subscriptions'];
Replace With: Select
$context['page_title'] = $txt['paid_subscriptions'];
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// Default the sub-action to 'view subscriptions', but only if they have already set things up..
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : (!empty($modSettings['paid_currency_symbol']) && !empty($modSettings['paid_enabled']) ? 'view' : 'settings');

// Make sure you can do this.
isAllowedTo($subActions[$_REQUEST['sa']][1]);

./Sources/ManagePermissions.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) && empty($subActions[$_REQUEST['sa']]['disabled']) ? $_REQUEST['sa'] : (allowedTo('manage_permissions') ? 'index' : 'settings');
isAllowedTo($subActions[$_REQUEST['sa']][1]);

// Create the tabs for the template.
Replace With: Select
// Create the tabs for the template.
Find: Select
call_helper($subActions[$_REQUEST['sa']][0]);
Add Before: Select
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) && empty($subActions[$_REQUEST['sa']]['disabled']) ? $_REQUEST['sa'] : (allowedTo('manage_permissions') ? 'index' : 'settings');

isAllowedTo($subActions[$_REQUEST['sa']][1]);

./Sources/ManagePosts.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default the sub-action to 'posts'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'posts';

$context['page_title'] = $txt['manageposts_title'];
Replace With: Select
$context['page_title'] = $txt['manageposts_title'];
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// Default the sub-action to 'posts'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'posts';

./Sources/ManageSearch.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default the sub-action to 'edit search settings'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'weights';

$context['sub_action'] = $_REQUEST['sa'];

// Create the tabs for the template.
Replace With: Select
// Create the tabs for the template.
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// Default the sub-action to 'edit search settings'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'weights';

$context['sub_action'] = $_REQUEST['sa'];

Find: Select
$smcFunc['db_query']('', '
ALTER TABLE {db_prefix}messages
DROP INDEX ' . implode(',
DROP INDEX ', $context['fulltext_index']),
array(
'db_error_skip' => true,
)
);
Replace With: Select
if ($db_type == 'postgresql')
$smcFunc['db_query']('', '
DROP INDEX IF EXISTS {db_prefix}messages_ftx',
array(
'db_error_skip' => true,
)
);
else
$smcFunc['db_query']('', '
ALTER TABLE {db_prefix}messages
DROP INDEX ' . implode(',
DROP INDEX ', $context['fulltext_index']),
array(
'db_error_skip' => true,
)
);

./Sources/ManageServer.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
// By default we're editing the core settings
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'general';
$context['sub_action'] = $_REQUEST['sa'];

// Warn the user if there's any relevant information regarding Settings.php.
Replace With: Select
// Warn the user if there's any relevant information regarding Settings.php.
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// By default we're editing the core settings
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'general';

$context['sub_action'] = $_REQUEST['sa'];

./Sources/ManageSmileys.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Default the sub-action to 'edit smiley settings'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'editsets';

$context['page_title'] = $txt['smileys_manage'];
$context['sub_action'] = $_REQUEST['sa'];
$context['sub_template'] = $context['sub_action'];

// Load up all the tabs...
Replace With: Select
// Load up all the tabs...
Find: Select
// Call the right function for this sub-action.
Add Before: Select
// Default the sub-action to 'edit smiley settings'.
$_REQUEST['sa'] = isset($_REQUEST['sa']) && isset($subActions[$_REQUEST['sa']]) ? $_REQUEST['sa'] : 'editsets';

$context['page_title'] = $txt['smileys_manage'];

$context['sub_template'] = $context['sub_action'] = $_REQUEST['sa'];

./Sources/MessageIndex.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
if (!empty($_REQUEST['start']) && (!is_numeric($_REQUEST['start']) || $_REQUEST['start'] % $context['messages_per_page'] != 0))
Replace With: Select
if (!empty($_REQUEST['start']) && (!is_numeric($_REQUEST['start']) || $_REQUEST['start'] % $context['topics_per_page'] != 0))

./Sources/ModerationCenter.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
/**
* Browse all the reported users...
*/
function ReportedMembers()
{
global $txt, $context, $scripturl, $smcFunc;

loadTemplate('ModerationCenter');

// Set an empty var for the server response.
$context['report_member_action'] = '';

// Put the open and closed options into tabs, because we can...
$context[$context['moderation_menu_name']]['tab_data'] = array(
'title' => $txt['mc_reported_members'],
'help' => '',
'description' => $txt['mc_reported_members_desc'],
);

isAllowedTo('moderate_forum');

// Set up the comforting bits...
$context['page_title'] = $txt['mc_reported_members'];
$context['sub_template'] = 'reported_members';

// Are we viewing open or closed reports?
$context['view_closed'] = isset($_GET['sa']) && $_GET['sa'] == 'closed' ? 1 : 0;

// Are we doing any work?
if ((isset($_GET['ignore']) || isset($_GET['close'])) && isset($_GET['rid']))
{
checkSession('get');
$_GET['rid'] = (int) $_GET['rid'];

// Update the report...
$smcFunc['db_query']('', '
UPDATE {db_prefix}log_reported
SET ' . (isset($_GET['ignore']) ? 'ignore_all = {int:ignore_all}' : 'closed = {int:closed}') . '
WHERE id_report = {int:id_report}',
array(
'ignore_all' => isset($_GET['ignore']) ? (int) $_GET['ignore'] : 0,
'closed' => isset($_GET['close']) ? (int) $_GET['close'] : 0,
'id_report' => $_GET['rid'],
)
);

// Get the board, topic and message for this report
$request = $smcFunc['db_query']('', '
SELECT id_member, membername
FROM {db_prefix}log_reported
WHERE id_report = {int:id_report}',
array(
'id_report' => $_GET['rid'],
)
);

// Set up the data for the log...
$extra = array('report' => $_GET['rid']);
list($extra['member'], $extra['membername']) = $smcFunc['db_fetch_row']($request);
$smcFunc['db_free_result']($request);

// Stick this in string format for consistency
$extra['member'] = (string) $extra['member'];

// Tell the user about it.
$context['report_member_action'] = isset($_GET['ignore']) ? (!empty($_GET['ignore']) ? 'ignore' : 'unignore') : (!empty($_GET['close']) ? 'close' : 'open');

// Log this action
logAction($context['report_member_action'] . '_user_report', $extra);

// Time to update.
updateSettings(array('last_mod_report_action' => time()));
recountOpenReports('members');
}
elseif (isset($_POST['close']) && isset($_POST['close_selected']))
{
checkSession();

// All the ones to update...
$toClose = array();
foreach ($_POST['close'] as $rid)
$toClose[] = (int) $rid;

if (!empty($toClose))
{
// Get the data for each of these reports
$request = $smcFunc['db_query']('', '
SELECT id_report, id_member, membername
FROM {db_prefix}log_reported
WHERE id_report IN ({array_int:report_list})',
array(
'report_list' => $toClose,
)
);

$logs = array();
while ($reports = $smcFunc['db_fetch_assoc']($request))
{
$logs[] = array(
'action' => 'close_user_report',
'log_type' => 'moderate',
'extra' => array(
'report' => $reports['id_report'],
'membername' => $reports['membername'],
'member' => (string) $reports['id_member'],
),
);
}

$smcFunc['db_free_result']($request);

// Log the closing of all the reports
logActions($logs);

$smcFunc['db_query']('', '
UPDATE {db_prefix}log_reported
SET closed = {int:is_closed}
WHERE id_report IN ({array_int:report_list})',
array(
'report_list' => $toClose,
'is_closed' => 1,
)
);

// Time to update.
updateSettings(array('last_mod_report_action' => time()));
recountOpenReports('members');
}

// Go on and tell the result.
$context['report_member_action'] = 'close_all';
}

// How many entries are we viewing?
$request = $smcFunc['db_query']('', '
SELECT COUNT(*)
FROM {db_prefix}log_reported AS lr
WHERE lr.closed = {int:view_closed}
AND lr.id_board = {int:not_a_reported_post}',
array(
'view_closed' => $context['view_closed'],
'not_a_reported_post' => 0,
)
);
list ($context['total_reports']) = $smcFunc['db_fetch_row']($request);
$smcFunc['db_free_result']($request);

// So, that means we can page index, yes?
$context['page_index'] = constructPageIndex($scripturl . '?action=moderate;area=reportedmembers' . ($context['view_closed'] ? ';sa=closed' : ''), $_GET['start'], $context['total_reports'], 10);
$context['start'] = $_GET['start'];

// By George, that means we in a position to get the reports, golly good.
$request = $smcFunc['db_query']('', '
SELECT lr.id_report, lr.id_member, lr.time_started, lr.time_updated, lr.num_reports, lr.closed, lr.ignore_all,
COALESCE(mem.real_name, lr.membername) AS user_name, COALESCE(mem.id_member, 0) AS id_user
FROM {db_prefix}log_reported AS lr
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lr.id_member)
WHERE lr.closed = {int:view_closed}
AND lr.id_board = {int:not_a_reported_post}
ORDER BY lr.time_updated DESC
LIMIT {int:limit}, {int:max}',
array(
'view_closed' => $context['view_closed'],
'not_a_reported_post' => 0,
'limit' => $context['start'],
'max' => 10,
)
);
$context['reports'] = array();
$report_ids = array();
for ($i = 0; $row = $smcFunc['db_fetch_assoc']($request); $i++)
{
$report_ids[] = $row['id_report'];
$context['reports'][$row['id_report']] = array(
'id' => $row['id_report'],
'report_href' => $scripturl . '?action=moderate;area=reportedmembers;report=' . $row['id_report'],
'user' => array(
'id' => $row['id_user'],
'name' => $row['user_name'],
'link' => $row['id_user'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_user'] . '">' . $row['user_name'] . '</a>' : $row['user_name'],
'href' => $scripturl . '?action=profile;u=' . $row['id_user'],
),
'comments' => array(),
'time_started' => timeformat($row['time_started']),
'last_updated' => timeformat($row['time_updated']),
'num_reports' => $row['num_reports'],
'closed' => $row['closed'],
'ignore' => $row['ignore_all']
);
}
$smcFunc['db_free_result']($request);

// Now get all the people who reported it.
if (!empty($report_ids))
{
$request = $smcFunc['db_query']('', '
SELECT lrc.id_comment, lrc.id_report, lrc.time_sent, lrc.comment,
COALESCE(mem.id_member, 0) AS id_member, COALESCE(mem.real_name, lrc.membername) AS reporter
FROM {db_prefix}log_reported_comments AS lrc
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = lrc.id_member)
WHERE lrc.id_report IN ({array_int:report_list})',
array(
'report_list' => $report_ids,
)
);
while ($row = $smcFunc['db_fetch_assoc']($request))
{
$context['reports'][$row['id_report']]['comments'][] = array(
'id' => $row['id_comment'],
'message' => $row['comment'],
'time' => timeformat($row['time_sent']),
'member' => array(
'id' => $row['id_member'],
'name' => empty($row['reporter']) ? $txt['guest'] : $row['reporter'],
'link' => $row['id_member'] ? '<a href="' . $scripturl . '?action=profile;u=' . $row['id_member'] . '">' . $row['reporter'] . '</a>' : (empty($row['reporter']) ? $txt['guest'] : $row['reporter']),
'href' => $row['id_member'] ? $scripturl . '?action=profile;u=' . $row['id_member'] : '',
),
);
}
$smcFunc['db_free_result']($request);
}

$context['report_manage_bans'] = allowedTo('manage_bans');
}

/**
* Act as an entrace for all group related activity.
Replace With: Select
/**
* Act as an entrace for all group related activity.

./Sources/PersonalMessage.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Execute the query!
Add Before: Select
$group_by = $context['folder'] == 'sent' ? '
GROUP BY pm.id_pm, pm.subject, pm.id_member_from, pm.body, pm.msgtime, pm.from_name' .
($context['sort_by'] == 'name' ? ', mem.real_name' : '')
: '';

Find: Select
WHERE pm.id_pm IN ({array_int:display_pms})' . ($context['folder'] == 'sent' ? '
GROUP BY pm.id_pm, pm.subject, pm.id_member_from, pm.body, pm.msgtime, pm.from_name' : '') . '
Replace With: Select
WHERE pm.id_pm IN ({array_int:display_pms})' .
$group_by . '

./Sources/Post.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
// Do we need to show the visual verification image?
Add Before: Select
// Previously uploaded attachments have 2 flavors:
// - Existing post - at this point, now in $context['current_attachments']
// - Just added, current session only - at this point, now in $_SESSION['already_attached']
// We need to make sure *all* of these are in $context['current_attachments'], otherwise they won't show in dropzone during edits.
if (!empty($_SESSION['already_attached']))
{
$request = $smcFunc['db_query']('', '
SELECT
a.id_attach, a.filename, COALESCE(a.size, 0) AS filesize, a.approved, a.mime_type, a.id_thumb
FROM {db_prefix}attachments AS a
WHERE a.attachment_type = {int:attachment_type}
AND a.id_attach IN ({array_int:just_uploaded})',
array(
'attachment_type' => 0,
'just_uploaded' => $_SESSION['already_attached']
)
);

while ($row = $smcFunc['db_fetch_assoc']($request))
{
$context['current_attachments'][$row['id_attach']] = array(
'name' => $smcFunc['htmlspecialchars']($row['filename']),
'size' => $row['filesize'],
'attachID' => $row['id_attach'],
'approved' => $row['approved'],
'mime_type' => $row['mime_type'],
'thumb' => $row['id_thumb'],
);
}
$smcFunc['db_free_result']($request);
}

Find: Select
$context['num_allowed_attachments'] = min(ini_get('max_file_uploads'), (empty($modSettings['attachmentNumPerPostLimit']) ? 50 : $modSettings['attachmentNumPerPostLimit']));
Replace With: Select
$context['num_allowed_attachments'] = !isset($modSettings['attachmentNumPerPostLimit']) ? 4 : $modSettings['attachmentNumPerPostLimit'];
Find: Select
// This will save some time...
if (empty($approve_has_changed))
unset($msgOptions['approved']);

modifyPost($msgOptions, $topicOptions, $posterOptions);
}
Replace With: Select
modifyPost($msgOptions, $topicOptions, $posterOptions);
}
Find: Select
'modify_reason' => (isset($_POST['modify_reason']) ? $_POST['modify_reason'] : ''),
Add After: Select
'approved' => (isset($row['approved']) ? $row['approved'] : null),

./Sources/Profile-Modify.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
'permission' => 'profile_website',
'link_with' => 'website',
Add After: Select
'input_validate' => function(&$value) use ($smcFunc)
{
if (mb_strlen($value) > 250)
return 'website_title_too_long';

return true;
},
Find: Select
if ($row['mask'] == 'nohtml' && ($valueReference != strip_tags($valueReference) || $value != filter_var($value, FILTER_SANITIZE_FULL_SPECIAL_CHARS) || preg_match('/<(.+?)[\s]*\/?[\s]*>/si', $valueReference)))
Replace With: Select
if ($row['mask'] == 'nohtml' && ($valueReference != strip_tags($valueReference) || $value != $smcFunc['htmlspecialchars']($value, ENT_NOQUOTES) || preg_match('/<(.+?)[\s]*\/?[\s]*>/si', $valueReference)))
Find: Select
SELECT id_alert, content_id, content_type, content_action
Replace With: Select
SELECT id_alert, content_id, content_type, content_action, is_read
Find: Select
foreach ($alerts as $id_alert => $alert)
{
if (!$alert['visible'])
unset($alerts[$id_alert]);
}
Replace With: Select
$deletes = array();
$num_unread_deletes = 0;
foreach ($alerts as $id_alert => $alert)
{
if (!$alert['visible'])
{
if (empty($alert['is_read']))
$num_unread_deletes++;

unset($alerts[$id_alert]);
$deletes[] = $id_alert;
}
}

// Penultimate task - delete these orphaned, invisible alerts, otherwise they might hang around forever.
// This can happen if they are deleted or moved to a board this user cannot access.
// Note that unread alerts are never purged.
if (!empty($deletes))
{
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}user_alerts
WHERE id_alert IN ({array_int:alerts})',
array(
'alerts' => $deletes,
)
);
}

// One last thing - tweak counter on member record.
// Do it directly, as updateMemberData() calls this function, and may create a loop.
// Note that $user_info is not populated when this is invoked via cron, hence the CASE statement.
if ($num_unread_deletes > 0)
{
$smcFunc['db_query']('', '
UPDATE {db_prefix}members
SET alerts =
CASE
WHEN alerts < {int:unread_deletes} THEN 0
ELSE alerts - {int:unread_deletes}
END
WHERE id_member = {int:member}',
array(
'unread_deletes' => $num_unread_deletes,
'member' => $memID,
)
);
}

./Sources/Profile-View.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$context['ip'] = $context['ip']['low'] . ' - ' . $context['ip']['high'];
Replace With: Select
$context['ip'] = $context['ip']['low'] . '-' . $context['ip']['high'];

./Sources/Profile.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$context['unread_alerts'] = fetch_alerts($memID, false, !empty($counter) ? $cur_profile['alerts'] - $counter : $limit, 0, !isset($_REQUEST['counter']));

// This shouldn't happen, but just in case...
if (empty($counter) && $cur_profile['alerts'] != count($context['unread_alerts']))
updateMemberData($memID, array('alerts' => count($context['unread_alerts'])));
Replace With: Select
$context['unread_alerts'] = fetch_alerts($memID, false, !empty($counter) ? $cur_profile['alerts'] - $counter : $limit, 0, !isset($_REQUEST['counter']));

./Sources/Recent.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
SELECT lt.id_topic, lt.id_msg
FROM {db_prefix}topics AS t
Replace With: Select
SELECT lt.id_topic, lt.id_msg, lt.unwatched
FROM {db_prefix}topics AS t
Find: Select
AND t.approved = {int:is_approved}' : '') . ' AND lt.unwatched != 1',
Replace With: Select
AND t.approved = {int:is_approved}' : ''),
Find: Select
AND t.id_last_msg > {int:earliest_msg}' : '') . '
AND COALESCE(lt.id_msg, lmr.id_msg, 0) < t.id_last_msg' . ($modSettings['postmod_active'] ? '
AND t.approved = {int:is_approved}' : ''),
Replace With: Select
AND t.id_last_msg > {int:earliest_msg}' : '') . '
AND COALESCE(lt.id_msg, lmr.id_msg, 0) < t.id_last_msg' . ($modSettings['postmod_active'] ? '
AND t.approved = {int:is_approved}' : '') . '
AND COALESCE(lt.unwatched, 0) != 1',
Find: Select
ORDER BY {raw:sort}
Add Before: Select
AND COALESCE(lt.unwatched, 0) != 1
Find: Select
GROUP BY m.id_topic',
Add Before: Select
AND COALESCE(lt.unwatched, 0) != 1

./Sources/Register.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
if (!isset($_POST['new_email']))
Replace With: Select
// Notify the admin about new activations, but not re-activations.
if (empty($row['is_activated']))

./Sources/Security.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$user_permissions = $user_info['permissions'];
Replace With: Select
$user_permissions = (array) $user_info['permissions'];
Find: Select
if (count(array_intersect($permission, $user_permissions)) != 0)
return true;
// You aren't allowed, by default.
else
return false;
Replace With: Select
return array_intersect($permission, $user_permissions) != [];
Find: Select
$context['cors_headers'] += implode(',', $cors_headers);
Replace With: Select
$context['cors_headers'] .= ',' . implode(',', $cors_headers);

./Sources/ShowAttachments.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
$file['etag'] = '"' . sha1_file($file['filePath']) . '"';
Replace With: Select
$file['etag'] = $file['exists'] ? sha1_file($file['filePath']) : '';
Find: Select
$thumbFile['etag'] = '"' . sha1_file($thumbFile['filePath']) . '"';
Replace With: Select
$thumbFile['etag'] = $thumbFile['exists'] ? sha1_file($thumbFile['filePath']) : '';
Find: Select
header('etag: ' . $file['etag']);
Replace With: Select
header('etag: "' . $file['etag'] . '"');

./Sources/Subs-Attachments.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
if (!empty($context['preview_message']))
$msgIDs[] = 0;
Replace With: Select
// Ensure that $msgIDs doesn't contain zero or non-integers.
$msgIDs = array_filter(array_map('intval', $msgIDs));
Find: Select
if (!empty($msgIDs))
Replace With: Select
if (!empty($msgIDs) || !empty($_SESSION['attachments_can_preview']))
Find: Select
$request = $smcFunc['db_query']('', '
SELECT
Add Before: Select
// Where clause - there may or may not be msg ids, & may or may not be attachs to preview,
// depending on post vs edit, inserted or not, preview or not, post error or not, etc.
// Either way, they may be needed in a display of a list of posts or in the dropzone 'mock' list of thumbnails.
$msg_or_att = '';
if (!empty($msgIDs))
$msg_or_att .= 'a.id_msg IN ({array_int:message_id}) ';
if (!empty($msgIDs) && !empty($_SESSION['attachments_can_preview']))
$msg_or_att .= 'OR ';
if (!empty($_SESSION['attachments_can_preview']))
$msg_or_att .= 'a.id_attach IN ({array_int:preview_attachments})';

// This tries to get all attachments for the page being displayed, to build a cache of attach info.
// This is also being used by POST, so it may need to grab attachs known only in the session.
Find: Select
AND a.id_msg IN ({array_int:message_id})',
Replace With: Select
AND (' . $msg_or_att . ')',
Find: Select
'message_id' => $msgIDs,
'attachment_type' => 0,
Add After: Select
'preview_attachments' => !empty($_SESSION['attachments_can_preview']) ? array_keys(array_filter($_SESSION['attachments_can_preview'])) : array(0),

./Sources/Subs-Boards.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Before we add new access_groups or deny_groups, remove all of the old entries
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}board_permissions_view
WHERE id_board = {int:selected_board}',
array(
'selected_board' => $board_id,
)
);
Replace With: Select
if (!empty($boardOptions['deny_groups']) || !empty($boardOptions['access_groups'])) {
// Before we add new access_groups or deny_groups, remove all of the old entries
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}board_permissions_view
WHERE id_board = {int:selected_board}',
array(
'selected_board' => $board_id,
)
);
}

./Sources/Subs-Charset.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
/**
* Converts the given UTF-8 string into lowercase.
Add Before: Select
require_once($sourcedir . '/Unicode/Metadata.php');

Find: Select
global $sourcedir;

$string = (string) $string;

$chars = preg_split('/(.)/su', $string, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

if ($chars === false)
return false;

require_once($sourcedir . '/Unicode/CaseLower.php');

$substitutions = utf8_strtolower_maps();

foreach ($chars as &$char)
$char = isset($substitutions[$char]) ? $substitutions[$char] : $char;

return implode('', $chars);
Replace With: Select
return utf8_convert_case($string, 'lower');
Find: Select
global $sourcedir;

$string = (string) $string;

$chars = preg_split('/(.)/su', $string, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

if ($chars === false)
return false;

require_once($sourcedir . '/Unicode/CaseUpper.php');

$substitutions = utf8_strtoupper_maps();

foreach ($chars as &$char)
$char = isset($substitutions[$char]) ? $substitutions[$char] : $char;

return implode('', $chars);
Replace With: Select
return utf8_convert_case($string, 'upper');
Find: Select
function utf8_casefold($string)
{
global $sourcedir;

$string = (string) $string;

$chars = preg_split('/(.)/su', $string, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

if ($chars === false)
return false;

Replace With: Select
function utf8_casefold($string)
{
return utf8_convert_case($string, 'fold');
}

/**
* Converts the case of the given UTF-8 string.
*
* @param string $string The string.
* @param string $case One of 'upper', 'lower', 'fold', 'title', 'ucfirst', or 'ucwords'.
* @param bool $simple If true, use simple maps instead of full maps. Default: false.
* @return string A version of $string converted to the specified case.
*/
function utf8_convert_case($string, $case, $simple = false)
{
global $sourcedir, $txt;

$simple = !empty($simple);

$lang = empty($txt['lang_locale']) ? '' : substr($txt['lang_locale'], 0, 2);

Find: Select
require_once($sourcedir . '/Unicode/CaseFold.php');

$substitutions = utf8_casefold_maps();

foreach ($chars as &$char)
$char = isset($substitutions[$char]) ? $substitutions[$char] : $char;

Replace With: Select
// The main case conversion logic
if (in_array($case, array('upper', 'lower', 'fold')))
{
$chars = preg_split('/(.)/su', $string, 0, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

if ($chars === false)
return false;

switch ($case)
{
case 'upper':
require_once($sourcedir . '/Unicode/CaseUpper.php');

$substitutions = $simple ? utf8_strtoupper_simple_maps() : utf8_strtoupper_maps();

// Turkish & Azeri conditional casing, part 1.
if (in_array($lang, array('tr', 'az')))
$substitutions['i'] = 'İ';

break;

case 'lower':
require_once($sourcedir . '/Unicode/CaseLower.php');

Find: Select
return implode('', $chars);
Replace With: Select
$substitutions = $simple ? utf8_strtolower_simple_maps() : utf8_strtolower_maps();

// Turkish & Azeri conditional casing, part 1.
if (in_array($lang, array('tr', 'az')))
{
$substitutions['İ'] = 'i';
$substitutions['I' . "\xCC\x87"] = 'i';
$substitutions['I'] = 'ı';
}

break;

case 'fold':
require_once($sourcedir . '/Unicode/CaseFold.php');

$substitutions = $simple ? utf8_casefold_simple_maps() : utf8_casefold_maps();

break;
}

foreach ($chars as &$char)
$char = isset($substitutions[$char]) ? $substitutions[$char] : $char;

$string = implode('', $chars);
}
elseif (in_array($case, array('title', 'ucfirst', 'ucwords')))
{
require_once($sourcedir . '/Unicode/RegularExpressions.php');
require_once($sourcedir . '/Unicode/CaseUpper.php');
require_once($sourcedir . '/Unicode/CaseTitle.php');

$prop_classes = utf8_regex_properties();

$upper = $simple ? utf8_strtoupper_simple_maps() : utf8_strtoupper_maps();

// Turkish & Azeri conditional casing, part 1.
if (in_array($lang, array('tr', 'az')))
$upper['i'] = 'İ';

$title = array_merge($upper, $simple ? utf8_titlecase_simple_maps() : utf8_titlecase_maps());

switch ($case)
{
case 'title':
$string = utf8_convert_case($string, 'lower', $simple);
$regex = '/(?:^|[^\w' . $prop_classes['Case_Ignorable'] . '])\K(\p{L})/u';
break;

case 'ucwords':
$regex = '/(?:^|[^\w' . $prop_classes['Case_Ignorable'] . '])\K(\p{L})(?=[' . $prop_classes['Case_Ignorable'] . ']*(?:(?<upper>\p{Lu})|\w?))/u';
break;

case 'ucfirst':
$regex = '/^[^\w' . $prop_classes['Case_Ignorable'] . ']*\K(\p{L})(?=[' . $prop_classes['Case_Ignorable'] . ']*(?:(?<upper>\p{Lu})|\w?))/u';
break;
}

$string = preg_replace_callback(
$regex,
function($matches) use ($upper, $title)
{
// If second letter is uppercase, use uppercase for first letter.
// Otherwise, use titlecase for first letter.
$case = !empty($matches['upper']) ? 'upper' : 'title';

$matches[1] = isset($$case[$matches[1]]) ? $$case[$matches[1]] : $matches[1];

return $matches[1];
},
$string
);
}

// If casefolding, we're done.
if ($case === 'fold')
return $string;

// Handle conditional casing situations...
$substitutions = array();
$replacements = array();

// Greek conditional casing, part 1: Fix lowercase sigma.
// Note that this rule doesn't depend on $txt['lang_locale'].
if ($case !== 'upper' && strpos($string, 'ς') !== false || strpos($string, 'σ') !== false)
{
require_once($sourcedir . '/Unicode/RegularExpressions.php');

$prop_classes = utf8_regex_properties();

// First, convert all lowercase sigmas to regular form.
$substitutions['ς'] = 'σ';

// Then convert any at the end of words to final form.
$replacements['/\Bσ([' . $prop_classes['Case_Ignorable'] . ']*)(?!\p{L})/u'] = 'ς$1';
}
// Greek conditional casing, part 2: No accents on uppercase strings.
if ($lang === 'el' && $case === 'upper')
{
// Composed forms.
$substitutions += array(
'Ά' => 'Α', 'Ἀ' => 'Α', 'Ἁ' => 'Α', 'Ὰ' => 'Α', 'Ᾰ' => 'Α',
'Ᾱ' => 'Α', 'Α' => 'Α', 'Α' => 'Α', 'Ἂ' => 'Α', 'Ἃ' => 'Α',
'Ἄ' => 'Α', 'Ἅ' => 'Α', 'Ἆ' => 'Α', 'Ἇ' => 'Α', 'Ὰ' => 'Α',
'Ά' => 'Α', 'Α' => 'Α', 'Ἀ' => 'Α', 'Ἁ' => 'Α', 'Ἂ' => 'Α',
'Ἃ' => 'Α', 'Ἄ' => 'Α', 'Ἅ' => 'Α', 'Ἆ' => 'Α', 'Ἇ' => 'Α',
'Έ' => 'Ε', 'Ἐ' => 'Ε', 'Ἑ' => 'Ε', 'Ὲ' => 'Ε', 'Ἒ' => 'Ε',
'Ἓ' => 'Ε', 'Ἔ' => 'Ε', 'Ἕ' => 'Ε', 'Ή' => 'Η', 'Ἠ' => 'Η',
'Ἡ' => 'Η', 'Ὴ' => 'Η', 'Η' => 'Η', 'Η' => 'Η', 'Ἢ' => 'Η',
'Ἣ' => 'Η', 'Ἤ' => 'Η', 'Ἥ' => 'Η', 'Ἦ' => 'Η', 'Ἧ' => 'Η',
'Ἠ' => 'Η', 'Ἡ' => 'Η', 'Ὴ' => 'Η', 'Ή' => 'Η', 'Η' => 'Η',
'Ἢ' => 'Η', 'Ἣ' => 'Η', 'Ἤ' => 'Η', 'Ἥ' => 'Η', 'Ἦ' => 'Η',
'Ἧ' => 'Η', 'Ί' => 'Ι', 'Ἰ' => 'Ι', 'Ἱ' => 'Ι', 'Ὶ' => 'Ι',
'Ῐ' => 'Ι', 'Ῑ' => 'Ι', 'Ι' => 'Ι', 'Ϊ' => 'Ι', 'Ι' => 'Ι',
'Ἲ' => 'Ι', 'Ἳ' => 'Ι', 'Ἴ' => 'Ι', 'Ἵ' => 'Ι', 'Ἶ' => 'Ι',
'Ἷ' => 'Ι', 'Ι' => 'Ι', 'Ι' => 'Ι', 'Ό' => 'Ο', 'Ὀ' => 'Ο',
'Ὁ' => 'Ο', 'Ὸ' => 'Ο', 'Ὂ' => 'Ο', 'Ὃ' => 'Ο', 'Ὄ' => 'Ο',
'Ὅ' => 'Ο', 'Ῥ' => 'Ρ', 'Ύ' => 'Υ', 'Υ' => 'Υ', 'Ὑ' => 'Υ',
'Ὺ' => 'Υ', 'Ῠ' => 'Υ', 'Ῡ' => 'Υ', 'Υ' => 'Υ', 'Ϋ' => 'Υ',
'Υ' => 'Υ', 'Υ' => 'Υ', 'Ὓ' => 'Υ', 'Υ' => 'Υ', 'Ὕ' => 'Υ',
'Υ' => 'Υ', 'Ὗ' => 'Υ', 'Υ' => 'Υ', 'Υ' => 'Υ', 'Υ' => 'Υ',
'Ώ' => 'Ω', 'Ὠ' => 'Ω', 'Ὡ' => 'Ω', 'Ὼ' => 'Ω', 'Ω' => 'Ω',
'Ω' => 'Ω', 'Ὢ' => 'Ω', 'Ὣ' => 'Ω', 'Ὤ' => 'Ω', 'Ὥ' => 'Ω',
'Ὦ' => 'Ω', 'Ὧ' => 'Ω', 'Ὠ' => 'Ω', 'Ὡ' => 'Ω', 'Ώ' => 'Ω',
'Ω' => 'Ω', 'Ὢ' => 'Ω', 'Ὣ' => 'Ω', 'Ὤ' => 'Ω', 'Ὥ' => 'Ω',
'Ὦ' => 'Ω', 'Ὧ' => 'Ω',
);

// Individual Greek diacritics.
$substitutions += array(
"\xCC\x80" => '', "\xCC\x81" => '', "\xCC\x84" => '',
"\xCC\x86" => '', "\xCC\x88" => '', "\xCC\x93" => '',
"\xCC\x94" => '', "\xCD\x82" => '', "\xCD\x83" => '',
"\xCD\x84" => '', "\xCD\x85" => '', "\xCD\xBA" => '',
"\xCE\x84" => '', "\xCE\x85" => '',
"\xE1\xBE\xBD" => '', "\xE1\xBE\xBF" => '', "\xE1\xBF\x80" => '',
"\xE1\xBF\x81" => '', "\xE1\xBF\x8D" => '', "\xE1\xBF\x8E" => '',
"\xE1\xBF\x8F" => '', "\xE1\xBF\x9D" => '', "\xE1\xBF\x9E" => '',
"\xE1\xBF\x9F" => '', "\xE1\xBF\xAD" => '', "\xE1\xBF\xAE" => '',
"\xE1\xBF\xAF" => '', "\xE1\xBF\xBD" => '', "\xE1\xBF\xBE" => '',
);
}

// Turkish & Azeri conditional casing, part 2.
if ($case !== 'upper' && in_array($lang, array('tr', 'az')))
{
// Remove unnecessary "COMBINING DOT ABOVE" after i
$substitutions['i' . "\xCC\x87"] = 'i';
}

// Lithuanian conditional casing.
if ($lang === 'lt')
{
// Force a dot above lowercase i and j with accents by inserting
// the "COMBINING DOT ABOVE" character.
// Note: some fonts handle this incorrectly and show two dots,
// but that's a bug in those fonts and cannot be fixed here.
if ($case !== 'upper')
$replacements['/(i\x{328}?|\x{12F}|j)([\x{300}\x{301}\x{303}])/u'] = '$1' . "\xCC\x87" . '$2';

// Remove "COMBINING DOT ABOVE" after uppercase I and J.
if ($case !== 'lower')
$replacements['/(I\x{328}?|\x{12E}|J)\x{307}/u'] = '$1';
}

// Dutch has a special titlecase rule.
if ($lang === 'nl' && $case === 'title')
{
$replacements['/\bIj/u'] = 'IJ';
}

// Now perform whatever conditional casing fixes we need.
if (!empty($substitutions))
$string = strtr($string, $substitutions);

if (!empty($replacements))
$string = preg_replace(array_keys($replacements), $replacements, $string);

return $string;
Find: Select
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_D))
return $string;
Replace With: Select
if (is_callable('IntlChar::getUnicodeVersion') && version_compare(implode('.', IntlChar::getUnicodeVersion()), SMF_UNICODE_VERSION, '>='))
{
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_D))
return $string;
Find: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_D);
Replace With: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_D);
}
Find: Select
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_KD))
return $string;
Replace With: Select
if (is_callable('IntlChar::getUnicodeVersion') && version_compare(implode('.', IntlChar::getUnicodeVersion()), SMF_UNICODE_VERSION, '>='))
{
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_KD))
return $string;
Find: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_KD);
Replace With: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_KD);
}
Find: Select
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_C))
return $string;
Replace With: Select
if (is_callable('IntlChar::getUnicodeVersion') && version_compare(implode('.', IntlChar::getUnicodeVersion()), SMF_UNICODE_VERSION, '>='))
{
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_C))
return $string;
Find: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_C);
Replace With: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_C);
}
Find: Select
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_KC))
return $string;
Replace With: Select
if (is_callable('IntlChar::getUnicodeVersion') && version_compare(implode('.', IntlChar::getUnicodeVersion()), SMF_UNICODE_VERSION, '>='))
{
if (is_callable('normalizer_is_normalized') && normalizer_is_normalized($string, Normalizer::FORM_KC))
return $string;
Find: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_KC);
Replace With: Select
if (is_callable('normalizer_normalize'))
return normalizer_normalize($string, Normalizer::FORM_KC);
}
Find: Select
* @return array Array of decomposed Unicode characters.
Add Before: Select
* @param bool $compatibility If true, perform compatibility decomposition. Default false.
Find: Select
if ($chars[$i] >= "\xEA\xB0\x80" && $chars[$i] <= "\xED\x9E\xA3")
Add Before: Select
// See "Hangul Syllable Decomposition" in the Unicode standard, ch. 3.12.
Find: Select
$l = 0x1100 + $sindex / (21 * 28);
$v = 0x1161 + ($sindex % (21 * 28)) / 28;
Replace With: Select
$l = (int) (0x1100 + $sindex / (21 * 28));
$v = (int) (0x1161 + ($sindex % (21 * 28)) / 28);
Find: Select
if ($chars[$c] >= "\xE1\x84\x80" && $chars[$c] <= "\xE1\x84\x92" && $chars[$c + 1] >= "\xE1\x85\xA1" && $chars[$c + 1] <= "\xE1\x85\xB5")
Replace With: Select
if ($chars[$c] >= "\xE1\x84\x80" && $chars[$c] <= "\xE1\x84\x92" && isset($chars[$c + 1]) && $chars[$c + 1] >= "\xE1\x85\xA1" && $chars[$c + 1] <= "\xE1\x85\xB5")
Find: Select
$pattern = $letter . $nonspacing_marks . '[' . $classes['viramas'] . ']' . $nonspacing_combining_marks . '\K' . (!empty($zwj_pattern) ? '(?:' . $zwj_pattern . '|' . $zwnj_pattern . ')' : $zwnj_pattern);
Replace With: Select
$pattern = $letter . $nonspacing_marks . '[' . $classes['Virama'] . ']' . $nonspacing_combining_marks . '\K' . (!empty($zwj_pattern) ? '(?:' . $zwj_pattern . '|' . $zwnj_pattern . ')' : $zwnj_pattern);

./Sources/Subs-Compat.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
'IDNA_ALLOW_UNASSIGNED' => 0,
Replace With: Select
'IDNA_ALLOW_UNASSIGNED' => 1,
Find: Select
* This is not a complete polyfill. The $flags, $variant, and $idna_info
* parameters are included for compatibility with the standard PHP
* function, but only the default values are supported.
*
* @param string $domain The domain to convert, which must be UTF-8 encoded.
* @param int $flags Ignored in this compatibility function.
* @param int $variant Ignored in this compatibility function.
Replace With: Select
* This is not a complete polyfill:
*
* - $flags only supports IDNA_DEFAULT, IDNA_NONTRANSITIONAL_TO_ASCII,
* and IDNA_USE_STD3_RULES.
* - $variant is ignored, because INTL_IDNA_VARIANT_UTS46 is always used.
* - $idna_info is ignored.
*
* @param string $domain The domain to convert, which must be UTF-8 encoded.
* @param int $flags A subset of possible IDNA_* flags.
* @param int $variant Ignored in this compatibility function.
Find: Select
function idn_to_ascii($domain, $flags = 0, $variant = 1, &$idna_info = null)
{
global $sourcedir;

require_once($sourcedir . '/Subs-Charset.php');
require_once($sourcedir . '/Class-Punycode.php');
$Punycode = new Punycode();

Replace With: Select
function idn_to_ascii($domain, $flags = 0, $variant = 1, &$idna_info = null)
{
global $sourcedir;

static $Punycode;

require_once($sourcedir . '/Class-Punycode.php');

Find: Select
return $Punycode->encode(sanitize_iri(utf8_normalize_kc_casefold($domain)));
Replace With: Select
if (!is_object($Punycode))
$Punycode = new Punycode();

if (method_exists($Punycode, 'useStd3'))
$Punycode->useStd3($flags === ($flags | IDNA_USE_STD3_RULES));
if (method_exists($Punycode, 'useNonTransitional'))
$Punycode->useNonTransitional($flags === ($flags | IDNA_NONTRANSITIONAL_TO_ASCII));

return $Punycode->encode($domain);
Find: Select
* This is not a complete polyfill. The $flags, $variant, and $idna_info
* parameters are included for compatibility with the standard PHP
* function, but only the default values are supported.
Replace With: Select
* This is not a complete polyfill:
*
* - $flags only supports IDNA_DEFAULT, IDNA_NONTRANSITIONAL_TO_UNICODE,
* and IDNA_USE_STD3_RULES.
* - $variant is ignored, because INTL_IDNA_VARIANT_UTS46 is always used.
* - $idna_info is ignored.
Find: Select
function idn_to_utf8($domain, $flags = 0, $variant = 1, &$idna_info = null)
{
global $sourcedir;

require_once($sourcedir . '/Subs-Charset.php');
require_once($sourcedir . '/Class-Punycode.php');
$Punycode = new Punycode();

Replace With: Select
function idn_to_utf8($domain, $flags = 0, $variant = 1, &$idna_info = null)
{
global $sourcedir;

static $Punycode;

require_once($sourcedir . '/Class-Punycode.php');

Find: Select
return $Punycode->decode(sanitize_iri(utf8_normalize_kc_casefold($domain)));
Replace With: Select
if (!is_object($Punycode))
$Punycode = new Punycode();

$Punycode->useStd3($flags === ($flags | IDNA_USE_STD3_RULES));
$Punycode->useNonTransitional($flags === ($flags | IDNA_NONTRANSITIONAL_TO_UNICODE));

return $Punycode->decode($domain);

./Sources/Subs-Db-mysql.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
mysqli_query($connection, 'SET SESSION sql_mode = \'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT\'');
Replace With: Select
mysqli_query($connection, 'SET SESSION sql_mode = \'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT\'');

./Sources/Subs-Db-postgresql.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
global $db_connection;

// Decide which connection to use
Replace With: Select
global $db_connection, $inTransaction;

// Decide which connection to use
Find: Select
return @pg_query($connection, 'BEGIN');
elseif ($type == 'rollback')
return @pg_query($connection, 'ROLLBACK');
elseif ($type == 'commit')
return @pg_query($connection, 'COMMIT');

Replace With: Select
{
$inTransaction = true;
return @pg_query($connection, 'BEGIN');
}
elseif ($type == 'rollback')
{
$inTransaction = false;
return @pg_query($connection, 'ROLLBACK');
}
elseif ($type == 'commit')
{
$inTransaction = false;
return @pg_query($connection, 'COMMIT');
}

Find: Select
global $db_prefix, $db_connection, $db_persist;
Replace With: Select
global $db_prefix, $db_connection, $db_persist, $smcFunc, $inTransaction;
Find: Select
if(empty($db_persist))
Add Before: Select
// If we are in a transaction, abort.
if (!empty($inTransaction))
smf_db_transaction('rollback');

./Sources/Subs-Editor.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
// ... nor this!
if ($thisVerification['number_questions'] && (!isset($_SESSION[$verificationOptions['id'] . '_vv']['q']) || !isset($_REQUEST[$verificationOptions['id'] . '_vv']['q'])))
fatal_lang_error('no_access', false);
// Hmm, it's requested but not actually declared. This shouldn't happen.
Replace With: Select
// Verification question does not exist for this language.
if ($thisVerification['number_questions'] && (!isset($_SESSION[$verificationOptions['id'] . '_vv']['q']) || !isset($_REQUEST[$verificationOptions['id'] . '_vv']['q'])))
fatal_lang_error('registration_no_verification_questions');
// Hmm, it's requested but not actually declared. This shouldn't happen.

./Sources/Subs-Notify.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$update_rows[] = array($memID, $k, $v);
Replace With: Select
$update_rows[] = array($memID, $k, min(max((int) $v, -128), 127));

./Sources/Subs-Package.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
$base_files = array('index.php', 'SSI.php', 'agreement.txt', 'cron.php', 'ssi_examples.php', 'ssi_examples.shtml', 'subscriptions.php');
Replace With: Select
$base_files = array('index.php', 'SSI.php', 'agreement.txt', 'cron.php', 'proxy.php', 'ssi_examples.php', 'ssi_examples.shtml', 'subscriptions.php');
Find: Select
if (preg_match('~^(\.{1,2}|CVS|backup.*|help|images|.*\~)$~', $entry) != 0)
Replace With: Select
if (preg_match('~^(\.{1,2}|CVS|backup.*|help|images|.*\~|.*minified_[a-z0-9]{32}\.(js|css))$~', $entry) != 0)

./Sources/Subs-Post.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
$line_break = $context['server']['is_windows'] || !$use_sendmail ? "\r\n" : "\n";
Replace With: Select
// Starting with php 8x, line breaks need to be \r\n even for linux.
$line_break = ($context['server']['is_windows'] || !$use_sendmail || version_compare(PHP_VERSION, '8.0.0', '>=')) ? "\r\n" : "\n";
Find: Select
if ($msgOptions['send_notifications'] && !empty($msgOptions['approved']) && (!empty($msgOptions['quoted_members']) || !empty($msgOptions['mentioned_members'])))
Replace With: Select
if ($msgOptions['send_notifications'] && !empty($msgOptions['approved']) && (!empty($msgOptions['quoted_members']) || !empty($msgOptions['mentioned_members']) || !empty($mention_modifications['removed']) || !empty($quoted_modifications['removed'])))
Find: Select
}
// If unapproving add to the approval queue!
Add Before: Select

// Clean up moderator alerts
if (!empty($notification_topics))
clearApprovalAlerts(array_column($notification_topics, 'topic'), 'unapproved_topic');
if (!empty($notification_posts))
clearApprovalAlerts(array_column($notification_posts, 'id'), 'unapproved_post');
Find: Select
/**
* Takes an array of board IDs and updates their last messages.
Add Before: Select
/**
* Upon approval, clear unread alerts.
*
* @param int[] $content_ids either id_msgs or id_topics
* @param string $content_action will be either 'unapproved_post' or 'unapproved_topic'
* @return void
*/
function clearApprovalAlerts($content_ids, $content_action)
{
global $smcFunc;

// Some data hygiene...
if (!is_array($content_ids))
return;
$content_ids = array_filter(array_map('intval', $content_ids));
if (empty($content_ids))
return;

if (!in_array($content_action, array('unapproved_post', 'unapproved_topic')))
return;

// Check to see if there are unread alerts to delete...
// Might be multiple alerts, for multiple moderators...
$alerts = array();
$moderators = array();
$result = $smcFunc['db_query']('', '
SELECT id_alert, id_member FROM {db_prefix}user_alerts
WHERE content_id IN ({array_int:content_ids})
AND content_type = {string:content_type}
AND content_action = {string:content_action}
AND is_read = {int:unread}',
array(
'content_ids' => $content_ids,
'content_type' => $content_action === 'unapproved_topic' ? 'topic' : 'msg',
'content_action' => $content_action,
'unread' => 0,
)
);
// Found any?
while ($row = $smcFunc['db_fetch_assoc']($result))
{
$alerts[] = $row['id_alert'];
$moderators[] = $row['id_member'];
}
if (!empty($alerts))
{
// Delete 'em
$smcFunc['db_query']('', '
DELETE FROM {db_prefix}user_alerts
WHERE id_alert IN ({array_int:alerts})',
array(
'alerts' => $alerts,
)
);
// Decrement counter for each moderator who received an alert
updateMemberData($moderators, array('alerts' => '-'));
}
}

./Sources/Subs-ReportedContent.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
// Log this action.
Add Before: Select
// See if any report alerts need to be cleaned up upon close/ignore
if (in_array($log_report, array('close', 'ignore', 'close_user', 'ignore_user')))
clearReportAlerts($log_report, $extra);

Find: Select
/**
* Counts how many reports are in total. Used for creating pagination.
Add Before: Select
/**
* Upon close/ignore, mark unread alerts as read.
*
* @param string $log_report - what action is being taken
* @param mixed[] $extra - detailed info about the report
* @return void
*/
function clearReportAlerts($log_report, $extra)
{
global $smcFunc;

// Setup the query, depending on if it's a member report or a msg report.
// In theory, these should be unique (reports for the same things get combined), but since $extra is an array, treat as an array.
if (strpos($log_report, '_user') !== false)
{
$content_ids = array_unique(array_column($extra, 'member'));
$content_type = 'member';
}
else
{
$content_ids = array_unique(array_column($extra, 'message'));
$content_type = 'msg';
}

// Check to see if there are unread alerts to flag as read...
// Might be multiple alerts, for multiple moderators...
$alerts = array();
$moderators = array();
$result = $smcFunc['db_query']('', '
SELECT id_alert, id_member FROM {db_prefix}user_alerts
WHERE content_id IN ({array_int:content_ids})
AND content_type = {string:content_type}
AND content_action = {string:content_action}
AND is_read = {int:unread}',
array(
'content_ids' => $content_ids,
'content_type' => $content_type,
'content_action' => 'report',
'unread' => 0,
)
);
// Found any?
while ($row = $smcFunc['db_fetch_assoc']($result))
{
$alerts[] = $row['id_alert'];
$moderators[] = $row['id_member'];
}
if (!empty($alerts))
{
// Flag 'em as read
$smcFunc['db_query']('', '
UPDATE {db_prefix}user_alerts
SET is_read = {int:time}
WHERE id_alert IN ({array_int:alerts})',
array(
'time' => time(),
'alerts' => $alerts,
)
);
// Decrement counter for each moderator who had an unread alert
updateMemberData($moderators, array('alerts' => '-'));
}
}

./Sources/Subs-Timezones.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
if (!empty($alt_tzid))
Replace With: Select
if (!empty($alt_tzid) && empty($tzid_metazones[$alt_tzid]))
Find: Select
'Europe/Kiev',
Replace With: Select
'Europe/Kyiv',
Find: Select
$country_tzids[$country_code] = array_values(get_tzid_fallbacks($country_tzids[$country_code], $when));
Replace With: Select
$country_tzids[$country_code] = array_unique(array_values(get_tzid_fallbacks($country_tzids[$country_code], $when)));
Find: Select

// 2. Newly created time zones.
Add Before: Select
'Europe/Busingen' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => 'Europe/Zurich',
),
),
'Europe/Kyiv' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => 'Europe/Kiev',
),
),
Find: Select
// The same as Tasmania, except it stayed on DST all year in 2010.
Add Before: Select
// The initial entry in many of the following zones is set to '' because
// the records go back to eras before the adoption of standardized time
// zones, which means no substitutes are possible then.

Find: Select
// This place uses two hours for DST. No substitutes are possible.
Add Before: Select
// Added in version 2013a.
'Asia/Khandyga' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1919-12-14T14:57:47+0000'),
'tzid' => 'Etc/GMT-8',
),
array(
'ts' => strtotime('1930-06-20T16:00:00+0000'),
'tzid' => 'Asia/Yakutsk',
),
array(
'ts' => strtotime('2003-12-31T15:00:00+0000'),
'tzid' => 'Asia/Vladivostok',
),
array(
'ts' => strtotime('2011-09-12T13:00:00+0000'),
'tzid' => 'Asia/Yakutsk',
),
),

// Added in version 2013a.
'Asia/Ust-Nera' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1919-12-14T14:27:06+0000'),
'tzid' => 'Etc/GMT-8',
),
array(
'ts' => strtotime('1930-06-20T16:00:00+0000'),
'tzid' => 'Asia/Yakutsk',
),
array(
'ts' => strtotime('1981-03-31T15:00:00+0000'),
'tzid' => 'Asia/Magadan',
),
array(
'ts' => strtotime('2011-09-12T12:00:00+0000'),
'tzid' => 'Asia/Vladivostok',
),
),

// Created in version 2014b.
Find: Select
// Diverged from Pacific/Port_Moresby in version 2014i.
'Pacific/Bougainville' => array(
// Before the divergence, we don't actually need this one at all.
array(
Replace With: Select
// Diverged from Asia/Yakustsk in version 2014f.
'Asia/Chita' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1919-12-14T16:26:08+0000'),
'tzid' => 'Asia/Yakutsk',
),
array(
'ts' => strtotime('2014-10-25T16:00:00+0000'),
'tzid' => 'Etc/GMT-8',
),
array(
'ts' => strtotime('2016-03-26T18:00:00+0000'),
'tzid' => 'Asia/Yakutsk',
),
),

// Diverged from Asia/Magadan in version 2014f.
'Asia/Srednekolymsk' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1924-05-01T13:45:08+0000'),
'tzid' => 'Etc/GMT-10',
),
array(
'ts' => strtotime('1930-06-20T14:00:00+0000'),
'tzid' => 'Asia/Magadan',
),
array(
'ts' => strtotime('2014-10-25T14:00:00+0000'),
'tzid' => 'Etc/GMT-11',
),
),

// Diverged from Pacific/Port_Moresby in version 2014i.
'Pacific/Bougainville' => array(
array(
Find: Select
// For dates after divergence, it is the same as Pacific/Kosrae.
Add Before: Select
// Pacific/Yap is an unused link to Pacific/Port_Moresby.
array(
'ts' => strtotime('1879-12-31T14:11:20+0000'),
'tzid' => 'Pacific/Yap',
),
// Apparently this was different for a while in World War II.
array(
'ts' => strtotime('1942-06-30T14:00:00+0000'),
'tzid' => 'Singapore',
),
array(
'ts' => strtotime('1945-08-20T15:00:00+0000'),
'tzid' => 'Pacific/Yap',
),
Find: Select
// Diverged from America/Santiago in version 2017a.
'America/Punta_Arenas' => array(
// Before the divergence, we don't actually need this one at all.
array(
Replace With: Select
// Added in version 2015g.
'America/Fort_Nelson' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1884-01-01T08:12:28+0000'),
'tzid' => 'Canada/Pacific',
),
array(
'ts' => strtotime('1946-01-01T08:00:00+0000'),
'tzid' => 'Etc/GMT+8',
),
array(
'ts' => strtotime('1947-01-01T08:00:00+0000'),
'tzid' => 'Canada/Pacific',
),
array(
'ts' => strtotime('2015-03-08T10:00:00+0000'),
'tzid' => 'MST',
),
),

// Created in version 2016b.
'Europe/Astrakhan' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1935-01-26T20:00:00+0000'),
'tzid' => 'Europe/Samara',
),
array(
'ts' => strtotime('1989-03-25T22:00:00+0000'),
'tzid' => 'Europe/Volgograd',
),
array(
'ts' => strtotime('2016-03-26T23:00:00+0000'),
'tzid' => 'Europe/Samara',
),
),

// Created in version 2016b.
'Europe/Ulyanovsk' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1935-01-26T20:00:00+0000'),
'tzid' => 'Europe/Samara',
),
array(
'ts' => strtotime('1989-03-25T22:00:00+0000'),
'tzid' => 'W-SU',
),
array(
'ts' => strtotime('2016-03-26T23:00:00+0000'),
'tzid' => 'Europe/Samara',
),
),

// Created in version 2016b.
'Asia/Barnaul' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1919-12-09T18:25:00+0000'),
'tzid' => 'Etc/GMT-6',
),
array(
'ts' => strtotime('1930-06-20T18:00:00+0000'),
'tzid' => 'Asia/Novokuznetsk',
),
array(
'ts' => strtotime('1995-05-27T17:00:00+0000'),
'tzid' => 'Asia/Novosibirsk',
),
array(
'ts' => strtotime('2016-03-26T20:00:00+0000'),
'tzid' => 'Asia/Novokuznetsk',
),
),

// Created in version 2016b.
'Asia/Tomsk' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1919-12-21T18:20:09+0000'),
'tzid' => 'Asia/Novosibirsk',
),
array(
'ts' => strtotime('1930-06-20T18:00:00+0000'),
'tzid' => 'Asia/Novokuznetsk',
),
array(
'ts' => strtotime('2002-04-30T20:00:00+0000'),
'tzid' => 'Asia/Novosibirsk',
),
array(
'ts' => strtotime('2016-05-28T20:00:00+0000'),
'tzid' => 'Asia/Novokuznetsk',
),
),

// Created in version 2016d.
'Europe/Kirov' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1935-01-26T20:00:00+0000'),
'tzid' => 'Europe/Samara',
),
array(
'ts' => strtotime('1989-03-25T22:00:00+0000'),
'tzid' => 'Europe/Volgograd',
),
array(
'ts' => strtotime('1992-03-28T22:00:00+0000'),
'tzid' => 'W-SU',
),
),

// Diverged from Asia/Nicosia in version 2016i.
'Asia/Famagusta' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
// Europe/Nicosia is an otherwise unused link to Asia/Nicosia.
array(
'ts' => strtotime('1921-11-13T21:46:32+0000'),
'tzid' => 'Europe/Nicosia',
),
// Became same as Europe/Istanbul.
// Turkey is an otherwise unused link to Europe/Istanbul.
array(
'ts' => strtotime('2016-09-07T21:00:00+0000'),
'tzid' => 'Turkey',
),
// Became same as Asia/Nicosia again.
array(
'ts' => strtotime('2017-10-29T01:00:00+0000'),
'tzid' => 'Europe/Nicosia',
),
),

// Created in version 2016j.
'Asia/Atyrau' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1924-05-01T20:32:16+0000'),
'tzid' => 'Etc/GMT-3',
),
array(
'ts' => strtotime('1930-06-20T21:00:00+0000'),
'tzid' => 'Asia/Aqtau',
),
array(
'ts' => strtotime('1981-09-30T19:00:00+0000'),
'tzid' => 'Asia/Aqtobe',
),
array(
'tz' => strtotime('1999-03-27T21:00:00+0000'),
'tzid' => 'Etc/GMT-5'
),
),

// Diverged from Europe/Volgograd in version 2016j.
'Europe/Saratov' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1935-01-26T20:00:00+0000'),
'tzid' => 'Europe/Samara',
),
array(
'ts' => strtotime('1988-03-26T22:00:00+0000'),
'tzid' => 'Europe/Volgograd',
),
array(
'ts' => strtotime('2016-12-03T23:00:00+0000'),
'tzid' => 'Europe/Samara',
),
),

// Diverged from America/Santiago in version 2017a.
'America/Punta_Arenas' => array(
array(
Find: Select
// For dates after divergence, it is the same as Antarctica/Palmer.
// If this ever ceases to be true, add another entry.
Replace With: Select
// Chile/Continental is an otherwise unused link to America/Santiago.
array(
'ts' => strtotime('1890-01-01T04:43:40+0000'),
'tzid' => 'Chile/Continental',
),
Find: Select
'ts' => strtotime('2017-05-14T03:00:00+0000'),
'tzid' => 'Antarctica/Palmer',
Replace With: Select
'ts' => strtotime('1942-08-01T05:00:00+0000'),
'tzid' => 'Etc/GMT+4',
),
array(
'ts' => strtotime('1946-08-29T04:00:00+0000'),
'tzid' => 'Chile/Continental',
),
// America/Mendoza is an otherwise unused link to America/Argentina/Mendoza.
array(
'ts' => strtotime('2016-12-04T03:00:00+0000'),
'tzid' => 'America/Mendoza',
),
),

// Diverged from Asia/Qyzylorda in version 2018h.
'Asia/Qostanay' => array(
array(
'ts' => PHP_INT_MIN,
'tzid' => '',
),
array(
'ts' => strtotime('1924-05-01T19:45:32+0000'),
'tzid' => 'Asia/Qyzylorda',
),
array(
'ts' => strtotime('1930-06-20T20:00:00+0000'),
'tzid' => 'Asia/Aqtobe',
),
array(
'ts' => strtotime('2004-10-30T21:00:00+0000'),
'tzid' => 'Asia/Almaty',
Find: Select
if (empty($replacements[$tzid]))
Add Before: Select
// Replacement is already in use.
if (in_array($alt['tzid'], $replacements) || (in_array($alt['tzid'], $tzids) && strpos($alt['tzid'], 'Etc/') === false))
$replacements[$tzid] = '';

./Sources/Subs.php

Find: Select
* @version 2.1.2
Replace With: Select
* @version 2.1.3
Find: Select
$start = max(0, $start);
$start = min($start - ($start % $num_per_page), $max_value);
Replace With: Select
$start = min(max(0, $start), $max_value);
$start = $start - ($start % $num_per_page);
Find: Select
if (function_exists('mb_strtoupper'))
{
$smcFunc['strtoupper'] = 'mb_strtoupper';
$smcFunc['strtolower'] = 'mb_strtolower';
}
elseif (isset($sourcedir))
Replace With: Select
if (isset($sourcedir))
Find: Select
$smcFunc['strtolower'] = 'utf8_strtolower';
}
Add After: Select
elseif (function_exists('mb_strtoupper'))
{
$smcFunc['strtoupper'] = 'mb_strtoupper';
$smcFunc['strtolower'] = 'mb_strtolower';
}
Find: Select
if (!empty($parse_tags))
Replace With: Select
if (!empty($parse_tags) && $message === false)
Find: Select
$data[0] = normalize_iri($data[0]);
Replace With: Select
$data[0] = normalize_iri(strtr(trim($data[0]), array('<br>' => '', ' ' => '%20')));
Find: Select
$data = normalize_iri(strtr($data, array('<br>' => '')));

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = 'ftp://' . ltrim($data, ':/');
Replace With: Select
$data = normalize_iri(strtr(trim($data), array('<br>' => '', ' ' => '%20')));

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = 'ftp://' . ltrim($data, ':/');
Find: Select
$data = iri_to_url($data);

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = 'ftp://' . ltrim($data, ':/');
Replace With: Select
$data = iri_to_url(strtr(trim($data), array('<br>' => '', ' ' => '%20')));

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = 'ftp://' . ltrim($data, ':/');
Find: Select
$url = iri_to_url(strtr($data, array('<br>' => '')));
Replace With: Select
$url = iri_to_url(strtr(trim($data), array('<br>' => '', ' ' => '%20')));
Find: Select
'content' => '<a href="$1" class="bbc_link">$1</a>',
'validate' => function(&$tag, &$data, $disabled)
{
$data = normalize_iri(strtr($data, array('<br>' => '')));
Replace With: Select
'content' => '<a href="$1" class="bbc_link">$1</a>',
'validate' => function(&$tag, &$data, $disabled)
{
$data = normalize_iri(strtr(trim($data), array('<br>' => '', ' ' => '%20')));
Find: Select
$data = iri_to_url($data);
Replace With: Select
$data = iri_to_url(strtr(trim($data), array('<br>' => '', ' ' => '%20')));
Find: Select
'tag' => 'url',
'type' => 'unparsed_content',
'content' => '<a href="$1" class="bbc_link" target="_blank" rel="noopener">$1</a>',
'validate' => function(&$tag, &$data, $disabled)
{
$data = normalize_iri(strtr($data, array('<br>' => '')));
Replace With: Select
'tag' => 'url',
'type' => 'unparsed_content',
'content' => '<a href="$1" class="bbc_link" target="_blank" rel="noopener">$1</a>',
'validate' => function(&$tag, &$data, $disabled)
{
$data = normalize_iri(strtr(trim($data), array('<br>' => '', ' ' => '%20')));
Find: Select
$data = iri_to_url($data);

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = '//' . ltrim($data, ':/');
Replace With: Select
$data = iri_to_url(strtr(trim($data), array('<br>' => '', ' ' => '%20')));

$scheme = parse_iri($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = '//' . ltrim($data, ':/');
Find: Select
'html',
Add After: Select
'attach',
'ftp',
'flash',
'member',
'code',
'php',
'nobbc',
Find: Select
} // if ip 22.12.* -> 22.12.* - 22.12.*
Replace With: Select
} // if ip 22.12.* -> 22.12.*-22.12.*

./Sources/Unicode/CaseFold.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
if (!defined('SMF'))
die('No direct access...');

Replace With: Select
if (!defined('SMF'))
die('No direct access...');

/**
* Helper function for utf8_casefold.
*
* Developers: Do not update the data in this function manually. Instead,
* run "php -f other/update_unicode_data.php" on the command line.
*
* @return array Casefolding maps.
*/
function utf8_casefold_simple_maps()
{
return array(
"\x41" => "\x61",
"\x42" => "\x62",
"\x43" => "\x63",
"\x44" => "\x64",
"\x45" => "\x65",
"\x46" => "\x66",
"\x47" => "\x67",
"\x48" => "\x68",
"\x49" => "\x69",
"\x4A" => "\x6A",
"\x4B" => "\x6B",
"\x4C" => "\x6C",
"\x4D" => "\x6D",
"\x4E" => "\x6E",
"\x4F" => "\x6F",
"\x50" => "\x70",
"\x51" => "\x71",
"\x52" => "\x72",
"\x53" => "\x73",
"\x54" => "\x74",
"\x55" => "\x75",
"\x56" => "\x76",
"\x57" => "\x77",
"\x58" => "\x78",
"\x59" => "\x79",
"\x5A" => "\x7A",
"\xC2\xB5" => "\xCE\xBC",
"\xC3\x80" => "\xC3\xA0",
"\xC3\x81" => "\xC3\xA1",
"\xC3\x82" => "\xC3\xA2",
"\xC3\x83" => "\xC3\xA3",
"\xC3\x84" => "\xC3\xA4",
"\xC3\x85" => "\xC3\xA5",
"\xC3\x86" => "\xC3\xA6",
"\xC3\x87" => "\xC3\xA7",
"\xC3\x88" => "\xC3\xA8",
"\xC3\x89" => "\xC3\xA9",
"\xC3\x8A" => "\xC3\xAA",
"\xC3\x8B" => "\xC3\xAB",
"\xC3\x8C" => "\xC3\xAC",
"\xC3\x8D" => "\xC3\xAD",
"\xC3\x8E" => "\xC3\xAE",
"\xC3\x8F" => "\xC3\xAF",
"\xC3\x90" => "\xC3\xB0",
"\xC3\x91" => "\xC3\xB1",
"\xC3\x92" => "\xC3\xB2",
"\xC3\x93" => "\xC3\xB3",
"\xC3\x94" => "\xC3\xB4",
"\xC3\x95" => "\xC3\xB5",
"\xC3\x96" => "\xC3\xB6",
"\xC3\x98" => "\xC3\xB8",
"\xC3\x99" => "\xC3\xB9",
"\xC3\x9A" => "\xC3\xBA",
"\xC3\x9B" => "\xC3\xBB",
"\xC3\x9C" => "\xC3\xBC",
"\xC3\x9D" => "\xC3\xBD",
"\xC3\x9E" => "\xC3\xBE",
"\xC4\x80" => "\xC4\x81",
"\xC4\x82" => "\xC4\x83",
"\xC4\x84" => "\xC4\x85",
"\xC4\x86" => "\xC4\x87",
"\xC4\x88" => "\xC4\x89",
"\xC4\x8A" => "\xC4\x8B",
"\xC4\x8C" => "\xC4\x8D",
"\xC4\x8E" => "\xC4\x8F",
"\xC4\x90" => "\xC4\x91",
"\xC4\x92" => "\xC4\x93",
"\xC4\x94" => "\xC4\x95",
"\xC4\x96" => "\xC4\x97",
"\xC4\x98" => "\xC4\x99",
"\xC4\x9A" => "\xC4\x9B",
"\xC4\x9C" => "\xC4\x9D",
"\xC4\x9E" => "\xC4\x9F",
"\xC4\xA0" => "\xC4\xA1",
"\xC4\xA2" => "\xC4\xA3",
"\xC4\xA4" => "\xC4\xA5",
"\xC4\xA6" => "\xC4\xA7",
"\xC4\xA8" => "\xC4\xA9",
"\xC4\xAA" => "\xC4\xAB",
"\xC4\xAC" => "\xC4\xAD",
"\xC4\xAE" => "\xC4\xAF",
"\xC4\xB2" => "\xC4\xB3",
"\xC4\xB4" => "\xC4\xB5",
"\xC4\xB6" => "\xC4\xB7",
"\xC4\xB9" => "\xC4\xBA",
"\xC4\xBB" => "\xC4\xBC",
"\xC4\xBD" => "\xC4\xBE",
"\xC4\xBF" => "\xC5\x80",
"\xC5\x81" => "\xC5\x82",
"\xC5\x83" => "\xC5\x84",
"\xC5\x85" => "\xC5\x86",
"\xC5\x87" => "\xC5\x88",
"\xC5\x8A" => "\xC5\x8B",
"\xC5\x8C" => "\xC5\x8D",
"\xC5\x8E" => "\xC5\x8F",
"\xC5\x90" => "\xC5\x91",
"\xC5\x92" => "\xC5\x93",
"\xC5\x94" => "\xC5\x95",
"\xC5\x96" => "\xC5\x97",
"\xC5\x98" => "\xC5\x99",
"\xC5\x9A" => "\xC5\x9B",
"\xC5\x9C" => "\xC5\x9D",
"\xC5\x9E" => "\xC5\x9F",
"\xC5\xA0" => "\xC5\xA1",
"\xC5\xA2" => "\xC5\xA3",
"\xC5\xA4" => "\xC5\xA5",
"\xC5\xA6" => "\xC5\xA7",
"\xC5\xA8" => "\xC5\xA9",
"\xC5\xAA" => "\xC5\xAB",
"\xC5\xAC" => "\xC5\xAD",
"\xC5\xAE" => "\xC5\xAF",
"\xC5\xB0" => "\xC5\xB1",
"\xC5\xB2" => "\xC5\xB3",
"\xC5\xB4" => "\xC5\xB5",
"\xC5\xB6" => "\xC5\xB7",
"\xC5\xB8" => "\xC3\xBF",
"\xC5\xB9" => "\xC5\xBA",
"\xC5\xBB" => "\xC5\xBC",
"\xC5\xBD" => "\xC5\xBE",
"\xC5\xBF" => "\x73",
"\xC6\x81" => "\xC9\x93",
"\xC6\x82" => "\xC6\x83",
"\xC6\x84" => "\xC6\x85",
"\xC6\x86" => "\xC9\x94",
"\xC6\x87" => "\xC6\x88",
"\xC6\x89" => "\xC9\x96",
"\xC6\x8A" => "\xC9\x97",
"\xC6\x8B" => "\xC6\x8C",
"\xC6\x8E" => "\xC7\x9D",
"\xC6\x8F" => "\xC9\x99",
"\xC6\x90" => "\xC9\x9B",
"\xC6\x91" => "\xC6\x92",
"\xC6\x93" => "\xC9\xA0",
"\xC6\x94" => "\xC9\xA3",
"\xC6\x96" => "\xC9\xA9",
"\xC6\x97" => "\xC9\xA8",
"\xC6\x98" => "\xC6\x99",
"\xC6\x9C" => "\xC9\xAF",
"\xC6\x9D" => "\xC9\xB2",
"\xC6\x9F" => "\xC9\xB5",
"\xC6\xA0" => "\xC6\xA1",
"\xC6\xA2" => "\xC6\xA3",
"\xC6\xA4" => "\xC6\xA5",
"\xC6\xA6" => "\xCA\x80",
"\xC6\xA7" => "\xC6\xA8",
"\xC6\xA9" => "\xCA\x83",
"\xC6\xAC" => "\xC6\xAD",
"\xC6\xAE" => "\xCA\x88",
"\xC6\xAF" => "\xC6\xB0",
"\xC6\xB1" => "\xCA\x8A",
"\xC6\xB2" => "\xCA\x8B",
"\xC6\xB3" => "\xC6\xB4",
"\xC6\xB5" => "\xC6\xB6",
"\xC6\xB7" => "\xCA\x92",
"\xC6\xB8" => "\xC6\xB9",
"\xC6\xBC" => "\xC6\xBD",
"\xC7\x84" => "\xC7\x86",
"\xC7\x85" => "\xC7\x86",
"\xC7\x87" => "\xC7\x89",
"\xC7\x88" => "\xC7\x89",
"\xC7\x8A" => "\xC7\x8C",
"\xC7\x8B" => "\xC7\x8C",
"\xC7\x8D" => "\xC7\x8E",
"\xC7\x8F" => "\xC7\x90",
"\xC7\x91" => "\xC7\x92",
"\xC7\x93" => "\xC7\x94",
"\xC7\x95" => "\xC7\x96",
"\xC7\x97" => "\xC7\x98",
"\xC7\x99" => "\xC7\x9A",
"\xC7\x9B" => "\xC7\x9C",
"\xC7\x9E" => "\xC7\x9F",
"\xC7\xA0" => "\xC7\xA1",
"\xC7\xA2" => "\xC7\xA3",
"\xC7\xA4" => "\xC7\xA5",
"\xC7\xA6" => "\xC7\xA7",
"\xC7\xA8" => "\xC7\xA9",
"\xC7\xAA" => "\xC7\xAB",
"\xC7\xAC" => "\xC7\xAD",
"\xC7\xAE" => "\xC7\xAF",
"\xC7\xB1" => "\xC7\xB3",
"\xC7\xB2" => "\xC7\xB3",
"\xC7\xB4" => "\xC7\xB5",
"\xC7\xB6" => "\xC6\x95",
"\xC7\xB7" => "\xC6\xBF",
"\xC7\xB8" => "\xC7\xB9",
"\xC7\xBA" => "\xC7\xBB",
"\xC7\xBC" => "\xC7\xBD",
"\xC7\xBE" => "\xC7\xBF",
"\xC8\x80" => "\xC8\x81",
"\xC8\x82" => "\xC8\x83",
"\xC8\x84" => "\xC8\x85",
"\xC8\x86" => "\xC8\x87",
"\xC8\x88" => "\xC8\x89",
"\xC8\x8A" => "\xC8\x8B",
"\xC8\x8C" => "\xC8\x8D",
"\xC8\x8E" => "\xC8\x8F",
"\xC8\x90" => "\xC8\x91",
"\xC8\x92" => "\xC8\x93",
"\xC8\x94" => "\xC8\x95",
"\xC8\x96" => "\xC8\x97",
"\xC8\x98" => "\xC8\x99",
"\xC8\x9A" => "\xC8\x9B",
"\xC8\x9C" => "\xC8\x9D",
"\xC8\x9E" => "\xC8\x9F",
"\xC8\xA0" => "\xC6\x9E",
"\xC8\xA2" => "\xC8\xA3",
"\xC8\xA4" => "\xC8\xA5",
"\xC8\xA6" => "\xC8\xA7",
"\xC8\xA8" => "\xC8\xA9",
"\xC8\xAA" => "\xC8\xAB",
"\xC8\xAC" => "\xC8\xAD",
"\xC8\xAE" => "\xC8\xAF",
"\xC8\xB0" => "\xC8\xB1",
"\xC8\xB2" => "\xC8\xB3",
"\xC8\xBA" => "\xE2\xB1\xA5",
"\xC8\xBB" => "\xC8\xBC",
"\xC8\xBD" => "\xC6\x9A",
"\xC8\xBE" => "\xE2\xB1\xA6",
"\xC9\x81" => "\xC9\x82",
"\xC9\x83" => "\xC6\x80",
"\xC9\x84" => "\xCA\x89",
"\xC9\x85" => "\xCA\x8C",
"\xC9\x86" => "\xC9\x87",
"\xC9\x88" => "\xC9\x89",
"\xC9\x8A" => "\xC9\x8B",
"\xC9\x8C" => "\xC9\x8D",
"\xC9\x8E" => "\xC9\x8F",
"\xCD\x85" => "\xCE\xB9",
"\xCD\xB0" => "\xCD\xB1",
"\xCD\xB2" => "\xCD\xB3",
"\xCD\xB6" => "\xCD\xB7",
"\xCD\xBF" => "\xCF\xB3",
"\xCE\x86" => "\xCE\xAC",
"\xCE\x88" => "\xCE\xAD",
"\xCE\x89" => "\xCE\xAE",
"\xCE\x8A" => "\xCE\xAF",
"\xCE\x8C" => "\xCF\x8C",
"\xCE\x8E" => "\xCF\x8D",
"\xCE\x8F" => "\xCF\x8E",
"\xCE\x91" => "\xCE\xB1",
"\xCE\x92" => "\xCE\xB2",
"\xCE\x93" => "\xCE\xB3",
"\xCE\x94" => "\xCE\xB4",
"\xCE\x95" => "\xCE\xB5",
"\xCE\x96" => "\xCE\xB6",
"\xCE\x97" => "\xCE\xB7",
"\xCE\x98" => "\xCE\xB8",
"\xCE\x99" => "\xCE\xB9",
"\xCE\x9A" => "\xCE\xBA",
"\xCE\x9B" => "\xCE\xBB",
"\xCE\x9C" => "\xCE\xBC",
"\xCE\x9D" => "\xCE\xBD",
"\xCE\x9E" => "\xCE\xBE",
"\xCE\x9F" => "\xCE\xBF",
"\xCE\xA0" => "\xCF\x80",
"\xCE\xA1" => "\xCF\x81",
"\xCE\xA3" => "\xCF\x83",
"\xCE\xA4" => "\xCF\x84",
"\xCE\xA5" => "\xCF\x85",
"\xCE\xA6" => "\xCF\x86",
"\xCE\xA7" => "\xCF\x87",
"\xCE\xA8" => "\xCF\x88",
"\xCE\xA9" => "\xCF\x89",
"\xCE\xAA" => "\xCF\x8A",
"\xCE\xAB" => "\xCF\x8B",
"\xCF\x82" => "\xCF\x83",
"\xCF\x8F" => "\xCF\x97",
"\xCF\x90" => "\xCE\xB2",
"\xCF\x91" => "\xCE\xB8",
"\xCF\x95" => "\xCF\x86",
"\xCF\x96" => "\xCF\x80",
"\xCF\x98" => "\xCF\x99",
"\xCF\x9A" => "\xCF\x9B",
"\xCF\x9C" => "\xCF\x9D",
"\xCF\x9E" => "\xCF\x9F",
"\xCF\xA0" => "\xCF\xA1",
"\xCF\xA2" => "\xCF\xA3",
"\xCF\xA4" => "\xCF\xA5",
"\xCF\xA6" => "\xCF\xA7",
"\xCF\xA8" => "\xCF\xA9",
"\xCF\xAA" => "\xCF\xAB",
"\xCF\xAC" => "\xCF\xAD",
"\xCF\xAE" => "\xCF\xAF",
"\xCF\xB0" => "\xCE\xBA",
"\xCF\xB1" => "\xCF\x81",
"\xCF\xB4" => "\xCE\xB8",
"\xCF\xB5" => "\xCE\xB5",
"\xCF\xB7" => "\xCF\xB8",
"\xCF\xB9" => "\xCF\xB2",
"\xCF\xBA" => "\xCF\xBB",
"\xCF\xBD" => "\xCD\xBB",
"\xCF\xBE" => "\xCD\xBC",
"\xCF\xBF" => "\xCD\xBD",
"\xD0\x80" => "\xD1\x90",
"\xD0\x81" => "\xD1\x91",
"\xD0\x82" => "\xD1\x92",
"\xD0\x83" => "\xD1\x93",
"\xD0\x84" => "\xD1\x94",
"\xD0\x85" => "\xD1\x95",
"\xD0\x86" => "\xD1\x96",
"\xD0\x87" => "\xD1\x97",
"\xD0\x88" => "\xD1\x98",
"\xD0\x89" => "\xD1\x99",
"\xD0\x8A" => "\xD1\x9A",
"\xD0\x8B" => "\xD1\x9B",
"\xD0\x8C" => "\xD1\x9C",
"\xD0\x8D" => "\xD1\x9D",
"\xD0\x8E" => "\xD1\x9E",
"\xD0\x8F" => "\xD1\x9F",
"\xD0\x90" => "\xD0\xB0",
"\xD0\x91" => "\xD0\xB1",
"\xD0\x92" => "\xD0\xB2",
"\xD0\x93" => "\xD0\xB3",
"\xD0\x94" => "\xD0\xB4",
"\xD0\x95" => "\xD0\xB5",
"\xD0\x96" => "\xD0\xB6",
"\xD0\x97" => "\xD0\xB7",
"\xD0\x98" => "\xD0\xB8",
"\xD0\x99" => "\xD0\xB9",
"\xD0\x9A" => "\xD0\xBA",
"\xD0\x9B" => "\xD0\xBB",
"\xD0\x9C" => "\xD0\xBC",
"\xD0\x9D" => "\xD0\xBD",
"\xD0\x9E" => "\xD0\xBE",
"\xD0\x9F" => "\xD0\xBF",
"\xD0\xA0" => "\xD1\x80",
"\xD0\xA1" => "\xD1\x81",
"\xD0\xA2" => "\xD1\x82",
"\xD0\xA3" => "\xD1\x83",
"\xD0\xA4" => "\xD1\x84",
"\xD0\xA5" => "\xD1\x85",
"\xD0\xA6" => "\xD1\x86",
"\xD0\xA7" => "\xD1\x87",
"\xD0\xA8" => "\xD1\x88",
"\xD0\xA9" => "\xD1\x89",
"\xD0\xAA" => "\xD1\x8A",
"\xD0\xAB" => "\xD1\x8B",
"\xD0\xAC" => "\xD1\x8C",
"\xD0\xAD" => "\xD1\x8D",
"\xD0\xAE" => "\xD1\x8E",
"\xD0\xAF" => "\xD1\x8F",
"\xD1\xA0" => "\xD1\xA1",
"\xD1\xA2" => "\xD1\xA3",
"\xD1\xA4" => "\xD1\xA5",
"\xD1\xA6" => "\xD1\xA7",
"\xD1\xA8" => "\xD1\xA9",
"\xD1\xAA" => "\xD1\xAB",
"\xD1\xAC" => "\xD1\xAD",
"\xD1\xAE" => "\xD1\xAF",
"\xD1\xB0" => "\xD1\xB1",
"\xD1\xB2" => "\xD1\xB3",
"\xD1\xB4" => "\xD1\xB5",
"\xD1\xB6" => "\xD1\xB7",
"\xD1\xB8" => "\xD1\xB9",
"\xD1\xBA" => "\xD1\xBB",
"\xD1\xBC" => "\xD1\xBD",
"\xD1\xBE" => "\xD1\xBF",
"\xD2\x80" => "\xD2\x81",
"\xD2\x8A" => "\xD2\x8B",
"\xD2\x8C" => "\xD2\x8D",
"\xD2\x8E" => "\xD2\x8F",
"\xD2\x90" => "\xD2\x91",
"\xD2\x92" => "\xD2\x93",
"\xD2\x94" => "\xD2\x95",
"\xD2\x96" => "\xD2\x97",
"\xD2\x98" => "\xD2\x99",
"\xD2\x9A" => "\xD2\x9B",
"\xD2\x9C" => "\xD2\x9D",
"\xD2\x9E" => "\xD2\x9F",
"\xD2\xA0" => "\xD2\xA1",
"\xD2\xA2" => "\xD2\xA3",
"\xD2\xA4" => "\xD2\xA5",
"\xD2\xA6" => "\xD2\xA7",
"\xD2\xA8" => "\xD2\xA9",
"\xD2\xAA" => "\xD2\xAB",
"\xD2\xAC" => "\xD2\xAD",
"\xD2\xAE" => "\xD2\xAF",
"\xD2\xB0" => "\xD2\xB1",
"\xD2\xB2" => "\xD2\xB3",
"\xD2\xB4" => "\xD2\xB5",
"\xD2\xB6" => "\xD2\xB7",
"\xD2\xB8" => "\xD2\xB9",
"\xD2\xBA" => "\xD2\xBB",
"\xD2\xBC" => "\xD2\xBD",
"\xD2\xBE" => "\xD2\xBF",
"\xD3\x80" => "\xD3\x8F",
"\xD3\x81" => "\xD3\x82",
"\xD3\x83" => "\xD3\x84",
"\xD3\x85" => "\xD3\x86",
"\xD3\x87" => "\xD3\x88",
"\xD3\x89" => "\xD3\x8A",
"\xD3\x8B" => "\xD3\x8C",
"\xD3\x8D" => "\xD3\x8E",
"\xD3\x90" => "\xD3\x91",
"\xD3\x92" => "\xD3\x93",
"\xD3\x94" => "\xD3\x95",
"\xD3\x96" => "\xD3\x97",
"\xD3\x98" => "\xD3\x99",
"\xD3\x9A" => "\xD3\x9B",
"\xD3\x9C" => "\xD3\x9D",
"\xD3\x9E" => "\xD3\x9F",
"\xD3\xA0" => "\xD3\xA1",
"\xD3\xA2" => "\xD3\xA3",
"\xD3\xA4" => "\xD3\xA5",
"\xD3\xA6" => "\xD3\xA7",
"\xD3\xA8" => "\xD3\xA9",
"\xD3\xAA" => "\xD3\xAB",
"\xD3\xAC" => "\xD3\xAD",
"\xD3\xAE" => "\xD3\xAF",
"\xD3\xB0" => "\xD3\xB1",
"\xD3\xB2" => "\xD3\xB3",
"\xD3\xB4" => "\xD3\xB5",
"\xD3\xB6" => "\xD3\xB7",
"\xD3\xB8" => "\xD3\xB9",
"\xD3\xBA" => "\xD3\xBB",
"\xD3\xBC" => "\xD3\xBD",
"\xD3\xBE" => "\xD3\xBF",
"\xD4\x80" => "\xD4\x81",
"\xD4\x82" => "\xD4\x83",
"\xD4\x84" => "\xD4\x85",
"\xD4\x86" => "\xD4\x87",
"\xD4\x88" => "\xD4\x89",
"\xD4\x8A" => "\xD4\x8B",
"\xD4\x8C" => "\xD4\x8D",
"\xD4\x8E" => "\xD4\x8F",
"\xD4\x90" => "\xD4\x91",
"\xD4\x92" => "\xD4\x93",
"\xD4\x94" => "\xD4\x95",
"\xD4\x96" => "\xD4\x97",
"\xD4\x98" => "\xD4\x99",
"\xD4\x9A" => "\xD4\x9B",
"\xD4\x9C" => "\xD4\x9D",
"\xD4\x9E" => "\xD4\x9F",
"\xD4\xA0" => "\xD4\xA1",
"\xD4\xA2" => "\xD4\xA3",
"\xD4\xA4" => "\xD4\xA5",
"\xD4\xA6" => "\xD4\xA7",
"\xD4\xA8" => "\xD4\xA9",
"\xD4\xAA" => "\xD4\xAB",
"\xD4\xAC" => "\xD4\xAD",
"\xD4\xAE" => "\xD4\xAF",
"\xD4\xB1" => "\xD5\xA1",
"\xD4\xB2" => "\xD5\xA2",
"\xD4\xB3" => "\xD5\xA3",
"\xD4\xB4" => "\xD5\xA4",
"\xD4\xB5" => "\xD5\xA5",
"\xD4\xB6" => "\xD5\xA6",
"\xD4\xB7" => "\xD5\xA7",
"\xD4\xB8" => "\xD5\xA8",
"\xD4\xB9" => "\xD5\xA9",
"\xD4\xBA" => "\xD5\xAA",
"\xD4\xBB" => "\xD5\xAB",
"\xD4\xBC" => "\xD5\xAC",
"\xD4\xBD" => "\xD5\xAD",
"\xD4\xBE" => "\xD5\xAE",
"\xD4\xBF" => "\xD5\xAF",
"\xD5\x80" => "\xD5\xB0",
"\xD5\x81" => "\xD5\xB1",
"\xD5\x82" => "\xD5\xB2",
"\xD5\x83" => "\xD5\xB3",
"\xD5\x84" => "\xD5\xB4",
"\xD5\x85" => "\xD5\xB5",
"\xD5\x86" => "\xD5\xB6",
"\xD5\x87" => "\xD5\xB7",
"\xD5\x88" => "\xD5\xB8",
"\xD5\x89" => "\xD5\xB9",
"\xD5\x8A" => "\xD5\xBA",
"\xD5\x8B" => "\xD5\xBB",
"\xD5\x8C" => "\xD5\xBC",
"\xD5\x8D" => "\xD5\xBD",
"\xD5\x8E" => "\xD5\xBE",
"\xD5\x8F" => "\xD5\xBF",
"\xD5\x90" => "\xD6\x80",
"\xD5\x91" => "\xD6\x81",
"\xD5\x92" => "\xD6\x82",
"\xD5\x93" => "\xD6\x83",
"\xD5\x94" => "\xD6\x84",
"\xD5\x95" => "\xD6\x85",
"\xD5\x96" => "\xD6\x86",
"\xE1\x82\xA0" => "\xE2\xB4\x80",
"\xE1\x82\xA1" => "\xE2\xB4\x81",
"\xE1\x82\xA2" => "\xE2\xB4\x82",
"\xE1\x82\xA3" => "\xE2\xB4\x83",
"\xE1\x82\xA4" => "\xE2\xB4\x84",
"\xE1\x82\xA5" => "\xE2\xB4\x85",
"\xE1\x82\xA6" => "\xE2\xB4\x86",
"\xE1\x82\xA7" => "\xE2\xB4\x87",
"\xE1\x82\xA8" => "\xE2\xB4\x88",
"\xE1\x82\xA9" => "\xE2\xB4\x89",
"\xE1\x82\xAA" => "\xE2\xB4\x8A",
"\xE1\x82\xAB" => "\xE2\xB4\x8B",
"\xE1\x82\xAC" => "\xE2\xB4\x8C",
"\xE1\x82\xAD" => "\xE2\xB4\x8D",
"\xE1\x82\xAE" => "\xE2\xB4\x8E",
"\xE1\x82\xAF" => "\xE2\xB4\x8F",
"\xE1\x82\xB0" => "\xE2\xB4\x90",
"\xE1\x82\xB1" => "\xE2\xB4\x91",
"\xE1\x82\xB2" => "\xE2\xB4\x92",
"\xE1\x82\xB3" => "\xE2\xB4\x93",
"\xE1\x82\xB4" => "\xE2\xB4\x94",
"\xE1\x82\xB5" => "\xE2\xB4\x95",
"\xE1\x82\xB6" => "\xE2\xB4\x96",
"\xE1\x82\xB7" => "\xE2\xB4\x97",
"\xE1\x82\xB8" => "\xE2\xB4\x98",
"\xE1\x82\xB9" => "\xE2\xB4\x99",
"\xE1\x82\xBA" => "\xE2\xB4\x9A",
"\xE1\x82\xBB" => "\xE2\xB4\x9B",
"\xE1\x82\xBC" => "\xE2\xB4\x9C",
"\xE1\x82\xBD" => "\xE2\xB4\x9D",
"\xE1\x82\xBE" => "\xE2\xB4\x9E",
"\xE1\x82\xBF" => "\xE2\xB4\x9F",
"\xE1\x83\x80" => "\xE2\xB4\xA0",
"\xE1\x83\x81" => "\xE2\xB4\xA1",
"\xE1\x83\x82" => "\xE2\xB4\xA2",
"\xE1\x83\x83" => "\xE2\xB4\xA3",
"\xE1\x83\x84" => "\xE2\xB4\xA4",
"\xE1\x83\x85" => "\xE2\xB4\xA5",
"\xE1\x83\x87" => "\xE2\xB4\xA7",
"\xE1\x83\x8D" => "\xE2\xB4\xAD",
"\xE1\x8F\xB8" => "\xE1\x8F\xB0",
"\xE1\x8F\xB9" => "\xE1\x8F\xB1",
"\xE1\x8F\xBA" => "\xE1\x8F\xB2",
"\xE1\x8F\xBB" => "\xE1\x8F\xB3",
"\xE1\x8F\xBC" => "\xE1\x8F\xB4",
"\xE1\x8F\xBD" => "\xE1\x8F\xB5",
"\xE1\xB2\x80" => "\xD0\xB2",
"\xE1\xB2\x81" => "\xD0\xB4",
"\xE1\xB2\x82" => "\xD0\xBE",
"\xE1\xB2\x83" => "\xD1\x81",
"\xE1\xB2\x84" => "\xD1\x82",
"\xE1\xB2\x85" => "\xD1\x82",
"\xE1\xB2\x86" => "\xD1\x8A",
"\xE1\xB2\x87" => "\xD1\xA3",
"\xE1\xB2\x88" => "\xEA\x99\x8B",
"\xE1\xB2\x90" => "\xE1\x83\x90",
"\xE1\xB2\x91" => "\xE1\x83\x91",
"\xE1\xB2\x92" => "\xE1\x83\x92",
"\xE1\xB2\x93" => "\xE1\x83\x93",
"\xE1\xB2\x94" => "\xE1\x83\x94",
"\xE1\xB2\x95" => "\xE1\x83\x95",
"\xE1\xB2\x96" => "\xE1\x83\x96",
"\xE1\xB2\x97" => "\xE1\x83\x97",
"\xE1\xB2\x98" => "\xE1\x83\x98",
"\xE1\xB2\x99" => "\xE1\x83\x99",
"\xE1\xB2\x9A" => "\xE1\x83\x9A",
"\xE1\xB2\x9B" => "\xE1\x83\x9B",
"\xE1\xB2\x9C" => "\xE1\x83\x9C",
"\xE1\xB2\x9D" => "\xE1\x83\x9D",
"\xE1\xB2\x9E" => "\xE1\x83\x9E",
"\xE1\xB2\x9F" => "\xE1\x83\x9F",
"\xE1\xB2\xA0" => "\xE1\x83\xA0",
"\xE1\xB2\xA1" => "\xE1\x83\xA1",
"\xE1\xB2\xA2" => "\xE1\x83\xA2",
"\xE1\xB2\xA3" => "\xE1\x83\xA3",
"\xE1\xB2\xA4" => "\xE1\x83\xA4",
"\xE1\xB2\xA5" => "\xE1\x83\xA5",
"\xE1\xB2\xA6" => "\xE1\x83\xA6",
"\xE1\xB2\xA7" => "\xE1\x83\xA7",
"\xE1\xB2\xA8" => "\xE1\x83\xA8",
"\xE1\xB2\xA9" => "\xE1\x83\xA9",
"\xE1\xB2\xAA" => "\xE1\x83\xAA",
"\xE1\xB2\xAB" => "\xE1\x83\xAB",
"\xE1\xB2\xAC" => "\xE1\x83\xAC",
"\xE1\xB2\xAD" => "\xE1\x83\xAD",
"\xE1\xB2\xAE" => "\xE1\x83\xAE",
"\xE1\xB2\xAF" => "\xE1\x83\xAF",
"\xE1\xB2\xB0" => "\xE1\x83\xB0",
"\xE1\xB2\xB1" => "\xE1\x83\xB1",
"\xE1\xB2\xB2" => "\xE1\x83\xB2",
"\xE1\xB2\xB3" => "\xE1\x83\xB3",
"\xE1\xB2\xB4" => "\xE1\x83\xB4",
"\xE1\xB2\xB5" => "\xE1\x83\xB5",
"\xE1\xB2\xB6" => "\xE1\x83\xB6",
"\xE1\xB2\xB7" => "\xE1\x83\xB7",
"\xE1\xB2\xB8" => "\xE1\x83\xB8",
"\xE1\xB2\xB9" => "\xE1\x83\xB9",
"\xE1\xB2\xBA" => "\xE1\x83\xBA",
"\xE1\xB2\xBD" => "\xE1\x83\xBD",
"\xE1\xB2\xBE" => "\xE1\x83\xBE",
"\xE1\xB2\xBF" => "\xE1\x83\xBF",
"\xE1\xB8\x80" => "\xE1\xB8\x81",
"\xE1\xB8\x82" => "\xE1\xB8\x83",
"\xE1\xB8\x84" => "\xE1\xB8\x85",
"\xE1\xB8\x86" => "\xE1\xB8\x87",
"\xE1\xB8\x88" => "\xE1\xB8\x89",
"\xE1\xB8\x8A" => "\xE1\xB8\x8B",
"\xE1\xB8\x8C" => "\xE1\xB8\x8D",
"\xE1\xB8\x8E" => "\xE1\xB8\x8F",
"\xE1\xB8\x90" => "\xE1\xB8\x91",
"\xE1\xB8\x92" => "\xE1\xB8\x93",
"\xE1\xB8\x94" => "\xE1\xB8\x95",
"\xE1\xB8\x96" => "\xE1\xB8\x97",
"\xE1\xB8\x98" => "\xE1\xB8\x99",
"\xE1\xB8\x9A" => "\xE1\xB8\x9B",
"\xE1\xB8\x9C" => "\xE1\xB8\x9D",
"\xE1\xB8\x9E" => "\xE1\xB8\x9F",
"\xE1\xB8\xA0" => "\xE1\xB8\xA1",
"\xE1\xB8\xA2" => "\xE1\xB8\xA3",
"\xE1\xB8\xA4" => "\xE1\xB8\xA5",
"\xE1\xB8\xA6" => "\xE1\xB8\xA7",
"\xE1\xB8\xA8" => "\xE1\xB8\xA9",
"\xE1\xB8\xAA" => "\xE1\xB8\xAB",
"\xE1\xB8\xAC" => "\xE1\xB8\xAD",
"\xE1\xB8\xAE" => "\xE1\xB8\xAF",
"\xE1\xB8\xB0" => "\xE1\xB8\xB1",
"\xE1\xB8\xB2" => "\xE1\xB8\xB3",
"\xE1\xB8\xB4" => "\xE1\xB8\xB5",
"\xE1\xB8\xB6" => "\xE1\xB8\xB7",
"\xE1\xB8\xB8" => "\xE1\xB8\xB9",
"\xE1\xB8\xBA" => "\xE1\xB8\xBB",
"\xE1\xB8\xBC" => "\xE1\xB8\xBD",
"\xE1\xB8\xBE" => "\xE1\xB8\xBF",
"\xE1\xB9\x80" => "\xE1\xB9\x81",
"\xE1\xB9\x82" => "\xE1\xB9\x83",
"\xE1\xB9\x84" => "\xE1\xB9\x85",
"\xE1\xB9\x86" => "\xE1\xB9\x87",
"\xE1\xB9\x88" => "\xE1\xB9\x89",
"\xE1\xB9\x8A" => "\xE1\xB9\x8B",
"\xE1\xB9\x8C" => "\xE1\xB9\x8D",
"\xE1\xB9\x8E" => "\xE1\xB9\x8F",
"\xE1\xB9\x90" => "\xE1\xB9\x91",
"\xE1\xB9\x92" => "\xE1\xB9\x93",
"\xE1\xB9\x94" => "\xE1\xB9\x95",
"\xE1\xB9\x96" => "\xE1\xB9\x97",
"\xE1\xB9\x98" => "\xE1\xB9\x99",
"\xE1\xB9\x9A" => "\xE1\xB9\x9B",
"\xE1\xB9\x9C" => "\xE1\xB9\x9D",
"\xE1\xB9\x9E" => "\xE1\xB9\x9F",
"\xE1\xB9\xA0" => "\xE1\xB9\xA1",
"\xE1\xB9\xA2" => "\xE1\xB9\xA3",
"\xE1\xB9\xA4" => "\xE1\xB9\xA5",
"\xE1\xB9\xA6" => "\xE1\xB9\xA7",
"\xE1\xB9\xA8" => "\xE1\xB9\xA9",
"\xE1\xB9\xAA" => "\xE1\xB9\xAB",
"\xE1\xB9\xAC" => "\xE1\xB9\xAD",
"\xE1\xB9\xAE" => "\xE1\xB9\xAF",
"\xE1\xB9\xB0" => "\xE1\xB9\xB1",
"\xE1\xB9\xB2" => "\xE1\xB9\xB3",
"\xE1\xB9\xB4" => "\xE1\xB9\xB5",
"\xE1\xB9\xB6" => "\xE1\xB9\xB7",
"\xE1\xB9\xB8" => "\xE1\xB9\xB9",
"\xE1\xB9\xBA" => "\xE1\xB9\xBB",
"\xE1\xB9\xBC" => "\xE1\xB9\xBD",
"\xE1\xB9\xBE" => "\xE1\xB9\xBF",
"\xE1\xBA\x80" => "\xE1\xBA\x81",
"\xE1\xBA\x82" => "\xE1\xBA\x83",
"\xE1\xBA\x84" => "\xE1\xBA\x85",
"\xE1\xBA\x86" => "\xE1\xBA\x87",
"\xE1\xBA\x88" => "\xE1\xBA\x89",
"\xE1\xBA\x8A" => "\xE1\xBA\x8B",
"\xE1\xBA\x8C" => "\xE1\xBA\x8D",
"\xE1\xBA\x8E" => "\xE1\xBA\x8F",
"\xE1\xBA\x90" => "\xE1\xBA\x91",
"\xE1\xBA\x92" => "\xE1\xBA\x93",
"\xE1\xBA\x94" => "\xE1\xBA\x95",
"\xE1\xBA\x9B" => "\xE1\xB9\xA1",
"\xE1\xBA\x9E" => "\xC3\x9F",
"\xE1\xBA\xA0" => "\xE1\xBA\xA1",
"\xE1\xBA\xA2" => "\xE1\xBA\xA3",
"\xE1\xBA\xA4" => "\xE1\xBA\xA5",
"\xE1\xBA\xA6" => "\xE1\xBA\xA7",
"\xE1\xBA\xA8" => "\xE1\xBA\xA9",
"\xE1\xBA\xAA" => "\xE1\xBA\xAB",
"\xE1\xBA\xAC" => "\xE1\xBA\xAD",
"\xE1\xBA\xAE" => "\xE1\xBA\xAF",
"\xE1\xBA\xB0" => "\xE1\xBA\xB1",
"\xE1\xBA\xB2" => "\xE1\xBA\xB3",
"\xE1\xBA\xB4" => "\xE1\xBA\xB5",
"\xE1\xBA\xB6" => "\xE1\xBA\xB7",
"\xE1\xBA\xB8" => "\xE1\xBA\xB9",
"\xE1\xBA\xBA" => "\xE1\xBA\xBB",
"\xE1\xBA\xBC" => "\xE1\xBA\xBD",
"\xE1\xBA\xBE" => "\xE1\xBA\xBF",
"\xE1\xBB\x80" => "\xE1\xBB\x81",
"\xE1\xBB\x82" => "\xE1\xBB\x83",
"\xE1\xBB\x84" => "\xE1\xBB\x85",
"\xE1\xBB\x86" => "\xE1\xBB\x87",
"\xE1\xBB\x88" => "\xE1\xBB\x89",
"\xE1\xBB\x8A" => "\xE1\xBB\x8B",
"\xE1\xBB\x8C" => "\xE1\xBB\x8D",
"\xE1\xBB\x8E" => "\xE1\xBB\x8F",
"\xE1\xBB\x90" => "\xE1\xBB\x91",
"\xE1\xBB\x92" => "\xE1\xBB\x93",
"\xE1\xBB\x94" => "\xE1\xBB\x95",
"\xE1\xBB\x96" => "\xE1\xBB\x97",
"\xE1\xBB\x98" => "\xE1\xBB\x99",
"\xE1\xBB\x9A" => "\xE1\xBB\x9B",
"\xE1\xBB\x9C" => "\xE1\xBB\x9D",
"\xE1\xBB\x9E" => "\xE1\xBB\x9F",
"\xE1\xBB\xA0" => "\xE1\xBB\xA1",
"\xE1\xBB\xA2" => "\xE1\xBB\xA3",
"\xE1\xBB\xA4" => "\xE1\xBB\xA5",
"\xE1\xBB\xA6" => "\xE1\xBB\xA7",
"\xE1\xBB\xA8" => "\xE1\xBB\xA9",
"\xE1\xBB\xAA" => "\xE1\xBB\xAB",
"\xE1\xBB\xAC" => "\xE1\xBB\xAD",
"\xE1\xBB\xAE" => "\xE1\xBB\xAF",
"\xE1\xBB\xB0" => "\xE1\xBB\xB1",
"\xE1\xBB\xB2" => "\xE1\xBB\xB3",
"\xE1\xBB\xB4" => "\xE1\xBB\xB5",
"\xE1\xBB\xB6" => "\xE1\xBB\xB7",
"\xE1\xBB\xB8" => "\xE1\xBB\xB9",
"\xE1\xBB\xBA" => "\xE1\xBB\xBB",
"\xE1\xBB\xBC" => "\xE1\xBB\xBD",
"\xE1\xBB\xBE" => "\xE1\xBB\xBF",
"\xE1\xBC\x88" => "\xE1\xBC\x80",
"\xE1\xBC\x89" => "\xE1\xBC\x81",
"\xE1\xBC\x8A" => "\xE1\xBC\x82",
"\xE1\xBC\x8B" => "\xE1\xBC\x83",
"\xE1\xBC\x8C" => "\xE1\xBC\x84",
"\xE1\xBC\x8D" => "\xE1\xBC\x85",
"\xE1\xBC\x8E" => "\xE1\xBC\x86",
"\xE1\xBC\x8F" => "\xE1\xBC\x87",
"\xE1\xBC\x98" => "\xE1\xBC\x90",
"\xE1\xBC\x99" => "\xE1\xBC\x91",
"\xE1\xBC\x9A" => "\xE1\xBC\x92",
"\xE1\xBC\x9B" => "\xE1\xBC\x93",
"\xE1\xBC\x9C" => "\xE1\xBC\x94",
"\xE1\xBC\x9D" => "\xE1\xBC\x95",
"\xE1\xBC\xA8" => "\xE1\xBC\xA0",
"\xE1\xBC\xA9" => "\xE1\xBC\xA1",
"\xE1\xBC\xAA" => "\xE1\xBC\xA2",
"\xE1\xBC\xAB" => "\xE1\xBC\xA3",
"\xE1\xBC\xAC" => "\xE1\xBC\xA4",
"\xE1\xBC\xAD" => "\xE1\xBC\xA5",
"\xE1\xBC\xAE" => "\xE1\xBC\xA6",
"\xE1\xBC\xAF" => "\xE1\xBC\xA7",
"\xE1\xBC\xB8" => "\xE1\xBC\xB0",
"\xE1\xBC\xB9" => "\xE1\xBC\xB1",
"\xE1\xBC\xBA" => "\xE1\xBC\xB2",
"\xE1\xBC\xBB" => "\xE1\xBC\xB3",
"\xE1\xBC\xBC" => "\xE1\xBC\xB4",
"\xE1\xBC\xBD" => "\xE1\xBC\xB5",
"\xE1\xBC\xBE" => "\xE1\xBC\xB6",
"\xE1\xBC\xBF" => "\xE1\xBC\xB7",
Find: Select
/**
* Helper function for utf8_casefold.
*
* Developers: Do not update the data in this function manually. Instead,
* run "php -f other/update_unicode_data.php" on the command line.
*
* @return array Casefolding maps.
*/
function utf8_casefold_maps()
Replace With: Select
"\xE1\xBD\x88" => "\xE1\xBD\x80",
"\xE1\xBD\x89" => "\xE1\xBD\x81",
"\xE1\xBD\x8A" => "\xE1\xBD\x82",
"\xE1\xBD\x8B" => "\xE1\xBD\x83",
"\xE1\xBD\x8C" => "\xE1\xBD\x84",
"\xE1\xBD\x8D" => "\xE1\xBD\x85",
"\xE1\xBD\x99" => "\xE1\xBD\x91",
"\xE1\xBD\x9B" => "\xE1\xBD\x93",
"\xE1\xBD\x9D" => "\xE1\xBD\x95",
"\xE1\xBD\x9F" => "\xE1\xBD\x97",
"\xE1\xBD\xA8" => "\xE1\xBD\xA0",
"\xE1\xBD\xA9" => "\xE1\xBD\xA1",
"\xE1\xBD\xAA" => "\xE1\xBD\xA2",
"\xE1\xBD\xAB" => "\xE1\xBD\xA3",
"\xE1\xBD\xAC" => "\xE1\xBD\xA4",
"\xE1\xBD\xAD" => "\xE1\xBD\xA5",
"\xE1\xBD\xAE" => "\xE1\xBD\xA6",
"\xE1\xBD\xAF" => "\xE1\xBD\xA7",
"\xE1\xBE\x88" => "\xE1\xBE\x80",
"\xE1\xBE\x89" => "\xE1\xBE\x81",
"\xE1\xBE\x8A" => "\xE1\xBE\x82",
"\xE1\xBE\x8B" => "\xE1\xBE\x83",
"\xE1\xBE\x8C" => "\xE1\xBE\x84",
"\xE1\xBE\x8D" => "\xE1\xBE\x85",
"\xE1\xBE\x8E" => "\xE1\xBE\x86",
"\xE1\xBE\x8F" => "\xE1\xBE\x87",
"\xE1\xBE\x98" => "\xE1\xBE\x90",
"\xE1\xBE\x99" => "\xE1\xBE\x91",
"\xE1\xBE\x9A" => "\xE1\xBE\x92",
"\xE1\xBE\x9B" => "\xE1\xBE\x93",
"\xE1\xBE\x9C" => "\xE1\xBE\x94",
"\xE1\xBE\x9D" => "\xE1\xBE\x95",
"\xE1\xBE\x9E" => "\xE1\xBE\x96",
"\xE1\xBE\x9F" => "\xE1\xBE\x97",
"\xE1\xBE\xA8" => "\xE1\xBE\xA0",
"\xE1\xBE\xA9" => "\xE1\xBE\xA1",
"\xE1\xBE\xAA" => "\xE1\xBE\xA2",
"\xE1\xBE\xAB" => "\xE1\xBE\xA3",
"\xE1\xBE\xAC" => "\xE1\xBE\xA4",
"\xE1\xBE\xAD" => "\xE1\xBE\xA5",
"\xE1\xBE\xAE" => "\xE1\xBE\xA6",
"\xE1\xBE\xAF" => "\xE1\xBE\xA7",
"\xE1\xBE\xB8" => "\xE1\xBE\xB0",
"\xE1\xBE\xB9" => "\xE1\xBE\xB1",
"\xE1\xBE\xBA" => "\xE1\xBD\xB0",
"\xE1\xBE\xBB" => "\xE1\xBD\xB1",
"\xE1\xBE\xBC" => "\xE1\xBE\xB3",
"\xE1\xBE\xBE" => "\xCE\xB9",
"\xE1\xBF\x88" => "\xE1\xBD\xB2",
"\xE1\xBF\x89" => "\xE1\xBD\xB3",
"\xE1\xBF\x8A" => "\xE1\xBD\xB4",
"\xE1\xBF\x8B" => "\xE1\xBD\xB5",
"\xE1\xBF\x8C" => "\xE1\xBF\x83",
"\xE1\xBF\x98" => "\xE1\xBF\x90",
"\xE1\xBF\x99" => "\xE1\xBF\x91",
"\xE1\xBF\x9A" => "\xE1\xBD\xB6",
"\xE1\xBF\x9B" => "\xE1\xBD\xB7",
"\xE1\xBF\xA8" => "\xE1\xBF\xA0",
"\xE1\xBF\xA9" => "\xE1\xBF\xA1",
"\xE1\xBF\xAA" => "\xE1\xBD\xBA",
"\xE1\xBF\xAB" => "\xE1\xBD\xBB",
"\xE1\xBF\xAC" => "\xE1\xBF\xA5",
"\xE1\xBF\xB8" => "\xE1\xBD\xB8",
"\xE1\xBF\xB9" => "\xE1\xBD\xB9",
"\xE1\xBF\xBA" => "\xE1\xBD\xBC",
"\xE1\xBF\xBB" => "\xE1\xBD\xBD",
"\xE1\xBF\xBC" => "\xE1\xBF\xB3",
"\xE2\x84\xA6" => "\xCF\x89",
"\xE2\x84\xAA" => "\x6B",
"\xE2\x84\xAB" => "\xC3\xA5",
"\xE2\x84\xB2" => "\xE2\x85\x8E",
"\xE2\x85\xA0" => "\xE2\x85\xB0",
"\xE2\x85\xA1" => "\xE2\x85\xB1",
"\xE2\x85\xA2" => "\xE2\x85\xB2",
"\xE2\x85\xA3" => "\xE2\x85\xB3",
"\xE2\x85\xA4" => "\xE2\x85\xB4",
"\xE2\x85\xA5" => "\xE2\x85\xB5",
"\xE2\x85\xA6" => "\xE2\x85\xB6",
"\xE2\x85\xA7" => "\xE2\x85\xB7",
"\xE2\x85\xA8" => "\xE2\x85\xB8",
"\xE2\x85\xA9" => "\xE2\x85\xB9",
"\xE2\x85\xAA" => "\xE2\x85\xBA",
"\xE2\x85\xAB" => "\xE2\x85\xBB",
"\xE2\x85\xAC" => "\xE2\x85\xBC",
"\xE2\x85\xAD" => "\xE2\x85\xBD",
"\xE2\x85\xAE" => "\xE2\x85\xBE",
"\xE2\x85\xAF" => "\xE2\x85\xBF",
"\xE2\x86\x83" => "\xE2\x86\x84",
"\xE2\x92\xB6" => "\xE2\x93\x90",
"\xE2\x92\xB7" => "\xE2\x93\x91",
"\xE2\x92\xB8" => "\xE2\x93\x92",
"\xE2\x92\xB9" => "\xE2\x93\x93",
"\xE2\x92\xBA" => "\xE2\x93\x94",
"\xE2\x92\xBB" => "\xE2\x93\x95",
"\xE2\x92\xBC" => "\xE2\x93\x96",
"\xE2\x92\xBD" => "\xE2\x93\x97",
"\xE2\x92\xBE" => "\xE2\x93\x98",
"\xE2\x92\xBF" => "\xE2\x93\x99",
"\xE2\x93\x80" => "\xE2\x93\x9A",
"\xE2\x93\x81" => "\xE2\x93\x9B",
"\xE2\x93\x82" => "\xE2\x93\x9C",
"\xE2\x93\x83" => "\xE2\x93\x9D",
"\xE2\x93\x84" => "\xE2\x93\x9E",
"\xE2\x93\x85" => "\xE2\x93\x9F",
"\xE2\x93\x86" => "\xE2\x93\xA0",
"\xE2\x93\x87" => "\xE2\x93\xA1",
"\xE2\x93\x88" => "\xE2\x93\xA2",
"\xE2\x93\x89" => "\xE2\x93\xA3",
"\xE2\x93\x8A" => "\xE2\x93\xA4",
"\xE2\x93\x8B" => "\xE2\x93\xA5",
"\xE2\x93\x8C" => "\xE2\x93\xA6",
"\xE2\x93\x8D" => "\xE2\x93\xA7",
"\xE2\x93\x8E" => "\xE2\x93\xA8",
"\xE2\x93\x8F" => "\xE2\x93\xA9",
"\xE2\xB0\x80" => "\xE2\xB0\xB0",
"\xE2\xB0\x81" => "\xE2\xB0\xB1",
"\xE2\xB0\x82" => "\xE2\xB0\xB2",
"\xE2\xB0\x83" => "\xE2\xB0\xB3",
"\xE2\xB0\x84" => "\xE2\xB0\xB4",
"\xE2\xB0\x85" => "\xE2\xB0\xB5",
"\xE2\xB0\x86" => "\xE2\xB0\xB6",
"\xE2\xB0\x87" => "\xE2\xB0\xB7",
"\xE2\xB0\x88" => "\xE2\xB0\xB8",
"\xE2\xB0\x89" => "\xE2\xB0\xB9",
"\xE2\xB0\x8A" => "\xE2\xB0\xBA",
"\xE2\xB0\x8B" => "\xE2\xB0\xBB",
"\xE2\xB0\x8C" => "\xE2\xB0\xBC",
"\xE2\xB0\x8D" => "\xE2\xB0\xBD",
"\xE2\xB0\x8E" => "\xE2\xB0\xBE",
"\xE2\xB0\x8F" => "\xE2\xB0\xBF",
"\xE2\xB0\x90" => "\xE2\xB1\x80",
"\xE2\xB0\x91" => "\xE2\xB1\x81",
"\xE2\xB0\x92" => "\xE2\xB1\x82",
"\xE2\xB0\x93" => "\xE2\xB1\x83",
"\xE2\xB0\x94" => "\xE2\xB1\x84",
"\xE2\xB0\x95" => "\xE2\xB1\x85",
"\xE2\xB0\x96" => "\xE2\xB1\x86",
"\xE2\xB0\x97" => "\xE2\xB1\x87",
"\xE2\xB0\x98" => "\xE2\xB1\x88",
"\xE2\xB0\x99" => "\xE2\xB1\x89",
"\xE2\xB0\x9A" => "\xE2\xB1\x8A",
"\xE2\xB0\x9B" => "\xE2\xB1\x8B",
"\xE2\xB0\x9C" => "\xE2\xB1\x8C",
"\xE2\xB0\x9D" => "\xE2\xB1\x8D",
"\xE2\xB0\x9E" => "\xE2\xB1\x8E",
"\xE2\xB0\x9F" => "\xE2\xB1\x8F",
"\xE2\xB0\xA0" => "\xE2\xB1\x90",
"\xE2\xB0\xA1" => "\xE2\xB1\x91",
"\xE2\xB0\xA2" => "\xE2\xB1\x92",
"\xE2\xB0\xA3" => "\xE2\xB1\x93",
"\xE2\xB0\xA4" => "\xE2\xB1\x94",
"\xE2\xB0\xA5" => "\xE2\xB1\x95",
"\xE2\xB0\xA6" => "\xE2\xB1\x96",
"\xE2\xB0\xA7" => "\xE2\xB1\x97",
"\xE2\xB0\xA8" => "\xE2\xB1\x98",
"\xE2\xB0\xA9" => "\xE2\xB1\x99",
"\xE2\xB0\xAA" => "\xE2\xB1\x9A",
"\xE2\xB0\xAB" => "\xE2\xB1\x9B",
"\xE2\xB0\xAC" => "\xE2\xB1\x9C",
"\xE2\xB0\xAD" => "\xE2\xB1\x9D",
"\xE2\xB0\xAE" => "\xE2\xB1\x9E",
"\xE2\xB0\xAF" => "\xE2\xB1\x9F",
"\xE2\xB1\xA0" => "\xE2\xB1\xA1",
"\xE2\xB1\xA2" => "\xC9\xAB",
"\xE2\xB1\xA3" => "\xE1\xB5\xBD",
"\xE2\xB1\xA4" => "\xC9\xBD",
"\xE2\xB1\xA7" => "\xE2\xB1\xA8",
"\xE2\xB1\xA9" => "\xE2\xB1\xAA",
"\xE2\xB1\xAB" => "\xE2\xB1\xAC",
"\xE2\xB1\xAD" => "\xC9\x91",
"\xE2\xB1\xAE" => "\xC9\xB1",
"\xE2\xB1\xAF" => "\xC9\x90",
"\xE2\xB1\xB0" => "\xC9\x92",
"\xE2\xB1\xB2" => "\xE2\xB1\xB3",
"\xE2\xB1\xB5" => "\xE2\xB1\xB6",
"\xE2\xB1\xBE" => "\xC8\xBF",
"\xE2\xB1\xBF" => "\xC9\x80",
"\xE2\xB2\x80" => "\xE2\xB2\x81",
"\xE2\xB2\x82" => "\xE2\xB2\x83",
"\xE2\xB2\x84" => "\xE2\xB2\x85",
"\xE2\xB2\x86" => "\xE2\xB2\x87",
"\xE2\xB2\x88" => "\xE2\xB2\x89",
"\xE2\xB2\x8A" => "\xE2\xB2\x8B",
"\xE2\xB2\x8C" => "\xE2\xB2\x8D",
"\xE2\xB2\x8E" => "\xE2\xB2\x8F",
"\xE2\xB2\x90" => "\xE2\xB2\x91",
"\xE2\xB2\x92" => "\xE2\xB2\x93",
"\xE2\xB2\x94" => "\xE2\xB2\x95",
"\xE2\xB2\x96" => "\xE2\xB2\x97",
"\xE2\xB2\x98" => "\xE2\xB2\x99",
"\xE2\xB2\x9A" => "\xE2\xB2\x9B",
"\xE2\xB2\x9C" => "\xE2\xB2\x9D",
"\xE2\xB2\x9E" => "\xE2\xB2\x9F",
"\xE2\xB2\xA0" => "\xE2\xB2\xA1",
"\xE2\xB2\xA2" => "\xE2\xB2\xA3",
"\xE2\xB2\xA4" => "\xE2\xB2\xA5",
"\xE2\xB2\xA6" => "\xE2\xB2\xA7",
"\xE2\xB2\xA8" => "\xE2\xB2\xA9",
"\xE2\xB2\xAA" => "\xE2\xB2\xAB",
"\xE2\xB2\xAC" => "\xE2\xB2\xAD",
"\xE2\xB2\xAE" => "\xE2\xB2\xAF",
"\xE2\xB2\xB0" => "\xE2\xB2\xB1",
"\xE2\xB2\xB2" => "\xE2\xB2\xB3",
"\xE2\xB2\xB4" => "\xE2\xB2\xB5",
"\xE2\xB2\xB6" => "\xE2\xB2\xB7",
"\xE2\xB2\xB8" => "\xE2\xB2\xB9",
"\xE2\xB2\xBA" => "\xE2\xB2\xBB",
"\xE2\xB2\xBC" => "\xE2\xB2\xBD",
"\xE2\xB2\xBE" => "\xE2\xB2\xBF",
"\xE2\xB3\x80" => "\xE2\xB3\x81",
"\xE2\xB3\x82" => "\xE2\xB3\x83",
"\xE2\xB3\x84" => "\xE2\xB3\x85",
"\xE2\xB3\x86" => "\xE2\xB3\x87",
"\xE2\xB3\x88" => "\xE2\xB3\x89",
"\xE2\xB3\x8A" => "\xE2\xB3\x8B",
"\xE2\xB3\x8C" => "\xE2\xB3\x8D",
"\xE2\xB3\x8E" => "\xE2\xB3\x8F",
"\xE2\xB3\x90" => "\xE2\xB3\x91",
"\xE2\xB3\x92" => "\xE2\xB3\x93",
"\xE2\xB3\x94" => "\xE2\xB3\x95",
"\xE2\xB3\x96" => "\xE2\xB3\x97",
"\xE2\xB3\x98" => "\xE2\xB3\x99",
"\xE2\xB3\x9A" => "\xE2\xB3\x9B",
"\xE2\xB3\x9C" => "\xE2\xB3\x9D",
"\xE2\xB3\x9E" => "\xE2\xB3\x9F",
"\xE2\xB3\xA0" => "\xE2\xB3\xA1",
"\xE2\xB3\xA2" => "\xE2\xB3\xA3",
"\xE2\xB3\xAB" => "\xE2\xB3\xAC",
"\xE2\xB3\xAD" => "\xE2\xB3\xAE",
"\xE2\xB3\xB2" => "\xE2\xB3\xB3",
"\xEA\x99\x80" => "\xEA\x99\x81",
"\xEA\x99\x82" => "\xEA\x99\x83",
"\xEA\x99\x84" => "\xEA\x99\x85",
"\xEA\x99\x86" => "\xEA\x99\x87",
"\xEA\x99\x88" => "\xEA\x99\x89",
"\xEA\x99\x8A" => "\xEA\x99\x8B",
"\xEA\x99\x8C" => "\xEA\x99\x8D",
"\xEA\x99\x8E" => "\xEA\x99\x8F",
"\xEA\x99\x90" => "\xEA\x99\x91",
"\xEA\x99\x92" => "\xEA\x99\x93",
"\xEA\x99\x94" => "\xEA\x99\x95",
"\xEA\x99\x96" => "\xEA\x99\x97",
"\xEA\x99\x98" => "\xEA\x99\x99",
"\xEA\x99\x9A" => "\xEA\x99\x9B",
"\xEA\x99\x9C" => "\xEA\x99\x9D",
"\xEA\x99\x9E" => "\xEA\x99\x9F",
"\xEA\x99\xA0" => "\xEA\x99\xA1",
"\xEA\x99\xA2" => "\xEA\x99\xA3",
"\xEA\x99\xA4" => "\xEA\x99\xA5",
"\xEA\x99\xA6" => "\xEA\x99\xA7",
"\xEA\x99\xA8" => "\xEA\x99\xA9",
"\xEA\x99\xAA" => "\xEA\x99\xAB",
"\xEA\x99\xAC" => "\xEA\x99\xAD",
"\xEA\x9A\x80" => "\xEA\x9A\x81",
"\xEA\x9A\x82" => "\xEA\x9A\x83",
"\xEA\x9A\x84" => "\xEA\x9A\x85",
"\xEA\x9A\x86" => "\xEA\x9A\x87",
"\xEA\x9A\x88" => "\xEA\x9A\x89",
"\xEA\x9A\x8A" => "\xEA\x9A\x8B",
"\xEA\x9A\x8C" => "\xEA\x9A\x8D",
"\xEA\x9A\x8E" => "\xEA\x9A\x8F",
"\xEA\x9A\x90" => "\xEA\x9A\x91",
"\xEA\x9A\x92" => "\xEA\x9A\x93",
"\xEA\x9A\x94" => "\xEA\x9A\x95",
"\xEA\x9A\x96" => "\xEA\x9A\x97",
"\xEA\x9A\x98" => "\xEA\x9A\x99",
"\xEA\x9A\x9A" => "\xEA\x9A\x9B",
"\xEA\x9C\xA2" => "\xEA\x9C\xA3",
"\xEA\x9C\xA4" => "\xEA\x9C\xA5",
"\xEA\x9C\xA6" => "\xEA\x9C\xA7",
"\xEA\x9C\xA8" => "\xEA\x9C\xA9",
"\xEA\x9C\xAA" => "\xEA\x9C\xAB",
"\xEA\x9C\xAC" => "\xEA\x9C\xAD",
"\xEA\x9C\xAE" => "\xEA\x9C\xAF",
"\xEA\x9C\xB2" => "\xEA\x9C\xB3",
"\xEA\x9C\xB4" => "\xEA\x9C\xB5",
"\xEA\x9C\xB6" => "\xEA\x9C\xB7",
"\xEA\x9C\xB8" => "\xEA\x9C\xB9",
"\xEA\x9C\xBA" => "\xEA\x9C\xBB",
"\xEA\x9C\xBC" => "\xEA\x9C\xBD",
"\xEA\x9C\xBE" => "\xEA\x9C\xBF",
"\xEA\x9D\x80" => "\xEA\x9D\x81",
"\xEA\x9D\x82" => "\xEA\x9D\x83",
"\xEA\x9D\x84" => "\xEA\x9D\x85",
"\xEA\x9D\x86" => "\xEA\x9D\x87",
"\xEA\x9D\x88" => "\xEA\x9D\x89",
"\xEA\x9D\x8A" => "\xEA\x9D\x8B",
"\xEA\x9D\x8C" => "\xEA\x9D\x8D",
"\xEA\x9D\x8E" => "\xEA\x9D\x8F",
"\xEA\x9D\x90" => "\xEA\x9D\x91",
"\xEA\x9D\x92" => "\xEA\x9D\x93",
"\xEA\x9D\x94" => "\xEA\x9D\x95",
"\xEA\x9D\x96" => "\xEA\x9D\x97",
"\xEA\x9D\x98" => "\xEA\x9D\x99",
"\xEA\x9D\x9A" => "\xEA\x9D\x9B",
"\xEA\x9D\x9C" => "\xEA\x9D\x9D",
"\xEA\x9D\x9E" => "\xEA\x9D\x9F",
"\xEA\x9D\xA0" => "\xEA\x9D\xA1",
"\xEA\x9D\xA2" => "\xEA\x9D\xA3",
"\xEA\x9D\xA4" => "\xEA\x9D\xA5",
"\xEA\x9D\xA6" => "\xEA\x9D\xA7",
"\xEA\x9D\xA8" => "\xEA\x9D\xA9",
"\xEA\x9D\xAA" => "\xEA\x9D\xAB",
"\xEA\x9D\xAC" => "\xEA\x9D\xAD",
"\xEA\x9D\xAE" => "\xEA\x9D\xAF",
"\xEA\x9D\xB9" => "\xEA\x9D\xBA",
"\xEA\x9D\xBB" => "\xEA\x9D\xBC",
"\xEA\x9D\xBD" => "\xE1\xB5\xB9",
"\xEA\x9D\xBE" => "\xEA\x9D\xBF",
"\xEA\x9E\x80" => "\xEA\x9E\x81",
"\xEA\x9E\x82" => "\xEA\x9E\x83",
"\xEA\x9E\x84" => "\xEA\x9E\x85",
"\xEA\x9E\x86" => "\xEA\x9E\x87",
"\xEA\x9E\x8B" => "\xEA\x9E\x8C",
"\xEA\x9E\x8D" => "\xC9\xA5",
"\xEA\x9E\x90" => "\xEA\x9E\x91",
"\xEA\x9E\x92" => "\xEA\x9E\x93",
"\xEA\x9E\x96" => "\xEA\x9E\x97",
"\xEA\x9E\x98" => "\xEA\x9E\x99",
"\xEA\x9E\x9A" => "\xEA\x9E\x9B",
"\xEA\x9E\x9C" => "\xEA\x9E\x9D",
"\xEA\x9E\x9E" => "\xEA\x9E\x9F",
"\xEA\x9E\xA0" => "\xEA\x9E\xA1",
"\xEA\x9E\xA2" => "\xEA\x9E\xA3",
"\xEA\x9E\xA4" => "\xEA\x9E\xA5",
"\xEA\x9E\xA6" => "\xEA\x9E\xA7",
"\xEA\x9E\xA8" => "\xEA\x9E\xA9",
"\xEA\x9E\xAA" => "\xC9\xA6",
"\xEA\x9E\xAB" => "\xC9\x9C",
"\xEA\x9E\xAC" => "\xC9\xA1",
"\xEA\x9E\xAD" => "\xC9\xAC",
"\xEA\x9E\xAE" => "\xC9\xAA",
"\xEA\x9E\xB0" => "\xCA\x9E",
"\xEA\x9E\xB1" => "\xCA\x87",
"\xEA\x9E\xB2" => "\xCA\x9D",
"\xEA\x9E\xB3" => "\xEA\xAD\x93",
"\xEA\x9E\xB4" => "\xEA\x9E\xB5",
"\xEA\x9E\xB6" => "\xEA\x9E\xB7",
"\xEA\x9E\xB8" => "\xEA\x9E\xB9",
"\xEA\x9E\xBA" => "\xEA\x9E\xBB",
"\xEA\x9E\xBC" => "\xEA\x9E\xBD",
"\xEA\x9E\xBE" => "\xEA\x9E\xBF",
"\xEA\x9F\x80" => "\xEA\x9F\x81",
"\xEA\x9F\x82" => "\xEA\x9F\x83",
"\xEA\x9F\x84" => "\xEA\x9E\x94",
"\xEA\x9F\x85" => "\xCA\x82",
"\xEA\x9F\x86" => "\xE1\xB6\x8E",
"\xEA\x9F\x87" => "\xEA\x9F\x88",
"\xEA\x9F\x89" => "\xEA\x9F\x8A",
"\xEA\x9F\x90" => "\xEA\x9F\x91",
"\xEA\x9F\x96" => "\xEA\x9F\x97",
"\xEA\x9F\x98" => "\xEA\x9F\x99",
"\xEA\x9F\xB5" => "\xEA\x9F\xB6",
"\xEA\xAD\xB0" => "\xE1\x8E\xA0",
"\xEA\xAD\xB1" => "\xE1\x8E\xA1",
"\xEA\xAD\xB2" => "\xE1\x8E\xA2",
"\xEA\xAD\xB3" => "\xE1\x8E\xA3",
"\xEA\xAD\xB4" => "\xE1\x8E\xA4",
"\xEA\xAD\xB5" => "\xE1\x8E\xA5",
"\xEA\xAD\xB6" => "\xE1\x8E\xA6",
"\xEA\xAD\xB7" => "\xE1\x8E\xA7",
"\xEA\xAD\xB8" => "\xE1\x8E\xA8",
"\xEA\xAD\xB9" => "\xE1\x8E\xA9",
"\xEA\xAD\xBA" => "\xE1\x8E\xAA",
"\xEA\xAD\xBB" => "\xE1\x8E\xAB",
"\xEA\xAD\xBC" => "\xE1\x8E\xAC",
"\xEA\xAD\xBD" => "\xE1\x8E\xAD",
"\xEA\xAD\xBE" => "\xE1\x8E\xAE",
"\xEA\xAD\xBF" => "\xE1\x8E\xAF",
"\xEA\xAE\x80" => "\xE1\x8E\xB0",
"\xEA\xAE\x81" => "\xE1\x8E\xB1",
"\xEA\xAE\x82" => "\xE1\x8E\xB2",
"\xEA\xAE\x83" => "\xE1\x8E\xB3",
"\xEA\xAE\x84" => "\xE1\x8E\xB4",
"\xEA\xAE\x85" => "\xE1\x8E\xB5",
"\xEA\xAE\x86" => "\xE1\x8E\xB6",
"\xEA\xAE\x87" => "\xE1\x8E\xB7",
"\xEA\xAE\x88" => "\xE1\x8E\xB8",
"\xEA\xAE\x89" => "\xE1\x8E\xB9",
"\xEA\xAE\x8A" => "\xE1\x8E\xBA",
"\xEA\xAE\x8B" => "\xE1\x8E\xBB",
"\xEA\xAE\x8C" => "\xE1\x8E\xBC",
"\xEA\xAE\x8D" => "\xE1\x8E\xBD",
"\xEA\xAE\x8E" => "\xE1\x8E\xBE",
"\xEA\xAE\x8F" => "\xE1\x8E\xBF",
"\xEA\xAE\x90" => "\xE1\x8F\x80",
"\xEA\xAE\x91" => "\xE1\x8F\x81",
"\xEA\xAE\x92" => "\xE1\x8F\x82",
"\xEA\xAE\x93" => "\xE1\x8F\x83",
"\xEA\xAE\x94" => "\xE1\x8F\x84",
"\xEA\xAE\x95" => "\xE1\x8F\x85",
"\xEA\xAE\x96" => "\xE1\x8F\x86",
"\xEA\xAE\x97" => "\xE1\x8F\x87",
"\xEA\xAE\x98" => "\xE1\x8F\x88",
"\xEA\xAE\x99" => "\xE1\x8F\x89",
"\xEA\xAE\x9A" => "\xE1\x8F\x8A",
"\xEA\xAE\x9B" => "\xE1\x8F\x8B",
"\xEA\xAE\x9C" => "\xE1\x8F\x8C",
"\xEA\xAE\x9D" => "\xE1\x8F\x8D",
"\xEA\xAE\x9E" => "\xE1\x8F\x8E",
"\xEA\xAE\x9F" => "\xE1\x8F\x8F",
"\xEA\xAE\xA0" => "\xE1\x8F\x90",
"\xEA\xAE\xA1" => "\xE1\x8F\x91",
"\xEA\xAE\xA2" => "\xE1\x8F\x92",
"\xEA\xAE\xA3" => "\xE1\x8F\x93",
"\xEA\xAE\xA4" => "\xE1\x8F\x94",
"\xEA\xAE\xA5" => "\xE1\x8F\x95",
"\xEA\xAE\xA6" => "\xE1\x8F\x96",
"\xEA\xAE\xA7" => "\xE1\x8F\x97",
"\xEA\xAE\xA8" => "\xE1\x8F\x98",
"\xEA\xAE\xA9" => "\xE1\x8F\x99",
"\xEA\xAE\xAA" => "\xE1\x8F\x9A",
"\xEA\xAE\xAB" => "\xE1\x8F\x9B",
"\xEA\xAE\xAC" => "\xE1\x8F\x9C",
"\xEA\xAE\xAD" => "\xE1\x8F\x9D",
"\xEA\xAE\xAE" => "\xE1\x8F\x9E",
"\xEA\xAE\xAF" => "\xE1\x8F\x9F",
"\xEA\xAE\xB0" => "\xE1\x8F\xA0",
"\xEA\xAE\xB1" => "\xE1\x8F\xA1",
"\xEA\xAE\xB2" => "\xE1\x8F\xA2",
"\xEA\xAE\xB3" => "\xE1\x8F\xA3",
"\xEA\xAE\xB4" => "\xE1\x8F\xA4",
"\xEA\xAE\xB5" => "\xE1\x8F\xA5",
"\xEA\xAE\xB6" => "\xE1\x8F\xA6",
"\xEA\xAE\xB7" => "\xE1\x8F\xA7",
"\xEA\xAE\xB8" => "\xE1\x8F\xA8",
"\xEA\xAE\xB9" => "\xE1\x8F\xA9",
"\xEA\xAE\xBA" => "\xE1\x8F\xAA",
"\xEA\xAE\xBB" => "\xE1\x8F\xAB",
"\xEA\xAE\xBC" => "\xE1\x8F\xAC",
"\xEA\xAE\xBD" => "\xE1\x8F\xAD",
"\xEA\xAE\xBE" => "\xE1\x8F\xAE",
"\xEA\xAE\xBF" => "\xE1\x8F\xAF",
"\xEF\xBC\xA1" => "\xEF\xBD\x81",
"\xEF\xBC\xA2" => "\xEF\xBD\x82",
"\xEF\xBC\xA3" => "\xEF\xBD\x83",
"\xEF\xBC\xA4" => "\xEF\xBD\x84",
"\xEF\xBC\xA5" => "\xEF\xBD\x85",
"\xEF\xBC\xA6" => "\xEF\xBD\x86",
"\xEF\xBC\xA7" => "\xEF\xBD\x87",
"\xEF\xBC\xA8" => "\xEF\xBD\x88",
"\xEF\xBC\xA9" => "\xEF\xBD\x89",
"\xEF\xBC\xAA" => "\xEF\xBD\x8A",
"\xEF\xBC\xAB" => "\xEF\xBD\x8B",
"\xEF\xBC\xAC" => "\xEF\xBD\x8C",
"\xEF\xBC\xAD" => "\xEF\xBD\x8D",
"\xEF\xBC\xAE" => "\xEF\xBD\x8E",
"\xEF\xBC\xAF" => "\xEF\xBD\x8F",
"\xEF\xBC\xB0" => "\xEF\xBD\x90",
"\xEF\xBC\xB1" => "\xEF\xBD\x91",
"\xEF\xBC\xB2" => "\xEF\xBD\x92",
"\xEF\xBC\xB3" => "\xEF\xBD\x93",
"\xEF\xBC\xB4" => "\xEF\xBD\x94",
"\xEF\xBC\xB5" => "\xEF\xBD\x95",
"\xEF\xBC\xB6" => "\xEF\xBD\x96",
"\xEF\xBC\xB7" => "\xEF\xBD\x97",
"\xEF\xBC\xB8" => "\xEF\xBD\x98",
"\xEF\xBC\xB9" => "\xEF\xBD\x99",
"\xEF\xBC\xBA" => "\xEF\xBD\x9A",
"\xF0\x90\x90\x80" => "\xF0\x90\x90\xA8",
"\xF0\x90\x90\x81" => "\xF0\x90\x90\xA9",
"\xF0\x90\x90\x82" => "\xF0\x90\x90\xAA",
"\xF0\x90\x90\x83" => "\xF0\x90\x90\xAB",
"\xF0\x90\x90\x84" => "\xF0\x90\x90\xAC",
"\xF0\x90\x90\x85" => "\xF0\x90\x90\xAD",
"\xF0\x90\x90\x86" => "\xF0\x90\x90\xAE",
"\xF0\x90\x90\x87" => "\xF0\x90\x90\xAF",
"\xF0\x90\x90\x88" => "\xF0\x90\x90\xB0",
"\xF0\x90\x90\x89" => "\xF0\x90\x90\xB1",
"\xF0\x90\x90\x8A" => "\xF0\x90\x90\xB2",
"\xF0\x90\x90\x8B" => "\xF0\x90\x90\xB3",
"\xF0\x90\x90\x8C" => "\xF0\x90\x90\xB4",
"\xF0\x90\x90\x8D" => "\xF0\x90\x90\xB5",
"\xF0\x90\x90\x8E" => "\xF0\x90\x90\xB6",
"\xF0\x90\x90\x8F" => "\xF0\x90\x90\xB7",
"\xF0\x90\x90\x90" => "\xF0\x90\x90\xB8",
"\xF0\x90\x90\x91" => "\xF0\x90\x90\xB9",
"\xF0\x90\x90\x92" => "\xF0\x90\x90\xBA",
"\xF0\x90\x90\x93" => "\xF0\x90\x90\xBB",
"\xF0\x90\x90\x94" => "\xF0\x90\x90\xBC",
"\xF0\x90\x90\x95" => "\xF0\x90\x90\xBD",
"\xF0\x90\x90\x96" => "\xF0\x90\x90\xBE",
"\xF0\x90\x90\x97" => "\xF0\x90\x90\xBF",
"\xF0\x90\x90\x98" => "\xF0\x90\x91\x80",
"\xF0\x90\x90\x99" => "\xF0\x90\x91\x81",
"\xF0\x90\x90\x9A" => "\xF0\x90\x91\x82",
"\xF0\x90\x90\x9B" => "\xF0\x90\x91\x83",
"\xF0\x90\x90\x9C" => "\xF0\x90\x91\x84",
"\xF0\x90\x90\x9D" => "\xF0\x90\x91\x85",
"\xF0\x90\x90\x9E" => "\xF0\x90\x91\x86",
"\xF0\x90\x90\x9F" => "\xF0\x90\x91\x87",
"\xF0\x90\x90\xA0" => "\xF0\x90\x91\x88",
"\xF0\x90\x90\xA1" => "\xF0\x90\x91\x89",
"\xF0\x90\x90\xA2" => "\xF0\x90\x91\x8A",
"\xF0\x90\x90\xA3" => "\xF0\x90\x91\x8B",
"\xF0\x90\x90\xA4" => "\xF0\x90\x91\x8C",
"\xF0\x90\x90\xA5" => "\xF0\x90\x91\x8D",
"\xF0\x90\x90\xA6" => "\xF0\x90\x91\x8E",
"\xF0\x90\x90\xA7" => "\xF0\x90\x91\x8F",
"\xF0\x90\x92\xB0" => "\xF0\x90\x93\x98",
"\xF0\x90\x92\xB1" => "\xF0\x90\x93\x99",
"\xF0\x90\x92\xB2" => "\xF0\x90\x93\x9A",
"\xF0\x90\x92\xB3" => "\xF0\x90\x93\x9B",
"\xF0\x90\x92\xB4" => "\xF0\x90\x93\x9C",
"\xF0\x90\x92\xB5" => "\xF0\x90\x93\x9D",
"\xF0\x90\x92\xB6" => "\xF0\x90\x93\x9E",
"\xF0\x90\x92\xB7" => "\xF0\x90\x93\x9F",
"\xF0\x90\x92\xB8" => "\xF0\x90\x93\xA0",
"\xF0\x90\x92\xB9" => "\xF0\x90\x93\xA1",
"\xF0\x90\x92\xBA" => "\xF0\x90\x93\xA2",
"\xF0\x90\x92\xBB" => "\xF0\x90\x93\xA3",
"\xF0\x90\x92\xBC" => "\xF0\x90\x93\xA4",
"\xF0\x90\x92\xBD" => "\xF0\x90\x93\xA5",
"\xF0\x90\x92\xBE" => "\xF0\x90\x93\xA6",
"\xF0\x90\x92\xBF" => "\xF0\x90\x93\xA7",
"\xF0\x90\x93\x80" => "\xF0\x90\x93\xA8",
"\xF0\x90\x93\x81" => "\xF0\x90\x93\xA9",
"\xF0\x90\x93\x82" => "\xF0\x90\x93\xAA",
"\xF0\x90\x93\x83" => "\xF0\x90\x93\xAB",
"\xF0\x90\x93\x84" => "\xF0\x90\x93\xAC",
"\xF0\x90\x93\x85" => "\xF0\x90\x93\xAD",
"\xF0\x90\x93\x86" => "\xF0\x90\x93\xAE",
"\xF0\x90\x93\x87" => "\xF0\x90\x93\xAF",
"\xF0\x90\x93\x88" => "\xF0\x90\x93\xB0",
"\xF0\x90\x93\x89" => "\xF0\x90\x93\xB1",
"\xF0\x90\x93\x8A" => "\xF0\x90\x93\xB2",
"\xF0\x90\x93\x8B" => "\xF0\x90\x93\xB3",
"\xF0\x90\x93\x8C" => "\xF0\x90\x93\xB4",
"\xF0\x90\x93\x8D" => "\xF0\x90\x93\xB5",
"\xF0\x90\x93\x8E" => "\xF0\x90\x93\xB6",
"\xF0\x90\x93\x8F" => "\xF0\x90\x93\xB7",
"\xF0\x90\x93\x90" => "\xF0\x90\x93\xB8",
"\xF0\x90\x93\x91" => "\xF0\x90\x93\xB9",
"\xF0\x90\x93\x92" => "\xF0\x90\x93\xBA",
"\xF0\x90\x93\x93" => "\xF0\x90\x93\xBB",
"\xF0\x90\x95\xB0" => "\xF0\x90\x96\x97",
"\xF0\x90\x95\xB1" => "\xF0\x90\x96\x98",
"\xF0\x90\x95\xB2" => "\xF0\x90\x96\x99",
"\xF0\x90\x95\xB3" => "\xF0\x90\x96\x9A",
"\xF0\x90\x95\xB4" => "\xF0\x90\x96\x9B",
"\xF0\x90\x95\xB5" => "\xF0\x90\x96\x9C",
"\xF0\x90\x95\xB6" => "\xF0\x90\x96\x9D",
"\xF0\x90\x95\xB7" => "\xF0\x90\x96\x9E",
"\xF0\x90\x95\xB8" => "\xF0\x90\x96\x9F",
"\xF0\x90\x95\xB9" => "\xF0\x90\x96\xA0",
"\xF0\x90\x95\xBA" => "\xF0\x90\x96\xA1",
"\xF0\x90\x95\xBC" => "\xF0\x90\x96\xA3",
"\xF0\x90\x95\xBD" => "\xF0\x90\x96\xA4",
"\xF0\x90\x95\xBE" => "\xF0\x90\x96\xA5",
"\xF0\x90\x95\xBF" => "\xF0\x90\x96\xA6",
"\xF0\x90\x96\x80" => "\xF0\x90\x96\xA7",
"\xF0\x90\x96\x81" => "\xF0\x90\x96\xA8",
"\xF0\x90\x96\x82" => "\xF0\x90\x96\xA9",
"\xF0\x90\x96\x83" => "\xF0\x90\x96\xAA",
"\xF0\x90\x96\x84" => "\xF0\x90\x96\xAB",
"\xF0\x90\x96\x85" => "\xF0\x90\x96\xAC",
"\xF0\x90\x96\x86" => "\xF0\x90\x96\xAD",
"\xF0\x90\x96\x87" => "\xF0\x90\x96\xAE",
"\xF0\x90\x96\x88" => "\xF0\x90\x96\xAF",
"\xF0\x90\x96\x89" => "\xF0\x90\x96\xB0",
"\xF0\x90\x96\x8A" => "\xF0\x90\x96\xB1",
"\xF0\x90\x96\x8C" => "\xF0\x90\x96\xB3",
"\xF0\x90\x96\x8D" => "\xF0\x90\x96\xB4",
"\xF0\x90\x96\x8E" => "\xF0\x90\x96\xB5",
"\xF0\x90\x96\x8F" => "\xF0\x90\x96\xB6",
"\xF0\x90\x96\x90" => "\xF0\x90\x96\xB7",
"\xF0\x90\x96\x91" => "\xF0\x90\x96\xB8",
"\xF0\x90\x96\x92" => "\xF0\x90\x96\xB9",
"\xF0\x90\x96\x94" => "\xF0\x90\x96\xBB",
"\xF0\x90\x96\x95" => "\xF0\x90\x96\xBC",
"\xF0\x90\xB2\x80" => "\xF0\x90\xB3\x80",
"\xF0\x90\xB2\x81" => "\xF0\x90\xB3\x81",
"\xF0\x90\xB2\x82" => "\xF0\x90\xB3\x82",
"\xF0\x90\xB2\x83" => "\xF0\x90\xB3\x83",
"\xF0\x90\xB2\x84" => "\xF0\x90\xB3\x84",
"\xF0\x90\xB2\x85" => "\xF0\x90\xB3\x85",
"\xF0\x90\xB2\x86" => "\xF0\x90\xB3\x86",
"\xF0\x90\xB2\x87" => "\xF0\x90\xB3\x87",
"\xF0\x90\xB2\x88" => "\xF0\x90\xB3\x88",
"\xF0\x90\xB2\x89" => "\xF0\x90\xB3\x89",
"\xF0\x90\xB2\x8A" => "\xF0\x90\xB3\x8A",
"\xF0\x90\xB2\x8B" => "\xF0\x90\xB3\x8B",
"\xF0\x90\xB2\x8C" => "\xF0\x90\xB3\x8C",
"\xF0\x90\xB2\x8D" => "\xF0\x90\xB3\x8D",
"\xF0\x90\xB2\x8E" => "\xF0\x90\xB3\x8E",
"\xF0\x90\xB2\x8F" => "\xF0\x90\xB3\x8F",
"\xF0\x90\xB2\x90" => "\xF0\x90\xB3\x90",
"\xF0\x90\xB2\x91" => "\xF0\x90\xB3\x91",
"\xF0\x90\xB2\x92" => "\xF0\x90\xB3\x92",
"\xF0\x90\xB2\x93" => "\xF0\x90\xB3\x93",
"\xF0\x90\xB2\x94" => "\xF0\x90\xB3\x94",
"\xF0\x90\xB2\x95" => "\xF0\x90\xB3\x95",
"\xF0\x90\xB2\x96" => "\xF0\x90\xB3\x96",
"\xF0\x90\xB2\x97" => "\xF0\x90\xB3\x97",
"\xF0\x90\xB2\x98" => "\xF0\x90\xB3\x98",
"\xF0\x90\xB2\x99" => "\xF0\x90\xB3\x99",
"\xF0\x90\xB2\x9A" => "\xF0\x90\xB3\x9A",
"\xF0\x90\xB2\x9B" => "\xF0\x90\xB3\x9B",
"\xF0\x90\xB2\x9C" => "\xF0\x90\xB3\x9C",
"\xF0\x90\xB2\x9D" => "\xF0\x90\xB3\x9D",
"\xF0\x90\xB2\x9E" => "\xF0\x90\xB3\x9E",
"\xF0\x90\xB2\x9F" => "\xF0\x90\xB3\x9F",
"\xF0\x90\xB2\xA0" => "\xF0\x90\xB3\xA0",
"\xF0\x90\xB2\xA1" => "\xF0\x90\xB3\xA1",
"\xF0\x90\xB2\xA2" => "\xF0\x90\xB3\xA2",
"\xF0\x90\xB2\xA3" => "\xF0\x90\xB3\xA3",
"\xF0\x90\xB2\xA4" => "\xF0\x90\xB3\xA4",
"\xF0\x90\xB2\xA5" => "\xF0\x90\xB3\xA5",
"\xF0\x90\xB2\xA6" => "\xF0\x90\xB3\xA6",
"\xF0\x90\xB2\xA7" => "\xF0\x90\xB3\xA7",
"\xF0\x90\xB2\xA8" => "\xF0\x90\xB3\xA8",
"\xF0\x90\xB2\xA9" => "\xF0\x90\xB3\xA9",
"\xF0\x90\xB2\xAA" => "\xF0\x90\xB3\xAA",
"\xF0\x90\xB2\xAB" => "\xF0\x90\xB3\xAB",
"\xF0\x90\xB2\xAC" => "\xF0\x90\xB3\xAC",
"\xF0\x90\xB2\xAD" => "\xF0\x90\xB3\xAD",
"\xF0\x90\xB2\xAE" => "\xF0\x90\xB3\xAE",
"\xF0\x90\xB2\xAF" => "\xF0\x90\xB3\xAF",
"\xF0\x90\xB2\xB0" => "\xF0\x90\xB3\xB0",
"\xF0\x90\xB2\xB1" => "\xF0\x90\xB3\xB1",
"\xF0\x90\xB2\xB2" => "\xF0\x90\xB3\xB2",
"\xF0\x91\xA2\xA0" => "\xF0\x91\xA3\x80",
"\xF0\x91\xA2\xA1" => "\xF0\x91\xA3\x81",
"\xF0\x91\xA2\xA2" => "\xF0\x91\xA3\x82",
"\xF0\x91\xA2\xA3" => "\xF0\x91\xA3\x83",
"\xF0\x91\xA2\xA4" => "\xF0\x91\xA3\x84",
"\xF0\x91\xA2\xA5" => "\xF0\x91\xA3\x85",
"\xF0\x91\xA2\xA6" => "\xF0\x91\xA3\x86",
"\xF0\x91\xA2\xA7" => "\xF0\x91\xA3\x87",
"\xF0\x91\xA2\xA8" => "\xF0\x91\xA3\x88",
"\xF0\x91\xA2\xA9" => "\xF0\x91\xA3\x89",
"\xF0\x91\xA2\xAA" => "\xF0\x91\xA3\x8A",
"\xF0\x91\xA2\xAB" => "\xF0\x91\xA3\x8B",
"\xF0\x91\xA2\xAC" => "\xF0\x91\xA3\x8C",
"\xF0\x91\xA2\xAD" => "\xF0\x91\xA3\x8D",
"\xF0\x91\xA2\xAE" => "\xF0\x91\xA3\x8E",
"\xF0\x91\xA2\xAF" => "\xF0\x91\xA3\x8F",
"\xF0\x91\xA2\xB0" => "\xF0\x91\xA3\x90",
"\xF0\x91\xA2\xB1" => "\xF0\x91\xA3\x91",
"\xF0\x91\xA2\xB2" => "\xF0\x91\xA3\x92",
"\xF0\x91\xA2\xB3" => "\xF0\x91\xA3\x93",
"\xF0\x91\xA2\xB4" => "\xF0\x91\xA3\x94",
"\xF0\x91\xA2\xB5" => "\xF0\x91\xA3\x95",
"\xF0\x91\xA2\xB6" => "\xF0\x91\xA3\x96",
"\xF0\x91\xA2\xB7" => "\xF0\x91\xA3\x97",
"\xF0\x91\xA2\xB8" => "\xF0\x91\xA3\x98",
"\xF0\x91\xA2\xB9" => "\xF0\x91\xA3\x99",
"\xF0\x91\xA2\xBA" => "\xF0\x91\xA3\x9A",
"\xF0\x91\xA2\xBB" => "\xF0\x91\xA3\x9B",
"\xF0\x91\xA2\xBC" => "\xF0\x91\xA3\x9C",
"\xF0\x91\xA2\xBD" => "\xF0\x91\xA3\x9D",
"\xF0\x91\xA2\xBE" => "\xF0\x91\xA3\x9E",
"\xF0\x91\xA2\xBF" => "\xF0\x91\xA3\x9F",
"\xF0\x96\xB9\x80" => "\xF0\x96\xB9\xA0",
"\xF0\x96\xB9\x81" => "\xF0\x96\xB9\xA1",
"\xF0\x96\xB9\x82" => "\xF0\x96\xB9\xA2",
"\xF0\x96\xB9\x83" => "\xF0\x96\xB9\xA3",
"\xF0\x96\xB9\x84" => "\xF0\x96\xB9\xA4",
"\xF0\x96\xB9\x85" => "\xF0\x96\xB9\xA5",
"\xF0\x96\xB9\x86" => "\xF0\x96\xB9\xA6",
"\xF0\x96\xB9\x87" => "\xF0\x96\xB9\xA7",
"\xF0\x96\xB9\x88" => "\xF0\x96\xB9\xA8",
"\xF0\x96\xB9\x89" => "\xF0\x96\xB9\xA9",
"\xF0\x96\xB9\x8A" => "\xF0\x96\xB9\xAA",
"\xF0\x96\xB9\x8B" => "\xF0\x96\xB9\xAB",
"\xF0\x96\xB9\x8C" => "\xF0\x96\xB9\xAC",
"\xF0\x96\xB9\x8D" => "\xF0\x96\xB9\xAD",
"\xF0\x96\xB9\x8E" => "\xF0\x96\xB9\xAE",
"\xF0\x96\xB9\x8F" => "\xF0\x96\xB9\xAF",
"\xF0\x96\xB9\x90" => "\xF0\x96\xB9\xB0",
"\xF0\x96\xB9\x91" => "\xF0\x96\xB9\xB1",
"\xF0\x96\xB9\x92" => "\xF0\x96\xB9\xB2",
"\xF0\x96\xB9\x93" => "\xF0\x96\xB9\xB3",
"\xF0\x96\xB9\x94" => "\xF0\x96\xB9\xB4",
"\xF0\x96\xB9\x95" => "\xF0\x96\xB9\xB5",
"\xF0\x96\xB9\x96" => "\xF0\x96\xB9\xB6",
"\xF0\x96\xB9\x97" => "\xF0\x96\xB9\xB7",
"\xF0\x96\xB9\x98" => "\xF0\x96\xB9\xB8",
"\xF0\x96\xB9\x99" => "\xF0\x96\xB9\xB9",
"\xF0\x96\xB9\x9A" => "\xF0\x96\xB9\xBA",
"\xF0\x96\xB9\x9B" => "\xF0\x96\xB9\xBB",
"\xF0\x96\xB9\x9C" => "\xF0\x96\xB9\xBC",
"\xF0\x96\xB9\x9D" => "\xF0\x96\xB9\xBD",
"\xF0\x96\xB9\x9E" => "\xF0\x96\xB9\xBE",
"\xF0\x96\xB9\x9F" => "\xF0\x96\xB9\xBF",
"\xF0\x9E\xA4\x80" => "\xF0\x9E\xA4\xA2",
"\xF0\x9E\xA4\x81" => "\xF0\x9E\xA4\xA3",
"\xF0\x9E\xA4\x82" => "\xF0\x9E\xA4\xA4",
"\xF0\x9E\xA4\x83" => "\xF0\x9E\xA4\xA5",
"\xF0\x9E\xA4\x84" => "\xF0\x9E\xA4\xA6",
"\xF0\x9E\xA4\x85" => "\xF0\x9E\xA4\xA7",
"\xF0\x9E\xA4\x86" => "\xF0\x9E\xA4\xA8",
"\xF0\x9E\xA4\x87" => "\xF0\x9E\xA4\xA9",
"\xF0\x9E\xA4\x88" => "\xF0\x9E\xA4\xAA",
"\xF0\x9E\xA4\x89" => "\xF0\x9E\xA4\xAB",
"\xF0\x9E\xA4\x8A" => "\xF0\x9E\xA4\xAC",
"\xF0\x9E\xA4\x8B" => "\xF0\x9E\xA4\xAD",
"\xF0\x9E\xA4\x8C" => "\xF0\x9E\xA4\xAE",
"\xF0\x9E\xA4\x8D" => "\xF0\x9E\xA4\xAF",
"\xF0\x9E\xA4\x8E" => "\xF0\x9E\xA4\xB0",
"\xF0\x9E\xA4\x8F" => "\xF0\x9E\xA4\xB1",
"\xF0\x9E\xA4\x90" => "\xF0\x9E\xA4\xB2",
"\xF0\x9E\xA4\x91" => "\xF0\x9E\xA4\xB3",
"\xF0\x9E\xA4\x92" => "\xF0\x9E\xA4\xB4",
"\xF0\x9E\xA4\x93" => "\xF0\x9E\xA4\xB5",
"\xF0\x9E\xA4\x94" => "\xF0\x9E\xA4\xB6",
"\xF0\x9E\xA4\x95" => "\xF0\x9E\xA4\xB7",
"\xF0\x9E\xA4\x96" => "\xF0\x9E\xA4\xB8",
"\xF0\x9E\xA4\x97" => "\xF0\x9E\xA4\xB9",
"\xF0\x9E\xA4\x98" => "\xF0\x9E\xA4\xBA",
"\xF0\x9E\xA4\x99" => "\xF0\x9E\xA4\xBB",
"\xF0\x9E\xA4\x9A" => "\xF0\x9E\xA4\xBC",
"\xF0\x9E\xA4\x9B" => "\xF0\x9E\xA4\xBD",
"\xF0\x9E\xA4\x9C" => "\xF0\x9E\xA4\xBE",
"\xF0\x9E\xA4\x9D" => "\xF0\x9E\xA4\xBF",
"\xF0\x9E\xA4\x9E" => "\xF0\x9E\xA5\x80",
"\xF0\x9E\xA4\x9F" => "\xF0\x9E\xA5\x81",
"\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82",
"\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83",
);
}

/**
* Helper function for utf8_casefold.
*
* Developers: Do not update the data in this function manually. Instead,
* run "php -f other/update_unicode_data.php" on the command line.
*
* @return array Casefolding maps.
*/
function utf8_casefold_maps()

./Sources/Unicode/CaseLower.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
function utf8_strtolower_maps()
Replace With: Select
function utf8_strtolower_simple_maps()
Find: Select
"\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82",
"\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83",
);
}

Replace With: Select
"\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82",
"\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83",
);
}

/**
* Helper function for utf8_strtolower.
*
* Developers: Do not update the data in this function manually. Instead,
* run "php -f other/update_unicode_data.php" on the command line.
*
* @return array Uppercase to lowercase maps.
*/
function utf8_strtolower_maps()
{
return array(
"\x41" => "\x61",
"\x42" => "\x62",
"\x43" => "\x63",
"\x44" => "\x64",
"\x45" => "\x65",
"\x46" => "\x66",
"\x47" => "\x67",
"\x48" => "\x68",
"\x49" => "\x69",
"\x4A" => "\x6A",
"\x4B" => "\x6B",
"\x4C" => "\x6C",
"\x4D" => "\x6D",
"\x4E" => "\x6E",
"\x4F" => "\x6F",
"\x50" => "\x70",
"\x51" => "\x71",
"\x52" => "\x72",
"\x53" => "\x73",
"\x54" => "\x74",
"\x55" => "\x75",
"\x56" => "\x76",
"\x57" => "\x77",
"\x58" => "\x78",
"\x59" => "\x79",
"\x5A" => "\x7A",
"\xC3\x80" => "\xC3\xA0",
"\xC3\x81" => "\xC3\xA1",
"\xC3\x82" => "\xC3\xA2",
"\xC3\x83" => "\xC3\xA3",
"\xC3\x84" => "\xC3\xA4",
"\xC3\x85" => "\xC3\xA5",
"\xC3\x86" => "\xC3\xA6",
"\xC3\x87" => "\xC3\xA7",
"\xC3\x88" => "\xC3\xA8",
"\xC3\x89" => "\xC3\xA9",
"\xC3\x8A" => "\xC3\xAA",
"\xC3\x8B" => "\xC3\xAB",
"\xC3\x8C" => "\xC3\xAC",
"\xC3\x8D" => "\xC3\xAD",
"\xC3\x8E" => "\xC3\xAE",
"\xC3\x8F" => "\xC3\xAF",
"\xC3\x90" => "\xC3\xB0",
"\xC3\x91" => "\xC3\xB1",
"\xC3\x92" => "\xC3\xB2",
"\xC3\x93" => "\xC3\xB3",
"\xC3\x94" => "\xC3\xB4",
"\xC3\x95" => "\xC3\xB5",
"\xC3\x96" => "\xC3\xB6",
"\xC3\x98" => "\xC3\xB8",
"\xC3\x99" => "\xC3\xB9",
"\xC3\x9A" => "\xC3\xBA",
"\xC3\x9B" => "\xC3\xBB",
"\xC3\x9C" => "\xC3\xBC",
"\xC3\x9D" => "\xC3\xBD",
"\xC3\x9E" => "\xC3\xBE",
"\xC3\x9F" => "\xC3\x9F",
"\xC4\x80" => "\xC4\x81",
"\xC4\x82" => "\xC4\x83",
"\xC4\x84" => "\xC4\x85",
"\xC4\x86" => "\xC4\x87",
"\xC4\x88" => "\xC4\x89",
"\xC4\x8A" => "\xC4\x8B",
"\xC4\x8C" => "\xC4\x8D",
"\xC4\x8E" => "\xC4\x8F",
"\xC4\x90" => "\xC4\x91",
"\xC4\x92" => "\xC4\x93",
"\xC4\x94" => "\xC4\x95",
"\xC4\x96" => "\xC4\x97",
"\xC4\x98" => "\xC4\x99",
"\xC4\x9A" => "\xC4\x9B",
"\xC4\x9C" => "\xC4\x9D",
"\xC4\x9E" => "\xC4\x9F",
"\xC4\xA0" => "\xC4\xA1",
"\xC4\xA2" => "\xC4\xA3",
"\xC4\xA4" => "\xC4\xA5",
"\xC4\xA6" => "\xC4\xA7",
"\xC4\xA8" => "\xC4\xA9",
"\xC4\xAA" => "\xC4\xAB",
"\xC4\xAC" => "\xC4\xAD",
"\xC4\xAE" => "\xC4\xAF",
"\xC4\xB0" => "\x69\xCC\x87",
"\xC4\xB2" => "\xC4\xB3",
"\xC4\xB4" => "\xC4\xB5",
"\xC4\xB6" => "\xC4\xB7",
"\xC4\xB9" => "\xC4\xBA",
"\xC4\xBB" => "\xC4\xBC",
"\xC4\xBD" => "\xC4\xBE",
"\xC4\xBF" => "\xC5\x80",
"\xC5\x81" => "\xC5\x82",
"\xC5\x83" => "\xC5\x84",
"\xC5\x85" => "\xC5\x86",
"\xC5\x87" => "\xC5\x88",
"\xC5\x89" => "\xC5\x89",
"\xC5\x8A" => "\xC5\x8B",
"\xC5\x8C" => "\xC5\x8D",
"\xC5\x8E" => "\xC5\x8F",
"\xC5\x90" => "\xC5\x91",
"\xC5\x92" => "\xC5\x93",
"\xC5\x94" => "\xC5\x95",
"\xC5\x96" => "\xC5\x97",
"\xC5\x98" => "\xC5\x99",
"\xC5\x9A" => "\xC5\x9B",
"\xC5\x9C" => "\xC5\x9D",
"\xC5\x9E" => "\xC5\x9F",
"\xC5\xA0" => "\xC5\xA1",
"\xC5\xA2" => "\xC5\xA3",
"\xC5\xA4" => "\xC5\xA5",
"\xC5\xA6" => "\xC5\xA7",
"\xC5\xA8" => "\xC5\xA9",
"\xC5\xAA" => "\xC5\xAB",
"\xC5\xAC" => "\xC5\xAD",
"\xC5\xAE" => "\xC5\xAF",
"\xC5\xB0" => "\xC5\xB1",
"\xC5\xB2" => "\xC5\xB3",
"\xC5\xB4" => "\xC5\xB5",
"\xC5\xB6" => "\xC5\xB7",
"\xC5\xB8" => "\xC3\xBF",
"\xC5\xB9" => "\xC5\xBA",
"\xC5\xBB" => "\xC5\xBC",
"\xC5\xBD" => "\xC5\xBE",
"\xC6\x81" => "\xC9\x93",
"\xC6\x82" => "\xC6\x83",
"\xC6\x84" => "\xC6\x85",
"\xC6\x86" => "\xC9\x94",
"\xC6\x87" => "\xC6\x88",
"\xC6\x89" => "\xC9\x96",
"\xC6\x8A" => "\xC9\x97",
"\xC6\x8B" => "\xC6\x8C",
"\xC6\x8E" => "\xC7\x9D",
"\xC6\x8F" => "\xC9\x99",
"\xC6\x90" => "\xC9\x9B",
"\xC6\x91" => "\xC6\x92",
"\xC6\x93" => "\xC9\xA0",
"\xC6\x94" => "\xC9\xA3",
"\xC6\x96" => "\xC9\xA9",
"\xC6\x97" => "\xC9\xA8",
"\xC6\x98" => "\xC6\x99",
"\xC6\x9C" => "\xC9\xAF",
"\xC6\x9D" => "\xC9\xB2",
"\xC6\x9F" => "\xC9\xB5",
"\xC6\xA0" => "\xC6\xA1",
"\xC6\xA2" => "\xC6\xA3",
"\xC6\xA4" => "\xC6\xA5",
"\xC6\xA6" => "\xCA\x80",
"\xC6\xA7" => "\xC6\xA8",
"\xC6\xA9" => "\xCA\x83",
"\xC6\xAC" => "\xC6\xAD",
"\xC6\xAE" => "\xCA\x88",
"\xC6\xAF" => "\xC6\xB0",
"\xC6\xB1" => "\xCA\x8A",
"\xC6\xB2" => "\xCA\x8B",
"\xC6\xB3" => "\xC6\xB4",
"\xC6\xB5" => "\xC6\xB6",
"\xC6\xB7" => "\xCA\x92",
"\xC6\xB8" => "\xC6\xB9",
"\xC6\xBC" => "\xC6\xBD",
"\xC7\x84" => "\xC7\x86",
"\xC7\x85" => "\xC7\x86",
"\xC7\x87" => "\xC7\x89",
"\xC7\x88" => "\xC7\x89",
"\xC7\x8A" => "\xC7\x8C",
"\xC7\x8B" => "\xC7\x8C",
"\xC7\x8D" => "\xC7\x8E",
"\xC7\x8F" => "\xC7\x90",
"\xC7\x91" => "\xC7\x92",
"\xC7\x93" => "\xC7\x94",
"\xC7\x95" => "\xC7\x96",
"\xC7\x97" => "\xC7\x98",
"\xC7\x99" => "\xC7\x9A",
"\xC7\x9B" => "\xC7\x9C",
"\xC7\x9E" => "\xC7\x9F",
"\xC7\xA0" => "\xC7\xA1",
"\xC7\xA2" => "\xC7\xA3",
"\xC7\xA4" => "\xC7\xA5",
"\xC7\xA6" => "\xC7\xA7",
"\xC7\xA8" => "\xC7\xA9",
"\xC7\xAA" => "\xC7\xAB",
"\xC7\xAC" => "\xC7\xAD",
"\xC7\xAE" => "\xC7\xAF",
"\xC7\xB0" => "\xC7\xB0",
"\xC7\xB1" => "\xC7\xB3",
"\xC7\xB2" => "\xC7\xB3",
"\xC7\xB4" => "\xC7\xB5",
"\xC7\xB6" => "\xC6\x95",
"\xC7\xB7" => "\xC6\xBF",
"\xC7\xB8" => "\xC7\xB9",
"\xC7\xBA" => "\xC7\xBB",
"\xC7\xBC" => "\xC7\xBD",
"\xC7\xBE" => "\xC7\xBF",
"\xC8\x80" => "\xC8\x81",
"\xC8\x82" => "\xC8\x83",
"\xC8\x84" => "\xC8\x85",
"\xC8\x86" => "\xC8\x87",
"\xC8\x88" => "\xC8\x89",
"\xC8\x8A" => "\xC8\x8B",
"\xC8\x8C" => "\xC8\x8D",
"\xC8\x8E" => "\xC8\x8F",
"\xC8\x90" => "\xC8\x91",
"\xC8\x92" => "\xC8\x93",
"\xC8\x94" => "\xC8\x95",
"\xC8\x96" => "\xC8\x97",
"\xC8\x98" => "\xC8\x99",
"\xC8\x9A" => "\xC8\x9B",
"\xC8\x9C" => "\xC8\x9D",
"\xC8\x9E" => "\xC8\x9F",
"\xC8\xA0" => "\xC6\x9E",
"\xC8\xA2" => "\xC8\xA3",
"\xC8\xA4" => "\xC8\xA5",
"\xC8\xA6" => "\xC8\xA7",
"\xC8\xA8" => "\xC8\xA9",
"\xC8\xAA" => "\xC8\xAB",
"\xC8\xAC" => "\xC8\xAD",
"\xC8\xAE" => "\xC8\xAF",
"\xC8\xB0" => "\xC8\xB1",
"\xC8\xB2" => "\xC8\xB3",
"\xC8\xBA" => "\xE2\xB1\xA5",
"\xC8\xBB" => "\xC8\xBC",
"\xC8\xBD" => "\xC6\x9A",
"\xC8\xBE" => "\xE2\xB1\xA6",
"\xC9\x81" => "\xC9\x82",
"\xC9\x83" => "\xC6\x80",
"\xC9\x84" => "\xCA\x89",
"\xC9\x85" => "\xCA\x8C",
"\xC9\x86" => "\xC9\x87",
"\xC9\x88" => "\xC9\x89",
"\xC9\x8A" => "\xC9\x8B",
"\xC9\x8C" => "\xC9\x8D",
"\xC9\x8E" => "\xC9\x8F",
"\xCD\xB0" => "\xCD\xB1",
"\xCD\xB2" => "\xCD\xB3",
"\xCD\xB6" => "\xCD\xB7",
"\xCD\xBF" => "\xCF\xB3",
"\xCE\x86" => "\xCE\xAC",
"\xCE\x88" => "\xCE\xAD",
"\xCE\x89" => "\xCE\xAE",
"\xCE\x8A" => "\xCE\xAF",
"\xCE\x8C" => "\xCF\x8C",
"\xCE\x8E" => "\xCF\x8D",
"\xCE\x8F" => "\xCF\x8E",
"\xCE\x90" => "\xCE\x90",
"\xCE\x91" => "\xCE\xB1",
"\xCE\x92" => "\xCE\xB2",
"\xCE\x93" => "\xCE\xB3",
"\xCE\x94" => "\xCE\xB4",
"\xCE\x95" => "\xCE\xB5",
"\xCE\x96" => "\xCE\xB6",
"\xCE\x97" => "\xCE\xB7",
"\xCE\x98" => "\xCE\xB8",
"\xCE\x99" => "\xCE\xB9",
"\xCE\x9A" => "\xCE\xBA",
"\xCE\x9B" => "\xCE\xBB",
"\xCE\x9C" => "\xCE\xBC",
"\xCE\x9D" => "\xCE\xBD",
"\xCE\x9E" => "\xCE\xBE",
"\xCE\x9F" => "\xCE\xBF",
"\xCE\xA0" => "\xCF\x80",
"\xCE\xA1" => "\xCF\x81",
"\xCE\xA3" => "\xCF\x83",
"\xCE\xA4" => "\xCF\x84",
"\xCE\xA5" => "\xCF\x85",
"\xCE\xA6" => "\xCF\x86",
"\xCE\xA7" => "\xCF\x87",
"\xCE\xA8" => "\xCF\x88",
"\xCE\xA9" => "\xCF\x89",
"\xCE\xAA" => "\xCF\x8A",
"\xCE\xAB" => "\xCF\x8B",
"\xCE\xB0" => "\xCE\xB0",
"\xCF\x8F" => "\xCF\x97",
"\xCF\x98" => "\xCF\x99",
"\xCF\x9A" => "\xCF\x9B",
"\xCF\x9C" => "\xCF\x9D",
"\xCF\x9E" => "\xCF\x9F",
"\xCF\xA0" => "\xCF\xA1",
"\xCF\xA2" => "\xCF\xA3",
"\xCF\xA4" => "\xCF\xA5",
"\xCF\xA6" => "\xCF\xA7",
"\xCF\xA8" => "\xCF\xA9",
"\xCF\xAA" => "\xCF\xAB",
"\xCF\xAC" => "\xCF\xAD",
"\xCF\xAE" => "\xCF\xAF",
"\xCF\xB4" => "\xCE\xB8",
"\xCF\xB7" => "\xCF\xB8",
"\xCF\xB9" => "\xCF\xB2",
"\xCF\xBA" => "\xCF\xBB",
"\xCF\xBD" => "\xCD\xBB",
"\xCF\xBE" => "\xCD\xBC",
"\xCF\xBF" => "\xCD\xBD",
"\xD0\x80" => "\xD1\x90",
"\xD0\x81" => "\xD1\x91",
"\xD0\x82" => "\xD1\x92",
"\xD0\x83" => "\xD1\x93",
"\xD0\x84" => "\xD1\x94",
"\xD0\x85" => "\xD1\x95",
"\xD0\x86" => "\xD1\x96",
"\xD0\x87" => "\xD1\x97",
"\xD0\x88" => "\xD1\x98",
"\xD0\x89" => "\xD1\x99",
"\xD0\x8A" => "\xD1\x9A",
"\xD0\x8B" => "\xD1\x9B",
"\xD0\x8C" => "\xD1\x9C",
"\xD0\x8D" => "\xD1\x9D",
"\xD0\x8E" => "\xD1\x9E",
"\xD0\x8F" => "\xD1\x9F",
"\xD0\x90" => "\xD0\xB0",
"\xD0\x91" => "\xD0\xB1",
"\xD0\x92" => "\xD0\xB2",
"\xD0\x93" => "\xD0\xB3",
"\xD0\x94" => "\xD0\xB4",
"\xD0\x95" => "\xD0\xB5",
"\xD0\x96" => "\xD0\xB6",
"\xD0\x97" => "\xD0\xB7",
"\xD0\x98" => "\xD0\xB8",
"\xD0\x99" => "\xD0\xB9",
"\xD0\x9A" => "\xD0\xBA",
"\xD0\x9B" => "\xD0\xBB",
"\xD0\x9C" => "\xD0\xBC",
"\xD0\x9D" => "\xD0\xBD",
"\xD0\x9E" => "\xD0\xBE",
"\xD0\x9F" => "\xD0\xBF",
"\xD0\xA0" => "\xD1\x80",
"\xD0\xA1" => "\xD1\x81",
"\xD0\xA2" => "\xD1\x82",
"\xD0\xA3" => "\xD1\x83",
"\xD0\xA4" => "\xD1\x84",
"\xD0\xA5" => "\xD1\x85",
"\xD0\xA6" => "\xD1\x86",
"\xD0\xA7" => "\xD1\x87",
"\xD0\xA8" => "\xD1\x88",
"\xD0\xA9" => "\xD1\x89",
"\xD0\xAA" => "\xD1\x8A",
"\xD0\xAB" => "\xD1\x8B",
"\xD0\xAC" => "\xD1\x8C",
"\xD0\xAD" => "\xD1\x8D",
"\xD0\xAE" => "\xD1\x8E",
"\xD0\xAF" => "\xD1\x8F",
"\xD1\xA0" => "\xD1\xA1",
"\xD1\xA2" => "\xD1\xA3",
"\xD1\xA4" => "\xD1\xA5",
"\xD1\xA6" => "\xD1\xA7",
"\xD1\xA8" => "\xD1\xA9",
"\xD1\xAA" => "\xD1\xAB",
"\xD1\xAC" => "\xD1\xAD",
"\xD1\xAE" => "\xD1\xAF",
"\xD1\xB0" => "\xD1\xB1",
"\xD1\xB2" => "\xD1\xB3",
"\xD1\xB4" => "\xD1\xB5",
"\xD1\xB6" => "\xD1\xB7",
"\xD1\xB8" => "\xD1\xB9",
"\xD1\xBA" => "\xD1\xBB",
"\xD1\xBC" => "\xD1\xBD",
"\xD1\xBE" => "\xD1\xBF",
"\xD2\x80" => "\xD2\x81",
"\xD2\x8A" => "\xD2\x8B",
"\xD2\x8C" => "\xD2\x8D",
"\xD2\x8E" => "\xD2\x8F",
"\xD2\x90" => "\xD2\x91",
"\xD2\x92" => "\xD2\x93",
"\xD2\x94" => "\xD2\x95",
"\xD2\x96" => "\xD2\x97",
"\xD2\x98" => "\xD2\x99",
"\xD2\x9A" => "\xD2\x9B",
"\xD2\x9C" => "\xD2\x9D",
"\xD2\x9E" => "\xD2\x9F",
"\xD2\xA0" => "\xD2\xA1",
"\xD2\xA2" => "\xD2\xA3",
"\xD2\xA4" => "\xD2\xA5",
"\xD2\xA6" => "\xD2\xA7",
"\xD2\xA8" => "\xD2\xA9",
"\xD2\xAA" => "\xD2\xAB",
"\xD2\xAC" => "\xD2\xAD",
"\xD2\xAE" => "\xD2\xAF",
"\xD2\xB0" => "\xD2\xB1",
"\xD2\xB2" => "\xD2\xB3",
"\xD2\xB4" => "\xD2\xB5",
"\xD2\xB6" => "\xD2\xB7",
"\xD2\xB8" => "\xD2\xB9",
"\xD2\xBA" => "\xD2\xBB",
"\xD2\xBC" => "\xD2\xBD",
"\xD2\xBE" => "\xD2\xBF",
"\xD3\x80" => "\xD3\x8F",
"\xD3\x81" => "\xD3\x82",
"\xD3\x83" => "\xD3\x84",
"\xD3\x85" => "\xD3\x86",
"\xD3\x87" => "\xD3\x88",
"\xD3\x89" => "\xD3\x8A",
"\xD3\x8B" => "\xD3\x8C",
"\xD3\x8D" => "\xD3\x8E",
"\xD3\x90" => "\xD3\x91",
"\xD3\x92" => "\xD3\x93",
"\xD3\x94" => "\xD3\x95",
"\xD3\x96" => "\xD3\x97",
"\xD3\x98" => "\xD3\x99",
"\xD3\x9A" => "\xD3\x9B",
"\xD3\x9C" => "\xD3\x9D",
"\xD3\x9E" => "\xD3\x9F",
"\xD3\xA0" => "\xD3\xA1",
"\xD3\xA2" => "\xD3\xA3",
"\xD3\xA4" => "\xD3\xA5",
"\xD3\xA6" => "\xD3\xA7",
"\xD3\xA8" => "\xD3\xA9",
"\xD3\xAA" => "\xD3\xAB",
"\xD3\xAC" => "\xD3\xAD",
"\xD3\xAE" => "\xD3\xAF",
"\xD3\xB0" => "\xD3\xB1",
"\xD3\xB2" => "\xD3\xB3",
"\xD3\xB4" => "\xD3\xB5",
"\xD3\xB6" => "\xD3\xB7",
"\xD3\xB8" => "\xD3\xB9",
"\xD3\xBA" => "\xD3\xBB",
"\xD3\xBC" => "\xD3\xBD",
"\xD3\xBE" => "\xD3\xBF",
"\xD4\x80" => "\xD4\x81",
"\xD4\x82" => "\xD4\x83",
"\xD4\x84" => "\xD4\x85",
"\xD4\x86" => "\xD4\x87",
"\xD4\x88" => "\xD4\x89",
"\xD4\x8A" => "\xD4\x8B",
"\xD4\x8C" => "\xD4\x8D",
"\xD4\x8E" => "\xD4\x8F",
"\xD4\x90" => "\xD4\x91",
"\xD4\x92" => "\xD4\x93",
"\xD4\x94" => "\xD4\x95",
"\xD4\x96" => "\xD4\x97",
"\xD4\x98" => "\xD4\x99",
"\xD4\x9A" => "\xD4\x9B",
"\xD4\x9C" => "\xD4\x9D",
"\xD4\x9E" => "\xD4\x9F",
"\xD4\xA0" => "\xD4\xA1",
"\xD4\xA2" => "\xD4\xA3",
"\xD4\xA4" => "\xD4\xA5",
"\xD4\xA6" => "\xD4\xA7",
"\xD4\xA8" => "\xD4\xA9",
"\xD4\xAA" => "\xD4\xAB",
"\xD4\xAC" => "\xD4\xAD",
"\xD4\xAE" => "\xD4\xAF",
"\xD4\xB1" => "\xD5\xA1",
"\xD4\xB2" => "\xD5\xA2",
"\xD4\xB3" => "\xD5\xA3",
"\xD4\xB4" => "\xD5\xA4",
"\xD4\xB5" => "\xD5\xA5",
"\xD4\xB6" => "\xD5\xA6",
"\xD4\xB7" => "\xD5\xA7",
"\xD4\xB8" => "\xD5\xA8",
"\xD4\xB9" => "\xD5\xA9",
"\xD4\xBA" => "\xD5\xAA",
"\xD4\xBB" => "\xD5\xAB",
"\xD4\xBC" => "\xD5\xAC",
"\xD4\xBD" => "\xD5\xAD",
"\xD4\xBE" => "\xD5\xAE",
"\xD4\xBF" => "\xD5\xAF",
"\xD5\x80" => "\xD5\xB0",
"\xD5\x81" => "\xD5\xB1",
"\xD5\x82" => "\xD5\xB2",
"\xD5\x83" => "\xD5\xB3",
"\xD5\x84" => "\xD5\xB4",
"\xD5\x85" => "\xD5\xB5",
"\xD5\x86" => "\xD5\xB6",
"\xD5\x87" => "\xD5\xB7",
"\xD5\x88" => "\xD5\xB8",
"\xD5\x89" => "\xD5\xB9",
"\xD5\x8A" => "\xD5\xBA",
"\xD5\x8B" => "\xD5\xBB",
"\xD5\x8C" => "\xD5\xBC",
"\xD5\x8D" => "\xD5\xBD",
"\xD5\x8E" => "\xD5\xBE",
"\xD5\x8F" => "\xD5\xBF",
"\xD5\x90" => "\xD6\x80",
"\xD5\x91" => "\xD6\x81",
"\xD5\x92" => "\xD6\x82",
"\xD5\x93" => "\xD6\x83",
"\xD5\x94" => "\xD6\x84",
"\xD5\x95" => "\xD6\x85",
"\xD5\x96" => "\xD6\x86",
"\xD6\x87" => "\xD6\x87",
"\xF0\x90\x90\x80" => "\xF0\x90\x90\xA8",
"\xF0\x90\x90\x81" => "\xF0\x90\x90\xA9",
"\xF0\x90\x90\x82" => "\xF0\x90\x90\xAA",
"\xF0\x90\x90\x83" => "\xF0\x90\x90\xAB",
"\xF0\x90\x90\x84" => "\xF0\x90\x90\xAC",
"\xF0\x90\x90\x85" => "\xF0\x90\x90\xAD",
"\xF0\x90\x90\x86" => "\xF0\x90\x90\xAE",
"\xF0\x90\x90\x87" => "\xF0\x90\x90\xAF",
"\xF0\x90\x90\x88" => "\xF0\x90\x90\xB0",
"\xF0\x90\x90\x89" => "\xF0\x90\x90\xB1",
"\xF0\x90\x90\x8A" => "\xF0\x90\x90\xB2",
"\xF0\x90\x90\x8B" => "\xF0\x90\x90\xB3",
"\xF0\x90\x90\x8C" => "\xF0\x90\x90\xB4",
"\xF0\x90\x90\x8D" => "\xF0\x90\x90\xB5",
"\xF0\x90\x90\x8E" => "\xF0\x90\x90\xB6",
"\xF0\x90\x90\x8F" => "\xF0\x90\x90\xB7",
"\xF0\x90\x90\x90" => "\xF0\x90\x90\xB8",
"\xF0\x90\x90\x91" => "\xF0\x90\x90\xB9",
"\xF0\x90\x90\x92" => "\xF0\x90\x90\xBA",
"\xF0\x90\x90\x93" => "\xF0\x90\x90\xBB",
"\xF0\x90\x90\x94" => "\xF0\x90\x90\xBC",
"\xF0\x90\x90\x95" => "\xF0\x90\x90\xBD",
"\xF0\x90\x90\x96" => "\xF0\x90\x90\xBE",
"\xF0\x90\x90\x97" => "\xF0\x90\x90\xBF",
"\xF0\x90\x90\x98" => "\xF0\x90\x91\x80",
"\xF0\x90\x90\x99" => "\xF0\x90\x91\x81",
"\xF0\x90\x90\x9A" => "\xF0\x90\x91\x82",
"\xF0\x90\x90\x9B" => "\xF0\x90\x91\x83",
"\xF0\x90\x90\x9C" => "\xF0\x90\x91\x84",
"\xF0\x90\x90\x9D" => "\xF0\x90\x91\x85",
"\xF0\x90\x90\x9E" => "\xF0\x90\x91\x86",
"\xF0\x90\x90\x9F" => "\xF0\x90\x91\x87",
"\xF0\x90\x90\xA0" => "\xF0\x90\x91\x88",
"\xF0\x90\x90\xA1" => "\xF0\x90\x91\x89",
"\xF0\x90\x90\xA2" => "\xF0\x90\x91\x8A",
"\xF0\x90\x90\xA3" => "\xF0\x90\x91\x8B",
"\xF0\x90\x90\xA4" => "\xF0\x90\x91\x8C",
"\xF0\x90\x90\xA5" => "\xF0\x90\x91\x8D",
"\xF0\x90\x90\xA6" => "\xF0\x90\x91\x8E",
"\xF0\x90\x90\xA7" => "\xF0\x90\x91\x8F",
"\xF0\x90\x92\xB0" => "\xF0\x90\x93\x98",
"\xF0\x90\x92\xB1" => "\xF0\x90\x93\x99",
"\xF0\x90\x92\xB2" => "\xF0\x90\x93\x9A",
"\xF0\x90\x92\xB3" => "\xF0\x90\x93\x9B",
"\xF0\x90\x92\xB4" => "\xF0\x90\x93\x9C",
"\xF0\x90\x92\xB5" => "\xF0\x90\x93\x9D",
"\xF0\x90\x92\xB6" => "\xF0\x90\x93\x9E",
"\xF0\x90\x92\xB7" => "\xF0\x90\x93\x9F",
"\xF0\x90\x92\xB8" => "\xF0\x90\x93\xA0",
"\xF0\x90\x92\xB9" => "\xF0\x90\x93\xA1",
"\xF0\x90\x92\xBA" => "\xF0\x90\x93\xA2",
"\xF0\x90\x92\xBB" => "\xF0\x90\x93\xA3",
"\xF0\x90\x92\xBC" => "\xF0\x90\x93\xA4",
"\xF0\x90\x92\xBD" => "\xF0\x90\x93\xA5",
"\xF0\x90\x92\xBE" => "\xF0\x90\x93\xA6",
"\xF0\x90\x92\xBF" => "\xF0\x90\x93\xA7",
"\xF0\x90\x93\x80" => "\xF0\x90\x93\xA8",
"\xF0\x90\x93\x81" => "\xF0\x90\x93\xA9",
"\xF0\x90\x93\x82" => "\xF0\x90\x93\xAA",
"\xF0\x90\x93\x83" => "\xF0\x90\x93\xAB",
"\xF0\x90\x93\x84" => "\xF0\x90\x93\xAC",
"\xF0\x90\x93\x85" => "\xF0\x90\x93\xAD",
"\xF0\x90\x93\x86" => "\xF0\x90\x93\xAE",
"\xF0\x90\x93\x87" => "\xF0\x90\x93\xAF",
"\xF0\x90\x93\x88" => "\xF0\x90\x93\xB0",
"\xF0\x90\x93\x89" => "\xF0\x90\x93\xB1",
"\xF0\x90\x93\x8A" => "\xF0\x90\x93\xB2",
"\xF0\x90\x93\x8B" => "\xF0\x90\x93\xB3",
"\xF0\x90\x93\x8C" => "\xF0\x90\x93\xB4",
"\xF0\x90\x93\x8D" => "\xF0\x90\x93\xB5",
"\xF0\x90\x93\x8E" => "\xF0\x90\x93\xB6",
"\xF0\x90\x93\x8F" => "\xF0\x90\x93\xB7",
"\xF0\x90\x93\x90" => "\xF0\x90\x93\xB8",
"\xF0\x90\x93\x91" => "\xF0\x90\x93\xB9",
"\xF0\x90\x93\x92" => "\xF0\x90\x93\xBA",
"\xF0\x90\x93\x93" => "\xF0\x90\x93\xBB",
"\xF0\x90\x95\xB0" => "\xF0\x90\x96\x97",
"\xF0\x90\x95\xB1" => "\xF0\x90\x96\x98",
"\xF0\x90\x95\xB2" => "\xF0\x90\x96\x99",
"\xF0\x90\x95\xB3" => "\xF0\x90\x96\x9A",
"\xF0\x90\x95\xB4" => "\xF0\x90\x96\x9B",
"\xF0\x90\x95\xB5" => "\xF0\x90\x96\x9C",
"\xF0\x90\x95\xB6" => "\xF0\x90\x96\x9D",
"\xF0\x90\x95\xB7" => "\xF0\x90\x96\x9E",
"\xF0\x90\x95\xB8" => "\xF0\x90\x96\x9F",
"\xF0\x90\x95\xB9" => "\xF0\x90\x96\xA0",
"\xF0\x90\x95\xBA" => "\xF0\x90\x96\xA1",
"\xF0\x90\x95\xBC" => "\xF0\x90\x96\xA3",
"\xF0\x90\x95\xBD" => "\xF0\x90\x96\xA4",
"\xF0\x90\x95\xBE" => "\xF0\x90\x96\xA5",
"\xF0\x90\x95\xBF" => "\xF0\x90\x96\xA6",
"\xF0\x90\x96\x80" => "\xF0\x90\x96\xA7",
"\xF0\x90\x96\x81" => "\xF0\x90\x96\xA8",
"\xF0\x90\x96\x82" => "\xF0\x90\x96\xA9",
"\xF0\x90\x96\x83" => "\xF0\x90\x96\xAA",
"\xF0\x90\x96\x84" => "\xF0\x90\x96\xAB",
"\xF0\x90\x96\x85" => "\xF0\x90\x96\xAC",
"\xF0\x90\x96\x86" => "\xF0\x90\x96\xAD",
"\xF0\x90\x96\x87" => "\xF0\x90\x96\xAE",
"\xF0\x90\x96\x88" => "\xF0\x90\x96\xAF",
"\xF0\x90\x96\x89" => "\xF0\x90\x96\xB0",
"\xF0\x90\x96\x8A" => "\xF0\x90\x96\xB1",
"\xF0\x90\x96\x8C" => "\xF0\x90\x96\xB3",
"\xF0\x90\x96\x8D" => "\xF0\x90\x96\xB4",
"\xF0\x90\x96\x8E" => "\xF0\x90\x96\xB5",
"\xF0\x90\x96\x8F" => "\xF0\x90\x96\xB6",
"\xF0\x90\x96\x90" => "\xF0\x90\x96\xB7",
"\xF0\x90\x96\x91" => "\xF0\x90\x96\xB8",
"\xF0\x90\x96\x92" => "\xF0\x90\x96\xB9",
"\xF0\x90\x96\x94" => "\xF0\x90\x96\xBB",
"\xF0\x90\x96\x95" => "\xF0\x90\x96\xBC",
"\xE1\x82\xA0" => "\xE2\xB4\x80",
"\xE1\x82\xA1" => "\xE2\xB4\x81",
"\xE1\x82\xA2" => "\xE2\xB4\x82",
"\xE1\x82\xA3" => "\xE2\xB4\x83",
"\xE1\x82\xA4" => "\xE2\xB4\x84",
"\xE1\x82\xA5" => "\xE2\xB4\x85",
"\xE1\x82\xA6" => "\xE2\xB4\x86",
"\xE1\x82\xA7" => "\xE2\xB4\x87",
"\xE1\x82\xA8" => "\xE2\xB4\x88",
"\xE1\x82\xA9" => "\xE2\xB4\x89",
"\xE1\x82\xAA" => "\xE2\xB4\x8A",
"\xE1\x82\xAB" => "\xE2\xB4\x8B",
"\xE1\x82\xAC" => "\xE2\xB4\x8C",
"\xE1\x82\xAD" => "\xE2\xB4\x8D",
"\xE1\x82\xAE" => "\xE2\xB4\x8E",
"\xE1\x82\xAF" => "\xE2\xB4\x8F",
"\xE1\x82\xB0" => "\xE2\xB4\x90",
"\xE1\x82\xB1" => "\xE2\xB4\x91",
"\xE1\x82\xB2" => "\xE2\xB4\x92",
"\xE1\x82\xB3" => "\xE2\xB4\x93",
"\xE1\x82\xB4" => "\xE2\xB4\x94",
"\xE1\x82\xB5" => "\xE2\xB4\x95",
"\xE1\x82\xB6" => "\xE2\xB4\x96",
"\xE1\x82\xB7" => "\xE2\xB4\x97",
"\xE1\x82\xB8" => "\xE2\xB4\x98",
"\xE1\x82\xB9" => "\xE2\xB4\x99",
"\xE1\x82\xBA" => "\xE2\xB4\x9A",
"\xE1\x82\xBB" => "\xE2\xB4\x9B",
"\xE1\x82\xBC" => "\xE2\xB4\x9C",
"\xE1\x82\xBD" => "\xE2\xB4\x9D",
"\xE1\x82\xBE" => "\xE2\xB4\x9E",
"\xE1\x82\xBF" => "\xE2\xB4\x9F",
"\xE1\x83\x80" => "\xE2\xB4\xA0",
"\xE1\x83\x81" => "\xE2\xB4\xA1",
"\xE1\x83\x82" => "\xE2\xB4\xA2",
"\xE1\x83\x83" => "\xE2\xB4\xA3",
"\xE1\x83\x84" => "\xE2\xB4\xA4",
"\xE1\x83\x85" => "\xE2\xB4\xA5",
"\xE1\x83\x87" => "\xE2\xB4\xA7",
"\xF0\x90\xB2\x80" => "\xF0\x90\xB3\x80",
"\xF0\x90\xB2\x81" => "\xF0\x90\xB3\x81",
"\xF0\x90\xB2\x82" => "\xF0\x90\xB3\x82",
"\xF0\x90\xB2\x83" => "\xF0\x90\xB3\x83",
"\xF0\x90\xB2\x84" => "\xF0\x90\xB3\x84",
"\xF0\x90\xB2\x85" => "\xF0\x90\xB3\x85",
"\xF0\x90\xB2\x86" => "\xF0\x90\xB3\x86",
"\xF0\x90\xB2\x87" => "\xF0\x90\xB3\x87",
"\xF0\x90\xB2\x88" => "\xF0\x90\xB3\x88",
"\xF0\x90\xB2\x89" => "\xF0\x90\xB3\x89",
"\xF0\x90\xB2\x8A" => "\xF0\x90\xB3\x8A",
"\xF0\x90\xB2\x8B" => "\xF0\x90\xB3\x8B",
"\xF0\x90\xB2\x8C" => "\xF0\x90\xB3\x8C",
"\xF0\x90\xB2\x8D" => "\xF0\x90\xB3\x8D",
"\xF0\x90\xB2\x8E" => "\xF0\x90\xB3\x8E",
"\xF0\x90\xB2\x8F" => "\xF0\x90\xB3\x8F",
"\xF0\x90\xB2\x90" => "\xF0\x90\xB3\x90",
"\xF0\x90\xB2\x91" => "\xF0\x90\xB3\x91",
"\xF0\x90\xB2\x92" => "\xF0\x90\xB3\x92",
"\xF0\x90\xB2\x93" => "\xF0\x90\xB3\x93",
"\xF0\x90\xB2\x94" => "\xF0\x90\xB3\x94",
"\xF0\x90\xB2\x95" => "\xF0\x90\xB3\x95",
"\xF0\x90\xB2\x96" => "\xF0\x90\xB3\x96",
"\xF0\x90\xB2\x97" => "\xF0\x90\xB3\x97",
"\xF0\x90\xB2\x98" => "\xF0\x90\xB3\x98",
"\xF0\x90\xB2\x99" => "\xF0\x90\xB3\x99",
"\xF0\x90\xB2\x9A" => "\xF0\x90\xB3\x9A",
"\xF0\x90\xB2\x9B" => "\xF0\x90\xB3\x9B",
"\xF0\x90\xB2\x9C" => "\xF0\x90\xB3\x9C",
"\xF0\x90\xB2\x9D" => "\xF0\x90\xB3\x9D",
"\xF0\x90\xB2\x9E" => "\xF0\x90\xB3\x9E",
"\xF0\x90\xB2\x9F" => "\xF0\x90\xB3\x9F",
"\xF0\x90\xB2\xA0" => "\xF0\x90\xB3\xA0",
"\xF0\x90\xB2\xA1" => "\xF0\x90\xB3\xA1",
"\xF0\x90\xB2\xA2" => "\xF0\x90\xB3\xA2",
"\xF0\x90\xB2\xA3" => "\xF0\x90\xB3\xA3",
"\xF0\x90\xB2\xA4" => "\xF0\x90\xB3\xA4",
"\xF0\x90\xB2\xA5" => "\xF0\x90\xB3\xA5",
"\xF0\x90\xB2\xA6" => "\xF0\x90\xB3\xA6",
"\xF0\x90\xB2\xA7" => "\xF0\x90\xB3\xA7",
"\xF0\x90\xB2\xA8" => "\xF0\x90\xB3\xA8",
"\xF0\x90\xB2\xA9" => "\xF0\x90\xB3\xA9",
"\xF0\x90\xB2\xAA" => "\xF0\x90\xB3\xAA",
"\xF0\x90\xB2\xAB" => "\xF0\x90\xB3\xAB",
"\xF0\x90\xB2\xAC" => "\xF0\x90\xB3\xAC",
"\xF0\x90\xB2\xAD" => "\xF0\x90\xB3\xAD",
"\xF0\x90\xB2\xAE" => "\xF0\x90\xB3\xAE",
"\xF0\x90\xB2\xAF" => "\xF0\x90\xB3\xAF",
"\xF0\x90\xB2\xB0" => "\xF0\x90\xB3\xB0",
"\xF0\x90\xB2\xB1" => "\xF0\x90\xB3\xB1",
"\xF0\x90\xB2\xB2" => "\xF0\x90\xB3\xB2",
"\xE1\x83\x8D" => "\xE2\xB4\xAD",
"\xF0\x91\xA2\xA0" => "\xF0\x91\xA3\x80",
"\xF0\x91\xA2\xA1" => "\xF0\x91\xA3\x81",
"\xF0\x91\xA2\xA2" => "\xF0\x91\xA3\x82",
"\xF0\x91\xA2\xA3" => "\xF0\x91\xA3\x83",
"\xF0\x91\xA2\xA4" => "\xF0\x91\xA3\x84",
"\xF0\x91\xA2\xA5" => "\xF0\x91\xA3\x85",
"\xF0\x91\xA2\xA6" => "\xF0\x91\xA3\x86",
"\xF0\x91\xA2\xA7" => "\xF0\x91\xA3\x87",
"\xF0\x91\xA2\xA8" => "\xF0\x91\xA3\x88",
"\xF0\x91\xA2\xA9" => "\xF0\x91\xA3\x89",
"\xF0\x91\xA2\xAA" => "\xF0\x91\xA3\x8A",
"\xF0\x91\xA2\xAB" => "\xF0\x91\xA3\x8B",
"\xF0\x91\xA2\xAC" => "\xF0\x91\xA3\x8C",
"\xF0\x91\xA2\xAD" => "\xF0\x91\xA3\x8D",
"\xF0\x91\xA2\xAE" => "\xF0\x91\xA3\x8E",
"\xF0\x91\xA2\xAF" => "\xF0\x91\xA3\x8F",
"\xF0\x91\xA2\xB0" => "\xF0\x91\xA3\x90",
"\xF0\x91\xA2\xB1" => "\xF0\x91\xA3\x91",
"\xF0\x91\xA2\xB2" => "\xF0\x91\xA3\x92",
"\xF0\x91\xA2\xB3" => "\xF0\x91\xA3\x93",
"\xF0\x91\xA2\xB4" => "\xF0\x91\xA3\x94",
"\xF0\x91\xA2\xB5" => "\xF0\x91\xA3\x95",
"\xF0\x91\xA2\xB6" => "\xF0\x91\xA3\x96",
"\xF0\x91\xA2\xB7" => "\xF0\x91\xA3\x97",
"\xF0\x91\xA2\xB8" => "\xF0\x91\xA3\x98",
"\xF0\x91\xA2\xB9" => "\xF0\x91\xA3\x99",
"\xF0\x91\xA2\xBA" => "\xF0\x91\xA3\x9A",
"\xF0\x91\xA2\xBB" => "\xF0\x91\xA3\x9B",
"\xF0\x91\xA2\xBC" => "\xF0\x91\xA3\x9C",
"\xF0\x91\xA2\xBD" => "\xF0\x91\xA3\x9D",
"\xF0\x91\xA2\xBE" => "\xF0\x91\xA3\x9E",
"\xF0\x91\xA2\xBF" => "\xF0\x91\xA3\x9F",
"\xE1\x8E\xA0" => "\xEA\xAD\xB0",
"\xE1\x8E\xA1" => "\xEA\xAD\xB1",
"\xE1\x8E\xA2" => "\xEA\xAD\xB2",
"\xE1\x8E\xA3" => "\xEA\xAD\xB3",
"\xE1\x8E\xA4" => "\xEA\xAD\xB4",
"\xE1\x8E\xA5" => "\xEA\xAD\xB5",
"\xE1\x8E\xA6" => "\xEA\xAD\xB6",
"\xE1\x8E\xA7" => "\xEA\xAD\xB7",
"\xE1\x8E\xA8" => "\xEA\xAD\xB8",
"\xE1\x8E\xA9" => "\xEA\xAD\xB9",
"\xE1\x8E\xAA" => "\xEA\xAD\xBA",
"\xE1\x8E\xAB" => "\xEA\xAD\xBB",
"\xE1\x8E\xAC" => "\xEA\xAD\xBC",
"\xE1\x8E\xAD" => "\xEA\xAD\xBD",
"\xE1\x8E\xAE" => "\xEA\xAD\xBE",
"\xE1\x8E\xAF" => "\xEA\xAD\xBF",
"\xE1\x8E\xB0" => "\xEA\xAE\x80",
"\xE1\x8E\xB1" => "\xEA\xAE\x81",
"\xE1\x8E\xB2" => "\xEA\xAE\x82",
"\xE1\x8E\xB3" => "\xEA\xAE\x83",
"\xE1\x8E\xB4" => "\xEA\xAE\x84",
"\xE1\x8E\xB5" => "\xEA\xAE\x85",
"\xE1\x8E\xB6" => "\xEA\xAE\x86",
"\xE1\x8E\xB7" => "\xEA\xAE\x87",
"\xE1\x8E\xB8" => "\xEA\xAE\x88",
"\xE1\x8E\xB9" => "\xEA\xAE\x89",
"\xE1\x8E\xBA" => "\xEA\xAE\x8A",
"\xE1\x8E\xBB" => "\xEA\xAE\x8B",
"\xE1\x8E\xBC" => "\xEA\xAE\x8C",
"\xE1\x8E\xBD" => "\xEA\xAE\x8D",
"\xE1\x8E\xBE" => "\xEA\xAE\x8E",
"\xE1\x8E\xBF" => "\xEA\xAE\x8F",
"\xE1\x8F\x80" => "\xEA\xAE\x90",
"\xE1\x8F\x81" => "\xEA\xAE\x91",
"\xE1\x8F\x82" => "\xEA\xAE\x92",
"\xE1\x8F\x83" => "\xEA\xAE\x93",
"\xE1\x8F\x84" => "\xEA\xAE\x94",
"\xE1\x8F\x85" => "\xEA\xAE\x95",
"\xE1\x8F\x86" => "\xEA\xAE\x96",
"\xE1\x8F\x87" => "\xEA\xAE\x97",
"\xE1\x8F\x88" => "\xEA\xAE\x98",
"\xE1\x8F\x89" => "\xEA\xAE\x99",
"\xE1\x8F\x8A" => "\xEA\xAE\x9A",
"\xE1\x8F\x8B" => "\xEA\xAE\x9B",
"\xE1\x8F\x8C" => "\xEA\xAE\x9C",
"\xE1\x8F\x8D" => "\xEA\xAE\x9D",
"\xE1\x8F\x8E" => "\xEA\xAE\x9E",
"\xE1\x8F\x8F" => "\xEA\xAE\x9F",
"\xE1\x8F\x90" => "\xEA\xAE\xA0",
"\xE1\x8F\x91" => "\xEA\xAE\xA1",
"\xE1\x8F\x92" => "\xEA\xAE\xA2",
"\xE1\x8F\x93" => "\xEA\xAE\xA3",
"\xE1\x8F\x94" => "\xEA\xAE\xA4",
"\xE1\x8F\x95" => "\xEA\xAE\xA5",
"\xE1\x8F\x96" => "\xEA\xAE\xA6",
"\xE1\x8F\x97" => "\xEA\xAE\xA7",
"\xE1\x8F\x98" => "\xEA\xAE\xA8",
"\xE1\x8F\x99" => "\xEA\xAE\xA9",
"\xE1\x8F\x9A" => "\xEA\xAE\xAA",
"\xE1\x8F\x9B" => "\xEA\xAE\xAB",
"\xE1\x8F\x9C" => "\xEA\xAE\xAC",
"\xE1\x8F\x9D" => "\xEA\xAE\xAD",
"\xE1\x8F\x9E" => "\xEA\xAE\xAE",
"\xE1\x8F\x9F" => "\xEA\xAE\xAF",
"\xE1\x8F\xA0" => "\xEA\xAE\xB0",
"\xE1\x8F\xA1" => "\xEA\xAE\xB1",
"\xE1\x8F\xA2" => "\xEA\xAE\xB2",
"\xE1\x8F\xA3" => "\xEA\xAE\xB3",
"\xE1\x8F\xA4" => "\xEA\xAE\xB4",
"\xE1\x8F\xA5" => "\xEA\xAE\xB5",
"\xE1\x8F\xA6" => "\xEA\xAE\xB6",
"\xE1\x8F\xA7" => "\xEA\xAE\xB7",
"\xE1\x8F\xA8" => "\xEA\xAE\xB8",
"\xE1\x8F\xA9" => "\xEA\xAE\xB9",
"\xE1\x8F\xAA" => "\xEA\xAE\xBA",
"\xE1\x8F\xAB" => "\xEA\xAE\xBB",
"\xE1\x8F\xAC" => "\xEA\xAE\xBC",
"\xE1\x8F\xAD" => "\xEA\xAE\xBD",
"\xE1\x8F\xAE" => "\xEA\xAE\xBE",
"\xE1\x8F\xAF" => "\xEA\xAE\xBF",
"\xE1\x8F\xB0" => "\xE1\x8F\xB8",
"\xE1\x8F\xB1" => "\xE1\x8F\xB9",
"\xE1\x8F\xB2" => "\xE1\x8F\xBA",
"\xE1\x8F\xB3" => "\xE1\x8F\xBB",
"\xE1\x8F\xB4" => "\xE1\x8F\xBC",
"\xE1\x8F\xB5" => "\xE1\x8F\xBD",
Find: Select
?>
Replace With: Select
"\xF0\x96\xB9\x80" => "\xF0\x96\xB9\xA0",
"\xF0\x96\xB9\x81" => "\xF0\x96\xB9\xA1",
"\xF0\x96\xB9\x82" => "\xF0\x96\xB9\xA2",
"\xF0\x96\xB9\x83" => "\xF0\x96\xB9\xA3",
"\xF0\x96\xB9\x84" => "\xF0\x96\xB9\xA4",
"\xF0\x96\xB9\x85" => "\xF0\x96\xB9\xA5",
"\xF0\x96\xB9\x86" => "\xF0\x96\xB9\xA6",
"\xF0\x96\xB9\x87" => "\xF0\x96\xB9\xA7",
"\xF0\x96\xB9\x88" => "\xF0\x96\xB9\xA8",
"\xF0\x96\xB9\x89" => "\xF0\x96\xB9\xA9",
"\xF0\x96\xB9\x8A" => "\xF0\x96\xB9\xAA",
"\xF0\x96\xB9\x8B" => "\xF0\x96\xB9\xAB",
"\xF0\x96\xB9\x8C" => "\xF0\x96\xB9\xAC",
"\xF0\x96\xB9\x8D" => "\xF0\x96\xB9\xAD",
"\xF0\x96\xB9\x8E" => "\xF0\x96\xB9\xAE",
"\xF0\x96\xB9\x8F" => "\xF0\x96\xB9\xAF",
"\xF0\x96\xB9\x90" => "\xF0\x96\xB9\xB0",
"\xF0\x96\xB9\x91" => "\xF0\x96\xB9\xB1",
"\xF0\x96\xB9\x92" => "\xF0\x96\xB9\xB2",
"\xF0\x96\xB9\x93" => "\xF0\x96\xB9\xB3",
"\xF0\x96\xB9\x94" => "\xF0\x96\xB9\xB4",
"\xF0\x96\xB9\x95" => "\xF0\x96\xB9\xB5",
"\xF0\x96\xB9\x96" => "\xF0\x96\xB9\xB6",
"\xF0\x96\xB9\x97" => "\xF0\x96\xB9\xB7",
"\xF0\x96\xB9\x98" => "\xF0\x96\xB9\xB8",
"\xF0\x96\xB9\x99" => "\xF0\x96\xB9\xB9",
"\xF0\x96\xB9\x9A" => "\xF0\x96\xB9\xBA",
"\xF0\x96\xB9\x9B" => "\xF0\x96\xB9\xBB",
"\xF0\x96\xB9\x9C" => "\xF0\x96\xB9\xBC",
"\xF0\x96\xB9\x9D" => "\xF0\x96\xB9\xBD",
"\xF0\x96\xB9\x9E" => "\xF0\x96\xB9\xBE",
"\xF0\x96\xB9\x9F" => "\xF0\x96\xB9\xBF",
"\xE1\xB2\x90" => "\xE1\x83\x90",
"\xE1\xB2\x91" => "\xE1\x83\x91",
"\xE1\xB2\x92" => "\xE1\x83\x92",
"\xE1\xB2\x93" => "\xE1\x83\x93",
"\xE1\xB2\x94" => "\xE1\x83\x94",
"\xE1\xB2\x95" => "\xE1\x83\x95",
"\xE1\xB2\x96" => "\xE1\x83\x96",
"\xE1\xB2\x97" => "\xE1\x83\x97",
"\xE1\xB2\x98" => "\xE1\x83\x98",
"\xE1\xB2\x99" => "\xE1\x83\x99",
"\xE1\xB2\x9A" => "\xE1\x83\x9A",
"\xE1\xB2\x9B" => "\xE1\x83\x9B",
"\xE1\xB2\x9C" => "\xE1\x83\x9C",
"\xE1\xB2\x9D" => "\xE1\x83\x9D",
"\xE1\xB2\x9E" => "\xE1\x83\x9E",
"\xE1\xB2\x9F" => "\xE1\x83\x9F",
"\xE1\xB2\xA0" => "\xE1\x83\xA0",
"\xE1\xB2\xA1" => "\xE1\x83\xA1",
"\xE1\xB2\xA2" => "\xE1\x83\xA2",
"\xE1\xB2\xA3" => "\xE1\x83\xA3",
"\xE1\xB2\xA4" => "\xE1\x83\xA4",
"\xE1\xB2\xA5" => "\xE1\x83\xA5",
"\xE1\xB2\xA6" => "\xE1\x83\xA6",
"\xE1\xB2\xA7" => "\xE1\x83\xA7",
"\xE1\xB2\xA8" => "\xE1\x83\xA8",
"\xE1\xB2\xA9" => "\xE1\x83\xA9",
"\xE1\xB2\xAA" => "\xE1\x83\xAA",
"\xE1\xB2\xAB" => "\xE1\x83\xAB",
"\xE1\xB2\xAC" => "\xE1\x83\xAC",
"\xE1\xB2\xAD" => "\xE1\x83\xAD",
"\xE1\xB2\xAE" => "\xE1\x83\xAE",
"\xE1\xB2\xAF" => "\xE1\x83\xAF",
"\xE1\xB2\xB0" => "\xE1\x83\xB0",
"\xE1\xB2\xB1" => "\xE1\x83\xB1",
"\xE1\xB2\xB2" => "\xE1\x83\xB2",
"\xE1\xB2\xB3" => "\xE1\x83\xB3",
"\xE1\xB2\xB4" => "\xE1\x83\xB4",
"\xE1\xB2\xB5" => "\xE1\x83\xB5",
"\xE1\xB2\xB6" => "\xE1\x83\xB6",
"\xE1\xB2\xB7" => "\xE1\x83\xB7",
"\xE1\xB2\xB8" => "\xE1\x83\xB8",
"\xE1\xB2\xB9" => "\xE1\x83\xB9",
"\xE1\xB2\xBA" => "\xE1\x83\xBA",
"\xE1\xB2\xBD" => "\xE1\x83\xBD",
"\xE1\xB2\xBE" => "\xE1\x83\xBE",
"\xE1\xB2\xBF" => "\xE1\x83\xBF",
"\xE1\xB8\x80" => "\xE1\xB8\x81",
"\xE1\xB8\x82" => "\xE1\xB8\x83",
"\xE1\xB8\x84" => "\xE1\xB8\x85",
"\xE1\xB8\x86" => "\xE1\xB8\x87",
"\xE1\xB8\x88" => "\xE1\xB8\x89",
"\xE1\xB8\x8A" => "\xE1\xB8\x8B",
"\xE1\xB8\x8C" => "\xE1\xB8\x8D",
"\xE1\xB8\x8E" => "\xE1\xB8\x8F",
"\xE1\xB8\x90" => "\xE1\xB8\x91",
"\xE1\xB8\x92" => "\xE1\xB8\x93",
"\xE1\xB8\x94" => "\xE1\xB8\x95",
"\xE1\xB8\x96" => "\xE1\xB8\x97",
"\xE1\xB8\x98" => "\xE1\xB8\x99",
"\xE1\xB8\x9A" => "\xE1\xB8\x9B",
"\xE1\xB8\x9C" => "\xE1\xB8\x9D",
"\xE1\xB8\x9E" => "\xE1\xB8\x9F",
"\xE1\xB8\xA0" => "\xE1\xB8\xA1",
"\xE1\xB8\xA2" => "\xE1\xB8\xA3",
"\xE1\xB8\xA4" => "\xE1\xB8\xA5",
"\xE1\xB8\xA6" => "\xE1\xB8\xA7",
"\xE1\xB8\xA8" => "\xE1\xB8\xA9",
"\xE1\xB8\xAA" => "\xE1\xB8\xAB",
"\xE1\xB8\xAC" => "\xE1\xB8\xAD",
"\xE1\xB8\xAE" => "\xE1\xB8\xAF",
"\xE1\xB8\xB0" => "\xE1\xB8\xB1",
"\xE1\xB8\xB2" => "\xE1\xB8\xB3",
"\xE1\xB8\xB4" => "\xE1\xB8\xB5",
"\xE1\xB8\xB6" => "\xE1\xB8\xB7",
"\xE1\xB8\xB8" => "\xE1\xB8\xB9",
"\xE1\xB8\xBA" => "\xE1\xB8\xBB",
"\xE1\xB8\xBC" => "\xE1\xB8\xBD",
"\xE1\xB8\xBE" => "\xE1\xB8\xBF",
"\xE1\xB9\x80" => "\xE1\xB9\x81",
"\xE1\xB9\x82" => "\xE1\xB9\x83",
"\xE1\xB9\x84" => "\xE1\xB9\x85",
"\xE1\xB9\x86" => "\xE1\xB9\x87",
"\xE1\xB9\x88" => "\xE1\xB9\x89",
"\xE1\xB9\x8A" => "\xE1\xB9\x8B",
"\xE1\xB9\x8C" => "\xE1\xB9\x8D",
"\xE1\xB9\x8E" => "\xE1\xB9\x8F",
"\xE1\xB9\x90" => "\xE1\xB9\x91",
"\xE1\xB9\x92" => "\xE1\xB9\x93",
"\xE1\xB9\x94" => "\xE1\xB9\x95",
"\xE1\xB9\x96" => "\xE1\xB9\x97",
"\xE1\xB9\x98" => "\xE1\xB9\x99",
"\xE1\xB9\x9A" => "\xE1\xB9\x9B",
"\xE1\xB9\x9C" => "\xE1\xB9\x9D",
"\xE1\xB9\x9E" => "\xE1\xB9\x9F",
"\xE1\xB9\xA0" => "\xE1\xB9\xA1",
"\xE1\xB9\xA2" => "\xE1\xB9\xA3",
"\xE1\xB9\xA4" => "\xE1\xB9\xA5",
"\xE1\xB9\xA6" => "\xE1\xB9\xA7",
"\xE1\xB9\xA8" => "\xE1\xB9\xA9",
"\xE1\xB9\xAA" => "\xE1\xB9\xAB",
"\xE1\xB9\xAC" => "\xE1\xB9\xAD",
"\xE1\xB9\xAE" => "\xE1\xB9\xAF",
"\xE1\xB9\xB0" => "\xE1\xB9\xB1",
"\xE1\xB9\xB2" => "\xE1\xB9\xB3",
"\xE1\xB9\xB4" => "\xE1\xB9\xB5",
"\xE1\xB9\xB6" => "\xE1\xB9\xB7",
"\xE1\xB9\xB8" => "\xE1\xB9\xB9",
"\xE1\xB9\xBA" => "\xE1\xB9\xBB",
"\xE1\xB9\xBC" => "\xE1\xB9\xBD",
"\xE1\xB9\xBE" => "\xE1\xB9\xBF",
"\xE1\xBA\x80" => "\xE1\xBA\x81",
"\xE1\xBA\x82" => "\xE1\xBA\x83",
"\xE1\xBA\x84" => "\xE1\xBA\x85",
"\xE1\xBA\x86" => "\xE1\xBA\x87",
"\xE1\xBA\x88" => "\xE1\xBA\x89",
"\xE1\xBA\x8A" => "\xE1\xBA\x8B",
"\xE1\xBA\x8C" => "\xE1\xBA\x8D",
"\xE1\xBA\x8E" => "\xE1\xBA\x8F",
"\xF0\x9E\xA4\x80" => "\xF0\x9E\xA4\xA2",
"\xF0\x9E\xA4\x81" => "\xF0\x9E\xA4\xA3",
"\xF0\x9E\xA4\x82" => "\xF0\x9E\xA4\xA4",
"\xF0\x9E\xA4\x83" => "\xF0\x9E\xA4\xA5",
"\xF0\x9E\xA4\x84" => "\xF0\x9E\xA4\xA6",
"\xF0\x9E\xA4\x85" => "\xF0\x9E\xA4\xA7",
"\xF0\x9E\xA4\x86" => "\xF0\x9E\xA4\xA8",
"\xF0\x9E\xA4\x87" => "\xF0\x9E\xA4\xA9",
"\xF0\x9E\xA4\x88" => "\xF0\x9E\xA4\xAA",
"\xF0\x9E\xA4\x89" => "\xF0\x9E\xA4\xAB",
"\xE1\xBA\x90" => "\xE1\xBA\x91",
"\xF0\x9E\xA4\x8A" => "\xF0\x9E\xA4\xAC",
"\xF0\x9E\xA4\x8B" => "\xF0\x9E\xA4\xAD",
"\xF0\x9E\xA4\x8C" => "\xF0\x9E\xA4\xAE",
"\xF0\x9E\xA4\x8D" => "\xF0\x9E\xA4\xAF",
"\xF0\x9E\xA4\x8E" => "\xF0\x9E\xA4\xB0",
"\xF0\x9E\xA4\x8F" => "\xF0\x9E\xA4\xB1",
"\xF0\x9E\xA4\x90" => "\xF0\x9E\xA4\xB2",
"\xF0\x9E\xA4\x91" => "\xF0\x9E\xA4\xB3",
"\xF0\x9E\xA4\x92" => "\xF0\x9E\xA4\xB4",
"\xF0\x9E\xA4\x93" => "\xF0\x9E\xA4\xB5",
"\xF0\x9E\xA4\x94" => "\xF0\x9E\xA4\xB6",
"\xF0\x9E\xA4\x95" => "\xF0\x9E\xA4\xB7",
"\xF0\x9E\xA4\x96" => "\xF0\x9E\xA4\xB8",
"\xF0\x9E\xA4\x97" => "\xF0\x9E\xA4\xB9",
"\xF0\x9E\xA4\x98" => "\xF0\x9E\xA4\xBA",
"\xF0\x9E\xA4\x99" => "\xF0\x9E\xA4\xBB",
"\xF0\x9E\xA4\x9A" => "\xF0\x9E\xA4\xBC",
"\xF0\x9E\xA4\x9B" => "\xF0\x9E\xA4\xBD",
"\xF0\x9E\xA4\x9C" => "\xF0\x9E\xA4\xBE",
"\xF0\x9E\xA4\x9D" => "\xF0\x9E\xA4\xBF",
"\xF0\x9E\xA4\x9E" => "\xF0\x9E\xA5\x80",
"\xF0\x9E\xA4\x9F" => "\xF0\x9E\xA5\x81",
"\xF0\x9E\xA4\xA0" => "\xF0\x9E\xA5\x82",
"\xF0\x9E\xA4\xA1" => "\xF0\x9E\xA5\x83",
"\xE1\xBA\x92" => "\xE1\xBA\x93",
"\xE1\xBA\x94" => "\xE1\xBA\x95",
"\xE1\xBA\x96" => "\xE1\xBA\x96",
"\xE1\xBA\x97" => "\xE1\xBA\x97",
"\xE1\xBA\x98" => "\xE1\xBA\x98",
"\xE1\xBA\x99" => "\xE1\xBA\x99",
"\xE1\xBA\x9A" => "\xE1\xBA\x9A",
"\xE1\xBA\x9E" => "\xC3\x9F",
"\xE1\xBA\xA0" => "\xE1\xBA\xA1",
"\xE1\xBA\xA2" => "\xE1\xBA\xA3",
"\xE1\xBA\xA4" => "\xE1\xBA\xA5",
"\xE1\xBA\xA6" => "\xE1\xBA\xA7",
"\xE1\xBA\xA8" => "\xE1\xBA\xA9",
"\xE1\xBA\xAA" => "\xE1\xBA\xAB",
"\xE1\xBA\xAC" => "\xE1\xBA\xAD",
"\xE1\xBA\xAE" => "\xE1\xBA\xAF",
"\xE1\xBA\xB0" => "\xE1\xBA\xB1",
"\xE1\xBA\xB2" => "\xE1\xBA\xB3",
"\xE1\xBA\xB4" => "\xE1\xBA\xB5",
"\xE1\xBA\xB6" => "\xE1\xBA\xB7",
"\xE1\xBA\xB8" => "\xE1\xBA\xB9",
"\xE1\xBA\xBA" => "\xE1\xBA\xBB",
"\xE1\xBA\xBC" => "\xE1\xBA\xBD",
"\xE1\xBA\xBE" => "\xE1\xBA\xBF",
"\xE1\xBB\x80" => "\xE1\xBB\x81",
"\xE1\xBB\x82" => "\xE1\xBB\x83",
"\xE1\xBB\x84" => "\xE1\xBB\x85",
"\xE1\xBB\x86" => "\xE1\xBB\x87",
"\xE1\xBB\x88" => "\xE1\xBB\x89",
"\xE1\xBB\x8A" => "\xE1\xBB\x8B",
"\xE1\xBB\x8C" => "\xE1\xBB\x8D",
"\xE1\xBB\x8E" => "\xE1\xBB\x8F",
"\xE1\xBB\x90" => "\xE1\xBB\x91",
"\xE1\xBB\x92" => "\xE1\xBB\x93",
"\xE1\xBB\x94" => "\xE1\xBB\x95",
"\xE1\xBB\x96" => "\xE1\xBB\x97",
"\xE1\xBB\x98" => "\xE1\xBB\x99",
"\xE1\xBB\x9A" => "\xE1\xBB\x9B",
"\xE1\xBB\x9C" => "\xE1\xBB\x9D",
"\xE1\xBB\x9E" => "\xE1\xBB\x9F",
"\xE1\xBB\xA0" => "\xE1\xBB\xA1",
"\xE1\xBB\xA2" => "\xE1\xBB\xA3",
"\xE1\xBB\xA4" => "\xE1\xBB\xA5",
"\xE1\xBB\xA6" => "\xE1\xBB\xA7",
"\xE1\xBB\xA8" => "\xE1\xBB\xA9",
"\xE1\xBB\xAA" => "\xE1\xBB\xAB",
"\xE1\xBB\xAC" => "\xE1\xBB\xAD",
"\xE1\xBB\xAE" => "\xE1\xBB\xAF",
"\xE1\xBB\xB0" => "\xE1\xBB\xB1",
"\xE1\xBB\xB2" => "\xE1\xBB\xB3",
"\xE1\xBB\xB4" => "\xE1\xBB\xB5",
"\xE1\xBB\xB6" => "\xE1\xBB\xB7",
"\xE1\xBB\xB8" => "\xE1\xBB\xB9",
"\xE1\xBB\xBA" => "\xE1\xBB\xBB",
"\xE1\xBB\xBC" => "\xE1\xBB\xBD",
"\xE1\xBB\xBE" => "\xE1\xBB\xBF",
"\xE1\xBC\x88" => "\xE1\xBC\x80",
"\xE1\xBC\x89" => "\xE1\xBC\x81",
"\xE1\xBC\x8A" => "\xE1\xBC\x82",
"\xE1\xBC\x8B" => "\xE1\xBC\x83",
"\xE1\xBC\x8C" => "\xE1\xBC\x84",
"\xE1\xBC\x8D" => "\xE1\xBC\x85",
"\xE1\xBC\x8E" => "\xE1\xBC\x86",
"\xE1\xBC\x8F" => "\xE1\xBC\x87",
"\xE1\xBC\x98" => "\xE1\xBC\x90",
"\xE1\xBC\x99" => "\xE1\xBC\x91",
"\xE1\xBC\x9A" => "\xE1\xBC\x92",
"\xE1\xBC\x9B" => "\xE1\xBC\x93",
"\xE1\xBC\x9C" => "\xE1\xBC\x94",
"\xE1\xBC\x9D" => "\xE1\xBC\x95",
"\xE1\xBC\xA8" => "\xE1\xBC\xA0",
"\xE1\xBC\xA9" => "\xE1\xBC\xA1",
"\xE1\xBC\xAA" => "\xE1\xBC\xA2",
"\xE1\xBC\xAB" => "\xE1\xBC\xA3",
"\xE1\xBC\xAC" => "\xE1\xBC\xA4",
"\xE1\xBC\xAD" => "\xE1\xBC\xA5",
"\xE1\xBC\xAE" => "\xE1\xBC\xA6",
"\xE1\xBC\xAF" => "\xE1\xBC\xA7",
"\xE1\xBC\xB8" => "\xE1\xBC\xB0",
"\xE1\xBC\xB9" => "\xE1\xBC\xB1",
"\xE1\xBC\xBA" => "\xE1\xBC\xB2",
"\xE1\xBC\xBB" => "\xE1\xBC\xB3",
"\xE1\xBC\xBC" => "\xE1\xBC\xB4",
"\xE1\xBC\xBD" => "\xE1\xBC\xB5",
"\xE1\xBC\xBE" => "\xE1\xBC\xB6",
"\xE1\xBC\xBF" => "\xE1\xBC\xB7",
"\xE1\xBD\x88" => "\xE1\xBD\x80",
"\xE1\xBD\x89" => "\xE1\xBD\x81",
"\xE1\xBD\x8A" => "\xE1\xBD\x82",
"\xE1\xBD\x8B" => "\xE1\xBD\x83",
"\xE1\xBD\x8C" => "\xE1\xBD\x84",
"\xE1\xBD\x8D" => "\xE1\xBD\x85",
"\xE1\xBD\x90" => "\xE1\xBD\x90",
"\xE1\xBD\x92" => "\xE1\xBD\x92",
"\xE1\xBD\x94" => "\xE1\xBD\x94",
"\xE1\xBD\x96" => "\xE1\xBD\x96",
"\xE1\xBD\x99" => "\xE1\xBD\x91",
"\xE1\xBD\x9B" => "\xE1\xBD\x93",
"\xE1\xBD\x9D" => "\xE1\xBD\x95",
"\xE1\xBD\x9F" => "\xE1\xBD\x97",
"\xE1\xBD\xA8" => "\xE1\xBD\xA0",
"\xE1\xBD\xA9" => "\xE1\xBD\xA1",
"\xE1\xBD\xAA" => "\xE1\xBD\xA2",
"\xE1\xBD\xAB" => "\xE1\xBD\xA3",
"\xE1\xBD\xAC" => "\xE1\xBD\xA4",
"\xE1\xBD\xAD" => "\xE1\xBD\xA5",
"\xE1\xBD\xAE" => "\xE1\xBD\xA6",
"\xE1\xBD\xAF" => "\xE1\xBD\xA7",
"\xE1\xBE\x80" => "\xE1\xBE\x80",
"\xE1\xBE\x81" => "\xE1\xBE\x81",
"\xE1\xBE\x82" => "\xE1\xBE\x82",
"\xE1\xBE\x83" => "\xE1\xBE\x83",
"\xE1\xBE\x84" => "\xE1\xBE\x84",
"\xE1\xBE\x85" => "\xE1\xBE\x85",
"\xE1\xBE\x86" => "\xE1\xBE\x86",
"\xE1\xBE\x87" => "\xE1\xBE\x87",
"\xE1\xBE\x88" => "\xE1\xBE\x80",
"\xE1\xBE\x89" => "\xE1\xBE\x81",
"\xE1\xBE\x8A" => "\xE1\xBE\x82",
"\xE1\xBE\x8B" => "\xE1\xBE\x83",
"\xE1\xBE\x8C" => "\xE1\xBE\x84",
"\xE1\xBE\x8D" => "\xE1\xBE\x85",
"\xE1\xBE\x8E" => "\xE1\xBE\x86",
"\xE1\xBE\x8F" => "\xE1\xBE\x87",
"\xE1\xBE\x90" => "\xE1\xBE\x90",
"\xE1\xBE\x91" => "\xE1\xBE\x91",
"\xE1\xBE\x92" => "\xE1\xBE\x92",
"\xE1\xBE\x93" => "\xE1\xBE\x93",
"\xE1\xBE\x94" => "\xE1\xBE\x94",
"\xE1\xBE\x95" => "\xE1\xBE\x95",
"\xE1\xBE\x96" => "\xE1\xBE\x96",
"\xE1\xBE\x97" => "\xE1\xBE\x97",
"\xE1\xBE\x98" => "\xE1\xBE\x90",
"\xE1\xBE\x99" => "\xE1\xBE\x91",
"\xE1\xBE\x9A" => "\xE1\xBE\x92",
"\xE1\xBE\x9B" => "\xE1\xBE\x93",
"\xE1\xBE\x9C" => "\xE1\xBE\x94",
"\xE1\xBE\x9D" => "\xE1\xBE\x95",
"\xE1\xBE\x9E" => "\xE1\xBE\x96",
"\xE1\xBE\x9F" => "\xE1\xBE\x97",
"\xE1\xBE\xA0" => "\xE1\xBE\xA0",
"\xE1\xBE\xA1" => "\xE1\xBE\xA1",
"\xE1\xBE\xA2" => "\xE1\xBE\xA2",
"\xE1\xBE\xA3" => "\xE1\xBE\xA3",
"\xE1\xBE\xA4" => "\xE1\xBE\xA4",
"\xE1\xBE\xA5" => "\xE1\xBE\xA5",
"\xE1\xBE\xA6" => "\xE1\xBE\xA6",
"\xE1\xBE\xA7" => "\xE1\xBE\xA7",
"\xE1\xBE\xA8" => "\xE1\xBE\xA0",
"\xE1\xBE\xA9" => "\xE1\xBE\xA1",
"\xE1\xBE\xAA" => "\xE1\xBE\xA2",
"\xE1\xBE\xAB" => "\xE1\xBE\xA3",
"\xE1\xBE\xAC" => "\xE1\xBE\xA4",
"\xE1\xBE\xAD" => "\xE1\xBE\xA5",
"\xE1\xBE\xAE" => "\xE1\xBE\xA6",
"\xE1\xBE\xAF" => "\xE1\xBE\xA7",
"\xE1\xBE\xB2" => "\xE1\xBE\xB2",
"\xE1\xBE\xB3" => "\xE1\xBE\xB3",
"\xE1\xBE\xB4" => "\xE1\xBE\xB4",
"\xE1\xBE\xB6" => "\xE1\xBE\xB6",
"\xE1\xBE\xB7" => "\xE1\xBE\xB7",
"\xE1\xBE\xB8" => "\xE1\xBE\xB0",
"\xE1\xBE\xB9" => "\xE1\xBE\xB1",
"\xE1\xBE\xBA" => "\xE1\xBD\xB0",
"\xE1\xBE\xBB" => "\xE1\xBD\xB1",
"\xE1\xBE\xBC" => "\xE1\xBE\xB3",
"\xE1\xBF\x82" => "\xE1\xBF\x82",
"\xE1\xBF\x83" => "\xE1\xBF\x83",
"\xE1\xBF\x84" => "\xE1\xBF\x84",
"\xE1\xBF\x86" => "\xE1\xBF\x86",
"\xE1\xBF\x87" => "\xE1\xBF\x87",
"\xE1\xBF\x88" => "\xE1\xBD\xB2",
"\xE1\xBF\x89" => "\xE1\xBD\xB3",
"\xE1\xBF\x8A" => "\xE1\xBD\xB4",
"\xE1\xBF\x8B" => "\xE1\xBD\xB5",
"\xE1\xBF\x8C" => "\xE1\xBF\x83",
"\xE1\xBF\x92" => "\xE1\xBF\x92",
"\xE1\xBF\x93" => "\xE1\xBF\x93",
"\xE1\xBF\x96" => "\xE1\xBF\x96",
"\xE1\xBF\x97" => "\xE1\xBF\x97",
"\xE1\xBF\x98" => "\xE1\xBF\x90",
"\xE1\xBF\x99" => "\xE1\xBF\x91",
"\xE1\xBF\x9A" => "\xE1\xBD\xB6",
"\xE1\xBF\x9B" => "\xE1\xBD\xB7",
"\xE1\xBF\xA2" => "\xE1\xBF\xA2",
"\xE1\xBF\xA3" => "\xE1\xBF\xA3",
"\xE1\xBF\xA4" => "\xE1\xBF\xA4",
"\xE1\xBF\xA6" => "\xE1\xBF\xA6",
"\xE1\xBF\xA7" => "\xE1\xBF\xA7",
"\xE1\xBF\xA8" => "\xE1\xBF\xA0",
"\xE1\xBF\xA9" => "\xE1\xBF\xA1",
"\xE1\xBF\xAA" => "\xE1\xBD\xBA",
"\xE1\xBF\xAB" => "\xE1\xBD\xBB",
"\xE1\xBF\xAC" => "\xE1\xBF\xA5",
"\xE1\xBF\xB2" => "\xE1\xBF\xB2",
"\xE1\xBF\xB3" => "\xE1\xBF\xB3",
"\xE1\xBF\xB4" => "\xE1\xBF\xB4",
"\xE1\xBF\xB6" => "\xE1\xBF\xB6",
"\xE1\xBF\xB7" => "\xE1\xBF\xB7",
"\xE1\xBF\xB8" => "\xE1\xBD\xB8",
"\xE1\xBF\xB9" => "\xE1\xBD\xB9",
"\xE1\xBF\xBA" => "\xE1\xBD\xBC",
"\xE1\xBF\xBB" => "\xE1\xBD\xBD",
"\xE1\xBF\xBC" => "\xE1\xBF\xB3",
"\xE2\x84\xA6" => "\xCF\x89",
"\xE2\x84\xAA" => "\x6B",
"\xE2\x84\xAB" => "\xC3\xA5",
"\xE2\x84\xB2" => "\xE2\x85\x8E",
"\xE2\x85\xA0" => "\xE2\x85\xB0",
"\xE2\x85\xA1" => "\xE2\x85\xB1",
"\xE2\x85\xA2" => "\xE2\x85\xB2",
"\xE2\x85\xA3" => "\xE2\x85\xB3",
"\xE2\x85\xA4" => "\xE2\x85\xB4",
"\xE2\x85\xA5" => "\xE2\x85\xB5",
"\xE2\x85\xA6" => "\xE2\x85\xB6",
"\xE2\x85\xA7" => "\xE2\x85\xB7",
"\xE2\x85\xA8" => "\xE2\x85\xB8",
"\xE2\x85\xA9" => "\xE2\x85\xB9",
"\xE2\x85\xAA" => "\xE2\x85\xBA",
"\xE2\x85\xAB" => "\xE2\x85\xBB",
"\xE2\x85\xAC" => "\xE2\x85\xBC",
"\xE2\x85\xAD" => "\xE2\x85\xBD",
"\xE2\x85\xAE" => "\xE2\x85\xBE",
"\xE2\x85\xAF" => "\xE2\x85\xBF",
"\xE2\x86\x83" => "\xE2\x86\x84",
"\xE2\x92\xB6" => "\xE2\x93\x90",
"\xE2\x92\xB7" => "\xE2\x93\x91",
"\xE2\x92\xB8" => "\xE2\x93\x92",
"\xE2\x92\xB9" => "\xE2\x93\x93",
"\xE2\x92\xBA" => "\xE2\x93\x94",
"\xE2\x92\xBB" => "\xE2\x93\x95",
"\xE2\x92\xBC" => "\xE2\x93\x96",
"\xE2\x92\xBD" => "\xE2\x93\x97",
"\xE2\x92\xBE" => "\xE2\x93\x98",
"\xE2\x92\xBF" => "\xE2\x93\x99",
"\xE2\x93\x80" => "\xE2\x93\x9A",
"\xE2\x93\x81" => "\xE2\x93\x9B",
"\xE2\x93\x82" => "\xE2\x93\x9C",
"\xE2\x93\x83" => "\xE2\x93\x9D",
"\xE2\x93\x84" => "\xE2\x93\x9E",
"\xE2\x93\x85" => "\xE2\x93\x9F",
"\xE2\x93\x86" => "\xE2\x93\xA0",
"\xE2\x93\x87" => "\xE2\x93\xA1",
"\xE2\x93\x88" => "\xE2\x93\xA2",
"\xE2\x93\x89" => "\xE2\x93\xA3",
"\xE2\x93\x8A" => "\xE2\x93\xA4",
"\xE2\x93\x8B" => "\xE2\x93\xA5",
"\xE2\x93\x8C" => "\xE2\x93\xA6",
"\xE2\x93\x8D" => "\xE2\x93\xA7",
"\xE2\x93\x8E" => "\xE2\x93\xA8",
"\xE2\x93\x8F" => "\xE2\x93\xA9",
"\xE2\xB0\x80" => "\xE2\xB0\xB0",
"\xE2\xB0\x81" => "\xE2\xB0\xB1",
"\xE2\xB0\x82" => "\xE2\xB0\xB2",
"\xE2\xB0\x83" => "\xE2\xB0\xB3",
"\xE2\xB0\x84" => "\xE2\xB0\xB4",
"\xE2\xB0\x85" => "\xE2\xB0\xB5",
"\xE2\xB0\x86" => "\xE2\xB0\xB6",
"\xE2\xB0\x87" => "\xE2\xB0\xB7",
"\xE2\xB0\x88" => "\xE2\xB0\xB8",
"\xE2\xB0\x89" => "\xE2\xB0\xB9",
"\xE2\xB0\x8A" => "\xE2\xB0\xBA",
"\xE2\xB0\x8B" => "\xE2\xB0\xBB",
"\xE2\xB0\x8C" => "\xE2\xB0\xBC",
"\xE2\xB0\x8D" => "\xE2\xB0\xBD",
"\xE2\xB0\x8E" => "\xE2\xB0\xBE",
"\xE2\xB0\x8F" => "\xE2\xB0\xBF",
"\xE2\xB0\x90" => "\xE2\xB1\x80",
"\xE2\xB0\x91" => "\xE2\xB1\x81",
"\xE2\xB0\x92" => "\xE2\xB1\x82",
"\xE2\xB0\x93" => "\xE2\xB1\x83",
"\xE2\xB0\x94" => "\xE2\xB1\x84",
"\xE2\xB0\x95" => "\xE2\xB1\x85",
"\xE2\xB0\x96" => "\xE2\xB1\x86",
"\xE2\xB0\x97" => "\xE2\xB1\x87",
"\xE2\xB0\x98" => "\xE2\xB1\x88",
"\xE2\xB0\x99" => "\xE2\xB1\x89",
"\xE2\xB0\x9A" => "\xE2\xB1\x8A",
"\xE2\xB0\x9B" => "\xE2\xB1\x8B",
"\xE2\xB0\x9C" => "\xE2\xB1\x8C",
"\xE2\xB0\x9D" => "\xE2\xB1\x8D",
"\xE2\xB0\x9E" => "\xE2\xB1\x8E",
"\xE2\xB0\x9F" => "\xE2\xB1\x8F",
"\xE2\xB0\xA0" => "\xE2\xB1\x90",
"\xE2\xB0\xA1" => "\xE2\xB1\x91",
"\xE2\xB0\xA2" => "\xE2\xB1\x92",
"\xE2\xB0\xA3" => "\xE2\xB1\x93",
"\xE2\xB0\xA4" => "\xE2\xB1\x94",
"\xE2\xB0\xA5" => "\xE2\xB1\x95",
"\xE2\xB0\xA6" => "\xE2\xB1\x96",
"\xE2\xB0\xA7" => "\xE2\xB1\x97",
"\xE2\xB0\xA8" => "\xE2\xB1\x98",
"\xE2\xB0\xA9" => "\xE2\xB1\x99",
"\xE2\xB0\xAA" => "\xE2\xB1\x9A",
"\xE2\xB0\xAB" => "\xE2\xB1\x9B",
"\xE2\xB0\xAC" => "\xE2\xB1\x9C",
"\xE2\xB0\xAD" => "\xE2\xB1\x9D",
"\xE2\xB0\xAE" => "\xE2\xB1\x9E",
"\xE2\xB0\xAF" => "\xE2\xB1\x9F",
"\xE2\xB1\xA0" => "\xE2\xB1\xA1",
"\xE2\xB1\xA2" => "\xC9\xAB",
"\xE2\xB1\xA3" => "\xE1\xB5\xBD",
"\xE2\xB1\xA4" => "\xC9\xBD",
"\xE2\xB1\xA7" => "\xE2\xB1\xA8",
"\xE2\xB1\xA9" => "\xE2\xB1\xAA",
"\xE2\xB1\xAB" => "\xE2\xB1\xAC",
"\xE2\xB1\xAD" => "\xC9\x91",
"\xE2\xB1\xAE" => "\xC9\xB1",
"\xE2\xB1\xAF" => "\xC9\x90",
"\xE2\xB1\xB0" => "\xC9\x92",
"\xE2\xB1\xB2" => "\xE2\xB1\xB3",
"\xE2\xB1\xB5" => "\xE2\xB1\xB6",
"\xE2\xB1\xBE" => "\xC8\xBF",
"\xE2\xB1\xBF" => "\xC9\x80",
"\xE2\xB2\x80" => "\xE2\xB2\x81",
"\xE2\xB2\x82" => "\xE2\xB2\x83",
"\xE2\xB2\x84" => "\xE2\xB2\x85",
"\xE2\xB2\x86" => "\xE2\xB2\x87",
"\xE2\xB2\x88" => "\xE2\xB2\x89",
"\xE2\xB2\x8A" => "\xE2\xB2\x8B",
"\xE2\xB2\x8C" => "\xE2\xB2\x8D",
"\xE2\xB2\x8E" => "\xE2\xB2\x8F",
"\xE2\xB2\x90" => "\xE2\xB2\x91",
"\xE2\xB2\x92" => "\xE2\xB2\x93",
"\xE2\xB2\x94" => "\xE2\xB2\x95",
"\xE2\xB2\x96" => "\xE2\xB2\x97",
"\xE2\xB2\x98" => "\xE2\xB2\x99",
"\xE2\xB2\x9A" => "\xE2\xB2\x9B",
"\xE2\xB2\x9C" => "\xE2\xB2\x9D",
"\xE2\xB2\x9E" => "\xE2\xB2\x9F",
"\xE2\xB2\xA0" => "\xE2\xB2\xA1",
"\xE2\xB2\xA2" => "\xE2\xB2\xA3",
"\xE2\xB2\xA4" => "\xE2\xB2\xA5",
"\xE2\xB2\xA6" => "\xE2\xB2\xA7",
"\xE2\xB2\xA8" => "\xE2\xB2\xA9",
"\xE2\xB2\xAA" => "\xE2\xB2\xAB",
"\xE2\xB2\xAC" => "\xE2\xB2\xAD",
"\xE2\xB2\xAE" => "\xE2\xB2\xAF",
"\xE2\xB2\xB0" => "\xE2\xB2\xB1",
"\xE2\xB2\xB2" => "\xE2\xB2\xB3",
"\xE2\xB2\xB4" => "\xE2\xB2\xB5",
"\xE2\xB2\xB6" => "\xE2\xB2\xB7",
"\xE2\xB2\xB8" => "\xE2\xB2\xB9",
"\xE2\xB2\xBA" => "\xE2\xB2\xBB",
"\xE2\xB2\xBC" => "\xE2\xB2\xBD",
"\xE2\xB2\xBE" => "\xE2\xB2\xBF",
"\xE2\xB3\x80" => "\xE2\xB3\x81",
"\xE2\xB3\x82" => "\xE2\xB3\x83",
"\xE2\xB3\x84" => "\xE2\xB3\x85",
"\xE2\xB3\x86" => "\xE2\xB3\x87",
"\xE2\xB3\x88" => "\xE2\xB3\x89",
"\xE2\xB3\x8A" => "\xE2\xB3\x8B",
"\xE2\xB3\x8C" => "\xE2\xB3\x8D",
"\xE2\xB3\x8E" => "\xE2\xB3\x8F",
"\xE2\xB3\x90" => "\xE2\xB3\x91",
"\xE2\xB3\x92" => "\xE2\xB3\x93",
"\xE2\xB3\x94" => "\xE2\xB3\x95",
"\xE2\xB3\x96" => "\xE2\xB3\x97",
"\xE2\xB3\x98" => "\xE2\xB3\x99",
"\xE2\xB3\x9A" => "\xE2\xB3\x9B",
"\xE2\xB3\x9C" => "\xE2\xB3\x9D",
"\xE2\xB3\x9E" => "\xE2\xB3\x9F",
"\xE2\xB3\xA0" => "\xE2\xB3\xA1",
"\xE2\xB3\xA2" => "\xE2\xB3\xA3",
"\xE2\xB3\xAB" => "\xE2\xB3\xAC",
"\xE2\xB3\xAD" => "\xE2\xB3\xAE",
"\xE2\xB3\xB2" => "\xE2\xB3\xB3",
"\xEA\x99\x80" => "\xEA\x99\x81",
"\xEA\x99\x82" => "\xEA\x99\x83",
"\xEA\x99\x84" => "\xEA\x99\x85",
"\xEA\x99\x86" => "\xEA\x99\x87",
"\xEA\x99\x88" => "\xEA\x99\x89",
"\xEA\x99\x8A" => "\xEA\x99\x8B",
"\xEA\x99\x8C" => "\xEA\x99\x8D",
"\xEA\x99\x8E" => "\xEA\x99\x8F",
"\xEA\x99\x90" => "\xEA\x99\x91",
"\xEA\x99\x92" => "\xEA\x99\x93",
"\xEA\x99\x94" => "\xEA\x99\x95",
"\xEA\x99\x96" => "\xEA\x99\x97",
"\xEA\x99\x98" => "\xEA\x99\x99",
"\xEA\x99\x9A" => "\xEA\x99\x9B",
"\xEA\x99\x9C" => "\xEA\x99\x9D",
"\xEA\x99\x9E" => "\xEA\x99\x9F",
"\xEA\x99\xA0" => "\xEA\x99\xA1",
"\xEA\x99\xA2" => "\xEA\x99\xA3",
"\xEA\x99\xA4" => "\xEA\x99\xA5",
"\xEA\x99\xA6" => "\xEA\x99\xA7",
"\xEA\x99\xA8" => "\xEA\x99\xA9",
"\xEA\x99\xAA" => "\xEA\x99\xAB",
"\xEA\x99\xAC" => "\xEA\x99\xAD",
"\xEA\x9A\x80" => "\xEA\x9A\x81",
"\xEA\x9A\x82" => "\xEA\x9A\x83",
"\xEA\x9A\x84" => "\xEA\x9A\x85",
"\xEA\x9A\x86" => "\xEA\x9A\x87",
"\xEA\x9A\x88" => "\xEA\x9A\x89",
"\xEA\x9A\x8A" => "\xEA\x9A\x8B",
"\xEA\x9A\x8C" => "\xEA\x9A\x8D",
"\xEA\x9A\x8E" => "\xEA\x9A\x8F",
"\xEA\x9A\x90" => "\xEA\x9A\x91",
"\xEA\x9A\x92" => "\xEA\x9A\x93",
"\xEA\x9A\x94" => "\xEA\x9A\x95",
"\xEA\x9A\x96" => "\xEA\x9A\x97",
"\xEA\x9A\x98" => "\xEA\x9A\x99",
"\xEA\x9A\x9A" => "\xEA\x9A\x9B",
"\xEA\x9C\xA2" => "\xEA\x9C\xA3",
"\xEA\x9C\xA4" => "\xEA\x9C\xA5",
"\xEA\x9C\xA6" => "\xEA\x9C\xA7",
"\xEA\x9C\xA8" => "\xEA\x9C\xA9",
"\xEA\x9C\xAA" => "\xEA\x9C\xAB",
"\xEA\x9C\xAC" => "\xEA\x9C\xAD",
"\xEA\x9C\xAE" => "\xEA\x9C\xAF",
"\xEA\x9C\xB2" => "\xEA\x9C\xB3",
"\xEA\x9C\xB4" => "\xEA\x9C\xB5",
"\xEA\x9C\xB6" => "\xEA\x9C\xB7",
"\xEA\x9C\xB8" => "\xEA\x9C\xB9",
"\xEA\x9C\xBA" => "\xEA\x9C\xBB",
"\xEA\x9C\xBC" => "\xEA\x9C\xBD",
"\xEA\x9C\xBE" => "\xEA\x9C\xBF",
"\xEA\x9D\x80" => "\xEA\x9D\x81",
"\xEA\x9D\x82" => "\xEA\x9D\x83",
"\xEA\x9D\x84" => "\xEA\x9D\x85",
"\xEA\x9D\x86" => "\xEA\x9D\x87",
"\xEA\x9D\x88" => "\xEA\x9D\x89",
"\xEA\x9D\x8A" => "\xEA\x9D\x8B",
"\xEA\x9D\x8C" => "\xEA\x9D\x8D",
"\xEA\x9D\x8E" => "\xEA\x9D\x8F",
"\xEA\x9D\x90" => "\xEA\x9D\x91",
"\xEA\x9D\x92" => "\xEA\x9D\x93",
"\xEA\x9D\x94" => "\xEA\x9D\x95",
"\xEA\x9D\x96" => "\xEA\x9D\x97",
"\xEA\x9D\x98" => "\xEA\x9D\x99",
"\xEA\x9D\x9A" => "\xEA\x9D\x9B",
"\xEA\x9D\x9C" => "\xEA\x9D\x9D",
"\xEA\x9D\x9E" => "\xEA\x9D\x9F",
"\xEA\x9D\xA0" => "\xEA\x9D\xA1",
"\xEA\x9D\xA2" => "\xEA\x9D\xA3",
"\xEA\x9D\xA4" => "\xEA\x9D\xA5",
"\xEA\x9D\xA6" => "\xEA\x9D\xA7",
"\xEA\x9D\xA8" => "\xEA\x9D\xA9",
"\xEA\x9D\xAA" => "\xEA\x9D\xAB",
"\xEA\x9D\xAC" => "\xEA\x9D\xAD",
"\xEA\x9D\xAE" => "\xEA\x9D\xAF",
"\xEA\x9D\xB9" => "\xEA\x9D\xBA",
"\xEA\x9D\xBB" => "\xEA\x9D\xBC",
"\xEA\x9D\xBD" => "\xE1\xB5\xB9",
"\xEA\x9D\xBE" => "\xEA\x9D\xBF",
"\xEA\x9E\x80" => "\xEA\x9E\x81",
"\xEA\x9E\x82" => "\xEA\x9E\x83",
"\xEA\x9E\x84" => "\xEA\x9E\x85",
"\xEA\x9E\x86" => "\xEA\x9E\x87",
"\xEA\x9E\x8B" => "\xEA\x9E\x8C",
"\xEA\x9E\x8D" => "\xC9\xA5",
"\xEA\x9E\x90" => "\xEA\x9E\x91",
"\xEA\x9E\x92" => "\xEA\x9E\x93",
"\xEA\x9E\x96" => "\xEA\x9E\x97",
"\xEA\x9E\x98" => "\xEA\x9E\x99",
"\xEA\x9E\x9A" => "\xEA\x9E\x9B",
"\xEA\x9E\x9C" => "\xEA\x9E\x9D",
"\xEA\x9E\x9E" => "\xEA\x9E\x9F",
"\xEA\x9E\xA0" => "\xEA\x9E\xA1",
"\xEA\x9E\xA2" => "\xEA\x9E\xA3",
"\xEA\x9E\xA4" => "\xEA\x9E\xA5",
"\xEA\x9E\xA6" => "\xEA\x9E\xA7",
"\xEA\x9E\xA8" => "\xEA\x9E\xA9",
"\xEA\x9E\xAA" => "\xC9\xA6",
"\xEA\x9E\xAB" => "\xC9\x9C",
"\xEA\x9E\xAC" => "\xC9\xA1",
"\xEA\x9E\xAD" => "\xC9\xAC",
"\xEA\x9E\xAE" => "\xC9\xAA",
"\xEA\x9E\xB0" => "\xCA\x9E",
"\xEA\x9E\xB1" => "\xCA\x87",
"\xEA\x9E\xB2" => "\xCA\x9D",
"\xEA\x9E\xB3" => "\xEA\xAD\x93",
"\xEA\x9E\xB4" => "\xEA\x9E\xB5",
"\xEA\x9E\xB6" => "\xEA\x9E\xB7",
"\xEA\x9E\xB8" => "\xEA\x9E\xB9",
"\xEA\x9E\xBA" => "\xEA\x9E\xBB",
"\xEA\x9E\xBC" => "\xEA\x9E\xBD",
"\xEA\x9E\xBE" => "\xEA\x9E\xBF",
"\xEA\x9F\x80" => "\xEA\x9F\x81",
"\xEA\x9F\x82" => "\xEA\x9F\x83",
"\xEA\x9F\x84" => "\xEA\x9E\x94",
"\xEA\x9F\x85" => "\xCA\x82",
"\xEA\x9F\x86" => "\xE1\xB6\x8E",
"\xEA\x9F\x87" => "\xEA\x9F\x88",
"\xEA\x9F\x89" => "\xEA\x9F\x8A",
"\xEA\x9F\x90" => "\xEA\x9F\x91",
"\xEA\x9F\x96" => "\xEA\x9F\x97",
"\xEA\x9F\x98" => "\xEA\x9F\x99",
"\xEA\x9F\xB5" => "\xEA\x9F\xB6",
"\xEF\xAC\x80" => "\xEF\xAC\x80",
"\xEF\xAC\x81" => "\xEF\xAC\x81",
"\xEF\xAC\x82" => "\xEF\xAC\x82",
"\xEF\xAC\x83" => "\xEF\xAC\x83",
"\xEF\xAC\x84" => "\xEF\xAC\x84",
"\xEF\xAC\x85" => "\xEF\xAC\x85",
"\xEF\xAC\x86" => "\xEF\xAC\x86",
"\xEF\xAC\x93" => "\xEF\xAC\x93",
"\xEF\xAC\x94" => "\xEF\xAC\x94",
"\xEF\xAC\x95" => "\xEF\xAC\x95",
"\xEF\xAC\x96" => "\xEF\xAC\x96",
"\xEF\xAC\x97" => "\xEF\xAC\x97",
"\xEF\xBC\xA1" => "\xEF\xBD\x81",
"\xEF\xBC\xA2" => "\xEF\xBD\x82",
"\xEF\xBC\xA3" => "\xEF\xBD\x83",
"\xEF\xBC\xA4" => "\xEF\xBD\x84",
"\xEF\xBC\xA5" => "\xEF\xBD\x85",
"\xEF\xBC\xA6" => "\xEF\xBD\x86",
"\xEF\xBC\xA7" => "\xEF\xBD\x87",
"\xEF\xBC\xA8" => "\xEF\xBD\x88",
"\xEF\xBC\xA9" => "\xEF\xBD\x89",
"\xEF\xBC\xAA" => "\xEF\xBD\x8A",
"\xEF\xBC\xAB" => "\xEF\xBD\x8B",
"\xEF\xBC\xAC" => "\xEF\xBD\x8C",
"\xEF\xBC\xAD" => "\xEF\xBD\x8D",
"\xEF\xBC\xAE" => "\xEF\xBD\x8E",
"\xEF\xBC\xAF" => "\xEF\xBD\x8F",
"\xEF\xBC\xB0" => "\xEF\xBD\x90",
"\xEF\xBC\xB1" => "\xEF\xBD\x91",
"\xEF\xBC\xB2" => "\xEF\xBD\x92",
"\xEF\xBC\xB3" => "\xEF\xBD\x93",
"\xEF\xBC\xB4" => "\xEF\xBD\x94",
"\xEF\xBC\xB5" => "\xEF\xBD\x95",
"\xEF\xBC\xB6" => "\xEF\xBD\x96",
"\xEF\xBC\xB7" => "\xEF\xBD\x97",
"\xEF\xBC\xB8" => "\xEF\xBD\x98",
"\xEF\xBC\xB9" => "\xEF\xBD\x99",
"\xEF\xBC\xBA" => "\xEF\xBD\x9A",
);
}

?>

./Sources/Unicode/CaseUpper.php

This operation isn't vital to the installation of this mod.
Find: Select
* @version 2.1.0
Replace With: Select
* @version 2.1.3
Find: Select
function utf8_strtoupper_maps()
Replace With: Select
function utf8_strtoupper_simple_maps()
Find: Select
"\xF0\x9E\xA5\x82" => "\xF0\x9E\xA4\xA0",
"\xF0\x9E\xA5\x83" => "\xF0\x9E\xA4\xA1",
);
}

Replace With: Select
"\xF0\x9E\xA5\x82" => "\xF0\x9E\xA4\xA0",
"\xF0\x9E\xA5\x83" => "\xF0\x9E\xA4\xA1",
);
}

/**
* Helper function for utf8_strtoupper.
*
* Developers: Do not update the data in this function manually. Instead,
* run "php -f other/update_unicode_data.php" on the command line.
*
* @return array Lowercase to uppercase maps.
*/
function utf8_strtoupper_maps()
{
return array(
"\x61" => "\x41",
"\x62" => "\x42",
"\x63" => "\x43",
"\x64" => "\x44",
"\x65" => "\x45",
"\x66" => "\x46",
"\x67" => "\x47",
"\x68" => "\x48",
"\x69" => "\x49",
"\x6A" => "\x4A",
"\x6B" => "\x4B",
"\x6C" => "\x4C",
"\x6D" => "\x4D",
"\x6E" => "\x4E",
"\x6F" => "\x4F",
"\x70" => "\x50",
"\x71" => "\x51",
"\x72" => "\x52",
"\x73" => "\x53",
"\x74" => "\x54",
"\x75" => "\x55",
"\x76" => "\x56",
"\x77" => "\x57",
"\x78" => "\x58",
"\x79" => "\x59",
"\x7A" => "\x5A",
"\xC2\xB5" => "\xCE\x9C",
"\xC3\x9F" => "\x53\x53",
"\xC3\xA0" => "\xC3\x80",
"\xC3\xA1" => "\xC3\x81",
"\xC3\xA2" => "\xC3\x82",
"\xC3\xA3" => "\xC3\x83",
"\xC3\xA4" => "\xC3\x84",
"\xC3\xA5" => "\xC3\x85",
"\xC3\xA6" => "\xC3\x86",
"\xC3\xA7" => "\xC3\x87",
"\xC3\xA8" => "\xC3\x88",
"\xC3\xA9" => "\xC3\x89",
"\xC3\xAA" => "\xC3\x8A",
"\xC3\xAB" => "\xC3\x8B",
"\xC3\xAC" => "\xC3\x8C",
"\xC3\xAD" => "\xC3\x8D",
"\xC3\xAE" => "\xC3\x8E",
"\xC3\xAF" => "\xC3\x8F",
"\xC3\xB0" => "\xC3\x90",
"\xC3\xB1" => "\xC3\x91",
"\xC3\xB2" => "\xC3\x92",
"\xC3\xB3" => "\xC3\x93",
"\xC3\xB4" => "\xC3\x94",
"\xC3\xB5" => "\xC3\x95",
"\xC3\xB6" => "\xC3\x96",
"\xC3\xB8" => "\xC3\x98",
"\xC3\xB9" => "\xC3\x99",
"\xC3\xBA" => "\xC3\x9A",
"\xC3\xBB" => "\xC3\x9B",
"\xC3\xBC" => "\xC3\x9C",
"\xC3\xBD" => "\xC3\x9D",
"\xC3\xBE" => "\xC3\x9E",
"\xC3\xBF" => "\xC5\xB8",
"\xC4\x81" => "\xC4\x80",
"\xC4\x83" => "\xC4\x82",
"\xC4\x85" => "\xC4\x84",
"\xC4\x87" => "\xC4\x86",
"\xC4\x89" => "\xC4\x88",
"\xC4\x8B" => "\xC4\x8A",
"\xC4\x8D" => "\xC4\x8C",
"\xC4\x8F" => "\xC4\x8E",
"\xC4\x91" => "\xC4\x90",
"\xC4\x93" => "\xC4\x92",
"\xC4\x95" => "\xC4\x94",
"\xC4\x97" => "\xC4\x96",
"\xC4\x99" => "\xC4\x98",
"\xC4\x9B" => "\xC4\x9A",
"\xC4\x9D" => "\xC4\x9C",
"\xC4\x9F" => "\xC4\x9E",
"\xC4\xA1" => "\xC4\xA0",
"\xC4\xA3" => "\xC4\xA2",
"\xC4\xA5" => "\xC4\xA4",
"\xC4\xA7" => "\xC4\xA6",
"\xC4\xA9" => "\xC4\xA8",
"\xC4\xAB" => "\xC4\xAA",
"\xC4\xAD" => "\xC4\xAC",
"\xC4\xAF" => "\xC4\xAE",
"\xC4\xB0" => "\xC4\xB0",
"\xC4\xB1" => "\x49",
"\xC4\xB3" => "\xC4\xB2",
"\xC4\xB5" => "\xC4\xB4",
"\xC4\xB7" => "\xC4\xB6",
"\xC4\xBA" => "\xC4\xB9",
"\xC4\xBC" => "\xC4\xBB",
"\xC4\xBE" => "\xC4\xBD",
"\xC5\x80" => "\xC4\xBF",
"\xC5\x82" => "\xC5\x81",
"\xC5\x84" => "\xC5\x83",
"\xC5\x86" => "\xC5\x85",
"\xC5\x88" => "\xC5\x87",
"\xC5\x89" => "\xCA\xBC\x4E",
"\xC5\x8B" => "\xC5\x8A",
"\xC5\x8D" => "\xC5\x8C",
"\xC5\x8F" => "\xC5\x8E",
"\xC5\x91" => "\xC5\x90",
"\xC5\x93" => "\xC5\x92",
"\xC5\x95" => "\xC5\x94",
"\xC5\x97" => "\xC5\x96",
"\xC5\x99" => "\xC5\x98",
"\xC5\x9B" => "\xC5\x9A",
"\xC5\x9D" => "\xC5\x9C",
"\xC5\x9F" => "\xC5\x9E",
"\xC5\xA1" => "\xC5\xA0",
"\xC5\xA3" => "\xC5\xA2",
"\xC5\xA5" => "\xC5\xA4",
"\xC5\xA7" => "\xC5\xA6",
"\xC5\xA9" => "\xC5\xA8",
"\xC5\xAB" => "\xC5\xAA",
"\xC5\xAD" => "\xC5\xAC",
"\xC5\xAF" => "\xC5\xAE",
"\xC5\xB1" => "\xC5\xB0",
"\xC5\xB3" => "\xC5\xB2",
"\xC5\xB5" => "\xC5\xB4",
"\xC5\xB7" => "\xC5\xB6",
"\xC5\xBA" => "\xC5\xB9",
"\xC5\xBC" => "\xC5\xBB",
"\xC5\xBE" => "\xC5\xBD",
"\xC5\xBF" => "\x53",
"\xC6\x80" => "\xC9\x83",
"\xC6\x83" => "\xC6\x82",
"\xC6\x85" => "\xC6\x84",
"\xC6\x88" => "\xC6\x87",
"\xC6\x8C" => "\xC6\x8B",
"\xC6\x92" => "\xC6\x91",
"\xC6\x95" => "\xC7\xB6",
"\xC6\x99" => "\xC6\x98",
"\xC6\x9A" => "\xC8\xBD",
"\xC6\x9E" => "\xC8\xA0",
"\xC6\xA1" => "\xC6\xA0",
"\xC6\xA3" => "\xC6\xA2",
"\xC6\xA5" => "\xC6\xA4",
"\xC6\xA8" => "\xC6\xA7",
"\xC6\xAD" => "\xC6\xAC",
"\xC6\xB0" => "\xC6\xAF",
"\xC6\xB4" => "\xC6\xB3",
"\xC6\xB6" => "\xC6\xB5",
"\xC6\xB9" => "\xC6\xB8",
"\xC6\xBD" => "\xC6\xBC",
"\xC6\xBF" => "\xC7\xB7",
"\xC7\x85" => "\xC7\x84",
"\xC7\x86" => "\xC7\x84",
"\xC7\x88" => "\xC7\x87",
"\xC7\x89" => "\xC7\x87",
"\xC7\x8B" => "\xC7\x8A",
"\xC7\x8C" => "\xC7\x8A",
"\xC7\x8E" => "\xC7\x8D",
"\xC7\x90" => "\xC7\x8F",
"\xC7\x92" => "\xC7\x91",
"\xC7\x94" => "\xC7\x93",
"\xC7\x96" => "\xC7\x95",
"\xC7\x98" => "\xC7\x97",
"\xC7\x9A" => "\xC7\x99",
"\xC7\x9C" => "\xC7\x9B",
"\xC7\x9D" => "\xC6\x8E",
"\xC7\x9F" => "\xC7\x9E",
"\xC7\xA1" => "\xC7\xA0",
"\xC7\xA3" => "\xC7\xA2",
"\xC7\xA5" => "\xC7\xA4",
"\xC7\xA7" => "\xC7\xA6",
"\xC7\xA9" => "\xC7\xA8",
"\xC7\xAB" => "\xC7\xAA",
"\xC7\xAD" => "\xC7\xAC",
"\xC7\xAF" => "\xC7\xAE",
"\xC7\xB0" => "\x4A\xCC\x8C",
"\xC7\xB2" => "\xC7\xB1",
"\xC7\xB3" => "\xC7\xB1",
"\xC7\xB5" => "\xC7\xB4",
"\xC7\xB9" => "\xC7\xB8",
"\xC7\xBB" => "\xC7\xBA",
"\xC7\xBD" => "\xC7\xBC",
"\xC7\xBF" => "\xC7\xBE",
"\xC8\x81" => "\xC8\x80",
"\xC8\x83" => "\xC8\x82",
"\xC8\x85" => "\xC8\x84",
"\xC8\x87" => "\xC8\x86",
"\xC8\x89" => "\xC8\x88",
"\xC8\x8B" => "\xC8\x8A",
"\xC8\x8D" => "\xC8\x8C",
"\xC8\x8F" => "\xC8\x8E",
"\xC8\x91" => "\xC8\x90",
"\xC8\x93" => "\xC8\x92",
"\xC8\x95" => "\xC8\x94",
"\xC8\x97" => "\xC8\x96",
"\xC8\x99" => "\xC8\x98",
"\xC8\x9B" => "\xC8\x9A",
"\xC8\x9D" => "\xC8\x9C",
"\xC8\x9F" => "\xC8\x9E",
"\xC8\xA3" => "\xC8\xA2",
"\xC8\xA5" => "\xC8\xA4",
"\xC8\xA7" => "\xC8\xA6",
"\xC8\xA9" => "\xC8\xA8",
"\xC8\xAB" => "\xC8\xAA",
"\xC8\xAD" => "\xC8\xAC",
"\xC8\xAF" => "\xC8\xAE",
"\xC8\xB1" => "\xC8\xB0",
"\xC8\xB3" => "\xC8\xB2",
"\xC8\xBC" => "\xC8\xBB",
"\xC8\xBF" => "\xE2\xB1\xBE",
"\xC9\x80" => "\xE2\xB1\xBF",
"\xC9\x82" => "\xC9\x81",
"\xC9\x87" => "\xC9\x86",
"\xC9\x89" => "\xC9\x88",
"\xC9\x8B" => "\xC9\x8A",
"\xC9\x8D" => "\xC9\x8C",
"\xC9\x8F" => "\xC9\x8E",
"\xC9\x90" => "\xE2\xB1\xAF",
"\xC9\x91" => "\xE2\xB1\xAD",
"\xC9\x92" => "\xE2\xB1\xB0",
"\xC9\x93" => "\xC6\x81",
"\xC9\x94" => "\xC6\x86",
"\xC9\x96" => "\xC6\x89",
"\xC9\x97" => "\xC6\x8A",
"\xC9\x99" => "\xC6\x8F",
"\xC9\x9B" => "\xC6\x90",
"\xC9\x9C" => "\xEA\x9E\xAB",
"\xC9\xA0" => "\xC6\x93",
"\xC9\xA1" => "\xEA\x9E\xAC",
"\xC9\xA3" => "\xC6\x94",
"\xC9\xA5" => "\xEA\x9E\x8D",
"\xC9\xA6" => "\xEA\x9E\xAA",
"\xC9\xA8" => "\xC6\x97",
"\xC9\xA9" => "\xC6\x96",
"\xC9\xAA" => "\xEA\x9E\xAE",
"\xC9\xAB" => "\xE2\xB1\xA2",
"\xC9\xAC" => "\xEA\x9E\xAD",
"\xC9\xAF" => "\xC6\x9C",
"\xC9\xB1" => "\xE2\xB1\xAE",
"\xC9\xB2" => "\xC6\x9D",
"\xC9\xB5" => "\xC6\x9F",
"\xC9\xBD" => "\xE2\xB1\xA4",
"\xCA\x80" => "\xC6\xA6",
"\xCA\x82" => "\xEA\x9F\x85",
"\xCA\x83" => "\xC6\xA9",
"\xCA\x87" => "\xEA\x9E\xB1",
"\xCA\x88" => "\xC6\xAE",
"\xCA\x89" => "\xC9\x84",
"\xCA\x8A" => "\xC6\xB1",
"\xCA\x8B" => "\xC6\xB2",
"\xCA\x8C" => "\xC9\x85",
"\xCA\x92" => "\xC6\xB7",
"\xCA\x9D" => "\xEA\x9E\xB2",
"\xCA\x9E" => "\xEA\x9E\xB0",
"\xCD\x85" => "\xCE\x99",
"\xCD\xB1" => "\xCD\xB0",
"\xCD\xB3" => "\xCD\xB2",
"\xCD\xB7" => "\xCD\xB6",
"\xCD\xBB" => "\xCF\xBD",
"\xCD\xBC" => "\xCF\xBE",
"\xCD\xBD" => "\xCF\xBF",
"\xCE\x90" => "\xCE\x99\xCC\x88\xCC\x81",
"\xCE\xAC" => "\xCE\x86",
"\xCE\xAD" => "\xCE\x88",
"\xCE\xAE" => "\xCE\x89",
"\xCE\xAF" => "\xCE\x8A",
"\xCE\xB0" => "\xCE\xA5\xCC\x88\xCC\x81",
"\xCE\xB1" => "\xCE\x91",
"\xCE\xB2" => "\xCE\x92",
"\xCE\xB3" => "\xCE\x93",
"\xCE\xB4" => "\xCE\x94",
"\xCE\xB5" => "\xCE\x95",
"\xCE\xB6" => "\xCE\x96",
"\xCE\xB7" => "\xCE\x97",
"\xCE\xB8" => "\xCE\x98",
"\xCE\xB9" => "\xCE\x99",
"\xCE\xBA" => "\xCE\x9A",
"\xCE\xBB" => "\xCE\x9B",
"\xCE\xBC" => "\xCE\x9C",
"\xCE\xBD" => "\xCE\x9D",
"\xCE\xBE" => "\xCE\x9E",
"\xCE\xBF" => "\xCE\x9F",
"\xCF\x80" => "\xCE\xA0",
"\xCF\x81" => "\xCE\xA1",
"\xCF\x82" => "\xCE\xA3",
"\xCF\x83" => "\xCE\xA3",
"\xCF\x84" => "\xCE\xA4",
"\xCF\x85" => "\xCE\xA5",
"\xCF\x86" => "\xCE\xA6",
"\xCF\x87" => "\xCE\xA7",
"\xCF\x88" => "\xCE\xA8",
"\xCF\x89" => "\xCE\xA9",
"\xCF\x8A" => "\xCE\xAA",
"\xCF\x8B" => "\xCE\xAB",
"\xCF\x8C" => "\xCE\x8C",
"\xCF\x8D" => "\xCE\x8E",
"\xCF\x8E" => "\xCE\x8F",
"\xCF\x90" => "\xCE\x92",
"\xCF\x91" => "\xCE\x98",
"\xCF\x95" => "\xCE\xA6",
"\xCF\x96" => "\xCE\xA0",
"\xCF\x97" => "\xCF\x8F",
"\xCF\x99" => "\xCF\x98",
"\xCF\x9B" => "\xCF\x9A",
"\xCF\x9D" => "\xCF\x9C",
"\xCF\x9F" => "\xCF\x9E",
"\xCF\xA1" => "\xCF\xA0",
"\xCF\xA3" => "\xCF\xA2",
"\xCF\xA5" => "\xCF\xA4",
"\xCF\xA7" => "\xCF\xA6",
"\xCF\xA9" => "\xCF\xA8",
"\xCF\xAB" => "\xCF\xAA",
"\xCF\xAD" => "\xCF\xAC",
"\xCF\xAF" => "\xCF\xAE",
"\xCF\xB0" => "\xCE\x9A",
"\xCF\xB1" => "\xCE\xA1",
"\xCF\xB2" => "\xCF\xB9",
"\xCF\xB3" => "\xCD\xBF",
"\xCF\xB5" => "\xCE\x95",
"\xCF\xB8" => "\xCF\xB7",
"\xCF\xBB" => "\xCF\xBA",
"\xD0\xB0" => "\xD0\x90",
"\xD0\xB1" => "\xD0\x91",
"\xD0\xB2" => "\xD0\x92",
"\xD0\xB3" => "\xD0\x93",
"\xD0\xB4" => "\xD0\x94",
"\xD0\xB5" => "\xD0\x95",
"\xD0\xB6" => "\xD0\x96",
"\xD0\xB7" => "\xD0\x97",
"\xD0\xB8" => "\xD0\x98",
"\xD0\xB9" => "\xD0\x99",
"\xD0\xBA" => "\xD0\x9A",
"\xD0\xBB" => "\xD0\x9B",
"\xD0\xBC" => "\xD0\x9C",
"\xD0\xBD" => "\xD0\x9D",
"\xD0\xBE" => "\xD0\x9E",
"\xD0\xBF" => "\xD0\x9F",
"\xD1\x80" => "\xD0\xA0",
"\xD1\x81" => "\xD0\xA1",
"\xD1\x82" => "\xD0\xA2",
"\xD1\x83" => "\xD0\xA3",
"\xD1\x84" => "\xD0\xA4",
"\xD1\x85" => "\xD0\xA5",
"\xD1\x86" => "\xD0\xA6",
"\xD1\x87" => "\xD0\xA7",
"\xD1\x88" => "\xD0\xA8",
"\xD1\x89" => "\xD0\xA9",
"\xD1\x8A" => "\xD0\xAA",
"\xD1\x8B" => "\xD0\xAB",
"\xD1\x8C" => "\xD0\xAC",
"\xD1\x8D" => "\xD0\xAD",
"\xD1\x8E" => "\xD0\xAE",
"\xD1\x8F" => "\xD0\xAF",
"\xD1\x90" => "\xD0\x80",
"\xD1\x91" => "\xD0\x81",
"\xD1\x92" => "\xD0\x82",
"\xD1\x93" => "\xD0\x83",
"\xD1\x94" => "\xD0\x84",
"\xD1\x95" => "\xD0\x85",
"\xD1\x96" => "\xD0\x86",
"\xD1\x97" => "\xD0\x87",
"\xD1\x98" => "\xD0\x88",
"\xD1\x99" => "\xD0\x89",
"\xD1\x9A" => "\xD0\x8A",
"\xD1\x9B" => "\xD0\x8B",
"\xD1\x9C" => "\xD0\x8C",
"\xD1\x9D" => "\xD0\x8D",
"\xD1\x9E" => "\xD0\x8E",
"\xD1\x9F" => "\xD0\x8F",
"\xD1\xA1" => "\xD1\xA0",
"\xD1\xA3" => "\xD1\xA2",
"\xD1\xA5" => "\xD1\xA4",
"\xD1\xA7" => "\xD1\xA6",
"\xD1\xA9" => "\xD1\xA8",
"\xD1\xAB" => "\xD1\xAA",
"\xD1\xAD" => "\xD1\xAC",
"\xD1\xAF" => "\xD1\xAE",
"\xD1\xB1" => "\xD1\xB0",
"\xD1\xB3" => "\xD1\xB2",
"\xD1\xB5" => "\xD1\xB4",
"\xD1\xB7" => "\xD1\xB6",
"\xD1\xB9" => "\xD1\xB8",
"\xD1\xBB" => "\xD1\xBA",
"\xD1\xBD" => "\xD1\xBC",
"\xD1\xBF" => "\xD1\xBE",
"\xD2\x81" => "\xD2\x80",
"\xD2\x8B" => "\xD2\x8A",
"\xD2\x8D" => "\xD2\x8C",
"\xD2\x8F" => "\xD2\x8E",
"\xD2\x91" => "\xD2\x90",
"\xD2\x93" => "\xD2\x92",
"\xD2\x95" => "\xD2\x94",
"\xD2\x97" => "\xD2\x96",
"\xD2\x99" => "\xD2\x98",
"\xD2\x9B" => "\xD2\x9A",
"\xD2\x9D" => "\xD2\x9C",
"\xD2\x9F" => "\xD2\x9E",
"\xD2\xA1" => "\xD2\xA0",
"\xD2\xA3" => "\xD2\xA2",
"\xD2\xA5" => "\xD2\xA4",
"\xD2\xA7" => "\xD2\xA6",
"\xD2\xA9" => "\xD2\xA8",
"\xD2\xAB" => "\xD2\xAA",
"\xD2\xAD" => "\xD2\xAC",
"\xD2\xAF" => "\xD2\xAE",
"\xD2\xB1" => "\xD2\xB0",
"\xD2\xB3" => "\xD2\xB2",
"\xD2\xB5" => "\xD2\xB4",
"\xD2\xB7" => "\xD2\xB6",
"\xD2\xB9" => "\xD2\xB8",
"\xD2\xBB" => "\xD2\xBA",
"\xD2\xBD" => "\xD2\xBC",
"\xD2\xBF" => "\xD2\xBE",
"\xD3\x82" => "\xD3\x81",
"\xD3\x84" => "\xD3\x83",
"\xD3\x86" => "\xD3\x85",
"\xD3\x88" => "\xD3\x87",
"\xD3\x8A" => "\xD3\x89",
"\xD3\x8C" => "\xD3\x8B",
"\xD3\x8E" => "\xD3\x8D",
"\xD3\x8F" => "\xD3\x80",
"\xD3\x91" => "\xD3\x90",
"\xD3\x93" => "\xD3\x92",
"\xD3\x95" => "\xD3\x94",
"\xD3\x97" => "\xD3\x96",
"\xD3\x99" => "\xD3\x98",
"\xD3\x9B" => "\xD3\x9A",
"\xD3\x9D" => "\xD3\x9C",
"\xD3\x9F" => "\xD3\x9E",
"\xD3\xA1" => "\xD3\xA0",
"\xD3\xA3" => "\xD3\xA2",
"\xD3\xA5" => "\xD3\xA4",
"\xD3\xA7" => "\xD3\xA6",
"\xD3\xA9" => "\xD3\xA8",
"\xD3\xAB" => "\xD3\xAA",
"\xD3\xAD" => "\xD3\xAC",
"\xD3\xAF" => "\xD3\xAE",
"\xD3\xB1" => "\xD3\xB0",
"\xD3\xB3" => "\xD3\xB2",
"\xD3\xB5" => "\xD3\xB4",
"\xD3\xB7" => "\xD3\xB6",
"\xD3\xB9" => "\xD3\xB8",
"\xD3\xBB" => "\xD3\xBA",
"\xD3\xBD" => "\xD3\xBC",
"\xD3\xBF" => "\xD3\xBE",
"\xD4\x81" => "\xD4\x80",
"\xD4\x83" => "\xD4\x82",
"\xD4\x85" => "\xD4\x84",
"\xD4\x87" => "\xD4\x86",
"\xD4\x89" => "\xD4\x88",
"\xD4\x8B" => "\xD4\x8A",
"\xD4\x8D" => "\xD4\x8C",
"\xD4\x8F" => "\xD4\x8E",
"\xD4\x91" => "\xD4\x90",
"\xD4\x93" => "\xD4\x92",
"\xD4\x95" => "\xD4\x94",
"\xD4\x97" => "\xD4\x96",
"\xD4\x99" => "\xD4\x98",
"\xD4\x9B" => "\xD4\x9A",
"\xD4\x9D" => "\xD4\x9C",
"\xD4\x9F" => "\xD4\x9E",
"\xD4\xA1" => "\xD4\xA0",
"\xD4\xA3" => "\xD4\xA2",
"\xD4\xA5" => "\xD4\xA4",
"\xD4\xA7" => "\xD4\xA6",
"\xD4\xA9" => "\xD4\xA8",
"\xD4\xAB" => "\xD4\xAA",
"\xD4\xAD" => "\xD4\xAC",
"\xD4\xAF" => "\xD4\xAE",
"\xD5\xA1" => "\xD4\xB1",
"\xD5\xA2" => "\xD4\xB2",
"\xD5\xA3" => "\xD4\xB3",
"\xD5\xA4" => "\xD4\xB4",
"\xD5\xA5" => "\xD4\xB5",
"\xD5\xA6" => "\xD4\xB6",
"\xD5\xA7" => "\xD4\xB7",
"\xD5\xA8" => "\xD4\xB8",
"\xD5\xA9" => "\xD4\xB9",
"\xD5\xAA" => "\xD4\xBA",
"\xD5\xAB" => "\xD4\xBB",
"\xD5\xAC" => "\xD4\xBC",
"\xD5\xAD" => "\xD4\xBD",
"\xD5\xAE" => "\xD4\xBE",
"\xD5\xAF" => "\xD4\xBF",
"\xD5\xB0" => "\xD5\x80",
"\xD5\xB1" => "\xD5\x81",
"\xD5\xB2" => "\xD5\x82",
"\xD5\xB3" => "\xD5\x83",
"\xD5\xB4" => "\xD5\x84",
"\xD5\xB5" => "\xD5\x85",
"\xD5\xB6" => "\xD5\x86",
"\xD5\xB7" => "\xD5\x87",
"\xD5\xB8" => "\xD5\x88",
"\xD5\xB9" => "\xD5\x89",
"\xD5\xBA" => "\xD5\x8A",
"\xD5\xBB" => "\xD5\x8B",
"\xD5\xBC" => "\xD5\x8C",
"\xD5\xBD" => "\xD5\x8D",
"\xD5\xBE" => "\xD5\x8E",
"\xD5\xBF" => "\xD5\x8F",
"\xD6\x80" => "\xD5\x90",
"\xD6\x81" => "\xD5\x91",
"\xD6\x82" => "\xD5\x92",
"\xD6\x83" => "\xD5\x93",
"\xD6\x84" => "\xD5\x94",
"\xD6\x85" => "\xD5\x95",
"\xD6\x86" => "\xD5\x96",
"\xD6\x87" => "\xD4\xB5\xD5\x92",
"\xF0\x90\x90\xA8" => "\xF0\x90\x90\x80",
"\xF0\x90\x90\xA9" => "\xF0\x90\x90\x81",
"\xF0\x90\x90\xAA" => "\xF0\x90\x90\x82",
"\xF0\x90\x90\xAB" => "\xF0\x90\x90\x83",
"\xF0\x90\x90\xAC" => "\xF0\x90\x90\x84",
"\xF0\x90\x90\xAD" => "\xF0\x90\x90\x85",
"\xF0\x90\x90\xAE" => "\xF0\x90\x90\x86",
"\xF0\x90\x90\xAF" => "\xF0\x90\x90\x87",
"\xF0\x90\x90\xB0" => "\xF0\x90\x90\x88",
"\xF0\x90\x90\xB1" => "\xF0\x90\x90\x89",
"\xF0\x90\x90\xB2" => "\xF0\x90\x90\x8A",
"\xF0\x90\x90\xB3" => "\xF0\x90\x90\x8B",
"\xF0\x90\x90\xB4" => "\xF0\x90\x90\x8C",
"\xF0\x90\x90\xB5" => "\xF0\x90\x90\x8D",
"\xF0\x90\x90\xB6" => "\xF0\x90\x90\x8E",
"\xF0\x90\x90\xB7" => "\xF0\x90\x90\x8F",
"\xF0\x90\x90\xB8" => "\xF0\x90\x90\x90",
"\xF0\x90\x90\xB9" => "\xF0\x90\x90\x91",
"\xF0\x90\x90\xBA" => "\xF0\x90\x90\x92",
"\xF0\x90\x90\xBB" => "\xF0\x90\x90\x93",
"\xF0\x90\x90\xBC" => "\xF0\x90\x90\x94",
"\xF0\x90\x90\xBD" => "\xF0\x90\x90\x95",
"\xF0\x90\x90\xBE" => "\xF0\x90\x90\x96",
"\xF0\x90\x90\xBF" => "\xF0\x90\x90\x97",
"\xF0\x90\x91\x80" => "\xF0\x90\x90\x98",
"\xF0\x90\x91\x81" => "\xF0\x90\x90\x99",
"\xF0\x90\x91\x82" => "\xF0\x90\x90\x9A",
"\xF0\x90\x91\x83" => "\xF0\x90\x90\x9B",
"\xF0\x90\x91\x84" => "\xF0\x90\x90\x9C",
"\xF0\x90\x91\x85" => "\xF0\x90\x90\x9D",
"\xF0\x90\x91\x86" => "\xF0\x90\x90\x9E",
"\xF0\x90\x91\x87" => "\xF0\x90\x90\x9F",
"\xF0\x90\x91\x88" => "\xF0\x90\x90\xA0",
"\xF0\x90\x91\x89" => "\xF0\x90\x90\xA1",
"\xF0\x90\x91\x8A" => "\xF0\x90\x90\xA2",
"\xF0\x90\x91\x8B" => "\xF0\x90\x90\xA3",
"\xF0\x90\x91\x8C" => "\xF0\x90\x90\xA4",
"\xF0\x90\x91\x8D" => "\xF0\x90\x90\xA5",
"\xF0\x90\x91\x8E" => "\xF0\x90\x90\xA6",
"\xF0\x90\x91\x8F" => "\xF0\x90\x90\xA7",
"\xF0\x90\x93\x98" => "\xF0\x90\x92\xB0",
"\xF0\x90\x93\x99" => "\xF0\x90\x92\xB1",
"\xF0\x90\x93\x9A" => "\xF0\x90\x92\xB2",
"\xF0\x90\x93\x9B" => "\xF0\x90\x92\xB3",
"\xF0\x90\x93\x9C" => "\xF0\x90\x92\xB4",
"\xF0\x90\x93\x9D" => "\xF0\x90\x92\xB5",
"\xF0\x90\x93\x9E" => "\xF0\x90\x92\xB6",
"\xF0\x90\x93\x9F" => "\xF0\x90\x92\xB7",
"\xF0\x90\x93\xA0" => "\xF0\x90\x92\xB8",
"\xF0\x90\x93\xA1" => "\xF0\x90\x92\xB9",
"\xF0\x90\x93\xA2" => "\xF0\x90\x92\xBA",
"\xF0\x90\x93\xA3" => "\xF0\x90\x92\xBB",
"\xF0\x90\x93\xA4" => "\xF0\x90\x92\xBC",
"\xF0\x90\x93\xA5" => "\xF0\x90\x92\xBD",
"\xF0\x90\x93\xA6" => "\xF0\x90\x92\xBE",
"\xF0\x90\x93\xA7" => "\xF0\x90\x92\xBF",
"\xF0\x90\x93\xA8" => "\xF0\x90\x93\x80",
"\xF0\x90\x93\xA9" => "\xF0\x90\x93\x81",
"\xF0\x90\x93\xAA" => "\xF0\x90\x93\x82",
"\xF0\x90\x93\xAB" => "\xF0\x90\x93\x83",
"\xF0\x90\x93\xAC" => "\xF0\x90\x93\x84",
"\xF0\x90\x93\xAD" => "\xF0\x90\x93\x85",
"\xF0\x90\x93\xAE" => "\xF0\x90\x93\x86",
"\xF0\x90\x93\xAF" => "\xF0\x90\x93\x87",
"\xF0\x90\x93\xB0" => "\xF0\x90\x93\x88",
"\xF0\x90\x93\xB1" => "\xF0\x90\x93\x89",
"\xF0\x90\x93\xB2" => "\xF0\x90\x93\x8A",
"\xF0\x90\x93\xB3" => "\xF0\x90\x93\x8B",
"\xF0\x90\x93\xB4" => "\xF0\x90\x93\x8C",
"\xF0\x90\x93\xB5" => "\xF0\x90\x93\x8D",
"\xF0\x90\x93\xB6" => "\xF0\x90\x93\x8E",
"\xF0\x90\x93\xB7" => "\xF0\x90\x93\x8F",
"\xF0\x90\x93\xB8" => "\xF0\x90\x93\x90",
"\xF0\x90\x93\xB9" => "\xF0\x90\x93\x91",
"\xF0\x90\x93\xBA" => "\xF0\x90\x93\x92",
"\xF0\x90\x93\xBB" => "\xF0\x90\x93\x93",
"\xF0\x90\x