MediaWiki master
MainConfigSchema.php
Go to the documentation of this file.
1<?php
10// phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
11// phpcs:disable Generic.Files.LineLength.TooLong
12namespace MediaWiki;
13
22use CdnPurgeJob;
27use DateTime;
28use DateTimeZone;
33use EmaillingJob;
37use Generator;
41use InvalidArgumentException;
43use JobQueueDB;
47use LocalRepo;
48use LogFormatter;
51use MediaWiki\Settings\Source\JsonSchemaTrait;
62use NullJob;
69use ReflectionClass;
76use SqlBagOStuff;
89
122 use JsonSchemaTrait;
123
145 public static function listDefaultValues( string $prefix = '' ): Generator {
146 $class = new ReflectionClass( self::class );
147 foreach ( $class->getReflectionConstants() as $const ) {
148 if ( !$const->isPublic() ) {
149 continue;
150 }
151
152 $value = $const->getValue();
153
154 if ( !is_array( $value ) ) {
155 // Just in case we end up having some other kind of constant on this class.
156 continue;
157 }
158
159 if ( isset( $value['obsolete'] ) ) {
160 continue;
161 }
162
163 $name = $const->getName();
164 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
165 }
166 }
167
180 public static function getDefaultValue( string $name ) {
181 $class = new ReflectionClass( self::class );
182 if ( !$class->hasConstant( $name ) ) {
183 throw new InvalidArgumentException( "Unknown setting: $name" );
184 }
185 $value = $class->getConstant( $name );
186
187 if ( !is_array( $value ) ) {
188 // Might happen if we end up having other kinds of constants on this class.
189 throw new InvalidArgumentException( "Unknown setting: $name" );
190 }
191
192 return self::getDefaultFromJsonSchema( $value );
193 }
194
195 /***************************************************************************/
203 public const ConfigRegistry = [
204 'default' => [
205 'main' => 'GlobalVarConfig::newInstance',
206 ],
207 'type' => 'map',
208 ];
209
213 public const Sitename = [
214 'default' => 'MediaWiki',
215 ];
216
217 /***************************************************************************/
218 // region Server URLs and file paths
243 public const Server = [
244 'default' => false,
245 ];
246
256 public const CanonicalServer = [
257 'default' => false,
258 ];
259
266 public const ServerName = [
267 'default' => false,
268 ];
269
276 public const AssumeProxiesUseDefaultProtocolPorts = [
277 'default' => true,
278 'type' => 'boolean',
279 ];
280
291 public const HttpsPort = [
292 'default' => 443,
293 ];
294
312 public const ForceHTTPS = [
313 'default' => false,
314 'type' => 'boolean',
315 ];
316
327 public const ScriptPath = [
328 'default' => '/wiki',
329 ];
330
345 public const UsePathInfo = [
346 'dynamicDefault' => true,
347 ];
348
352 public static function getDefaultUsePathInfo(): bool {
353 // These often break when PHP is set up in CGI mode.
354 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
355 // lighttpd converts incoming path data to lowercase on systems
356 // with case-insensitive filesystems, and there have been reports of
357 // problems on Apache as well.
358 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
359 !str_contains( PHP_SAPI, 'isapi' );
360 }
361
367 public const Script = [
368 'default' => false,
369 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
370 ];
371
376 public static function getDefaultScript( $scriptPath ): string {
377 return "$scriptPath/index.php";
378 }
379
387 public const LoadScript = [
388 'default' => false,
389 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
390 ];
391
396 public static function getDefaultLoadScript( $scriptPath ): string {
397 return "$scriptPath/load.php";
398 }
399
406 public const RestPath = [
407 'default' => false,
408 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
409 ];
410
415 public static function getDefaultRestPath( $scriptPath ): string {
416 return "$scriptPath/rest.php";
417 }
418
426 public const StylePath = [
427 'default' => false,
428 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
429 ];
430
435 public static function getDefaultStylePath( $resourceBasePath ): string {
436 return "$resourceBasePath/skins";
437 }
438
446 public const LocalStylePath = [
447 'default' => false,
448 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
449 ];
450
455 public static function getDefaultLocalStylePath( $scriptPath ): string {
456 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
457 return "$scriptPath/skins";
458 }
459
467 public const ExtensionAssetsPath = [
468 'default' => false,
469 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
470 ];
471
476 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
477 return "$resourceBasePath/extensions";
478 }
479
487 public const ExtensionDirectory = [
488 'default' => null,
489 'type' => '?string',
490 ];
491
499 public const StyleDirectory = [
500 'default' => null,
501 'type' => '?string',
502 ];
503
513 public const BaseDirectory = [
514 'default' => null,
515 ];
516
524 public const ArticlePath = [
525 'default' => false,
526 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
527 ];
528
534 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
535 if ( $usePathInfo ) {
536 return "$script/$1";
537 }
538 return "$script?title=$1";
539 }
540
546 public const UploadPath = [
547 'default' => false,
548 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
549 ];
550
555 public static function getDefaultUploadPath( $scriptPath ): string {
556 return "$scriptPath/images";
557 }
558
571 public const ImgAuthPath = [
572 'default' => false,
573 ];
574
581 public const ThumbPath = [
582 'default' => false,
583 ];
584
588 public const UploadDirectory = [
589 'default' => false,
590 'dynamicDefault' => [ 'use' => [ 'BaseDirectory' ] ]
591 ];
592
597 public static function getDefaultUploadDirectory( $baseDirectory ): string {
598 return "$baseDirectory/images";
599 }
600
606 public const FileCacheDirectory = [
607 'default' => false,
608 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
609 ];
610
615 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
616 return "$uploadDirectory/cache";
617 }
618
627 public const Logo = [
628 'default' => false,
629 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
630 ];
631
636 public static function getDefaultLogo( $resourceBasePath ): string {
637 return "$resourceBasePath/resources/assets/change-your-logo.svg";
638 }
639
689 public const Logos = [
690 'default' => false,
691 'type' => 'map|false',
692 ];
693
723 public const LogoHD = [
724 'default' => false,
725 'type' => 'map|false',
726 'deprecated' => 'since 1.35. Developers should retrieve this logo (and other variants) ' .
727 'using the static function MediaWiki\ResourceLoader\SkinModule::getAvailableLogos. $wgLogos ' .
728 'should be used instead.',
729 ];
730
736 public const Favicon = [
737 'default' => '/favicon.ico',
738 ];
739
747 public const AppleTouchIcon = [
748 'default' => false,
749 ];
750
769 public const ReferrerPolicy = [
770 'default' => false,
771 'type' => 'list|string|false',
772 ];
773
795 public const TmpDirectory = [
796 'default' => false,
797 ];
798
805 public const UploadBaseUrl = [
806 'default' => '',
807 ];
808
821 public const UploadStashScalerBaseUrl = [
822 'default' => false,
823 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
824 ];
825
840 public const ActionPaths = [
841 'default' => [],
842 'type' => 'map',
843 ];
844
851 public const MainPageIsDomainRoot = [
852 'default' => false,
853 'type' => 'boolean',
854 ];
855
856 // endregion -- end of server URLs and file paths
857
858 /***************************************************************************/
859 // region Files and file uploads
871 public const EnableUploads = [
872 'default' => false,
873 ];
874
878 public const UploadStashMaxAge = [
879 'default' => 6 * 3600, // 6 hours
880 ];
881
888 public const EnableAsyncUploads = [
889 'default' => false,
890 ];
891
895 public const UploadMaintenance = [
896 'default' => false,
897 ];
898
908 public const IllegalFileChars = [
909 'default' => ':\\/\\\\',
910 'deprecated' => 'since 1.41; no longer customizable',
911 ];
912
918 public const DeletedDirectory = [
919 'default' => false,
920 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
921 ];
922
927 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
928 return "$uploadDirectory/deleted";
929 }
930
934 public const ImgAuthDetails = [
935 'default' => false,
936 ];
937
953 public const ImgAuthUrlPathMap = [
954 'default' => [],
955 'type' => 'map',
956 ];
957
1092 public const LocalFileRepo = [
1093 'default' => false,
1094 'type' => 'map|false',
1095 'dynamicDefault' => [ 'use' => [ 'UploadDirectory', 'ScriptPath', 'Favicon', 'UploadBaseUrl',
1096 'UploadPath', 'HashedUploadDirectory', 'ThumbnailScriptPath',
1097 'GenerateThumbnailOnParse', 'DeletedDirectory', 'UpdateCompatibleMetadata' ] ],
1098 ];
1099
1100 public static function getDefaultLocalFileRepo(
1101 $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath,
1102 $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory,
1103 $updateCompatibleMetadata
1104 ) {
1105 return [
1106 'class' => LocalRepo::class,
1107 'name' => 'local',
1108 'directory' => $uploadDirectory,
1109 'scriptDirUrl' => $scriptPath,
1110 'favicon' => $favicon,
1111 'url' => $uploadBaseUrl ? $uploadBaseUrl . $uploadPath : $uploadPath,
1112 'hashLevels' => $hashedUploadDirectory ? 2 : 0,
1113 'thumbScriptUrl' => $thumbnailScriptPath,
1114 'transformVia404' => !$generateThumbnailOnParse,
1115 'deletedDir' => $deletedDirectory,
1116 'deletedHashLevels' => $hashedUploadDirectory ? 3 : 0,
1117 'updateCompatibleMetadata' => $updateCompatibleMetadata,
1118 'reserializeMetadata' => $updateCompatibleMetadata,
1119 ];
1120 }
1121
1135 public const ForeignFileRepos = [
1136 'default' => [],
1137 'type' => 'list',
1138 ];
1139
1149 public const UseInstantCommons = [
1150 'default' => false,
1151 ];
1152
1180 public const UseSharedUploads = [
1181 'default' => false,
1182 'type' => 'boolean',
1183 ];
1184
1192 public const SharedUploadDirectory = [
1193 'default' => null,
1194 'type' => '?string',
1195 ];
1196
1204 public const SharedUploadPath = [
1205 'default' => null,
1206 'type' => '?string',
1207 ];
1208
1216 public const HashedSharedUploadDirectory = [
1217 'default' => true,
1218 'type' => 'boolean',
1219 ];
1220
1228 public const RepositoryBaseUrl = [
1229 'default' => 'https://commons.wikimedia.org/wiki/File:',
1230 ];
1231
1239 public const FetchCommonsDescriptions = [
1240 'default' => false,
1241 'type' => 'boolean',
1242 ];
1243
1252 public const SharedUploadDBname = [
1253 'default' => false,
1254 'type' => 'false|string',
1255 ];
1256
1264 public const SharedUploadDBprefix = [
1265 'default' => '',
1266 'type' => 'string',
1267 ];
1268
1276 public const CacheSharedUploads = [
1277 'default' => true,
1278 'type' => 'boolean',
1279 ];
1280
1291 public const ForeignUploadTargets = [
1292 'default' => [ 'local', ],
1293 'type' => 'list',
1294 ];
1295
1305 public const UploadDialog = [
1306 'default' =>
1307 [
1308 'fields' =>
1309 [
1310 'description' => true,
1311 'date' => false,
1312 'categories' => false,
1313 ],
1314 'licensemessages' =>
1315 [
1316 'local' => 'generic-local',
1317 'foreign' => 'generic-foreign',
1318 ],
1319 'comment' =>
1320 [
1321 'local' => '',
1322 'foreign' => '',
1323 ],
1324 'format' =>
1325 [
1326 'filepage' => '$DESCRIPTION',
1327 'description' => '$TEXT',
1328 'ownwork' => '',
1329 'license' => '',
1330 'uncategorized' => '',
1331 ],
1332 ],
1333 'type' => 'map',
1334 ];
1335
1372 public const FileBackends = [
1373 'default' => [],
1374 'type' => 'map',
1375 ];
1376
1388 public const LockManagers = [
1389 'default' => [],
1390 'type' => 'list',
1391 ];
1392
1408 public const ShowEXIF = [
1409 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1410 ];
1411
1415 public static function getDefaultShowEXIF(): bool {
1416 return function_exists( 'exif_read_data' );
1417 }
1418
1422 public const UpdateCompatibleMetadata = [
1423 'default' => false,
1424 ];
1425
1432 public const AllowCopyUploads = [
1433 'default' => false,
1434 ];
1435
1441 public const CopyUploadsDomains = [
1442 'default' => [],
1443 'type' => 'list',
1444 ];
1445
1451 public const CopyUploadsFromSpecialUpload = [
1452 'default' => false,
1453 ];
1454
1460 public const CopyUploadProxy = [
1461 'default' => false,
1462 ];
1463
1472 public const CopyUploadTimeout = [
1473 'default' => false,
1474 'type' => 'false|integer',
1475 ];
1476
1483 public const CopyUploadAllowOnWikiDomainConfig = [
1484 'default' => false,
1485 ];
1486
1507 public const MaxUploadSize = [
1508 'default' => 1024 * 1024 * 100,
1509 ];
1510
1525 public const MinUploadChunkSize = [
1526 'default' => 1024,
1527 ];
1528
1540 public const UploadNavigationUrl = [
1541 'default' => false,
1542 ];
1543
1549 public const UploadMissingFileUrl = [
1550 'default' => false,
1551 ];
1552
1566 public const ThumbnailScriptPath = [
1567 'default' => false,
1568 ];
1569
1577 public const SharedThumbnailScriptPath = [
1578 'default' => false,
1579 'type' => 'string|false',
1580 ];
1581
1587 public const HashedUploadDirectory = [
1588 'default' => true,
1589 'type' => 'boolean',
1590 ];
1591
1600 public const FileExtensions = [
1601 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1602 'type' => 'list',
1603 ];
1604
1613 public const ProhibitedFileExtensions = [
1614 'default' => [
1615 # HTML may contain cookie-stealing JavaScript and web bugs
1616 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1617 # PHP scripts may execute arbitrary code on the server
1618 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1619 # Other types that may be interpreted by some servers
1620 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1621 # May contain harmful executables for Windows victims
1622 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1623 # T341565
1624 'xml',
1625 ],
1626 'type' => 'list',
1627 ];
1628
1635 public const MimeTypeExclusions = [
1636 'default' => [
1637 # HTML may contain cookie-stealing JavaScript and web bugs
1638 'text/html',
1639 # Similarly with JavaScript itself
1640 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1641 # PHP scripts may execute arbitrary code on the server
1642 'application/x-php', 'text/x-php',
1643 # Other types that may be interpreted by some servers
1644 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1645 # Client-side hazards on Internet Explorer
1646 'text/scriptlet', 'application/x-msdownload',
1647 # Windows metafile, client-side vulnerability on some systems
1648 'application/x-msmetafile',
1649 # Files that look like java files
1650 'application/java',
1651 # XML files generally - T341565
1652 'application/xml', 'text/xml',
1653 ],
1654 'type' => 'list',
1655 ];
1656
1662 public const CheckFileExtensions = [
1663 'default' => true,
1664 ];
1665
1672 public const StrictFileExtensions = [
1673 'default' => true,
1674 ];
1675
1682 public const DisableUploadScriptChecks = [
1683 'default' => false,
1684 ];
1685
1689 public const UploadSizeWarning = [
1690 'default' => false,
1691 ];
1692
1704 public const TrustedMediaFormats = [
1705 'default' => [
1706 MEDIATYPE_BITMAP, // all bitmap formats
1707 MEDIATYPE_AUDIO, // all audio formats
1708 MEDIATYPE_VIDEO, // all plain video formats
1709 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1710 "application/pdf", // PDF files
1711 # "application/x-shockwave-flash", //flash/shockwave movie
1712 ],
1713 'type' => 'list',
1714 ];
1715
1724 public const MediaHandlers = [
1725 'default' => [],
1726 'type' => 'map',
1727 ];
1728
1735 public const NativeImageLazyLoading = [
1736 'default' => false,
1737 'type' => 'boolean',
1738 ];
1739
1744 public const ParserTestMediaHandlers = [
1745 'default' => [
1746 'image/jpeg' => 'MockBitmapHandler',
1747 'image/png' => 'MockBitmapHandler',
1748 'image/gif' => 'MockBitmapHandler',
1749 'image/tiff' => 'MockBitmapHandler',
1750 'image/webp' => 'MockBitmapHandler',
1751 'image/x-ms-bmp' => 'MockBitmapHandler',
1752 'image/x-bmp' => 'MockBitmapHandler',
1753 'image/x-xcf' => 'MockBitmapHandler',
1754 'image/svg+xml' => 'MockSvgHandler',
1755 'image/vnd.djvu' => 'MockDjVuHandler',
1756 ],
1757 'type' => 'map',
1758 ];
1759
1765 public const UseImageResize = [
1766 'default' => true,
1767 ];
1768
1778 public const UseImageMagick = [
1779 'default' => false,
1780 ];
1781
1785 public const ImageMagickConvertCommand = [
1786 'default' => '/usr/bin/convert',
1787 ];
1788
1794 public const MaxInterlacingAreas = [
1795 'default' => [],
1796 'type' => 'map',
1797 ];
1798
1802 public const SharpenParameter = [
1803 'default' => '0x0.4',
1804 ];
1805
1809 public const SharpenReductionThreshold = [
1810 'default' => 0.85,
1811 ];
1812
1817 public const ImageMagickTempDir = [
1818 'default' => false,
1819 ];
1820
1833 public const CustomConvertCommand = [
1834 'default' => false,
1835 ];
1836
1842 public const JpegTran = [
1843 'default' => '/usr/bin/jpegtran',
1844 ];
1845
1865 public const JpegPixelFormat = [
1866 'default' => 'yuv420',
1867 ];
1868
1876 public const JpegQuality = [
1877 'default' => 80,
1878 ];
1879
1884 public const Exiv2Command = [
1885 'default' => '/usr/bin/exiv2',
1886 ];
1887
1893 public const Exiftool = [
1894 'default' => '/usr/bin/exiftool',
1895 ];
1896
1907 public const SVGConverters = [
1908 'default' => [
1909 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1910 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
1911 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
1912 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1913 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1914 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
1915 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1916 ],
1917 'type' => 'map',
1918 ];
1919
1923 public const SVGConverter = [
1924 'default' => 'ImageMagick',
1925 ];
1926
1930 public const SVGConverterPath = [
1931 'default' => '',
1932 ];
1933
1937 public const SVGMaxSize = [
1938 'default' => 5120,
1939 ];
1940
1946 public const SVGMetadataCutoff = [
1947 'default' => 262144,
1948 ];
1949
1960 public const SVGNativeRendering = [
1961 'default' => false,
1962 'type' => 'string|boolean',
1963 ];
1964
1972 public const SVGNativeRenderingSizeLimit = [
1973 'default' => 50 * 1024,
1974 ];
1975
1985 public const MediaInTargetLanguage = [
1986 'default' => true,
1987 ];
1988
2006 public const MaxImageArea = [
2007 'default' => 12500000,
2008 'type' => 'string|integer|false',
2009 ];
2010
2019 public const MaxAnimatedGifArea = [
2020 'default' => 12500000,
2021 ];
2022
2038 public const TiffThumbnailType = [
2039 'default' => [],
2040 'type' => 'list',
2041 'mergeStrategy' => 'replace',
2042 ];
2043
2051 public const ThumbnailEpoch = [
2052 'default' => '20030516000000',
2053 ];
2054
2062 public const AttemptFailureEpoch = [
2063 'default' => 1,
2064 ];
2065
2077 public const IgnoreImageErrors = [
2078 'default' => false,
2079 ];
2080
2101 public const GenerateThumbnailOnParse = [
2102 'default' => true,
2103 'type' => 'boolean',
2104 ];
2105
2109 public const ShowArchiveThumbnails = [
2110 'default' => true,
2111 ];
2112
2118 public const EnableAutoRotation = [
2119 'default' => null,
2120 'type' => '?boolean',
2121 ];
2122
2128 public const Antivirus = [
2129 'default' => null,
2130 'type' => '?string',
2131 ];
2132
2168 public const AntivirusSetup = [
2169 'default' => [
2170 # setup for clamav
2171 'clamav' => [
2172 'command' => 'clamscan --no-summary ',
2173 'codemap' => [
2174 "0" => AV_NO_VIRUS, # no virus
2175 "1" => AV_VIRUS_FOUND, # virus found
2176 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2177 "*" => AV_SCAN_FAILED, # else scan failed
2178 ],
2179 'messagepattern' => '/.*?:(.*)/sim',
2180 ],
2181 ],
2182 'type' => 'map',
2183 ];
2184
2188 public const AntivirusRequired = [
2189 'default' => true,
2190 ];
2191
2195 public const VerifyMimeType = [
2196 'default' => true,
2197 ];
2198
2209 public const MimeTypeFile = [
2210 'default' => 'internal',
2211 ];
2212
2218 public const MimeInfoFile = [
2219 'default' => 'internal',
2220 ];
2221
2235 public const MimeDetectorCommand = [
2236 'default' => null,
2237 'type' => '?string',
2238 ];
2239
2245 public const TrivialMimeDetection = [
2246 'default' => false,
2247 ];
2248
2254 public const XMLMimeTypes = [
2255 'default' => [
2256 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2257 'svg' => 'image/svg+xml',
2258 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2259 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2260 'html' => 'text/html',
2261 ],
2262 'type' => 'map',
2263 ];
2264
2275 public const ImageLimits = [
2276 'default' => [
2277 [ 320, 240 ],
2278 [ 640, 480 ],
2279 [ 800, 600 ],
2280 [ 1024, 768 ],
2281 [ 1280, 1024 ],
2282 [ 2560, 2048 ],
2283 ],
2284 'type' => 'list',
2285 ];
2286
2292 public const ThumbLimits = [
2293 'default' => [
2294 120,
2295 150,
2296 180,
2297 200,
2298 250,
2299 300
2300 ],
2301 'type' => 'list',
2302 ];
2303
2309 public const ThumbnailNamespaces = [
2310 'default' => [ NS_FILE ],
2311 'type' => 'list',
2312 'items' => [ 'type' => 'integer', ],
2313 ];
2314
2325 public const ThumbnailBuckets = [
2326 'default' => null,
2327 'type' => '?list',
2328 ];
2329
2345 public const ThumbnailMinimumBucketDistance = [
2346 'default' => 50,
2347 ];
2348
2358 public const UploadThumbnailRenderMap = [
2359 'default' => [],
2360 'type' => 'map',
2361 ];
2362
2374 public const UploadThumbnailRenderMethod = [
2375 'default' => 'jobqueue',
2376 ];
2377
2384 public const UploadThumbnailRenderHttpCustomHost = [
2385 'default' => false,
2386 ];
2387
2394 public const UploadThumbnailRenderHttpCustomDomain = [
2395 'default' => false,
2396 ];
2397
2405 public const UseTinyRGBForJPGThumbnails = [
2406 'default' => false,
2407 ];
2408
2424 public const GalleryOptions = [
2425 'default' => [],
2426 'type' => 'map',
2427 ];
2428
2434 public const ThumbUpright = [
2435 'default' => 0.75,
2436 ];
2437
2441 public const DirectoryMode = [
2442 'default' => 0777, // octal!
2443 ];
2444
2451 public const ResponsiveImages = [
2452 'default' => true,
2453 ];
2454
2471 public const ImagePreconnect = [
2472 'default' => false,
2473 ];
2474
2475 /***************************************************************************/
2476 // region DJVU settings
2484 public const DjvuDump = [
2485 'default' => null,
2486 'type' => '?string',
2487 ];
2488
2494 public const DjvuRenderer = [
2495 'default' => null,
2496 'type' => '?string',
2497 ];
2498
2504 public const DjvuTxt = [
2505 'default' => null,
2506 'type' => '?string',
2507 ];
2508
2514 public const DjvuPostProcessor = [
2515 'default' => 'pnmtojpeg',
2516 'type' => '?string',
2517 ];
2518
2522 public const DjvuOutputExtension = [
2523 'default' => 'jpg',
2524 ];
2525
2526 // endregion -- end of DJvu
2527
2528 // endregion -- end of file uploads
2529
2530 /***************************************************************************/
2531 // region Email settings
2539 public const EmergencyContact = [
2540 'default' => false,
2541 ];
2542
2551 public const PasswordSender = [
2552 'default' => false,
2553 ];
2554
2560 public const NoReplyAddress = [
2561 'default' => false,
2562 ];
2563
2569 public const EnableEmail = [
2570 'default' => true,
2571 ];
2572
2578 public const EnableUserEmail = [
2579 'default' => true,
2580 ];
2581
2589 public const EnableSpecialMute = [
2590 'default' => false,
2591 ];
2592
2598 public const EnableUserEmailMuteList = [
2599 'default' => false,
2600 ];
2601
2611 public const UserEmailUseReplyTo = [
2612 'default' => true,
2613 ];
2614
2619 public const PasswordReminderResendTime = [
2620 'default' => 24,
2621 ];
2622
2626 public const NewPasswordExpiry = [
2627 'default' => 3600 * 24 * 7,
2628 ];
2629
2633 public const UserEmailConfirmationTokenExpiry = [
2634 'default' => 7 * 24 * 60 * 60,
2635 ];
2636
2641 public const PasswordExpirationDays = [
2642 'default' => false,
2643 ];
2644
2649 public const PasswordExpireGrace = [
2650 'default' => 3600 * 24 * 7,
2651 ];
2652
2670 public const SMTP = [
2671 'default' => false,
2672 'type' => 'false|map',
2673 ];
2674
2678 public const AdditionalMailParams = [
2679 'default' => null,
2680 ];
2681
2686 public const AllowHTMLEmail = [
2687 'default' => false,
2688 ];
2689
2699 public const EnotifFromEditor = [
2700 'default' => false,
2701 'type' => 'boolean',
2702 ];
2703
2710 public const EmailAuthentication = [
2711 'default' => true,
2712 ];
2713
2717 public const EnotifWatchlist = [
2718 'default' => false,
2719 ];
2720
2728 public const EnotifUserTalk = [
2729 'default' => false,
2730 ];
2731
2744 public const EnotifRevealEditorAddress = [
2745 'default' => false,
2746 'type' => 'boolean',
2747 ];
2748
2762 public const EnotifMinorEdits = [
2763 'default' => true,
2764 ];
2765
2773 public const EnotifImpersonal = [
2774 'default' => false,
2775 ];
2776
2781 public const EnotifMaxRecips = [
2782 'default' => 500,
2783 ];
2784
2788 public const EnotifUseRealName = [
2789 'default' => false,
2790 ];
2791
2796 public const UsersNotifiedOnAllChanges = [
2797 'default' => [],
2798 'type' => 'map',
2799 ];
2800
2801 // endregion -- end of email settings
2802
2803 /***************************************************************************/
2804 // region Database settings
2815 public const DBname = [
2816 'default' => 'my_wiki',
2817 ];
2818
2827 public const DBmwschema = [
2828 'default' => null,
2829 'type' => '?string',
2830 ];
2831
2840 public const DBprefix = [
2841 'default' => '',
2842 ];
2843
2847 public const DBserver = [
2848 'default' => 'localhost',
2849 ];
2850
2854 public const DBport = [
2855 'default' => 5432,
2856 ];
2857
2861 public const DBuser = [
2862 'default' => 'wikiuser',
2863 ];
2864
2868 public const DBpassword = [
2869 'default' => '',
2870 ];
2871
2875 public const DBtype = [
2876 'default' => 'mysql',
2877 ];
2878
2886 public const DBssl = [
2887 'default' => false,
2888 ];
2889
2898 public const DBcompress = [
2899 'default' => false,
2900 ];
2901
2905 public const DBadminuser = [
2906 'default' => null,
2907 ];
2908
2912 public const DBadminpassword = [
2913 'default' => null,
2914 ];
2915
2927 public const SearchType = [
2928 'default' => null,
2929 ];
2930
2943 public const SearchTypeAlternatives = [
2944 'default' => null,
2945 ];
2946
2950 public const DBTableOptions = [
2951 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2952 ];
2953
2961 public const SQLMode = [
2962 'default' => '',
2963 ];
2964
2972 public const DBDefaultGroup = [
2973 'default' => null,
2974 ];
2975
2979 public const SQLiteDataDir = [
2980 'default' => '',
2981 ];
2982
3003 public const SharedDB = [
3004 'default' => null,
3005 ];
3006
3010 public const SharedPrefix = [
3011 'default' => false,
3012 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3013 ];
3014
3019 public static function getDefaultSharedPrefix( $dbPrefix ) {
3020 return $dbPrefix;
3021 }
3022
3027 public const SharedTables = [
3028 'default' => [
3029 'user',
3030 'user_properties',
3031 'user_autocreate_serial',
3032 ],
3033 'type' => 'list',
3034 ];
3035
3040 public const SharedSchema = [
3041 'default' => false,
3042 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3043 ];
3044
3049 public static function getDefaultSharedSchema( $dbMwschema ) {
3050 return $dbMwschema;
3051 }
3052
3107 public const DBservers = [
3108 'default' => false,
3109 'type' => 'false|list',
3110 ];
3111
3122 public const LBFactoryConf = [
3123 'default' => [
3124 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3125 ],
3126 'type' => 'map',
3127 'mergeStrategy' => 'replace',
3128 ];
3129
3141 public const DataCenterUpdateStickTTL = [
3142 'default' => 10,
3143 ];
3144
3148 public const DBerrorLog = [
3149 'default' => false,
3150 ];
3151
3172 public const DBerrorLogTZ = [
3173 'default' => false,
3174 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3175 ];
3176
3177 public static function getDefaultDBerrorLogTZ( $localtimezone ) {
3178 // NOTE: Extra fallback, in case $localtimezone is ''.
3179 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3180 // in them, erroneously generated by the installer.
3181 return $localtimezone ?: self::getDefaultLocaltimezone();
3182 }
3183
3197 public const LocalDatabases = [
3198 'default' => [],
3199 'type' => 'list',
3200 'items' => [ 'type' => 'string', ],
3201 ];
3202
3210 public const DatabaseReplicaLagWarning = [
3211 'default' => 10,
3212 ];
3213
3218 public const DatabaseReplicaLagCritical = [
3219 'default' => 30,
3220 ];
3221
3228 public const MaxExecutionTimeForExpensiveQueries = [
3229 'default' => 0,
3230 ];
3231
3247 public const VirtualDomainsMapping = [
3248 'default' => [],
3249 'type' => 'map',
3250 ];
3251
3266 public const TemplateLinksSchemaMigrationStage = [
3268 'type' => 'integer',
3269 ];
3270
3282 public const PageLinksSchemaMigrationStage = [
3284 'type' => 'integer',
3285 ];
3286
3305 public const ExternalLinksDomainGaps = [
3306 'default' => [],
3307 'type' => 'map',
3308 ];
3309
3310 // endregion -- End of DB settings
3311
3312 /***************************************************************************/
3313 // region Content handlers and storage
3324 public const ContentHandlers = [
3325 'default' =>
3326 [
3327 // the usual case
3329 'class' => WikitextContentHandler::class,
3330 'services' => [
3331 'TitleFactory',
3332 'ParserFactory',
3333 'GlobalIdGenerator',
3334 'LanguageNameUtils',
3335 'LinkRenderer',
3336 'MagicWordFactory',
3337 'ParsoidParserFactory',
3338 ],
3339 ],
3340 // dumb version, no syntax highlighting
3341 CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
3342 // simple implementation, for use by extensions, etc.
3343 CONTENT_MODEL_JSON => JsonContentHandler::class,
3344 // dumb version, no syntax highlighting
3345 CONTENT_MODEL_CSS => CssContentHandler::class,
3346 // plain text, for use by extensions, etc.
3347 CONTENT_MODEL_TEXT => TextContentHandler::class,
3348 // fallback for unknown models, from imports or extensions that were removed
3349 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3350 ],
3351 'type' => 'map',
3352 ];
3353
3365 public const NamespaceContentModels = [
3366 'default' => [],
3367 'type' => 'map',
3368 ];
3369
3381 public const ContentHandlerTextFallback = [
3382 'default' => 'ignore',
3383 'deprecated' => 'since 1.37',
3384 ];
3385
3401 public const TextModelsToParse = [
3402 'default' => [
3403 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3404 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3405 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3406 ],
3407 'type' => 'list',
3408 ];
3409
3416 public const CompressRevisions = [
3417 'default' => false,
3418 ];
3419
3429 public const ExternalStores = [
3430 'default' => [],
3431 'type' => 'list',
3432 ];
3433
3453 public const ExternalServers = [
3454 'default' => [],
3455 'type' => 'map',
3456 ];
3457
3470 public const DefaultExternalStore = [
3471 'default' => false,
3472 'type' => 'list|false',
3473 ];
3474
3481 public const RevisionCacheExpiry = [
3482 'default' => 86400 * 7,
3483 'type' => 'integer',
3484 ];
3485
3492 public const PageLanguageUseDB = [
3493 'default' => false,
3494 'type' => 'boolean',
3495 ];
3496
3509 public const DiffEngine = [
3510 'default' => null,
3511 'type' => '?string',
3512 ];
3513
3517 public const ExternalDiffEngine = [
3518 'default' => false,
3519 'type' => 'string|false',
3520 ];
3521
3546 public const Wikidiff2Options = [
3547 'default' => [],
3548 'type' => 'map'
3549 ];
3550
3551 // endregion -- end of Content handlers and storage
3552
3553 /***************************************************************************/
3554 // region Performance hacks and limits
3566 public const RequestTimeLimit = [
3567 'default' => null,
3568 'type' => '?integer',
3569 ];
3570
3580 public const TransactionalTimeLimit = [
3581 'default' => 120,
3582 ];
3583
3598 public const CriticalSectionTimeLimit = [
3599 'default' => 180.0,
3600 'type' => 'float',
3601 ];
3602
3606 public const MiserMode = [
3607 'default' => false,
3608 ];
3609
3613 public const DisableQueryPages = [
3614 'default' => false,
3615 ];
3616
3620 public const QueryCacheLimit = [
3621 'default' => 1000,
3622 ];
3623
3627 public const WantedPagesThreshold = [
3628 'default' => 1,
3629 ];
3630
3634 public const AllowSlowParserFunctions = [
3635 'default' => false,
3636 ];
3637
3641 public const AllowSchemaUpdates = [
3642 'default' => true,
3643 ];
3644
3648 public const MaxArticleSize = [
3649 'default' => 2048,
3650 ];
3651
3656 public const MemoryLimit = [
3657 'default' => '50M',
3658 ];
3659
3703 public const PoolCounterConf = [
3704 'default' => null,
3705 'type' => '?map',
3706 ];
3707
3720 public const PoolCountClientConf = [
3721 'default' => [
3722 'servers' => [
3723 '127.0.0.1'
3724 ],
3725 'timeout' => 0.1,
3726 ],
3727 'type' => 'map',
3728 ];
3729
3737 public const MaxUserDBWriteDuration = [
3738 'default' => false,
3739 'type' => 'integer|false',
3740 ];
3741
3749 public const MaxJobDBWriteDuration = [
3750 'default' => false,
3751 'type' => 'integer|false',
3752 ];
3753
3758 public const LinkHolderBatchSize = [
3759 'default' => 1000,
3760 ];
3761
3765 public const MaximumMovedPages = [
3766 'default' => 100,
3767 ];
3768
3781 public const ForceDeferredUpdatesPreSend = [
3782 'default' => false,
3783 ];
3784
3794 public const MultiShardSiteStats = [
3795 'default' => false,
3796 'type' => 'boolean',
3797 ];
3798
3799 // endregion -- end performance hacks
3800
3801 /***************************************************************************/
3802 // region Cache settings
3813 public const CacheDirectory = [
3814 'default' => false,
3815 ];
3816
3841 public const MainCacheType = [
3842 'default' => CACHE_NONE,
3843 ];
3844
3851 public const MessageCacheType = [
3852 'default' => CACHE_ANYTHING,
3853 ];
3854
3880 public const ParserCacheType = [
3881 'default' => CACHE_ANYTHING,
3882 ];
3883
3891 public const SessionCacheType = [
3892 'default' => CACHE_ANYTHING,
3893 ];
3894
3903 public const LanguageConverterCacheType = [
3904 'default' => CACHE_ANYTHING,
3905 ];
3906
3971 public const ObjectCaches = [
3972 'default' => [
3973 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
3974 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
3975
3976 CACHE_ANYTHING => [ 'factory' => 'ObjectCache::newAnything' ],
3977 CACHE_ACCEL => [ 'factory' => 'ObjectCache::getLocalServerInstance' ],
3978
3979 'db-replicated' => [
3980 'class' => ReplicatedBagOStuff::class,
3981 'readFactory' => [
3982 'factory' => 'ObjectCache::newFromParams',
3983 'args' => [ [ 'class' => SqlBagOStuff::class, 'replicaOnly' => true ] ]
3984 ],
3985 'writeFactory' => [
3986 'factory' => 'ObjectCache::newFromParams',
3987 'args' => [ [ 'class' => SqlBagOStuff::class, 'replicaOnly' => false ] ]
3988 ],
3989 'loggroup' => 'SQLBagOStuff',
3990 'reportDupes' => false
3991 ],
3992 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
3993 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
3994 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
3995
3996 // Deprecated since 1.35.
3997 // - To configure a wg*CacheType variable to use the local server cache,
3998 // use CACHE_ACCEL instead, which will select these automatically.
3999 // - To access the object for the local server cache at run-time,
4000 // use MediaWikiServices::getLocalServerObjectCache()
4001 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
4002 // - To instantiate a new one of these explicitly, do so directly
4003 // by using `new APCUBagOStuff( [ … ] )`
4004 // - To instantiate a new one of these including auto-detection and fallback,
4005 // use ObjectCache::makeLocalServerCache().
4006 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4007 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4008 'wincache' => [ 'class' => WinCacheBagOStuff::class, 'reportDupes' => false ],
4009 ],
4010 'type' => 'map',
4011 ];
4012
4020 public const WANObjectCache = [
4021 'default' => [],
4022 'type' => 'map',
4023 ];
4024
4045 public const MicroStashType = [
4046 'default' => CACHE_ANYTHING,
4047 'type' => 'string|int',
4048 ];
4049
4078 public const MainStash = [
4079 'default' => 'db-replicated',
4080 ];
4081
4110 public const ParsoidCacheConfig = [
4111 'type' => 'object',
4112 'properties' => [
4113 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4114 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4115 'CacheThresholdTime' => [ 'type' => 'float', 'default' => 0.0 ],
4116 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4117 ]
4118 ];
4119
4135 public const ChronologyProtectorStash = [
4136 'default' => null,
4137 'type' => '?string',
4138 ];
4139
4145 public const ChronologyProtectorSecret = [
4146 'default' => '',
4147 'type' => 'string',
4148 ];
4149
4155 public const ParserCacheExpireTime = [
4156 'default' => 60 * 60 * 24,
4157 ];
4158
4164 public const OldRevisionParserCacheExpireTime = [
4165 'default' => 60 * 60,
4166 ];
4167
4171 public const ObjectCacheSessionExpiry = [
4172 'default' => 60 * 60,
4173 ];
4174
4187 public const PHPSessionHandling = [
4188 'default' => 'enable',
4189 'type' => 'string',
4190 ];
4191
4199 public const SuspiciousIpExpiry = [
4200 'default' => false,
4201 'type' => 'integer|false',
4202 ];
4203
4209 public const SessionPbkdf2Iterations = [
4210 'default' => 10001,
4211 ];
4212
4216 public const MemCachedServers = [
4217 'default' => [ '127.0.0.1:11211', ],
4218 'type' => 'list',
4219 ];
4220
4225 public const MemCachedPersistent = [
4226 'default' => false,
4227 ];
4228
4232 public const MemCachedTimeout = [
4233 'default' => 500000,
4234 ];
4235
4247 public const UseLocalMessageCache = [
4248 'default' => false,
4249 ];
4250
4258 public const AdaptiveMessageCache = [
4259 'default' => false,
4260 ];
4261
4293 public const LocalisationCacheConf = [
4294 'properties' => [
4295 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4296 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4297 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4298 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4299 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4300 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4301 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4302 ],
4303 'type' => 'object',
4304 ];
4305
4309 public const CachePages = [
4310 'default' => true,
4311 ];
4312
4322 public const CacheEpoch = [
4323 'default' => '20030516000000',
4324 ];
4325
4330 public const GitInfoCacheDirectory = [
4331 'default' => false,
4332 ];
4333
4339 public const UseFileCache = [
4340 'default' => false,
4341 ];
4342
4349 public const FileCacheDepth = [
4350 'default' => 2,
4351 ];
4352
4357 public const RenderHashAppend = [
4358 'default' => '',
4359 ];
4360
4370 public const EnableSidebarCache = [
4371 'default' => false,
4372 ];
4373
4377 public const SidebarCacheExpiry = [
4378 'default' => 86400,
4379 ];
4380
4387 public const UseGzip = [
4388 'default' => false,
4389 ];
4390
4400 public const InvalidateCacheOnLocalSettingsChange = [
4401 'default' => true,
4402 ];
4403
4418 public const ExtensionInfoMTime = [
4419 'default' => false,
4420 'type' => 'integer|false',
4421 ];
4422
4429 public const EnableRemoteBagOStuffTests = [
4430 'default' => false,
4431 ];
4432
4433 // endregion -- end of cache settings
4434
4435 /***************************************************************************/
4436 // region HTTP proxy (CDN) settings
4455 public const UseCdn = [
4456 'default' => false,
4457 ];
4458
4467 public const VaryOnXFP = [
4468 'default' => false,
4469 ];
4470
4480 public const InternalServer = [
4481 'default' => false,
4482 ];
4483
4493 public const CdnMaxAge = [
4494 'default' => 18000,
4495 ];
4496
4503 public const CdnMaxageLagged = [
4504 'default' => 30,
4505 ];
4506
4513 public const CdnMaxageStale = [
4514 'default' => 10,
4515 ];
4516
4532 public const CdnReboundPurgeDelay = [
4533 'default' => 0,
4534 ];
4535
4542 public const CdnMaxageSubstitute = [
4543 'default' => 60,
4544 ];
4545
4551 public const ForcedRawSMaxage = [
4552 'default' => 300,
4553 ];
4554
4565 public const CdnServers = [
4566 'default' => [],
4567 'type' => 'map',
4568 ];
4569
4578 public const CdnServersNoPurge = [
4579 'default' => [],
4580 'type' => 'map',
4581 ];
4582
4603 public const SquidPurgeUseHostHeader = [
4604 'default' => true,
4605 'deprecated' => 'since 1.33',
4606 ];
4607
4656 public const HTCPRouting = [
4657 'default' => [],
4658 'type' => 'map',
4659 ];
4660
4666 public const HTCPMulticastTTL = [
4667 'default' => 1,
4668 ];
4669
4673 public const UsePrivateIPs = [
4674 'default' => false,
4675 ];
4676
4688 public const CdnMatchParameterOrder = [
4689 'default' => true,
4690 ];
4691
4692 // endregion -- end of HTTP proxy settings
4693
4694 /***************************************************************************/
4695 // region Language, regional and character encoding settings
4715 public const LanguageCode = [
4716 'default' => 'en',
4717 ];
4718
4730 public const GrammarForms = [
4731 'default' => [],
4732 'type' => 'map',
4733 ];
4734
4738 public const InterwikiMagic = [
4739 'default' => true,
4740 ];
4741
4745 public const HideInterlanguageLinks = [
4746 'default' => false,
4747 ];
4748
4769 public const ExtraInterlanguageLinkPrefixes = [
4770 'default' => [],
4771 'type' => 'list',
4772 ];
4773
4781 public const InterlanguageLinkCodeMap = [
4782 'default' => [],
4783 'type' => 'map',
4784 ];
4785
4789 public const ExtraLanguageNames = [
4790 'default' => [],
4791 'type' => 'map',
4792 ];
4793
4808 public const ExtraLanguageCodes = [
4809 'default' => [
4810 'bh' => 'bho',
4811 'no' => 'nb',
4812 'simple' => 'en',
4813 ],
4814 'type' => 'map',
4815 ];
4816
4825 public const DummyLanguageCodes = [
4826 'default' => [],
4827 'type' => 'map',
4828 ];
4829
4837 public const AllUnicodeFixes = [
4838 'default' => false,
4839 ];
4840
4851 public const LegacyEncoding = [
4852 'default' => false,
4853 ];
4854
4859 public const AmericanDates = [
4860 'default' => false,
4861 ];
4862
4867 public const TranslateNumerals = [
4868 'default' => true,
4869 ];
4870
4876 public const UseDatabaseMessages = [
4877 'default' => true,
4878 ];
4879
4883 public const MaxMsgCacheEntrySize = [
4884 'default' => 10000,
4885 ];
4886
4890 public const DisableLangConversion = [
4891 'default' => false,
4892 ];
4893
4897 public const DisableTitleConversion = [
4898 'default' => false,
4899 ];
4900
4905 public const DefaultLanguageVariant = [
4906 'default' => false,
4907 ];
4908
4913 public const UsePigLatinVariant = [
4914 'default' => false,
4915 ];
4916
4927 public const DisabledVariants = [
4928 'default' => [],
4929 'type' => 'map',
4930 ];
4931
4950 public const VariantArticlePath = [
4951 'default' => false,
4952 ];
4953
4969 public const UseXssLanguage = [
4970 'default' => false,
4971 ];
4972
4978 public const LoginLanguageSelector = [
4979 'default' => false,
4980 ];
4981
5002 public const ForceUIMsgAsContentMsg = [
5003 'default' => [],
5004 'type' => 'map',
5005 ];
5006
5019 public const RawHtmlMessages = [
5020 'default' => [
5021 'copyright',
5022 'history_copyright',
5023 'googlesearch',
5024 'youhavenewmessagesmanyusers',
5025 'youhavenewmessages',
5026 ],
5027 'type' => 'list',
5028 'items' => [ 'type' => 'string', ],
5029 ];
5030
5055 public const Localtimezone = [
5056 'dynamicDefault' => true,
5057 ];
5058
5059 public static function getDefaultLocaltimezone(): string {
5060 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5061 // it falls back to UTC.
5062 $localtimezone = date_default_timezone_get();
5063 if ( !$localtimezone ) {
5064 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5065 // returned garbage.
5066 $localtimezone = 'UTC';
5067 }
5068
5069 return $localtimezone;
5070 }
5071
5081 public const LocalTZoffset = [
5082 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5083 ];
5084
5085 public static function getDefaultLocalTZoffset( $localtimezone ): int {
5086 // NOTE: Extra fallback, in case $localtimezone is ''.
5087 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5088 // in them, erroneously generated by the installer.
5089 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5090
5091 $offset = ( new DateTimeZone( $localtimezone ) )->getOffset( new DateTime() );
5092 return (int)( $offset / 60 );
5093 }
5094
5103 public const OverrideUcfirstCharacters = [
5104 'default' => [],
5105 'type' => 'map',
5106 ];
5107
5108 // endregion -- End of language/charset settings
5109
5110 /***************************************************************************/
5111 // region Output format and skin settings
5117 public const MimeType = [
5118 'default' => 'text/html',
5119 ];
5120
5130 public const Html5Version = [
5131 'default' => null,
5132 ];
5133
5143 public const HTMLFormAllowTableFormat = [
5144 'default' => true,
5145 ];
5146
5155 public const UseMediaWikiUIEverywhere = [
5156 'default' => false,
5157 ];
5158
5166 public const EditSubmitButtonLabelPublish = [
5167 'default' => false,
5168 ];
5169
5186 public const XhtmlNamespaces = [
5187 'default' => [],
5188 'type' => 'map',
5189 ];
5190
5198 public const SiteNotice = [
5199 'default' => '',
5200 ];
5201
5213 public const BrowserFormatDetection = [
5214 'default' => 'telephone=no',
5215 'type' => 'string',
5216 ];
5217
5226 public const SkinMetaTags = [
5227 'default' => [],
5228 'type' => 'map',
5229 ];
5230
5235 public const DefaultSkin = [
5236 'default' => 'vector-2022',
5237 ];
5238
5244 public const FallbackSkin = [
5245 'default' => 'fallback',
5246 ];
5247
5258 public const SkipSkins = [
5259 'default' => [],
5260 'type' => 'map',
5261 ];
5262
5266 public const DisableOutputCompression = [
5267 'default' => false,
5268 ];
5269
5299 public const FragmentMode = [
5300 'default' => [ 'html5', 'legacy', ],
5301 'type' => 'list',
5302 ];
5303
5312 public const ExternalInterwikiFragmentMode = [
5313 'default' => 'legacy',
5314 ];
5315
5347 public const FooterIcons = [
5348 'default' => [
5349 "copyright" => [
5350 "copyright" => [], // placeholder for the built in copyright icon
5351 ],
5352 "poweredby" => [
5353 "mediawiki" => [
5354 // Defaults to point at
5355 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5356 // plus srcset for 1.5x, 2x resolution variants.
5357 "src" => null,
5358 "url" => "https://www.mediawiki.org/",
5359 "alt" => "Powered by MediaWiki",
5360 ]
5361 ],
5362 ],
5363 'type' => 'map',
5364 ];
5365
5373 public const UseCombinedLoginLink = [
5374 'default' => false,
5375 ];
5376
5380 public const Edititis = [
5381 'default' => false,
5382 ];
5383
5395 public const Send404Code = [
5396 'default' => true,
5397 ];
5398
5409 public const ShowRollbackEditCount = [
5410 'default' => 10,
5411 ];
5412
5419 public const EnableCanonicalServerLink = [
5420 'default' => false,
5421 ];
5422
5436 public const InterwikiLogoOverride = [
5437 'default' => [],
5438 'type' => 'list',
5439 'items' => [ 'type' => 'string', ],
5440 ];
5441
5442 // endregion -- End of output format settings
5443
5444 /***************************************************************************/
5445 // region ResourceLoader settings
5455 public const MangleFlashPolicy = [
5456 'default' => true,
5457 'obsolete' => 'Since 1.39; no longer has any effect.',
5458 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5459 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5460 ];
5461
5781 public const ResourceModules = [
5782 'default' => [],
5783 'type' => 'map',
5784 ];
5785
5880 public const ResourceModuleSkinStyles = [
5881 'default' => [],
5882 'type' => 'map',
5883 ];
5884
5896 public const ResourceLoaderSources = [
5897 'default' => [],
5898 'type' => 'map',
5899 ];
5900
5906 public const ResourceBasePath = [
5907 'default' => null,
5908 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
5909 ];
5910
5915 public static function getDefaultResourceBasePath( $scriptPath ): string {
5916 return $scriptPath;
5917 }
5918
5931 public const ResourceLoaderMaxage = [
5932 'default' => [],
5933 'type' => 'map',
5934 ];
5935
5942 public const ResourceLoaderUseObjectCacheForDeps = [
5943 'default' => false,
5944 ];
5945
5951 public const ResourceLoaderDebug = [
5952 'default' => false,
5953 ];
5954
5967 public const ResourceLoaderMaxQueryLength = [
5968 'default' => false,
5969 'type' => 'integer|false',
5970 ];
5971
5979 public const ResourceLoaderValidateJS = [
5980 'default' => true,
5981 ];
5982
5991 public const ResourceLoaderEnableJSProfiler = [
5992 'default' => false,
5993 ];
5994
5999 public const ResourceLoaderStorageEnabled = [
6000 'default' => true,
6001 ];
6002
6009 public const ResourceLoaderStorageVersion = [
6010 'default' => 1,
6011 ];
6012
6019 public const ResourceLoaderEnableSourceMapLinks = [
6020 'default' => true,
6021 ];
6022
6034 public const AllowSiteCSSOnRestrictedPages = [
6035 'default' => false,
6036 ];
6037
6048 public const VueDevelopmentMode = [
6049 'default' => false,
6050 ];
6051
6052 // endregion -- End of ResourceLoader settings
6053
6054 /***************************************************************************/
6055 // region Page titles and redirects
6062 public const MetaNamespace = [
6063 'default' => false,
6064 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6065 ];
6066
6071 public static function getDefaultMetaNamespace( $sitename ): string {
6072 return str_replace( ' ', '_', $sitename );
6073 }
6074
6082 public const MetaNamespaceTalk = [
6083 'default' => false,
6084 ];
6085
6092 public const CanonicalNamespaceNames = [
6093 'default' => NamespaceInfo::CANONICAL_NAMES,
6094 'type' => 'map',
6095 ];
6096
6123 public const ExtraNamespaces = [
6124 'default' => [],
6125 'type' => 'map',
6126 ];
6127
6136 public const ExtraGenderNamespaces = [
6137 'default' => [],
6138 'type' => 'map',
6139 ];
6140
6163 public const NamespaceAliases = [
6164 'default' => [],
6165 'type' => 'map',
6166 ];
6167
6194 public const LegalTitleChars = [
6195 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6196 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6197 ];
6198
6206 public const CapitalLinks = [
6207 'default' => true,
6208 ];
6209
6224 public const CapitalLinkOverrides = [
6225 'default' => [],
6226 'type' => 'map',
6227 ];
6228
6233 public const NamespacesWithSubpages = [
6234 'default' => [
6235 NS_TALK => true,
6236 NS_USER => true,
6237 NS_USER_TALK => true,
6238 NS_PROJECT => true,
6239 NS_PROJECT_TALK => true,
6240 NS_FILE_TALK => true,
6241 NS_MEDIAWIKI => true,
6242 NS_MEDIAWIKI_TALK => true,
6243 NS_TEMPLATE => true,
6244 NS_TEMPLATE_TALK => true,
6245 NS_HELP => true,
6246 NS_HELP_TALK => true,
6248 ],
6249 'type' => 'map',
6250 ];
6251
6258 public const ContentNamespaces = [
6259 'default' => [ NS_MAIN ],
6260 'type' => 'list',
6261 ];
6262
6271 public const ShortPagesNamespaceExclusions = [
6272 'default' => [],
6273 'type' => 'list',
6274 ];
6275
6284 public const ExtraSignatureNamespaces = [
6285 'default' => [],
6286 'type' => 'list',
6287 ];
6288
6300 public const InvalidRedirectTargets = [
6301 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6302 'type' => 'list',
6303 ];
6304
6313 public const DisableHardRedirects = [
6314 'default' => false,
6315 ];
6316
6322 public const FixDoubleRedirects = [
6323 'default' => false,
6324 ];
6325
6326 // endregion -- End of title and interwiki settings
6327
6328 /***************************************************************************/
6329 // region Interwiki links and sites
6338 public const LocalInterwikis = [
6339 'default' => [],
6340 'type' => 'list',
6341 ];
6342
6346 public const InterwikiExpiry = [
6347 'default' => 10800,
6348 ];
6349
6370 public const InterwikiCache = [
6371 'default' => false,
6372 'type' => 'false|map',
6373 'mergeStrategy' => 'replace',
6374 ];
6375
6383 public const InterwikiScopes = [
6384 'default' => 3,
6385 ];
6386
6390 public const InterwikiFallbackSite = [
6391 'default' => 'wiki',
6392 ];
6393
6410 public const RedirectSources = [
6411 'default' => false,
6412 ];
6413
6419 public const SiteTypes = [
6420 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6421 'type' => 'map',
6422 ];
6423
6424 // endregion -- Interwiki links and sites
6425
6426 /***************************************************************************/
6427 // region Parser settings
6435 public const MaxTocLevel = [
6436 'default' => 999,
6437 ];
6438
6443 public const MaxPPNodeCount = [
6444 'default' => 1000000,
6445 ];
6446
6454 public const MaxTemplateDepth = [
6455 'default' => 100,
6456 ];
6457
6461 public const MaxPPExpandDepth = [
6462 'default' => 100,
6463 ];
6464
6475 public const UrlProtocols = [
6476 'default' => [
6477 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6478 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6479 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6480 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:',
6481 '//',
6482 ],
6483 'type' => 'list',
6484 ];
6485
6489 public const CleanSignatures = [
6490 'default' => true,
6491 ];
6492
6496 public const AllowExternalImages = [
6497 'default' => false,
6498 ];
6499
6514 public const AllowExternalImagesFrom = [
6515 'default' => '',
6516 ];
6517
6529 public const EnableImageWhitelist = [
6530 'default' => false,
6531 ];
6532
6544 public const AllowImageTag = [
6545 'default' => false,
6546 'deprecated' => 'since 1.35; register an extension tag named <img> instead.',
6547 ];
6548
6567 public const TidyConfig = [
6568 'default' => [],
6569 'type' => 'map',
6570 ];
6571
6580 public const ParsoidSettings = [
6581 'default' => [
6582 'useSelser' => true,
6583 ],
6584 'type' => 'map',
6585 ];
6586
6595 public const ParserEnableLegacyMediaDOM = [
6596 'default' => false,
6597 'deprecated' => 'since 1.41',
6598 ];
6599
6609 public const UseContentMediaStyles = [
6610 'default' => false,
6611 'deprecated' => 'since 1.41',
6612 ];
6613
6622 public const UseLegacyMediaStyles = [
6623 'default' => false,
6624 ];
6625
6632 public const RawHtml = [
6633 'default' => false,
6634 ];
6635
6645 public const ExternalLinkTarget = [
6646 'default' => false,
6647 ];
6648
6655 public const NoFollowLinks = [
6656 'default' => true,
6657 ];
6658
6664 public const NoFollowNsExceptions = [
6665 'default' => [],
6666 'type' => 'list',
6667 ];
6668
6682 public const NoFollowDomainExceptions = [
6683 'default' => [ 'mediawiki.org', ],
6684 'type' => 'list',
6685 ];
6686
6691 public const RegisterInternalExternals = [
6692 'default' => false,
6693 ];
6694
6698 public const AllowDisplayTitle = [
6699 'default' => true,
6700 ];
6701
6707 public const RestrictDisplayTitle = [
6708 'default' => true,
6709 ];
6710
6715 public const ExpensiveParserFunctionLimit = [
6716 'default' => 100,
6717 ];
6718
6723 public const PreprocessorCacheThreshold = [
6724 'default' => 1000,
6725 ];
6726
6730 public const EnableScaryTranscluding = [
6731 'default' => false,
6732 ];
6733
6739 public const TranscludeCacheExpiry = [
6740 'default' => 3600,
6741 ];
6742
6749 public const EnableMagicLinks = [
6750 'default' => [
6751 'ISBN' => false,
6752 'PMID' => false,
6753 'RFC' => false,
6754 ],
6755 'type' => 'map',
6756 ];
6757
6758 // endregion -- end of parser settings
6759
6760 /***************************************************************************/
6761 // region Statistics and content analysis
6780 public const ArticleCountMethod = [
6781 'default' => 'link',
6782 ];
6783
6792 public const ActiveUserDays = [
6793 'default' => 30,
6794 ];
6795
6808 public const LearnerEdits = [
6809 'default' => 10,
6810 ];
6811
6817 public const LearnerMemberSince = [
6818 'default' => 4,
6819 ];
6820
6826 public const ExperiencedUserEdits = [
6827 'default' => 500,
6828 ];
6829
6835 public const ExperiencedUserMemberSince = [
6836 'default' => 30,
6837 ];
6838
6857 public const ManualRevertSearchRadius = [
6858 'default' => 15,
6859 'type' => 'integer',
6860 ];
6861
6874 public const RevertedTagMaxDepth = [
6875 'default' => 15,
6876 'type' => 'integer',
6877 ];
6878
6879 // endregion -- End of statistics and content analysis
6880
6881 /***************************************************************************/
6882 // region User accounts, authentication
6891 public const CentralIdLookupProviders = [
6892 'default' => [
6893 'local' => [
6894 'class' => LocalIdLookup::class,
6895 'services' => [
6896 'MainConfig',
6897 'DBLoadBalancerFactory',
6898 'HideUserUtils',
6899 ]
6900 ]
6901 ],
6902 'type' => 'map',
6903 ];
6904
6908 public const CentralIdLookupProvider = [
6909 'default' => 'local',
6910 'type' => 'string',
6911 ];
6912
6917 public const UserRegistrationProviders = [
6918 'default' => [
6919 LocalUserRegistrationProvider::TYPE => [
6920 'class' => LocalUserRegistrationProvider::class,
6921 'services' => [
6922 'UserFactory'
6923 ]
6924 ]
6925 ],
6926 'type' => 'map',
6927 ];
6928
6994 public const PasswordPolicy = [
6995 'default' => [
6996 'policies' => [
6997 'bureaucrat' => [
6998 'MinimalPasswordLength' => 10,
6999 'MinimumPasswordLengthToLogin' => 1,
7000 ],
7001 'sysop' => [
7002 'MinimalPasswordLength' => 10,
7003 'MinimumPasswordLengthToLogin' => 1,
7004 ],
7005 'interface-admin' => [
7006 'MinimalPasswordLength' => 10,
7007 'MinimumPasswordLengthToLogin' => 1,
7008 ],
7009 'bot' => [
7010 'MinimalPasswordLength' => 10,
7011 'MinimumPasswordLengthToLogin' => 1,
7012 ],
7013 'default' => [
7014 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
7015 'PasswordCannotBeSubstringInUsername' => [
7016 'value' => true,
7017 'suggestChangeOnLogin' => true
7018 ],
7019 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7020 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
7021 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7022 ],
7023 ],
7024 'checks' => [
7025 'MinimalPasswordLength' => 'PasswordPolicyChecks::checkMinimalPasswordLength',
7026 'MinimumPasswordLengthToLogin' => 'PasswordPolicyChecks::checkMinimumPasswordLengthToLogin',
7027 'PasswordCannotBeSubstringInUsername' =>
7028 'PasswordPolicyChecks::checkPasswordCannotBeSubstringInUsername',
7029 'PasswordCannotMatchDefaults' => 'PasswordPolicyChecks::checkPasswordCannotMatchDefaults',
7030 'MaximalPasswordLength' => 'PasswordPolicyChecks::checkMaximalPasswordLength',
7031 'PasswordNotInCommonList' => 'PasswordPolicyChecks::checkPasswordNotInCommonList',
7032 ],
7033 ],
7034 'type' => 'map',
7035 'mergeStrategy' => 'array_replace_recursive',
7036 ];
7037
7057 public const AuthManagerConfig = [
7058 'default' => null,
7059 'type' => '?map',
7060 ];
7061
7066 public const AuthManagerAutoConfig = [
7067 'default' => [
7068 'preauth' => [
7069 \MediaWiki\Auth\ThrottlePreAuthenticationProvider::class => [
7070 'class' => \MediaWiki\Auth\ThrottlePreAuthenticationProvider::class,
7071 'sort' => 0,
7072 ],
7073 ],
7074 'primaryauth' => [
7075 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7076 // any other PasswordAuthenticationRequest-based
7077 // PrimaryAuthenticationProvider (or at least any that might return
7078 // FAIL rather than ABSTAIN for a wrong password), or password reset
7079 // won't work right. Do not remove this (or change the key) or
7080 // auto-configuration of other such providers in extensions will
7081 // probably auto-insert themselves in the wrong place.
7082 \MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider::class => [
7083 'class' => \MediaWiki\Auth\TemporaryPasswordPrimaryAuthenticationProvider::class,
7084 'services' => [
7085 'DBLoadBalancerFactory',
7086 'UserOptionsLookup',
7087 ],
7088 'args' => [ [
7089 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7090 'authoritative' => false,
7091 ] ],
7092 'sort' => 0,
7093 ],
7094 \MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider::class => [
7095 'class' => \MediaWiki\Auth\LocalPasswordPrimaryAuthenticationProvider::class,
7096 'services' => [
7097 'DBLoadBalancerFactory',
7098 ],
7099 'args' => [ [
7100 // Last one should be authoritative, or else the user will get
7101 // a less-than-helpful error message (something like "supplied
7102 // authentication info not supported" rather than "wrong
7103 // password") if it too fails.
7104 'authoritative' => true,
7105 ] ],
7106 'sort' => 100,
7107 ],
7108 ],
7109 'secondaryauth' => [
7110 \MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider::class => [
7111 'class' => \MediaWiki\Auth\CheckBlocksSecondaryAuthenticationProvider::class,
7112 'sort' => 0,
7113 ],
7114 \MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider::class => [
7115 'class' => \MediaWiki\Auth\ResetPasswordSecondaryAuthenticationProvider::class,
7116 'sort' => 100,
7117 ],
7118 // Linking during login is experimental, enable at your own risk - T134952
7119 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7120 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7121 // 'sort' => 100,
7122 // ],
7123 \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class => [
7124 'class' => \MediaWiki\Auth\EmailNotificationSecondaryAuthenticationProvider::class,
7125 'services' => [
7126 'DBLoadBalancerFactory',
7127 ],
7128 'sort' => 200,
7129 ],
7130 ],
7131 ],
7132 'type' => 'map',
7133 'mergeStrategy' => 'array_plus_2d',
7134 ];
7135
7146 public const RememberMe = [
7147 'default' => 'choose',
7148 'type' => 'string',
7149 ];
7150
7188 public const ReauthenticateTime = [
7189 'default' => [ 'default' => 300, ],
7190 'type' => 'map',
7191 'additionalProperties' => [ 'type' => 'integer', ],
7192 ];
7193
7208 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7209 'default' => [ 'default' => true, ],
7210 'type' => 'map',
7211 'additionalProperties' => [ 'type' => 'boolean', ],
7212 ];
7213
7224 public const ChangeCredentialsBlacklist = [
7225 'default' => [
7226 \MediaWiki\Auth\TemporaryPasswordAuthenticationRequest::class,
7227 ],
7228 'type' => 'list',
7229 'items' => [ 'type' => 'string', ],
7230 ];
7231
7242 public const RemoveCredentialsBlacklist = [
7243 'default' => [
7244 \MediaWiki\Auth\PasswordAuthenticationRequest::class,
7245 ],
7246 'type' => 'list',
7247 'items' => [ 'type' => 'string', ],
7248 ];
7249
7256 public const MinimalPasswordLength = [
7257 'default' => false,
7258 'deprecated' => 'since 1.26, use $wgPasswordPolicy\'s MinimalPasswordLength.',
7259 ];
7260
7272 public const MaximalPasswordLength = [
7273 'default' => false,
7274 'deprecated' => 'since 1.26, use $wgPasswordPolicy\'s MaximalPasswordLength.',
7275 ];
7276
7283 public const InvalidPasswordReset = [
7284 'default' => true,
7285 ];
7286
7295 public const PasswordDefault = [
7296 'default' => 'pbkdf2',
7297 ];
7298
7326 public const PasswordConfig = [
7327 'default' => [
7328 'A' => [
7329 'class' => MWOldPassword::class,
7330 ],
7331 'B' => [
7332 'class' => MWSaltedPassword::class,
7333 ],
7334 'pbkdf2-legacyA' => [
7335 'class' => LayeredParameterizedPassword::class,
7336 'types' => [
7337 'A',
7338 'pbkdf2',
7339 ],
7340 ],
7341 'pbkdf2-legacyB' => [
7342 'class' => LayeredParameterizedPassword::class,
7343 'types' => [
7344 'B',
7345 'pbkdf2',
7346 ],
7347 ],
7348 'bcrypt' => [
7349 'class' => BcryptPassword::class,
7350 'cost' => 9,
7351 ],
7352 'pbkdf2' => [
7353 'factory' => [ AbstractPbkdf2Password::class, 'newInstance' ],
7354 'algo' => 'sha512',
7355 'cost' => '30000',
7356 'length' => '64',
7357 ],
7358 'argon2' => [
7359 'class' => Argon2Password::class,
7360
7361 // Algorithm used:
7362 // * 'argon2i' is optimized against side-channel attacks
7363 // * 'argon2id' is optimized against both side-channel and GPU cracking
7364 // * 'auto' to use best available algorithm. If you're using more than one server, be
7365 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7366 // older versions might would not understand.
7367 'algo' => 'auto',
7368
7369 // The parameters below are the same as options accepted by password_hash().
7370 // Set them to override that function's defaults.
7371 //
7372 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7373 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7374 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7375 ],
7376 ],
7377 'type' => 'map',
7378 ];
7379
7386 public const PasswordResetRoutes = [
7387 'default' => [
7388 'username' => true,
7389 'email' => true,
7390 ],
7391 'type' => 'map',
7392 ];
7393
7397 public const MaxSigChars = [
7398 'default' => 255,
7399 ];
7400
7413 public const SignatureValidation = [
7414 'default' => 'warning',
7415 ];
7416
7423 public const SignatureAllowedLintErrors = [
7424 'default' => [ 'obsolete-tag', ],
7425 'type' => 'list',
7426 ];
7427
7432 public const MaxNameChars = [
7433 'default' => 255,
7434 ];
7435
7442 public const ReservedUsernames = [
7443 'default' => [
7444 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7445 'Conversion script', // Used for the old Wikipedia software upgrade
7446 'Maintenance script', // Maintenance scripts which perform editing, image import script
7447 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7448 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7449 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7450 'Move page script', // Default user name used by maintenance/deleteBatch.php
7451 'Command line script', // Default user name used by maintenance/undelete.php
7452 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7453 'msg:double-redirect-fixer', // Automatic double redirect fix
7454 'msg:usermessage-editor', // Default user for leaving user messages
7455 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7456 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7457 'msg:spambot_username', // Used by cleanupSpam.php
7458 'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
7459 ],
7460 'type' => 'list',
7461 ];
7462
7470 public const DefaultUserOptions = [
7471 'default' =>
7472 // This array should be sorted by key
7473 [
7474 'ccmeonemails' => 0,
7475 'date' => 'default',
7476 'diffonly' => 0,
7477 'diff-type' => 'table',
7478 'disablemail' => 0,
7479 'editfont' => 'monospace',
7480 'editondblclick' => 0,
7481 'editsectiononrightclick' => 0,
7482 'email-allow-new-users' => 1,
7483 'enotifminoredits' => 0,
7484 'enotifrevealaddr' => 0,
7485 'enotifusertalkpages' => 1,
7486 'enotifwatchlistpages' => 1,
7487 'extendwatchlist' => 1,
7488 'fancysig' => 0,
7489 'forceeditsummary' => 0,
7490 'forcesafemode' => 0,
7491 'gender' => 'unknown',
7492 'hidecategorization' => 1,
7493 'hideminor' => 0,
7494 'hidepatrolled' => 0,
7495 'imagesize' => 2,
7496 'minordefault' => 0,
7497 'newpageshidepatrolled' => 0,
7498 'nickname' => '',
7499 'norollbackdiff' => 0,
7500 'prefershttps' => 1,
7501 'previewonfirst' => 0,
7502 'previewontop' => 1,
7503 'pst-cssjs' => 1,
7504 'rcdays' => 7,
7505 'rcenhancedfilters-disable' => 0,
7506 'rclimit' => 50,
7507 'requireemail' => 0,
7508 'search-match-redirect' => true,
7509 'search-special-page' => 'Search',
7510 'search-thumbnail-extra-namespaces' => true,
7511 'searchlimit' => 20,
7512 'showhiddencats' => 0,
7513 'shownumberswatching' => 1,
7514 'showrollbackconfirmation' => 0,
7515 'skin' => false,
7516 'skin-responsive' => 1,
7517 'thumbsize' => 5,
7518 'underline' => 2,
7519 'useeditwarning' => 1,
7520 'uselivepreview' => 0,
7521 'usenewrc' => 1,
7522 'watchcreations' => 1,
7523 'watchdefault' => 1,
7524 'watchdeletion' => 0,
7525 'watchlistdays' => 7,
7526 'watchlisthideanons' => 0,
7527 'watchlisthidebots' => 0,
7528 'watchlisthidecategorization' => 1,
7529 'watchlisthideliu' => 0,
7530 'watchlisthideminor' => 0,
7531 'watchlisthideown' => 0,
7532 'watchlisthidepatrolled' => 0,
7533 'watchlistreloadautomatically' => 0,
7534 'watchlistunwatchlinks' => 0,
7535 'watchmoves' => 0,
7536 'watchrollback' => 0,
7537 'watchuploads' => 1,
7538 'wlenhancedfilters-disable' => 0,
7539 'wllimit' => 250,
7540 ],
7541 'type' => 'map',
7542 ];
7543
7547 public const HiddenPrefs = [
7548 'default' => [],
7549 'type' => 'list',
7550 ];
7551
7558 public const InvalidUsernameCharacters = [
7559 'default' => '@:>=',
7560 ];
7561
7571 public const UserrightsInterwikiDelimiter = [
7572 'default' => '@',
7573 ];
7574
7583 public const SecureLogin = [
7584 'default' => false,
7585 ];
7586
7596 public const AuthenticationTokenVersion = [
7597 'default' => null,
7598 'type' => '?string',
7599 ];
7600
7610 public const SessionProviders = [
7611 'type' => 'map',
7612 'default' => [
7613 \MediaWiki\Session\CookieSessionProvider::class => [
7614 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7615 'args' => [ [
7616 'priority' => 30,
7617 ] ],
7618 ],
7619 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7620 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7621 'args' => [ [
7622 'priority' => 75,
7623 ] ],
7624 'services' => [
7625 'GrantsInfo'
7626 ],
7627 ],
7628 ],
7629 ];
7630
7638 public const AllowRequiringEmailForResets = [
7639 'default' => false,
7640 ];
7641
7696 public const AutoCreateTempUser = [
7697 'properties' => [
7698 'enabled' => [ 'type' => 'bool', 'default' => false ],
7699 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7700 'genPattern' => [ 'type' => 'string', 'default' => '*Unregistered $1' ],
7701 'matchPattern' => [ 'type' => 'string', 'default' => '*$1' ],
7702 'reservedPattern' => [ 'type' => 'string|null', 'default' => null ],
7703 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local' ] ],
7704 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'plain-numeric' ] ],
7705 'expireAfterDays' => [ 'type' => 'int|null', 'default' => null ],
7706 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => null ],
7707 ],
7708 'type' => 'object',
7709 ];
7710
7711 // endregion -- end user accounts
7712
7713 /***************************************************************************/
7714 // region User rights, access control and monitoring
7720 public const AutoblockExpiry = [
7721 'default' => 86400,
7722 ];
7723
7731 public const BlockAllowsUTEdit = [
7732 'default' => true,
7733 ];
7734
7749 public const BlockCIDRLimit = [
7750 'default' => [
7751 'IPv4' => 16,
7752 'IPv6' => 19,
7753 ],
7754 'type' => 'map',
7755 ];
7756
7762 public const BlockDisablesLogin = [
7763 'default' => false,
7764 ];
7765
7771 public const EnablePartialActionBlocks = [
7772 'default' => false,
7773 'type' => 'boolean',
7774 ];
7775
7781 public const EnableMultiBlocks = [
7782 'default' => false,
7783 'type' => 'boolean',
7784 ];
7785
7799 public const BlockTargetMigrationStage = [
7800 'default' => SCHEMA_COMPAT_OLD,
7801 'type' => 'integer',
7802 ];
7803
7823 public const WhitelistRead = [
7824 'default' => false,
7825 ];
7826
7854 public const WhitelistReadRegexp = [
7855 'default' => false,
7856 ];
7857
7862 public const EmailConfirmToEdit = [
7863 'default' => false,
7864 ];
7865
7870 public const HideIdentifiableRedirects = [
7871 'default' => true,
7872 ];
7873
7898 public const GroupPermissions = [
7899 'type' => 'map',
7900 'additionalProperties' => [
7901 'type' => 'map',
7902 'additionalProperties' => [ 'type' => 'boolean', ],
7903 ],
7904 'mergeStrategy' => 'array_plus_2d',
7905 'default' => [
7906 '*' => [
7907 'createaccount' => true,
7908 'read' => true,
7909 'edit' => true,
7910 'createpage' => true,
7911 'createtalk' => true,
7912 'writeapi' => true,
7913 'viewmyprivateinfo' => true,
7914 'editmyprivateinfo' => true,
7915 'editmyoptions' => true,
7916 ],
7917 'user' => [
7918 'move' => true,
7919 'move-subpages' => true,
7920 'move-rootuserpages' => true,
7921 'move-categorypages' => true,
7922 'movefile' => true,
7923 'read' => true,
7924 'edit' => true,
7925 'createpage' => true,
7926 'createtalk' => true,
7927 'writeapi' => true,
7928 'upload' => true,
7929 'reupload' => true,
7930 'reupload-shared' => true,
7931 'minoredit' => true,
7932 'editmyusercss' => true,
7933 'editmyuserjson' => true,
7934 'editmyuserjs' => true,
7935 'editmyuserjsredirect' => true,
7936 'sendemail' => true,
7937 'applychangetags' => true,
7938 'changetags' => true,
7939 'editcontentmodel' => true,
7940 'viewmywatchlist' => true,
7941 'editmywatchlist' => true,
7942 ],
7943 'autoconfirmed' => [
7944 'autoconfirmed' => true,
7945 'editsemiprotected' => true,
7946 ],
7947 'bot' => [
7948 'bot' => true,
7949 'autoconfirmed' => true,
7950 'editsemiprotected' => true,
7951 'nominornewtalk' => true,
7952 'autopatrol' => true,
7953 'suppressredirect' => true,
7954 'apihighlimits' => true,
7955 'writeapi' => true,
7956 ],
7957 'sysop' => [
7958 'block' => true,
7959 'createaccount' => true,
7960 'delete' => true,
7961 'bigdelete' => true,
7962 'deletedhistory' => true,
7963 'deletedtext' => true,
7964 'undelete' => true,
7965 'editinterface' => true,
7966 'editsitejson' => true,
7967 'edituserjson' => true,
7968 'import' => true,
7969 'importupload' => true,
7970 'move' => true,
7971 'move-subpages' => true,
7972 'move-rootuserpages' => true,
7973 'move-categorypages' => true,
7974 'patrol' => true,
7975 'autopatrol' => true,
7976 'protect' => true,
7977 'editprotected' => true,
7978 'rollback' => true,
7979 'upload' => true,
7980 'reupload' => true,
7981 'reupload-shared' => true,
7982 'unwatchedpages' => true,
7983 'autoconfirmed' => true,
7984 'editsemiprotected' => true,
7985 'ipblock-exempt' => true,
7986 'blockemail' => true,
7987 'markbotedits' => true,
7988 'apihighlimits' => true,
7989 'browsearchive' => true,
7990 'noratelimit' => true,
7991 'movefile' => true,
7992 'unblockself' => true,
7993 'suppressredirect' => true,
7994 'mergehistory' => true,
7995 'managechangetags' => true,
7996 'deletechangetags' => true,
7997 ],
7998 'interface-admin' => [
7999 'editinterface' => true,
8000 'editsitecss' => true,
8001 'editsitejson' => true,
8002 'editsitejs' => true,
8003 'editusercss' => true,
8004 'edituserjson' => true,
8005 'edituserjs' => true,
8006 ],
8007 'bureaucrat' => [
8008 'userrights' => true,
8009 'noratelimit' => true,
8010 'renameuser' => true,
8011 ],
8012 'suppress' => [
8013 'hideuser' => true,
8014 'suppressrevision' => true,
8015 'viewsuppressed' => true,
8016 'suppressionlog' => true,
8017 'deleterevision' => true,
8018 'deletelogentry' => true,
8019 ],
8020 ],
8021 ];
8022
8030 public const PrivilegedGroups = [
8031 'default' => [
8032 'bureaucrat',
8033 'interface-admin',
8034 'suppress',
8035 'sysop',
8036 ],
8037 'type' => 'list',
8038 ];
8039
8049 public const RevokePermissions = [
8050 'default' => [],
8051 'type' => 'map',
8052 'mergeStrategy' => 'array_plus_2d',
8053 ];
8054
8074 public const GroupInheritsPermissions = [
8075 'default' => [],
8076 'type' => 'map',
8077 'additionalProperties' => [ 'type' => 'string', ],
8078 ];
8079
8083 public const ImplicitGroups = [
8084 'default' => [ '*', 'user', 'autoconfirmed' ],
8085 'type' => 'list',
8086 ];
8087
8112 public const GroupsAddToSelf = [
8113 'default' => [],
8114 'type' => 'map',
8115 ];
8116
8120 public const GroupsRemoveFromSelf = [
8121 'default' => [],
8122 'type' => 'map',
8123 ];
8124
8133 public const RestrictionTypes = [
8134 'default' => [ 'create', 'edit', 'move', 'upload' ],
8135 'type' => 'list',
8136 ];
8137
8149 public const RestrictionLevels = [
8150 'default' => [ '', 'autoconfirmed', 'sysop' ],
8151 'type' => 'list',
8152 ];
8153
8163 public const CascadingRestrictionLevels = [
8164 'default' => [ 'sysop', ],
8165 'type' => 'list',
8166 ];
8167
8180 public const SemiprotectedRestrictionLevels = [
8181 'default' => [ 'autoconfirmed', ],
8182 'type' => 'list',
8183 ];
8184
8192 public const NamespaceProtection = [
8193 'default' => [],
8194 'type' => 'map',
8195 ];
8196
8206 public const NonincludableNamespaces = [
8207 'default' => [],
8208 'type' => 'map',
8209 ];
8210
8234 public const AutoConfirmAge = [
8235 'default' => 0,
8236 ];
8237
8249 public const AutoConfirmCount = [
8250 'default' => 0,
8251 ];
8252
8310 public const Autopromote = [
8311 'default' => [
8312 'autoconfirmed' => [ '&',
8313 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8314 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8315 ],
8316 ],
8317 'type' => 'map',
8318 ];
8319
8340 public const AutopromoteOnce = [
8341 'default' => [ 'onEdit' => [], ],
8342 'type' => 'map',
8343 ];
8344
8350 public const AutopromoteOnceLogInRC = [
8351 'default' => true,
8352 ];
8353
8383 public const AddGroups = [
8384 'default' => [],
8385 'type' => 'map',
8386 ];
8387
8391 public const RemoveGroups = [
8392 'default' => [],
8393 'type' => 'map',
8394 ];
8395
8406 public const AvailableRights = [
8407 'default' => [],
8408 'type' => 'list',
8409 'items' => [ 'type' => 'string', ],
8410 ];
8411
8425 public const ImplicitRights = [
8426 'default' => [],
8427 'type' => 'list',
8428 'items' => [ 'type' => 'string', ]
8429 ];
8430
8435 public const DeleteRevisionsLimit = [
8436 'default' => 0,
8437 ];
8438
8444 public const DeleteRevisionsBatchSize = [
8445 'default' => 1000,
8446 ];
8447
8457 public const HideUserContribLimit = [
8458 'default' => 1000,
8459 ];
8460
8486 public const AccountCreationThrottle = [
8487 'default' => [ [
8488 'count' => 0,
8489 'seconds' => 86400,
8490 ] ],
8491 'type' => 'int|list',
8492 ];
8493
8504 public const SpamRegex = [
8505 'default' => [],
8506 'type' => 'list',
8507 ];
8508
8512 public const SummarySpamRegex = [
8513 'default' => [],
8514 'type' => 'list',
8515 ];
8516
8523 public const EnableDnsBlacklist = [
8524 'default' => false,
8525 ];
8526
8551 public const DnsBlacklistUrls = [
8552 'default' => [ 'http.dnsbl.sorbs.net.', ],
8553 'type' => 'list',
8554 ];
8555
8564 public const ProxyList = [
8565 'default' => [],
8566 'type' => 'string|list',
8567 ];
8568
8573 public const ProxyWhitelist = [
8574 'default' => [],
8575 'type' => 'list',
8576 ];
8577
8585 public const SoftBlockRanges = [
8586 'default' => [],
8587 'type' => 'list',
8588 'items' => [ 'type' => 'string', ],
8589 ];
8590
8596 public const ApplyIpBlocksToXff = [
8597 'default' => false,
8598 ];
8599
8642 public const RateLimits = [
8643 'default' => [
8644 // Page edits
8645 'edit' => [
8646 'ip' => [ 8, 60 ],
8647 'newbie' => [ 8, 60 ],
8648 'user' => [ 90, 60 ],
8649 ],
8650 // Page moves
8651 'move' => [
8652 'newbie' => [ 2, 120 ],
8653 'user' => [ 8, 60 ],
8654 ],
8655 // File uploads
8656 'upload' => [
8657 'ip' => [ 8, 60 ],
8658 'newbie' => [ 8, 60 ],
8659 ],
8660 // Page rollbacks
8661 'rollback' => [
8662 'user' => [ 10, 60 ],
8663 'newbie' => [ 5, 120 ]
8664 ],
8665 // Triggering password resets emails
8666 'mailpassword' => [
8667 'ip' => [ 5, 3600 ],
8668 ],
8669 // Emailing other users using MediaWiki
8670 'sendemail' => [
8671 'ip' => [ 5, 86400 ],
8672 'newbie' => [ 5, 86400 ],
8673 'user' => [ 20, 86400 ],
8674 ],
8675 'changeemail' => [
8676 'ip-all' => [ 10, 3600 ],
8677 'user' => [ 4, 86400 ]
8678 ],
8679 // since 1.33 - rate limit email confirmations
8680 'confirmemail' => [
8681 'ip-all' => [ 10, 3600 ],
8682 'user' => [ 4, 86400 ]
8683 ],
8684 // Purging pages
8685 'purge' => [
8686 'ip' => [ 30, 60 ],
8687 'user' => [ 30, 60 ],
8688 ],
8689 // Purges of link tables
8690 'linkpurge' => [
8691 'ip' => [ 30, 60 ],
8692 'user' => [ 30, 60 ],
8693 ],
8694 // Files rendered via thumb.php or thumb_handler.php
8695 'renderfile' => [
8696 'ip' => [ 700, 30 ],
8697 'user' => [ 700, 30 ],
8698 ],
8699 // Same as above but for non-standard thumbnails
8700 'renderfile-nonstandard' => [
8701 'ip' => [ 70, 30 ],
8702 'user' => [ 70, 30 ],
8703 ],
8704 // Stashing edits into cache before save
8705 'stashedit' => [
8706 'ip' => [ 30, 60 ],
8707 'newbie' => [ 30, 60 ],
8708 ],
8709 // Stash base HTML for VE edits
8710 'stashbasehtml' => [
8711 'ip' => [ 5, 60 ],
8712 'newbie' => [ 5, 60 ],
8713 ],
8714 // Adding or removing change tags
8715 'changetags' => [
8716 'ip' => [ 8, 60 ],
8717 'newbie' => [ 8, 60 ],
8718 ],
8719 // Changing the content model of a page
8720 'editcontentmodel' => [
8721 'newbie' => [ 2, 120 ],
8722 'user' => [ 8, 60 ],
8723 ],
8724 ],
8725 'type' => 'map',
8726 'mergeStrategy' => 'array_plus_2d',
8727 ];
8728
8734 public const RateLimitsExcludedIPs = [
8735 'default' => [],
8736 'type' => 'list',
8737 ];
8738
8744 public const PutIPinRC = [
8745 'default' => true,
8746 ];
8747
8752 public const QueryPageDefaultLimit = [
8753 'default' => 50,
8754 ];
8755
8768 public const PasswordAttemptThrottle = [
8769 'default' => [
8770 // Short term limit
8771 [ 'count' => 5, 'seconds' => 300 ],
8772 // Long term limit. We need to balance the risk
8773 // of somebody using this as a DoS attack to lock someone
8774 // out of their account, and someone doing a brute force attack.
8775 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
8776 ],
8777 'type' => 'list',
8778 ];
8779
8790 public const GrantPermissions = [
8791 'default' => [
8792 'basic' => [
8793 'autocreateaccount' => true,
8794 'autoconfirmed' => true,
8795 'autopatrol' => true,
8796 'editsemiprotected' => true,
8797 'ipblock-exempt' => true,
8798 'nominornewtalk' => true,
8799 'patrolmarks' => true,
8800 'read' => true,
8801 'writeapi' => true,
8802 'unwatchedpages' => true,
8803 ],
8804 'highvolume' => [
8805 'bot' => true,
8806 'apihighlimits' => true,
8807 'noratelimit' => true,
8808 'markbotedits' => true,
8809 ],
8810 'import' => [
8811 'import' => true,
8812 'importupload' => true,
8813 ],
8814 'editpage' => [
8815 'edit' => true,
8816 'minoredit' => true,
8817 'applychangetags' => true,
8818 'changetags' => true,
8819 'editcontentmodel' => true,
8820 ],
8821 'editprotected' => [
8822 'edit' => true,
8823 'minoredit' => true,
8824 'applychangetags' => true,
8825 'changetags' => true,
8826 'editcontentmodel' => true,
8827 'editprotected' => true,
8828 ],
8829 'editmycssjs' => [
8830 'edit' => true,
8831 'minoredit' => true,
8832 'applychangetags' => true,
8833 'changetags' => true,
8834 'editcontentmodel' => true,
8835 'editmyusercss' => true,
8836 'editmyuserjson' => true,
8837 'editmyuserjs' => true,
8838 ],
8839 'editmyoptions' => [
8840 'editmyoptions' => true,
8841 'editmyuserjson' => true,
8842 ],
8843 'editinterface' => [
8844 'edit' => true,
8845 'minoredit' => true,
8846 'applychangetags' => true,
8847 'changetags' => true,
8848 'editcontentmodel' => true,
8849 'editinterface' => true,
8850 'edituserjson' => true,
8851 'editsitejson' => true,
8852 ],
8853 'editsiteconfig' => [
8854 'edit' => true,
8855 'minoredit' => true,
8856 'applychangetags' => true,
8857 'changetags' => true,
8858 'editcontentmodel' => true,
8859 'editinterface' => true,
8860 'edituserjson' => true,
8861 'editsitejson' => true,
8862 'editusercss' => true,
8863 'edituserjs' => true,
8864 'editsitecss' => true,
8865 'editsitejs' => true,
8866 ],
8867 'createeditmovepage' => [
8868 'edit' => true,
8869 'minoredit' => true,
8870 'applychangetags' => true,
8871 'changetags' => true,
8872 'editcontentmodel' => true,
8873 'createpage' => true,
8874 'createtalk' => true,
8875 'delete-redirect' => true,
8876 'move' => true,
8877 'move-rootuserpages' => true,
8878 'move-subpages' => true,
8879 'move-categorypages' => true,
8880 'suppressredirect' => true,
8881 ],
8882 'uploadfile' => [
8883 'upload' => true,
8884 'reupload-own' => true,
8885 ],
8886 'uploadeditmovefile' => [
8887 'upload' => true,
8888 'reupload-own' => true,
8889 'reupload' => true,
8890 'reupload-shared' => true,
8891 'upload_by_url' => true,
8892 'movefile' => true,
8893 'suppressredirect' => true,
8894 ],
8895 'patrol' => [
8896 'patrol' => true,
8897 ],
8898 'rollback' => [
8899 'rollback' => true,
8900 ],
8901 'blockusers' => [
8902 'block' => true,
8903 'blockemail' => true,
8904 ],
8905 'viewdeleted' => [
8906 'browsearchive' => true,
8907 'deletedhistory' => true,
8908 'deletedtext' => true,
8909 ],
8910 'viewrestrictedlogs' => [
8911 'suppressionlog' => true,
8912 ],
8913 'delete' => [
8914 'edit' => true,
8915 'minoredit' => true,
8916 'applychangetags' => true,
8917 'changetags' => true,
8918 'editcontentmodel' => true,
8919 'browsearchive' => true,
8920 'deletedhistory' => true,
8921 'deletedtext' => true,
8922 'delete' => true,
8923 'bigdelete' => true,
8924 'deletelogentry' => true,
8925 'deleterevision' => true,
8926 'undelete' => true,
8927 ],
8928 'oversight' => [
8929 'suppressrevision' => true,
8930 'viewsuppressed' => true,
8931 ],
8932 'protect' => [
8933 'edit' => true,
8934 'minoredit' => true,
8935 'applychangetags' => true,
8936 'changetags' => true,
8937 'editcontentmodel' => true,
8938 'editprotected' => true,
8939 'protect' => true,
8940 ],
8941 'viewmywatchlist' => [
8942 'viewmywatchlist' => true,
8943 ],
8944 'editmywatchlist' => [
8945 'editmywatchlist' => true,
8946 ],
8947 'sendemail' => [
8948 'sendemail' => true,
8949 ],
8950 'createaccount' => [
8951 'createaccount' => true,
8952 ],
8953 'privateinfo' => [
8954 'viewmyprivateinfo' => true,
8955 ],
8956 'mergehistory' => [
8957 'mergehistory' => true,
8958 ],
8959 ],
8960 'type' => 'map',
8961 'mergeStrategy' => 'array_plus_2d',
8962 'additionalProperties' => [
8963 'type' => 'map',
8964 'additionalProperties' => [ 'type' => 'boolean', ],
8965 ],
8966 ];
8967
8978 public const GrantPermissionGroups = [
8979 'default' =>
8980 [
8981 // Hidden grants are implicitly present
8982 'basic' => 'hidden',
8983
8984 'editpage' => 'page-interaction',
8985 'createeditmovepage' => 'page-interaction',
8986 'editprotected' => 'page-interaction',
8987 'patrol' => 'page-interaction',
8988
8989 'uploadfile' => 'file-interaction',
8990 'uploadeditmovefile' => 'file-interaction',
8991
8992 'sendemail' => 'email',
8993
8994 'viewmywatchlist' => 'watchlist-interaction',
8995 'editviewmywatchlist' => 'watchlist-interaction',
8996
8997 'editmycssjs' => 'customization',
8998 'editmyoptions' => 'customization',
8999
9000 'editinterface' => 'administration',
9001 'editsiteconfig' => 'administration',
9002 'rollback' => 'administration',
9003 'blockusers' => 'administration',
9004 'delete' => 'administration',
9005 'viewdeleted' => 'administration',
9006 'viewrestrictedlogs' => 'administration',
9007 'protect' => 'administration',
9008 'oversight' => 'administration',
9009 'createaccount' => 'administration',
9010 'mergehistory' => 'administration',
9011 'import' => 'administration',
9012
9013 'highvolume' => 'high-volume',
9014
9015 'privateinfo' => 'private-information',
9016 ],
9017 'type' => 'map',
9018 'additionalProperties' => [ 'type' => 'string', ],
9019 ];
9020
9024 public const EnableBotPasswords = [
9025 'default' => true,
9026 'type' => 'boolean',
9027 ];
9028
9034 public const BotPasswordsCluster = [
9035 'default' => false,
9036 'type' => 'string|false',
9037 ];
9038
9047 public const BotPasswordsDatabase = [
9048 'default' => false,
9049 'type' => 'string|false',
9050 ];
9051
9052 // endregion -- end of user rights settings
9053
9054 /***************************************************************************/
9055 // region Security
9061 public const SecretKey = [
9062 'default' => false,
9063 ];
9064
9070 public const AllowUserJs = [
9071 'default' => false,
9072 ];
9073
9079 public const AllowUserCss = [
9080 'default' => false,
9081 ];
9082
9089 public const AllowUserCssPrefs = [
9090 'default' => true,
9091 ];
9092
9096 public const UseSiteJs = [
9097 'default' => true,
9098 ];
9099
9103 public const UseSiteCss = [
9104 'default' => true,
9105 ];
9106
9111 public const BreakFrames = [
9112 'default' => false,
9113 ];
9114
9134 public const EditPageFrameOptions = [
9135 'default' => 'DENY',
9136 ];
9137
9149 public const ApiFrameOptions = [
9150 'default' => 'DENY',
9151 ];
9152
9160 public const CSPHeader = [
9161 'default' => false,
9162 'type' => 'false|object',
9163 ];
9164
9170 public const CSPReportOnlyHeader = [
9171 'default' => false,
9172 'type' => 'false|object',
9173 ];
9174
9184 public const CSPFalsePositiveUrls = [
9185 'default' => [
9186 'https://3hub.co' => true,
9187 'https://morepro.info' => true,
9188 'https://p.ato.mx' => true,
9189 'https://s.ato.mx' => true,
9190 'https://adserver.adtech.de' => true,
9191 'https://ums.adtechus.com' => true,
9192 'https://cas.criteo.com' => true,
9193 'https://cat.nl.eu.criteo.com' => true,
9194 'https://atpixel.alephd.com' => true,
9195 'https://rtb.metrigo.com' => true,
9196 'https://d5p.de17a.com' => true,
9197 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9198 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9199 'https://t.lkqd.net/t' => true,
9200 'chrome-extension' => true,
9201 ],
9202 'type' => 'map',
9203 ];
9204
9212 public const AllowCrossOrigin = [
9213 'default' => false,
9214 'type' => 'boolean',
9215 ];
9216
9230 public const RestAllowCrossOriginCookieAuth = [
9231 'default' => false,
9232 'type' => 'boolean',
9233 ];
9234
9243 public const SessionSecret = [
9244 'default' => false,
9245 ];
9246
9255 public const SessionInsecureSecrets = [
9256 'default' => false,
9257 ];
9258
9269 public const HKDFSecret = [
9270 'default' => false,
9271 ];
9272
9281 public const HKDFAlgorithm = [
9282 'default' => 'sha256',
9283 ];
9284
9285 // endregion -- end of security
9286
9287 /***************************************************************************/
9288 // region Cookie settings
9294 public const CookieExpiration = [
9295 'default' => 30 * 86400,
9296 ];
9297
9304 public const ExtendedLoginCookieExpiration = [
9305 'default' => 180 * 86400,
9306 ];
9307
9312 public const CookieDomain = [
9313 'default' => '',
9314 ];
9315
9320 public const CookiePath = [
9321 'default' => '/',
9322 ];
9323
9334 public const CookieSecure = [
9335 'default' => 'detect',
9336 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9337 ];
9338
9339 public static function getDefaultCookieSecure( $forceHTTPS ): bool {
9340 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9341 }
9342
9348 public const CookiePrefix = [
9349 'default' => false,
9350 'dynamicDefault' => [
9351 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9352 ],
9353 ];
9354
9355 public static function getDefaultCookiePrefix(
9356 $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix
9357 ): string {
9358 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9359 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9360 }
9361 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9362 }
9363
9369 public const CookieHttpOnly = [
9370 'default' => true,
9371 ];
9372
9382 public const CookieSameSite = [
9383 'default' => null,
9384 'type' => '?string',
9385 ];
9386
9394 public const UseSameSiteLegacyCookies = [
9395 'default' => false,
9396 'type' => 'boolean',
9397 ];
9398
9402 public const CacheVaryCookies = [
9403 'default' => [],
9404 'type' => 'list',
9405 ];
9406
9410 public const SessionName = [
9411 'default' => false,
9412 ];
9413
9421 public const CookieSetOnAutoblock = [
9422 'default' => true,
9423 ];
9424
9432 public const CookieSetOnIpBlock = [
9433 'default' => true,
9434 ];
9435
9436 // endregion -- end of cookie settings
9437
9438 /***************************************************************************/
9439 // region Profiling, testing and debugging
9441 // See $wgProfiler for how to enable profiling.
9442
9454 public const DebugLogFile = [
9455 'default' => '',
9456 ];
9457
9461 public const DebugLogPrefix = [
9462 'default' => '',
9463 ];
9464
9470 public const DebugRedirects = [
9471 'default' => false,
9472 ];
9473
9488 public const DebugRawPage = [
9489 'default' => false,
9490 ];
9491
9500 public const DebugComments = [
9501 'default' => false,
9502 ];
9503
9511 public const DebugDumpSql = [
9512 'default' => false,
9513 ];
9514
9520 public const TrxProfilerLimits = [
9521 'default' => [
9522 // HTTP GET/HEAD requests.
9523 // Primary queries should not happen on GET requests
9524 'GET' => [
9525 'masterConns' => 0,
9526 'writes' => 0,
9527 'readQueryTime' => 5,
9528 'readQueryRows' => 10000
9529 ],
9530 // HTTP POST requests.
9531 // Primary reads and writes will happen for a subset of these.
9532 'POST' => [
9533 'readQueryTime' => 5,
9534 'writeQueryTime' => 1,
9535 'readQueryRows' => 100000,
9536 'maxAffected' => 1000
9537 ],
9538 'POST-nonwrite' => [
9539 'writes' => 0,
9540 'readQueryTime' => 5,
9541 'readQueryRows' => 10000
9542 ],
9543 // Deferred updates that run after HTTP response is sent for GET requests
9544 'PostSend-GET' => [
9545 'readQueryTime' => 5,
9546 'writeQueryTime' => 1,
9547 'readQueryRows' => 10000,
9548 'maxAffected' => 1000,
9549 // Log primary queries under the post-send entry point as they are discouraged
9550 'masterConns' => 0,
9551 'writes' => 0,
9552 ],
9553 // Deferred updates that run after HTTP response is sent for POST requests
9554 'PostSend-POST' => [
9555 'readQueryTime' => 5,
9556 'writeQueryTime' => 1,
9557 'readQueryRows' => 100000,
9558 'maxAffected' => 1000
9559 ],
9560 // Background job runner
9561 'JobRunner' => [
9562 'readQueryTime' => 30,
9563 'writeQueryTime' => 5,
9564 'readQueryRows' => 100000,
9565 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9566 ],
9567 // Command-line scripts
9568 'Maintenance' => [
9569 'writeQueryTime' => 5,
9570 'maxAffected' => 1000
9571 ]
9572 ],
9573 'type' => 'map',
9574 ];
9575
9608 public const DebugLogGroups = [
9609 'default' => [],
9610 'type' => 'map',
9611 ];
9612
9634 public const MWLoggerDefaultSpi = [
9635 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9636 'mergeStrategy' => 'replace',
9637 'type' => 'map',
9638 ];
9639
9645 public const ShowDebug = [
9646 'default' => false,
9647 ];
9648
9652 public const SpecialVersionShowHooks = [
9653 'default' => false,
9654 ];
9655
9663 public const ShowExceptionDetails = [
9664 'default' => false,
9665 ];
9666
9670 public const LogExceptionBacktrace = [
9671 'default' => true,
9672 ];
9673
9678 public const PropagateErrors = [
9679 'default' => true,
9680 ];
9681
9685 public const ShowHostnames = [
9686 'default' => false,
9687 ];
9688
9696 public const OverrideHostname = [
9697 'default' => false,
9698 ];
9699
9704 public const DevelopmentWarnings = [
9705 'default' => false,
9706 ];
9707
9713 public const DeprecationReleaseLimit = [
9714 'default' => false,
9715 ];
9716
9783 public const Profiler = [
9784 'default' => [],
9785 'type' => 'map',
9786 'mergeStrategy' => 'replace',
9787 ];
9788
9799 public const StatsdServer = [
9800 'default' => false,
9801 ];
9802
9810 public const StatsdMetricPrefix = [
9811 'default' => 'MediaWiki',
9812 ];
9813
9822 public const StatsdSamplingRates = [
9823 'default' => [],
9824 'type' => 'map',
9825 ];
9826
9835 public const StatsTarget = [
9836 'default' => null,
9837 'type' => '?string',
9838 ];
9839
9849 public const StatsFormat = [
9850 'default' => null,
9851 'type' => '?string',
9852 ];
9853
9863 public const StatsPrefix = [
9864 'default' => 'mediawiki',
9865 'type' => 'string',
9866 ];
9867
9874 public const PageInfoTransclusionLimit = [
9875 'default' => 50,
9876 ];
9877
9881 public const EnableJavaScriptTest = [
9882 'default' => false,
9883 ];
9884
9890 public const CachePrefix = [
9891 'default' => false,
9892 ];
9893
9902 public const DebugToolbar = [
9903 'default' => false,
9904 ];
9905
9906 // endregion -- end of profiling, testing and debugging
9907
9908 /***************************************************************************/
9909 // region Search
9915 public const DisableTextSearch = [
9916 'default' => false,
9917 ];
9918
9923 public const AdvancedSearchHighlighting = [
9924 'default' => false,
9925 ];
9926
9931 public const SearchHighlightBoundaries = [
9932 'default' => '[\\p{Z}\\p{P}\\p{C}]',
9933 ];
9934
9945 public const OpenSearchTemplate = [
9946 'default' => false,
9947 'deprecated' => 'since 1.25 ' .
9948 'Use $wgOpenSearchTemplates[\'application/x-suggestions+json\'] instead',
9949 ];
9950
9959 public const OpenSearchTemplates = [
9960 'default' => [
9961 'application/x-suggestions+json' => false,
9962 'application/x-suggestions+xml' => false,
9963 ],
9964 'type' => 'map',
9965 ];
9966
9973 public const EnableOpenSearchSuggest = [
9974 'default' => true,
9975 'obsolete' => 'Since 1.35, no longer used',
9976 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
9977 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
9978 ];
9979
9984 public const OpenSearchDefaultLimit = [
9985 'default' => 10,
9986 ];
9987
9992 public const OpenSearchDescriptionLength = [
9993 'default' => 100,
9994 ];
9995
9999 public const SearchSuggestCacheExpiry = [
10000 'default' => 1200,
10001 ];
10002
10007 public const DisableSearchUpdate = [
10008 'default' => false,
10009 ];
10010
10021 public const NamespacesToBeSearchedDefault = [
10022 'default' => [ NS_MAIN => true, ],
10023 'type' => 'map',
10024 ];
10025
10030 public const DisableInternalSearch = [
10031 'default' => false,
10032 ];
10033
10051 public const SearchForwardUrl = [
10052 'default' => null,
10053 ];
10054
10060 public const SitemapNamespaces = [
10061 'default' => false,
10062 'type' => 'false|list',
10063 ];
10064
10081 public const SitemapNamespacesPriorities = [
10082 'default' => false,
10083 'type' => 'false|map',
10084 ];
10085
10091 public const EnableSearchContributorsByIP = [
10092 'default' => true,
10093 ];
10094
10105 public const SpecialSearchFormOptions = [
10106 'default' => [],
10107 'type' => 'map',
10108 ];
10109
10118 public const SearchMatchRedirectPreference = [
10119 'default' => false,
10120 'type' => 'boolean',
10121 ];
10122
10129 public const SearchRunSuggestedQuery = [
10130 'default' => true,
10131 'type' => 'boolean',
10132 ];
10133
10134 // endregion -- end of search settings
10135
10136 /***************************************************************************/
10137 // region Edit user interface
10144 public const Diff3 = [
10145 'default' => '/usr/bin/diff3',
10146 ];
10147
10151 public const Diff = [
10152 'default' => '/usr/bin/diff',
10153 ];
10154
10160 public const PreviewOnOpenNamespaces = [
10161 'default' => [
10162 NS_CATEGORY => true
10163 ],
10164 'type' => 'map',
10165 ];
10166
10172 public const UniversalEditButton = [
10173 'default' => true,
10174 ];
10175
10181 public const UseAutomaticEditSummaries = [
10182 'default' => true,
10183 ];
10184
10185 // endregion -- end edit UI
10186
10187 /***************************************************************************/
10188 // region Maintenance
10190 // See also $wgSiteNotice
10191
10195 public const CommandLineDarkBg = [
10196 'default' => false,
10197 ];
10198
10207 public const ReadOnly = [
10208 'default' => null,
10209 ];
10210
10216 public const ReadOnlyWatchedItemStore = [
10217 'default' => false,
10218 'type' => 'boolean',
10219 ];
10220
10229 public const ReadOnlyFile = [
10230 'default' => false,
10231 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10232 ];
10233
10238 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10239 return "$uploadDirectory/lock_yBgMBwiR";
10240 }
10241
10251 public const UpgradeKey = [
10252 'default' => false,
10253 ];
10254
10258 public const GitBin = [
10259 'default' => '/usr/bin/git',
10260 ];
10261
10275 public const GitRepositoryViewers = [
10276 'default' => [
10277 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10278 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10279 ],
10280 'type' => 'map',
10281 ];
10282
10283 // endregion -- End of maintenance
10284
10285 /***************************************************************************/
10286 // region Recent changes, new pages, watchlist and history
10295 public const RCMaxAge = [
10296 'default' => 90 * 24 * 3600,
10297 ];
10298
10306 public const WatchersMaxAge = [
10307 'default' => 180 * 24 * 3600,
10308 ];
10309
10318 public const UnwatchedPageSecret = [
10319 'default' => 1,
10320 ];
10321
10329 public const RCFilterByAge = [
10330 'default' => false,
10331 ];
10332
10337 public const RCLinkLimits = [
10338 'default' => [ 50, 100, 250, 500 ],
10339 'type' => 'list',
10340 ];
10341
10348 public const RCLinkDays = [
10349 'default' => [ 1, 3, 7, 14, 30 ],
10350 'type' => 'list',
10351 ];
10352
10416 public const RCFeeds = [
10417 'default' => [],
10418 'type' => 'map',
10419 ];
10420
10428 public const RCEngines = [
10429 'default' => [
10430 'redis' => RedisPubSubFeedEngine::class,
10431 'udp' => UDPRCFeedEngine::class,
10432 ],
10433 'type' => 'map',
10434 ];
10435
10448 public const RCWatchCategoryMembership = [
10449 'default' => false,
10450 ];
10451
10460 public const UseRCPatrol = [
10461 'default' => true,
10462 ];
10463
10470 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10471 'default' => 3,
10472 ];
10473
10481 public const UseNPPatrol = [
10482 'default' => true,
10483 ];
10484
10493 public const UseFilePatrol = [
10494 'default' => true,
10495 ];
10496
10500 public const Feed = [
10501 'default' => true,
10502 ];
10503
10508 public const FeedLimit = [
10509 'default' => 50,
10510 ];
10511
10521 public const FeedCacheTimeout = [
10522 'default' => 60,
10523 ];
10524
10529 public const FeedDiffCutoff = [
10530 'default' => 32768,
10531 ];
10532
10548 public const OverrideSiteFeed = [
10549 'default' => [],
10550 'type' => 'map',
10551 ];
10552
10559 public const FeedClasses = [
10560 'default' => [
10561 'rss' => \MediaWiki\Feed\RSSFeed::class,
10562 'atom' => \MediaWiki\Feed\AtomFeed::class,
10563 ],
10564 'type' => 'map',
10565 ];
10566
10571 public const AdvertisedFeedTypes = [
10572 'default' => [ 'atom', ],
10573 'type' => 'list',
10574 ];
10575
10579 public const RCShowWatchingUsers = [
10580 'default' => false,
10581 ];
10582
10586 public const RCShowChangedSize = [
10587 'default' => true,
10588 ];
10589
10595 public const RCChangedSizeThreshold = [
10596 'default' => 500,
10597 ];
10598
10603 public const ShowUpdatedMarker = [
10604 'default' => true,
10605 ];
10606
10611 public const DisableAnonTalk = [
10612 'default' => false,
10613 ];
10614
10619 public const UseTagFilter = [
10620 'default' => true,
10621 ];
10622
10640 public const SoftwareTags = [
10641 'default' => [
10642 'mw-contentmodelchange' => true,
10643 'mw-new-redirect' => true,
10644 'mw-removed-redirect' => true,
10645 'mw-changed-redirect-target' => true,
10646 'mw-blank' => true,
10647 'mw-replace' => true,
10648 'mw-rollback' => true,
10649 'mw-undo' => true,
10650 'mw-manual-revert' => true,
10651 'mw-reverted' => true,
10652 'mw-server-side-upload' => true,
10653 ],
10654 'type' => 'map',
10655 'additionalProperties' => [ 'type' => 'boolean', ],
10656 ];
10657
10665 public const UnwatchedPageThreshold = [
10666 'default' => false,
10667 ];
10668
10694 public const RecentChangesFlags = [
10695 'default' => [
10696 'newpage' => [
10697 'letter' => 'newpageletter',
10698 'title' => 'recentchanges-label-newpage',
10699 'legend' => 'recentchanges-legend-newpage',
10700 'grouping' => 'any',
10701 ],
10702 'minor' => [
10703 'letter' => 'minoreditletter',
10704 'title' => 'recentchanges-label-minor',
10705 'legend' => 'recentchanges-legend-minor',
10706 'class' => 'minoredit',
10707 'grouping' => 'all',
10708 ],
10709 'bot' => [
10710 'letter' => 'boteditletter',
10711 'title' => 'recentchanges-label-bot',
10712 'legend' => 'recentchanges-legend-bot',
10713 'class' => 'botedit',
10714 'grouping' => 'all',
10715 ],
10716 'unpatrolled' => [
10717 'letter' => 'unpatrolledletter',
10718 'title' => 'recentchanges-label-unpatrolled',
10719 'legend' => 'recentchanges-legend-unpatrolled',
10720 'grouping' => 'any',
10721 ],
10722 ],
10723 'type' => 'map',
10724 ];
10725
10731 public const WatchlistExpiry = [
10732 'default' => false,
10733 'type' => 'boolean',
10734 ];
10735
10746 public const WatchlistPurgeRate = [
10747 'default' => 0.1,
10748 'type' => 'float',
10749 ];
10750
10765 public const WatchlistExpiryMaxDuration = [
10766 'default' => '1 year',
10767 'type' => '?string',
10768 ];
10769
10770 // endregion -- end RC/watchlist
10771
10772 /***************************************************************************/
10773 // region Copyright and credits settings
10783 public const RightsPage = [
10784 'default' => null,
10785 ];
10786
10793 public const RightsUrl = [
10794 'default' => null,
10795 ];
10796
10805 public const RightsText = [
10806 'default' => null,
10807 ];
10808
10812 public const RightsIcon = [
10813 'default' => null,
10814 ];
10815
10819 public const UseCopyrightUpload = [
10820 'default' => false,
10821 ];
10822
10830 public const MaxCredits = [
10831 'default' => 0,
10832 ];
10833
10839 public const ShowCreditsIfMax = [
10840 'default' => true,
10841 ];
10842
10843 // endregion -- end of copyright and credits settings
10844
10845 /***************************************************************************/
10846 // region Import / Export
10872 public const ImportSources = [
10873 'default' => [],
10874 'type' => 'map',
10875 ];
10876
10885 public const ImportTargetNamespace = [
10886 'default' => null,
10887 ];
10888
10895 public const ExportAllowHistory = [
10896 'default' => true,
10897 ];
10898
10904 public const ExportMaxHistory = [
10905 'default' => 0,
10906 ];
10907
10911 public const ExportAllowListContributors = [
10912 'default' => false,
10913 ];
10914
10926 public const ExportMaxLinkDepth = [
10927 'default' => 0,
10928 ];
10929
10933 public const ExportFromNamespaces = [
10934 'default' => false,
10935 ];
10936
10940 public const ExportAllowAll = [
10941 'default' => false,
10942 ];
10943
10950 public const ExportPagelistLimit = [
10951 'default' => 5000,
10952 ];
10953
10958 public const XmlDumpSchemaVersion = [
10959 'default' => XML_DUMP_SCHEMA_VERSION_11,
10960 ];
10961
10962 // endregion -- end of import/export
10963
10964 /***************************************************************************/
10965 // region Wiki Farm
10977 public const WikiFarmSettingsDirectory = [
10978 'default' => null
10979 ];
10980
10989 public const WikiFarmSettingsExtension = [
10990 'default' => 'yaml'
10991 ];
10992
10993 // endregion -- End Wiki Farm
10994
10995 /***************************************************************************/
10996 // region Extensions
11003 public const ExtensionFunctions = [
11004 'default' => [],
11005 'type' => 'list',
11006 ];
11007
11035 public const ExtensionMessagesFiles = [
11036 'default' => [],
11037 'type' => 'map',
11038 ];
11039
11068 public const MessagesDirs = [
11069 'default' => [],
11070 'type' => 'map',
11071 ];
11072
11079 public const ExtensionEntryPointListFiles = [
11080 'default' => [],
11081 'type' => 'map',
11082 ];
11083
11087 public const EnableParserLimitReporting = [
11088 'default' => true,
11089 ];
11090
11116 public const ValidSkinNames = [
11117 'default' => [],
11118 'type' => 'map',
11119 ];
11120
11126 public const SpecialPages = [
11127 'default' => [],
11128 'type' => 'map',
11129 ];
11130
11141 public const AutoloadAttemptLowercase = [
11142 'default' => false,
11143 'obsolete' => 'Since 1.40; no longer has any effect.',
11144 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11145 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11146 ];
11147
11206 public const ExtensionCredits = [
11207 'default' => [],
11208 'type' => 'map',
11209 ];
11210
11240 public const Hooks = [
11241 'default' => [],
11242 'type' => 'map',
11243 'mergeStrategy' => 'array_merge_recursive',
11244 ];
11245
11260 public const ServiceWiringFiles = [
11261 'default' => [],
11262 'type' => 'list',
11263 ];
11264
11283 public const JobClasses = [
11284 'default' => [
11285 'deletePage' => DeletePageJob::class,
11286 'refreshLinks' => RefreshLinksJob::class,
11287 'deleteLinks' => DeleteLinksJob::class,
11288 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11289 'sendMail' => [
11290 'class' => EmaillingJob::class,
11291 'services' => [
11292 0 => 'Emailer'
11293 ]
11294 ],
11295 'enotifNotify' => EnotifNotifyJob::class,
11296 'fixDoubleRedirect' => [
11297 'class' => DoubleRedirectJob::class,
11298 'services' => [
11299 'RevisionLookup',
11300 'MagicWordFactory',
11301 'WikiPageFactory',
11302 ],
11303 // This job requires a title
11304 'needsPage' => true,
11305 ],
11306 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11307 'PublishStashedFile' => PublishStashedFileJob::class,
11308 'ThumbnailRender' => ThumbnailRenderJob::class,
11309 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11310 'refreshLinksPrioritized' => RefreshLinksJob::class,
11311 'refreshLinksDynamic' => RefreshLinksJob::class,
11312 'activityUpdateJob' => ActivityUpdateJob::class,
11313 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
11314 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11315 'watchlistExpiry' => WatchlistExpiryJob::class,
11316 'cdnPurge' => CdnPurgeJob::class,
11317 'userGroupExpiry' => UserGroupExpiryJob::class,
11318 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11319 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11320 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11321 'null' => NullJob::class,
11322 'userEditCountInit' => UserEditCountInitJob::class,
11323 'parsoidCachePrewarm' => [
11324 'class' => ParsoidCachePrewarmJob::class,
11325 'services' => [
11326 'ParsoidOutputAccess',
11327 'PageStore',
11328 'RevisionLookup'
11329 ],
11330 // tell the JobFactory not to include the $page parameter in the constructor call
11331 'needsPage' => false
11332 ],
11333 'renameUser' => [
11334 'class' => RenameUserJob::class,
11335 'services' => [
11336 'MainConfig',
11337 'DBLoadBalancerFactory'
11338 ]
11339 ],
11340 ],
11341 'type' => 'map',
11342 ];
11343
11355 public const JobTypesExcludedFromDefaultQueue = [
11356 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile' ],
11357 'type' => 'list',
11358 ];
11359
11369 public const JobBackoffThrottling = [
11370 'default' => [],
11371 'type' => 'map',
11372 'additionalProperties' => [ 'type' => 'float', ],
11373 ];
11374
11382 public const JobTypeConf = [
11383 'default' => [
11384 'default' => [
11385 'class' => JobQueueDB::class,
11386 'order' => 'random',
11387 'claimTTL' => 3600
11388 ],
11389 ],
11390 'additionalProperties' => [
11391 'type' => 'object',
11392 'properties' => [
11393 'class' => [ 'type' => 'string' ],
11394 'order' => [ 'type' => 'string' ],
11395 'claimTTL' => [ 'type' => 'int' ]
11396 ],
11397 ],
11398 'type' => 'map',
11399 ];
11400
11413 public const JobQueueIncludeInMaxLagFactor = [
11414 'default' => false,
11415 ];
11416
11422 public const SpecialPageCacheUpdates = [
11423 'default' => [
11424 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11425 ],
11426 'type' => 'map',
11427 ];
11428
11437 public const PagePropLinkInvalidations = [
11438 'default' => [ 'hiddencat' => 'categorylinks', ],
11439 'type' => 'map',
11440 ];
11441
11442 // endregion -- End extensions
11443
11444 /***************************************************************************/
11445 // region Categories
11452 public const CategoryMagicGallery = [
11453 'default' => true,
11454 ];
11455
11459 public const CategoryPagingLimit = [
11460 'default' => 200,
11461 ];
11462
11489 public const CategoryCollation = [
11490 'default' => 'uppercase',
11491 ];
11492
11504 public const TempCategoryCollations = [
11505 'default' => [],
11506 'type' => 'list',
11507 ];
11508
11523 public const TrackingCategories = [
11524 'default' => [],
11525 'type' => 'list',
11526 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
11527 'the new extension registration system.',
11528 ];
11529
11530 // endregion -- End categories
11531
11532 /***************************************************************************/
11533 // region Logging
11545 public const LogTypes = [
11546 'default' => [
11547 '',
11548 'block',
11549 'protect',
11550 'rights',
11551 'delete',
11552 'upload',
11553 'move',
11554 'import',
11555 'patrol',
11556 'merge',
11557 'suppress',
11558 'tag',
11559 'managetags',
11560 'contentmodel',
11561 'renameuser',
11562 ],
11563 'type' => 'list',
11564 ];
11565
11573 public const LogRestrictions = [
11574 'default' => [ 'suppress' => 'suppressionlog', ],
11575 'type' => 'map',
11576 ];
11577
11596 public const FilterLogTypes = [
11597 'default' => [
11598 'patrol' => true,
11599 'tag' => true,
11600 'newusers' => false,
11601 ],
11602 'type' => 'map',
11603 ];
11604
11614 public const LogNames = [
11615 'default' => [
11616 '' => 'all-logs-page',
11617 'block' => 'blocklogpage',
11618 'protect' => 'protectlogpage',
11619 'rights' => 'rightslog',
11620 'delete' => 'dellogpage',
11621 'upload' => 'uploadlogpage',
11622 'move' => 'movelogpage',
11623 'import' => 'importlogpage',
11624 'patrol' => 'patrol-log-page',
11625 'merge' => 'mergelog',
11626 'suppress' => 'suppressionlog',
11627 ],
11628 'type' => 'map',
11629 ];
11630
11640 public const LogHeaders = [
11641 'default' => [
11642 '' => 'alllogstext',
11643 'block' => 'blocklogtext',
11644 'delete' => 'dellogpagetext',
11645 'import' => 'importlogpagetext',
11646 'merge' => 'mergelogpagetext',
11647 'move' => 'movelogpagetext',
11648 'patrol' => 'patrol-log-header',
11649 'protect' => 'protectlogtext',
11650 'rights' => 'rightslogtext',
11651 'suppress' => 'suppressionlogtext',
11652 'upload' => 'uploadlogpagetext',
11653 ],
11654 'type' => 'map',
11655 ];
11656
11664 public const LogActions = [
11665 'default' => [],
11666 'type' => 'map',
11667 ];
11668
11676 public const LogActionsHandlers = [
11677 'default' => [
11678 'block/block' => BlockLogFormatter::class,
11679 'block/reblock' => BlockLogFormatter::class,
11680 'block/unblock' => BlockLogFormatter::class,
11681 'contentmodel/change' => ContentModelLogFormatter::class,
11682 'contentmodel/new' => ContentModelLogFormatter::class,
11683 'delete/delete' => DeleteLogFormatter::class,
11684 'delete/delete_redir' => DeleteLogFormatter::class,
11685 'delete/delete_redir2' => DeleteLogFormatter::class,
11686 'delete/event' => DeleteLogFormatter::class,
11687 'delete/restore' => DeleteLogFormatter::class,
11688 'delete/revision' => DeleteLogFormatter::class,
11689 'import/interwiki' => ImportLogFormatter::class,
11690 'import/upload' => ImportLogFormatter::class,
11691 'managetags/activate' => LogFormatter::class,
11692 'managetags/create' => LogFormatter::class,
11693 'managetags/deactivate' => LogFormatter::class,
11694 'managetags/delete' => LogFormatter::class,
11695 'merge/merge' => MergeLogFormatter::class,
11696 'move/move' => MoveLogFormatter::class,
11697 'move/move_redir' => MoveLogFormatter::class,
11698 'patrol/patrol' => PatrolLogFormatter::class,
11699 'patrol/autopatrol' => PatrolLogFormatter::class,
11700 'protect/modify' => ProtectLogFormatter::class,
11701 'protect/move_prot' => ProtectLogFormatter::class,
11702 'protect/protect' => ProtectLogFormatter::class,
11703 'protect/unprotect' => ProtectLogFormatter::class,
11704 'renameuser/renameuser' => RenameuserLogFormatter::class,
11705 'rights/autopromote' => RightsLogFormatter::class,
11706 'rights/rights' => RightsLogFormatter::class,
11707 'suppress/block' => BlockLogFormatter::class,
11708 'suppress/delete' => DeleteLogFormatter::class,
11709 'suppress/event' => DeleteLogFormatter::class,
11710 'suppress/reblock' => BlockLogFormatter::class,
11711 'suppress/revision' => DeleteLogFormatter::class,
11712 'tag/update' => TagLogFormatter::class,
11713 'upload/overwrite' => UploadLogFormatter::class,
11714 'upload/revert' => UploadLogFormatter::class,
11715 'upload/upload' => UploadLogFormatter::class,
11716 ],
11717 'type' => 'map',
11718 ];
11719
11729 public const ActionFilteredLogs = [
11730 'default' => [
11731 'block' => [
11732 'block' => [ 'block' ],
11733 'reblock' => [ 'reblock' ],
11734 'unblock' => [ 'unblock' ],
11735 ],
11736 'contentmodel' => [
11737 'change' => [ 'change' ],
11738 'new' => [ 'new' ],
11739 ],
11740 'delete' => [
11741 'delete' => [ 'delete' ],
11742 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
11743 'restore' => [ 'restore' ],
11744 'event' => [ 'event' ],
11745 'revision' => [ 'revision' ],
11746 ],
11747 'import' => [
11748 'interwiki' => [ 'interwiki' ],
11749 'upload' => [ 'upload' ],
11750 ],
11751 'managetags' => [
11752 'create' => [ 'create' ],
11753 'delete' => [ 'delete' ],
11754 'activate' => [ 'activate' ],
11755 'deactivate' => [ 'deactivate' ],
11756 ],
11757 'move' => [
11758 'move' => [ 'move' ],
11759 'move_redir' => [ 'move_redir' ],
11760 ],
11761 'newusers' => [
11762 'create' => [ 'create', 'newusers' ],
11763 'create2' => [ 'create2' ],
11764 'autocreate' => [ 'autocreate' ],
11765 'byemail' => [ 'byemail' ],
11766 ],
11767 'protect' => [
11768 'protect' => [ 'protect' ],
11769 'modify' => [ 'modify' ],
11770 'unprotect' => [ 'unprotect' ],
11771 'move_prot' => [ 'move_prot' ],
11772 ],
11773 'rights' => [
11774 'rights' => [ 'rights' ],
11775 'autopromote' => [ 'autopromote' ],
11776 ],
11777 'suppress' => [
11778 'event' => [ 'event' ],
11779 'revision' => [ 'revision' ],
11780 'delete' => [ 'delete' ],
11781 'block' => [ 'block' ],
11782 'reblock' => [ 'reblock' ],
11783 ],
11784 'upload' => [
11785 'upload' => [ 'upload' ],
11786 'overwrite' => [ 'overwrite' ],
11787 'revert' => [ 'revert' ],
11788 ],
11789 ],
11790 'type' => 'map',
11791 ];
11792
11796 public const NewUserLog = [
11797 'default' => true,
11798 ];
11799
11805 public const PageCreationLog = [
11806 'default' => true,
11807 ];
11808
11809 // endregion -- end logging
11810
11811 /***************************************************************************/
11812 // region Special pages (general and miscellaneous)
11818 public const AllowSpecialInclusion = [
11819 'default' => true,
11820 ];
11821
11828 public const DisableQueryPageUpdate = [
11829 'default' => false,
11830 ];
11831
11836 public const CountCategorizedImagesAsUsed = [
11837 'default' => false,
11838 ];
11839
11844 public const MaxRedirectLinksRetrieved = [
11845 'default' => 500,
11846 ];
11847
11854 public const RangeContributionsCIDRLimit = [
11855 'default' => [
11856 'IPv4' => 16,
11857 'IPv6' => 32,
11858 ],
11859 'type' => 'map',
11860 'additionalProperties' => [ 'type' => 'integer', ],
11861 ];
11862
11863 // endregion -- end special pages
11864
11865 /***************************************************************************/
11866 // region Actions
11875 public const Actions = [
11876 'default' => [],
11877 'type' => 'map',
11878 ];
11879
11880 // endregion -- end actions
11881
11882 /***************************************************************************/
11883 // region Robot (search engine crawler) policy
11885 // See also $wgNoFollowLinks.
11886
11892 public const DefaultRobotPolicy = [
11893 'default' => 'index,follow',
11894 ];
11895
11911 public const NamespaceRobotPolicies = [
11912 'default' => [],
11913 'type' => 'map',
11914 ];
11915
11945 public const ArticleRobotPolicies = [
11946 'default' => [],
11947 'type' => 'map',
11948 ];
11949
11961 public const ExemptFromUserRobotsControl = [
11962 'default' => null,
11963 'type' => '?list',
11964 ];
11965
11966 // endregion End robot policy
11967
11968 /***************************************************************************/
11969 // region Action API and REST API
11986 public const DebugAPI = [
11987 'default' => false,
11988 ];
11989
12025 public const APIModules = [
12026 'default' => [],
12027 'type' => 'map',
12028 ];
12029
12038 public const APIFormatModules = [
12039 'default' => [],
12040 'type' => 'map',
12041 ];
12042
12051 public const APIMetaModules = [
12052 'default' => [],
12053 'type' => 'map',
12054 ];
12055
12064 public const APIPropModules = [
12065 'default' => [],
12066 'type' => 'map',
12067 ];
12068
12077 public const APIListModules = [
12078 'default' => [],
12079 'type' => 'map',
12080 ];
12081
12086 public const APIMaxDBRows = [
12087 'default' => 5000,
12088 ];
12089
12095 public const APIMaxResultSize = [
12096 'default' => 8388608,
12097 ];
12098
12103 public const APIMaxUncachedDiffs = [
12104 'default' => 1,
12105 ];
12106
12113 public const APIMaxLagThreshold = [
12114 'default' => 7,
12115 ];
12116
12121 public const APIRequestLog = [
12122 'default' => false,
12123 ];
12124
12128 public const APICacheHelpTimeout = [
12129 'default' => 60 * 60,
12130 ];
12131
12136 public const APIUselessQueryPages = [
12137 'default' => [
12138 'MIMEsearch',
12139 'LinkSearch',
12140 ],
12141 'type' => 'list',
12142 ];
12143
12147 public const AjaxLicensePreview = [
12148 'default' => true,
12149 ];
12150
12173 public const CrossSiteAJAXdomains = [
12174 'default' => [],
12175 'type' => 'map',
12176 ];
12177
12183 public const CrossSiteAJAXdomainExceptions = [
12184 'default' => [],
12185 'type' => 'map',
12186 ];
12187
12191 public const AllowedCorsHeaders = [
12192 'default' => [
12193 /* simple headers (see spec) */
12194 'Accept',
12195 'Accept-Language',
12196 'Content-Language',
12197 'Content-Type',
12198 /* non-authorable headers in XHR, which are however requested by some UAs */
12199 'Accept-Encoding',
12200 'DNT',
12201 'Origin',
12202 /* MediaWiki whitelist */
12203 'User-Agent',
12204 'Api-User-Agent',
12205 /* Allowing caching preflight requests, see T269636 */
12206 'Access-Control-Max-Age',
12207 /* OAuth 2.0, see T322944 */
12208 'Authorization',
12209 ],
12210 'type' => 'list',
12211 ];
12212
12218 public const RestAPIAdditionalRouteFiles = [
12219 'default' => [],
12220 'type' => 'list',
12221 ];
12222
12223 // endregion -- End AJAX and API
12224
12225 /***************************************************************************/
12226 // region Shell and process control
12232 public const MaxShellMemory = [
12233 'default' => 307200,
12234 ];
12235
12240 public const MaxShellFileSize = [
12241 'default' => 102400,
12242 ];
12243
12247 public const MaxShellTime = [
12248 'default' => 180,
12249 ];
12250
12255 public const MaxShellWallClockTime = [
12256 'default' => 180,
12257 ];
12258
12282 public const ShellCgroup = [
12283 'default' => false,
12284 ];
12285
12289 public const PhpCli = [
12290 'default' => '/usr/bin/php',
12291 ];
12292
12305 public const ShellRestrictionMethod = [
12306 'default' => 'autodetect',
12307 'type' => 'string|false',
12308 ];
12309
12323 public const ShellboxUrls = [
12324 'default' => [ 'default' => null, ],
12325 'type' => 'map',
12326 'additionalProperties' => [
12327 'type' => 'string|false|null',
12328 ],
12329 ];
12330
12337 public const ShellboxSecretKey = [
12338 'default' => null,
12339 'type' => '?string',
12340 ];
12341
12342 // endregion -- end Shell and process control
12343
12344 /***************************************************************************/
12345 // region HTTP client
12353 public const HTTPTimeout = [
12354 'default' => 25,
12355 'type' => 'float',
12356 ];
12357
12365 public const HTTPConnectTimeout = [
12366 'default' => 5.0,
12367 'type' => 'float',
12368 ];
12369
12377 public const HTTPMaxTimeout = [
12378 'default' => 0,
12379 'type' => 'float',
12380 ];
12381
12389 public const HTTPMaxConnectTimeout = [
12390 'default' => 0,
12391 'type' => 'float',
12392 ];
12393
12399 public const HTTPImportTimeout = [
12400 'default' => 25,
12401 ];
12402
12406 public const AsyncHTTPTimeout = [
12407 'default' => 25,
12408 ];
12409
12413 public const HTTPProxy = [
12414 'default' => '',
12415 ];
12416
12432 public const LocalVirtualHosts = [
12433 'default' => [],
12434 'type' => 'map',
12435 ];
12436
12448 public const LocalHTTPProxy = [
12449 'default' => false,
12450 'type' => 'string|false',
12451 ];
12452
12462 public const AllowExternalReqID = [
12463 'default' => false,
12464 ];
12465
12466 // endregion -- End HTTP client
12467
12468 /***************************************************************************/
12469 // region Job queue
12489 public const JobRunRate = [
12490 'default' => 1,
12491 ];
12492
12500 public const RunJobsAsync = [
12501 'default' => false,
12502 ];
12503
12507 public const UpdateRowsPerJob = [
12508 'default' => 300,
12509 ];
12510
12514 public const UpdateRowsPerQuery = [
12515 'default' => 100,
12516 ];
12517
12518 // endregion -- End job queue
12519
12520 /***************************************************************************/
12521 // region Miscellaneous
12529 public const RedirectOnLogin = [
12530 'default' => null,
12531 ];
12532
12569 public const VirtualRestConfig = [
12570 'default' => [
12571 'paths' => [],
12572 'modules' => [],
12573 'global' => [
12574 # Timeout in seconds
12575 'timeout' => 360,
12576 # 'domain' is set to $wgCanonicalServer in Setup.php
12577 'forwardCookies' => false,
12578 'HTTPProxy' => null
12579 ]
12580 ],
12581 'mergeStrategy' => 'array_plus_2d',
12582 'type' => 'map',
12583 ];
12584
12607 public const EventRelayerConfig = [
12608 'default' => [
12609 'default' => [ 'class' => EventRelayerNull::class, ],
12610 ],
12611 'type' => 'map',
12612 ];
12613
12631 public const Pingback = [
12632 'default' => false,
12633 'type' => 'boolean',
12634 ];
12635
12641 public const OriginTrials = [
12642 'default' => [],
12643 'type' => 'list',
12644 ];
12645
12652 public const ReportToExpiry = [
12653 'default' => 86400,
12654 'type' => 'integer',
12655 ];
12656
12663 public const ReportToEndpoints = [
12664 'default' => [],
12665 'type' => 'list',
12666 ];
12667
12676 public const FeaturePolicyReportOnly = [
12677 'default' => [],
12678 'type' => 'list',
12679 ];
12680
12686 public const SkinsPreferred = [
12687 'default' => [ 'vector-2022', 'vector' ],
12688 'type' => 'list',
12689 ];
12690
12696 public const SpecialContributeSkinsEnabled = [
12697 'default' => [],
12698 'type' => 'list',
12699 ];
12700
12705 public const EnableEditRecovery = [
12706 'default' => false,
12707 'type' => 'boolean',
12708 ];
12709
12713 public const EditRecoveryExpiry = [
12714 'default' => 2592000,
12715 'type' => 'integer',
12716 ];
12717
12718 // endregion -- End Miscellaneous
12719
12720}
const SCHEMA_COMPAT_OLD
Definition Defines.php:275
const AV_SCAN_FAILED
Definition Defines.php:99
const SCHEMA_COMPAT_READ_NEW
Definition Defines.php:268
const AV_VIRUS_FOUND
Definition Defines.php:97
const APCOND_AGE
Definition Defines.php:177
const NS_HELP
Definition Defines.php:76
const SCHEMA_COMPAT_WRITE_OLD
Definition Defines.php:263
const NS_USER
Definition Defines.php:66
const CONTENT_MODEL_CSS
Definition Defines.php:211
const NS_FILE
Definition Defines.php:70
const CACHE_NONE
Definition Defines.php:86
const CACHE_ANYTHING
Definition Defines.php:85
const NS_MEDIAWIKI_TALK
Definition Defines.php:73
const NS_MAIN
Definition Defines.php:64
const NS_PROJECT_TALK
Definition Defines.php:69
const NS_MEDIAWIKI
Definition Defines.php:72
const NS_TEMPLATE
Definition Defines.php:74
const CACHE_ACCEL
Definition Defines.php:89
const NS_FILE_TALK
Definition Defines.php:71
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:315
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:209
const SCHEMA_COMPAT_READ_OLD
Definition Defines.php:264
const CONTENT_MODEL_JSON
Definition Defines.php:213
const NS_HELP_TALK
Definition Defines.php:77
const NS_CATEGORY_TALK
Definition Defines.php:79
const CONTENT_MODEL_TEXT
Definition Defines.php:212
const SCHEMA_COMPAT_WRITE_NEW
Definition Defines.php:267
const CACHE_DB
Definition Defines.php:87
const AV_SCAN_ABORTED
Definition Defines.php:98
const APCOND_EDITCOUNT
Definition Defines.php:176
const NS_TALK
Definition Defines.php:65
const AV_NO_VIRUS
Definition Defines.php:96
const NS_USER_TALK
Definition Defines.php:67
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:214
const NS_PROJECT
Definition Defines.php:68
const NS_CATEGORY
Definition Defines.php:78
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:210
const NS_TEMPLATE_TALK
Definition Defines.php:75
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:88
This is a wrapper for APCu's shared memory functions.
A PBKDF2-hashed password.
Job for updating user activity like "last viewed" timestamps.
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
Assemble the segments of a chunked upload.
A Bcrypt-hashed password.
This class formats block log entries.
Job to add recent change entries mentioning category membership changes.
Job to purge a set of URLs from CDN.
Job to clear a users watchlist in batches.
Job for clearing all of the "last viewed" timestamps for a user's watchlist, or setting them all to t...
Content handler for CSS pages.
Job to prune link tables for pages that were deleted.
This class formats delete log entries.
Fix any double redirects after moving a page.
Send an arbitrary single email.
A BagOStuff object with no objects in it.
Send an email notification.
Content handler implementation for unknown content.
Maintenance script that fixes double redirects.
Job to purge the HTML/file cache for all pages that link to or use another page or file.
Simple store for keeping values in an associative array for the current process.
Hooks class.
Definition Hooks.php:38
This class formats import log entries.
Content handler for JavaScript pages.
Class to handle job queues stored in the DB.
Content handler for JSON text.
Methods for dealing with language codes.
This password hash type layers one or more parameterized password types on top of each other.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:48
Caching for the contents of localisation files.
Implements the default log formatting.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Class representing a MediaWiki site.
This class performs some operations related to tracking categories, such as adding a tracking categor...
Class for handling updates to the site_stats table.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:47
This class contains schema declarations for all configuration variables known to MediaWiki core.
static getDefaultLocalTZoffset( $localtimezone)
Site language code.
static getDefaultLogo( $resourceBasePath)
static getDefaultLoadScript( $scriptPath)
static getDefaultCookieSecure( $forceHTTPS)
Default cookie lifetime, in seconds.
static getDefaultUploadDirectory( $baseDirectory)
static getDefaultLocalFileRepo( $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath, $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory, $updateCompatibleMetadata)
Allow users to upload files.
static getDefaultValue(string $name)
Returns the default value of the given config setting.
static getDefaultReadOnlyFile( $uploadDirectory)
static getDefaultUploadPath( $scriptPath)
static getDefaultMetaNamespace( $sitename)
static getDefaultExtensionAssetsPath( $resourceBasePath)
static getDefaultDeletedDirectory( $uploadDirectory)
static listDefaultValues(string $prefix='')
Returns a generator for iterating over all config settings and their default values.
static getDefaultScript( $scriptPath)
static getDefaultResourceBasePath( $scriptPath)
static getDefaultDBerrorLogTZ( $localtimezone)
Current wiki database name.
static getDefaultSharedPrefix( $dbPrefix)
static getDefaultSharedSchema( $dbMwschema)
static getDefaultLocalStylePath( $scriptPath)
static getDefaultStylePath( $resourceBasePath)
static getDefaultCookiePrefix( $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix)
Default cookie lifetime, in seconds.
static getDefaultFileCacheDirectory( $uploadDirectory)
static getDefaultArticlePath(string $script, $usePathInfo)
static getDefaultLocaltimezone()
Site language code.
static getDefaultRestPath( $scriptPath)
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form stripping il...
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
A CentralIdLookup provider that just uses local IDs.
A wrapper class for the PECL memcached client.
A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
This class formats merge log entries.
This class formats move log entries.
No-op job that does nothing.
Definition NullJob.php:50
This class formats patrol log entries.
Profiler base class that defines the interface and some shared functionality.
Definition Profiler.php:37
This class formats protect log entries.
Upload a file from the upload stash into the local file repo.
Puurge expired rows from the recentchanges table.
Send recent change to a Redis Pub/Sub channel.
Job to update link tables for rerendered wiki pages.
Custom job to perform updates on tables in busier environments.
LogFormatter for renameuser/renameuser logs.
A cache class that directs writes to one set of servers and reads to another.
Job for deferring the execution of RevertedTagUpdate.
This class formats rights log entries.
RDBMS-based caching module.
This class formats tag log entries.
Base content handler implementation for flat text contents.
Job for asynchronous rendering of thumbnails, e.g.
Send recent change notifications to a destination address over UDP.
This class formats upload log entries.
Job that initializes an user's edit count.
Job that purges expired user group memberships.
Job that updates a user's preferences.
Multi-datacenter aware caching interface.
No-op class for publishing messages into a PubSub system.
Content handler for wiki text pages.
Wrapper for WinCache object caching functions; identical interface to the APC wrapper.
return[0=> 'ـ', 1=> ' ', 2=> '`', 3=> '´', 4=> '˜', 5=> '^', 6=> '¯', 7=> '‾', 8=> '˘', 9=> '˙', 10=> '¨', 11=> '˚', 12=> '˝', 13=> '᾽', 14=> '῝', 15=> '¸', 16=> '˛', 17=> '_', 18=> '‗', 19=> '῀', 20=> '﮲', 21=> '﮳', 22=> '﮴', 23=> '﮵', 24=> '﮶', 25=> '﮷', 26=> '﮸', 27=> '﮹', 28=> '﮺', 29=> '﮻', 30=> '﮼', 31=> '﮽', 32=> '﮾', 33=> '﮿', 34=> '﯀', 35=> '﯁', 36=> '゛', 37=> '゜', 38=> '-', 39=> '֊', 40=> '᐀', 41=> '᭠', 42=> '᠆', 43=> '᠇', 44=> '‐', 45=> '‒', 46=> '–', 47=> '—', 48=> '―', 49=> '⁓', 50=> '⸗', 51=> '゠', 52=> '・', 53=> ',', 54=> '՝', 55=> '،', 56=> '؍', 57=> '٫', 58=> '٬', 59=> '߸', 60=> '᠂', 61=> '᠈', 62=> '꓾', 63=> '꘍', 64=> '꛵', 65=> '︑', 66=> ';', 67=> '؛', 68=> '⁏', 69=> '꛶', 70=> ':', 71=> '։', 72=> '؞', 73=> '܃', 74=> '܄', 75=> '܅', 76=> '܆', 77=> '܇', 78=> '܈', 79=> '࠰', 80=> '࠱', 81=> '࠲', 82=> '࠳', 83=> '࠴', 84=> '࠵', 85=> '࠶', 86=> '࠷', 87=> '࠸', 88=> '࠹', 89=> '࠺', 90=> '࠻', 91=> '࠼', 92=> '࠽', 93=> '࠾', 94=> '፡', 95=> '፣', 96=> '፤', 97=> '፥', 98=> '፦', 99=> '᠄', 100=> '᠅', 101=> '༔', 102=> '៖', 103=> '᭝', 104=> '꧇', 105=> '᛫', 106=> '᛬', 107=> '᛭', 108=> '꛴', 109=> '!', 110=> '¡', 111=> '՜', 112=> '߹', 113=> '᥄', 114=> '?', 115=> '¿', 116=> '⸮', 117=> '՞', 118=> '؟', 119=> '܉', 120=> '፧', 121=> '᥅', 122=> '⳺', 123=> '⳻', 124=> '꘏', 125=> '꛷', 126=> '‽', 127=> '⸘', 128=> '.', 129=> '᠁', 130=> '۔', 131=> '܁', 132=> '܂', 133=> '።', 134=> '᠃', 135=> '᠉', 136=> '᙮', 137=> '᭜', 138=> '⳹', 139=> '⳾', 140=> '⸰', 141=> '꓿', 142=> '꘎', 143=> '꛳', 144=> '︒', 145=> '·', 146=> '⸱', 147=> '।', 148=> '॥', 149=> '꣎', 150=> '꣏', 151=> '᰻', 152=> '᰼', 153=> '꡶', 154=> '꡷', 155=> '᜵', 156=> '᜶', 157=> '꤯', 158=> '၊', 159=> '။', 160=> '។', 161=> '៕', 162=> '᪨', 163=> '᪩', 164=> '᪪', 165=> '᪫', 166=> '᭞', 167=> '᭟', 168=> '꧈', 169=> '꧉', 170=> '꩝', 171=> '꩞', 172=> '꩟', 173=> '꯫', 174=> '𐩖', 175=> '𐩗', 176=> '𑁇', 177=> '𑁈', 178=> '𑃀', 179=> '𑃁', 180=> '᱾', 181=> '᱿', 182=> '܀', 183=> '߷', 184=> '჻', 185=> '፠', 186=> '፨', 187=> '᨞', 188=> '᨟', 189=> '᭚', 190=> '᭛', 191=> '꧁', 192=> '꧂', 193=> '꧃', 194=> '꧄', 195=> '꧅', 196=> '꧆', 197=> '꧊', 198=> '꧋', 199=> '꧌', 200=> '꧍', 201=> '꛲', 202=> '꥟', 203=> '𐡗', 204=> '𐬺', 205=> '𐬻', 206=> '𐬼', 207=> '𐬽', 208=> '𐬾', 209=> '𐬿', 210=> '𑂾', 211=> '𑂿', 212=> '⁕', 213=> '⁖', 214=> '⁘', 215=> '⁙', 216=> '⁚', 217=> '⁛', 218=> '⁜', 219=> '⁝', 220=> '⁞', 221=> '⸪', 222=> '⸫', 223=> '⸬', 224=> '⸭', 225=> '⳼', 226=> '⳿', 227=> '⸙', 228=> '𐤿', 229=> '𐄀', 230=> '𐄁', 231=> '𐄂', 232=> '𐎟', 233=> '𐏐', 234=> '𐤟', 235=> '𒑰', 236=> '𒑱', 237=> '𒑲', 238=> '𒑳', 239=> '\'', 240=> '‘', 241=> '’', 242=> '‚', 243=> '‛', 244=> '‹', 245=> '›', 246=> '"', 247 => '“', 248 => '”', 249 => '„', 250 => '‟', 251 => '«', 252 => '»', 253 => '(', 254 => ')', 255 => '[', 256 => ']', 257 => '{', 258 => '}', 259 => '༺', 260 => '༻', 261 => '༼', 262 => '༽', 263 => '᚛', 264 => '᚜', 265 => '⁅', 266 => '⁆', 267 => '⧼', 268 => '⧽', 269 => '⦃', 270 => '⦄', 271 => '⦅', 272 => '⦆', 273 => '⦇', 274 => '⦈', 275 => '⦉', 276 => '⦊', 277 => '⦋', 278 => '⦌', 279 => '⦍', 280 => '⦎', 281 => '⦏', 282 => '⦐', 283 => '⦑', 284 => '⦒', 285 => '⦓', 286 => '⦔', 287 => '⦕', 288 => '⦖', 289 => '⦗', 290 => '⦘', 291 => '⟬', 292 => '⟭', 293 => '⟮', 294 => '⟯', 295 => '⸂', 296 => '⸃', 297 => '⸄', 298 => '⸅', 299 => '⸉', 300 => '⸊', 301 => '⸌', 302 => '⸍', 303 => '⸜', 304 => '⸝', 305 => '⸠', 306 => '⸡', 307 => '⸢', 308 => '⸣', 309 => '⸤', 310 => '⸥', 311 => '⸦', 312 => '⸧', 313 => '⸨', 314 => '⸩', 315 => '〈', 316 => '〉', 317 => '「', 318 => '」', 319 => '﹝', 320 => '﹞', 321 => '︗', 322 => '︘', 323 => '﴾', 324 => '﴿', 325 => '§', 326 => '¶', 327 => '⁋', 328 => '©', 329 => '®', 330 => '@', 331 => '*', 332 => '⁎', 333 => '⁑', 334 => '٭', 335 => '꙳', 336 => '/', 337 => '⁄', 338 => '\\', 339 => '&', 340 => '⅋', 341 => '⁊', 342 => '#', 343 => '%', 344 => '٪', 345 => '‰', 346 => '؉', 347 => '‱', 348 => '؊', 349 => '⁒', 350 => '†', 351 => '‡', 352 => '•', 353 => '‣', 354 => '‧', 355 => '⁃', 356 => '⁌', 357 => '⁍', 358 => '′', 359 => '‵', 360 => '‸', 361 => '※', 362 => '‿', 363 => '⁔', 364 => '⁀', 365 => '⁐', 366 => '⁁', 367 => '⁂', 368 => '⸀', 369 => '⸁', 370 => '⸆', 371 => '⸇', 372 => '⸈', 373 => '⸋', 374 => '⸎', 375 => '⸏', 376 => '⸐', 377 => '⸑', 378 => '⸒', 379 => '⸓', 380 => '⸔', 381 => '⸕', 382 => '⸖', 383 => '⸚', 384 => '⸛', 385 => '⸞', 386 => '⸟', 387 => '꙾', 388 => '՚', 389 => '՛', 390 => '՟', 391 => '־', 392 => '׀', 393 => '׃', 394 => '׆', 395 => '׳', 396 => '״', 397 => '܊', 398 => '܋', 399 => '܌', 400 => '܍', 401 => '࡞', 402 => '᠀', 403 => '॰', 404 => '꣸', 405 => '꣹', 406 => '꣺', 407 => '෴', 408 => '๚', 409 => '๛', 410 => '꫞', 411 => '꫟', 412 => '༄', 413 => '༅', 414 => '༆', 415 => '༇', 416 => '༈', 417 => '༉', 418 => '༊', 419 => '࿐', 420 => '࿑', 421 => '་', 422 => '།', 423 => '༎', 424 => '༏', 425 => '༐', 426 => '༑', 427 => '༒', 428 => '྅', 429 => '࿒', 430 => '࿓', 431 => '࿔', 432 => '࿙', 433 => '࿚', 434 => '᰽', 435 => '᰾', 436 => '᰿', 437 => '᥀', 438 => '၌', 439 => '၍', 440 => '၎', 441 => '၏', 442 => '႞', 443 => '႟', 444 => '꩷', 445 => '꩸', 446 => '꩹', 447 => 'ៗ', 448 => '៘', 449 => '៙', 450 => '៚', 451 => '᪠', 452 => '᪡', 453 => '᪢', 454 => '᪣', 455 => '᪤', 456 => '᪥', 457 => '᪦', 458 => '᪬', 459 => '᪭', 460 => '᙭', 461 => '⵰', 462 => '꡴', 463 => '꡵', 464 => '᯼', 465 => '᯽', 466 => '᯾', 467 => '᯿', 468 => '꤮', 469 => '꧞', 470 => '꧟', 471 => '꩜', 472 => '𑁉', 473 => '𑁊', 474 => '𑁋', 475 => '𑁌', 476 => '𑁍', 477 => '𐩐', 478 => '𐩑', 479 => '𐩒', 480 => '𐩓', 481 => '𐩔', 482 => '𐩕', 483 => '𐩘', 484 => '𐬹', 485 => '𑂻', 486 => '𑂼', 487 => 'ʹ', 488 => '͵', 489 => 'ʺ', 490 => '˂', 491 => '˃', 492 => '˄', 493 => '˅', 494 => 'ˆ', 495 => 'ˇ', 496 => 'ˈ', 497 => 'ˉ', 498 => 'ˊ', 499 => 'ˋ', 500 => 'ˌ', 501 => 'ˍ', 502 => 'ˎ', 503 => 'ˏ', 504 => '˒', 505 => '˓', 506 => '˔', 507 => '˕', 508 => '˖', 509 => '˗', 510 => '˞', 511 => '˟', 512 => '˥', 513 => '˦', 514 => '˧', 515 => '˨', 516 => '˩', 517 => '˪', 518 => '˫', 519 => 'ˬ', 520 => '˭', 521 => '˯', 522 => '˰', 523 => '˱', 524 => '˲', 525 => '˳', 526 => '˴', 527 => '˵', 528 => '˶', 529 => '˷', 530 => '˸', 531 => '˹', 532 => '˺', 533 => '˻', 534 => '˼', 535 => '˽', 536 => '˾', 537 => '˿', 538 => '᎐', 539 => '᎑', 540 => '᎒', 541 => '᎓', 542 => '᎔', 543 => '᎕', 544 => '᎖', 545 => '᎗', 546 => '᎘', 547 => '᎙', 548 => '꜀', 549 => '꜁', 550 => '꜂', 551 => '꜃', 552 => '꜄', 553 => '꜅', 554 => '꜆', 555 => '꜇', 556 => '꜈', 557 => '꜉', 558 => '꜊', 559 => '꜋', 560 => '꜌', 561 => '꜍', 562 => '꜎', 563 => '꜏', 564 => '꜐', 565 => '꜑', 566 => '꜒', 567 => '꜓', 568 => '꜔', 569 => '꜕', 570 => '꜖', 571 => 'ꜗ', 572 => 'ꜘ', 573 => 'ꜙ', 574 => 'ꜚ', 575 => 'ꜛ', 576 => 'ꜜ', 577 => 'ꜝ', 578 => 'ꜞ', 579 => 'ꜟ', 580 => '꜠', 581 => '꜡', 582 => 'ꞈ', 583 => '꞉', 584 => '꞊', 585 => '°', 586 => '҂', 587 => '؈', 588 => '؎', 589 => '؏', 590 => '۞', 591 => '۩', 592 => '﷽', 593 => '߶', 594 => '৺', 595 => '୰', 596 => '௳', 597 => '௴', 598 => '௵', 599 => '௶', 600 => '௷', 601 => '௸', 602 => '௺', 603 => '౿', 604 => '൹', 605 => '꠨', 606 => '꠩', 607 => '꠪', 608 => '꠫', 609 => '꠶', 610 => '꠷', 611 => '꠹', 612 => '๏', 613 => '༁', 614 => '༂', 615 => '༃', 616 => '༓', 617 => '༕', 618 => '༖', 619 => '༗', 620 => '༚', 621 => '༛', 622 => '༜', 623 => '༝', 624 => '༞', 625 => '༟', 626 => '༴', 627 => '༶', 628 => '༸', 629 => '྾', 630 => '྿', 631 => '࿀', 632 => '࿁', 633 => '࿂', 634 => '࿃', 635 => '࿄', 636 => '࿅', 637 => '࿇', 638 => '࿈', 639 => '࿉', 640 => '࿊', 641 => '࿋', 642 => '࿌', 643 => '࿎', 644 => '࿏', 645 => '࿕', 646 => '࿖', 647 => '࿗', 648 => '࿘', 649 => '᧠', 650 => '᧡', 651 => '᧢', 652 => '᧣', 653 => '᧤', 654 => '᧥', 655 => '᧦', 656 => '᧧', 657 => '᧨', 658 => '᧩', 659 => '᧪', 660 => '᧫', 661 => '᧬', 662 => '᧭', 663 => '᧮', 664 => '᧯', 665 => '᧰', 666 => '᧱', 667 => '᧲', 668 => '᧳', 669 => '᧴', 670 => '᧵', 671 => '᧶', 672 => '᧷', 673 => '᧸', 674 => '᧹', 675 => '᧺', 676 => '᧻', 677 => '᧼', 678 => '᧽', 679 => '᧾', 680 => '᧿', 681 => '᭡', 682 => '᭢', 683 => '᭣', 684 => '᭤', 685 => '᭥', 686 => '᭦', 687 => '᭧', 688 => '᭨', 689 => '᭩', 690 => '᭪', 691 => '᭴', 692 => '᭵', 693 => '᭶', 694 => '᭷', 695 => '᭸', 696 => '᭹', 697 => '᭺', 698 => '᭻', 699 => '᭼', 700 => '℄', 701 => '℈', 702 => '℔', 703 => '℗', 704 => '℘', 705 => '℞', 706 => '℟', 707 => '℣', 708 => '℥', 709 => '℧', 710 => '℩', 711 => '℮', 712 => '℺', 713 => '⅁', 714 => '⅂', 715 => '⅃', 716 => '⅄', 717 => '⅊', 718 => '⅌', 719 => '⅍', 720 => '⅏', 721 => '←', 722 => '→', 723 => '↑', 724 => '↓', 725 => '↔', 726 => '↕', 727 => '↖', 728 => '↗', 729 => '↘', 730 => '↙', 731 => '↜', 732 => '↝', 733 => '↞', 734 => '↟', 735 => '↠', 736 => '↡', 737 => '↢', 738 => '↣', 739 => '↤', 740 => '↥', 741 => '↦', 742 => '↧', 743 => '↨', 744 => '↩', 745 => '↪', 746 => '↫', 747 => '↬', 748 => '↭', 749 => '↯', 750 => '↰', 751 => '↱', 752 => '↲', 753 => '↳', 754 => '↴', 755 => '↵', 756 => '↶', 757 => '↷', 758 => '↸', 759 => '↹', 760 => '↺', 761 => '↻', 762 => '↼', 763 => '↽', 764 => '↾', 765 => '↿', 766 => '⇀', 767 => '⇁', 768 => '⇂', 769 => '⇃', 770 => '⇄', 771 => '⇅', 772 => '⇆', 773 => '⇇', 774 => '⇈', 775 => '⇉', 776 => '⇊', 777 => '⇋', 778 => '⇌', 779 => '⇐', 780 => '⇑', 781 => '⇒', 782 => '⇓', 783 => '⇔', 784 => '⇕', 785 => '⇖', 786 => '⇗', 787 => '⇘', 788 => '⇙', 789 => '⇚', 790 => '⇛', 791 => '⇜', 792 => '⇝', 793 => '⇞', 794 => '⇟', 795 => '⇠', 796 => '⇡', 797 => '⇢', 798 => '⇣', 799 => '⇤', 800 => '⇥', 801 => '⇦', 802 => '⇧', 803 => '⇨', 804 => '⇩', 805 => '⇪', 806 => '⇫', 807 => '⇬', 808 => '⇭', 809 => '⇮', 810 => '⇯', 811 => '⇰', 812 => '⇱', 813 => '⇲', 814 => '⇳', 815 => '⇴', 816 => '⇵', 817 => '⇶', 818 => '⇷', 819 => '⇸', 820 => '⇹', 821 => '⇺', 822 => '⇻', 823 => '⇼', 824 => '⇽', 825 => '⇾', 826 => '⇿', 827 => '∀', 828 => '∁', 829 => '∂', 830 => '∃', 831 => '∅', 832 => '∆', 833 => '∇', 834 => '∈', 835 => '∊', 836 => '∋', 837 => '∍', 838 => '϶', 839 => '∎', 840 => '∏', 841 => '∐', 842 => '∑', 843 => '+', 844 => '±', 845 => '÷', 846 => '×', 847 => '<', 848 => '=', 849 => '>', 850 => '¬', 851 => '|', 852 => '¦', 853 => '‖', 854 => '~', 855 => '−', 856 => '∓', 857 => '∔', 858 => '∕', 859 => '∖', 860 => '∗', 861 => '∘', 862 => '∙', 863 => '√', 864 => '∛', 865 => '؆', 866 => '∜', 867 => '؇', 868 => '∝', 869 => '∞', 870 => '∟', 871 => '∠', 872 => '∡', 873 => '∢', 874 => '∣', 875 => '∥', 876 => '∧', 877 => '∨', 878 => '∩', 879 => '∪', 880 => '∫', 881 => '∮', 882 => '∱', 883 => '∲', 884 => '∳', 885 => '∴', 886 => '∵', 887 => '∶', 888 => '∷', 889 => '∸', 890 => '∹', 891 => '∺', 892 => '∻', 893 => '∼', 894 => '∽', 895 => '∾', 896 => '∿', 897 => '≀', 898 => '≂', 899 => '≃', 900 => '≅', 901 => '≆', 902 => '≈', 903 => '≊', 904 => '≋', 905 => '≌', 906 => '≍', 907 => '≎', 908 => '≏', 909 => '≐', 910 => '≑', 911 => '≒', 912 => '≓', 913 => '≔', 914 => '≕', 915 => '≖', 916 => '≗', 917 => '≘', 918 => '≙', 919 => '≚', 920 => '≛', 921 => '≜', 922 => '≝', 923 => '≞', 924 => '≟', 925 => '≡', 926 => '≣', 927 => '≤', 928 => '≥', 929 => '≦', 930 => '≧', 931 => '≨', 932 => '≩', 933 => '≪', 934 => '≫', 935 => '≬', 936 => '≲', 937 => '≳', 938 => '≶', 939 => '≷', 940 => '≺', 941 => '≻', 942 => '≼', 943 => '≽', 944 => '≾', 945 => '≿', 946 => '⊂', 947 => '⊃', 948 => '⊆', 949 => '⊇', 950 => '⊊', 951 => '⊋', 952 => '⊌', 953 => '⊍', 954 => '⊎', 955 => '⊏', 956 => '⊐', 957 => '⊑', 958 => '⊒', 959 => '⊓', 960 => '⊔', 961 => '⊕', 962 => '⊖', 963 => '⊗', 964 => '⊘', 965 => '⊙', 966 => '⊚', 967 => '⊛', 968 => '⊜', 969 => '⊝', 970 => '⊞', 971 => '⊟', 972 => '⊠', 973 => '⊡', 974 => '⊢', 975 => '⊣', 976 => '⊤', 977 => '⊥', 978 => '⊦', 979 => '⊧', 980 => '⊨', 981 => '⊩', 982 => '⊪', 983 => '⊫', 984 => '⊰', 985 => '⊱', 986 => '⊲', 987 => '⊳', 988 => '⊴', 989 => '⊵', 990 => '⊶', 991 => '⊷', 992 => '⊸', 993 => '⊹', 994 => '⊺', 995 => '⊻', 996 => '⊼', 997 => '⊽', 998 => '⊾', 999 => '⊿', 1000 => '⋀', 1001 => '⋁', 1002 => '⋂', 1003 => '⋃', 1004 => '⋄', 1005 => '⋅', 1006 => '⋆', 1007 => '⋇', 1008 => '⋈', 1009 => '⋉', 1010 => '⋊', 1011 => '⋋', 1012 => '⋌', 1013 => '⋍', 1014 => '⋎', 1015 => '⋏', 1016 => '⋐', 1017 => '⋑', 1018 => '⋒', 1019 => '⋓', 1020 => '⋔', 1021 => '⋕', 1022 => '⋖', 1023 => '⋗', 1024 => '⋘', 1025 => '⋙', 1026 => '⋚', 1027 => '⋛', 1028 => '⋜', 1029 => '⋝', 1030 => '⋞', 1031 => '⋟', 1032 => '⋤', 1033 => '⋥', 1034 => '⋦', 1035 => '⋧', 1036 => '⋨', 1037 => '⋩', 1038 => '⋮', 1039 => '⋯', 1040 => '⋰', 1041 => '⋱', 1042 => '⋲', 1043 => '⋳', 1044 => '⋴', 1045 => '⋵', 1046 => '⋶', 1047 => '⋷', 1048 => '⋸', 1049 => '⋹', 1050 => '⋺', 1051 => '⋻', 1052 => '⋼', 1053 => '⋽', 1054 => '⋾', 1055 => '⋿', 1056 => '⌀', 1057 => '⌁', 1058 => '⌂', 1059 => '⌃', 1060 => '⌄', 1061 => '⌅', 1062 => '⌆', 1063 => '⌇', 1064 => '⌈', 1065 => '⌉', 1066 => '⌊', 1067 => '⌋', 1068 => '⌌', 1069 => '⌍', 1070 => '⌎', 1071 => '⌏', 1072 => '⌐', 1073 => '⌑', 1074 => '⌒', 1075 => '⌓', 1076 => '⌔', 1077 => '⌕', 1078 => '⌖', 1079 => '⌗', 1080 => '⌘', 1081 => '⌙', 1082 => '⌚', 1083 => '⌛', 1084 => '⌜', 1085 => '⌝', 1086 => '⌞', 1087 => '⌟', 1088 => '⌠', 1089 => '⌡', 1090 => '⌢', 1091 => '⌣', 1092 => '⌤', 1093 => '⌥', 1094 => '⌦', 1095 => '⌧', 1096 => '⌨', 1097 => '⌫', 1098 => '⌬', 1099 => '⌭', 1100 => '⌮', 1101 => '⌯', 1102 => '⌰', 1103 => '⌱', 1104 => '⌲', 1105 => '⌳', 1106 => '⌴', 1107 => '⌵', 1108 => '⌶', 1109 => '⌷', 1110 => '⌸', 1111 => '⌹', 1112 => '⌺', 1113 => '⌻', 1114 => '⌼', 1115 => '⌽', 1116 => '⌾', 1117 => '⌿', 1118 => '⍀', 1119 => '⍁', 1120 => '⍂', 1121 => '⍃', 1122 => '⍄', 1123 => '⍅', 1124 => '⍆', 1125 => '⍇', 1126 => '⍈', 1127 => '⍉', 1128 => '⍊', 1129 => '⍋', 1130 => '⍌', 1131 => '⍍', 1132 => '⍎', 1133 => '⍏', 1134 => '⍐', 1135 => '⍑', 1136 => '⍒', 1137 => '⍓', 1138 => '⍔', 1139 => '⍕', 1140 => '⍖', 1141 => '⍗', 1142 => '⍘', 1143 => '⍙', 1144 => '⍚', 1145 => '⍛', 1146 => '⍜', 1147 => '⍝', 1148 => '⍞', 1149 => '⍟', 1150 => '⍠', 1151 => '⍡', 1152 => '⍢', 1153 => '⍣', 1154 => '⍤', 1155 => '⍥', 1156 => '⍦', 1157 => '⍧', 1158 => '⍨', 1159 => '⍩', 1160 => '⍪', 1161 => '⍫', 1162 => '⍬', 1163 => '⍭', 1164 => '⍮', 1165 => '⍯', 1166 => '⍰', 1167 => '⍱', 1168 => '⍲', 1169 => '⍳', 1170 => '⍴', 1171 => '⍵', 1172 => '⍶', 1173 => '⍷', 1174 => '⍸', 1175 => '⍹', 1176 => '⍺', 1177 => '⍻', 1178 => '⍼', 1179 => '⍽', 1180 => '⍾', 1181 => '⍿', 1182 => '⎀', 1183 => '⎁', 1184 => '⎂', 1185 => '⎃', 1186 => '⎄', 1187 => '⎅', 1188 => '⎆', 1189 => '⎇', 1190 => '⎈', 1191 => '⎉', 1192 => '⎊', 1193 => '⎋', 1194 => '⎌', 1195 => '⎍', 1196 => '⎎', 1197 => '⎏', 1198 => '⎐', 1199 => '⎑', 1200 => '⎒', 1201 => '⎓', 1202 => '⎔', 1203 => '⎕', 1204 => '⎖', 1205 => '⎗', 1206 => '⎘', 1207 => '⎙', 1208 => '⎚', 1209 => '⎛', 1210 => '⎜', 1211 => '⎝', 1212 => '⎞', 1213 => '⎟', 1214 => '⎠', 1215 => '⎡', 1216 => '⎢', 1217 => '⎣', 1218 => '⎤', 1219 => '⎥', 1220 => '⎦', 1221 => '⎧', 1222 => '⎨', 1223 => '⎩', 1224 => '⎪', 1225 => '⎫', 1226 => '⎬', 1227 => '⎭', 1228 => '⎮', 1229 => '⎯', 1230 => '⎰', 1231 => '⎱', 1232 => '⎲', 1233 => '⎳', 1234 => '⎴', 1235 => '⎵', 1236 => '⎶', 1237 => '⎷', 1238 => '⎸', 1239 => '⎹', 1240 => '⎺', 1241 => '⎻', 1242 => '⎼', 1243 => '⎽', 1244 => '⎾', 1245 => '⎿', 1246 => '⏀', 1247 => '⏁', 1248 => '⏂', 1249 => '⏃', 1250 => '⏄', 1251 => '⏅', 1252 => '⏆', 1253 => '⏇', 1254 => '⏈', 1255 => '⏉', 1256 => '⏊', 1257 => '⏋', 1258 => '⏌', 1259 => '⏍', 1260 => '⏎', 1261 => '⏏', 1262 => '⏐', 1263 => '⏑', 1264 => '⏒', 1265 => '⏓', 1266 => '⏔', 1267 => '⏕', 1268 => '⏖', 1269 => '⏗', 1270 => '⏘', 1271 => '⏙', 1272 => '⏚', 1273 => '⏛', 1274 => '⏜', 1275 => '⏝', 1276 => '⏞', 1277 => '⏟', 1278 => '⏠', 1279 => '⏡', 1280 => '⏢', 1281 => '⏣', 1282 => '⏤', 1283 => '⏥', 1284 => '⏦', 1285 => '⏧', 1286 => '⏨', 1287 => '⏩', 1288 => '⏪', 1289 => '⏫', 1290 => '⏬', 1291 => '⏭', 1292 => '⏮', 1293 => '⏯', 1294 => '⏰', 1295 => '⏱', 1296 => '⏲', 1297 => '⏳', 1298 => '␀', 1299 => '␁', 1300 => '␂', 1301 => '␃', 1302 => '␄', 1303 => '␅', 1304 => '␆', 1305 => '␇', 1306 => '␈', 1307 => '␉', 1308 => '␊', 1309 => '␋', 1310 => '␌', 1311 => '␍', 1312 => '␎', 1313 => '␏', 1314 => '␐', 1315 => '␑', 1316 => '␒', 1317 => '␓', 1318 => '␔', 1319 => '␕', 1320 => '␖', 1321 => '␗', 1322 => '␘', 1323 => '␙', 1324 => '␚', 1325 => '␛', 1326 => '␜', 1327 => '␝', 1328 => '␞', 1329 => '␟', 1330 => '␠', 1331 => '␡', 1332 => '␢', 1333 => '␣', 1334 => '␤', 1335 => '␥', 1336 => '␦', 1337 => '⑀', 1338 => '⑁', 1339 => '⑂', 1340 => '⑃', 1341 => '⑄', 1342 => '⑅', 1343 => '⑆', 1344 => '⑇', 1345 => '⑈', 1346 => '⑉', 1347 => '⑊', 1348 => '─', 1349 => '━', 1350 => '│', 1351 => '┃', 1352 => '┄', 1353 => '┅', 1354 => '┆', 1355 => '┇', 1356 => '┈', 1357 => '┉', 1358 => '┊', 1359 => '┋', 1360 => '┌', 1361 => '┍', 1362 => '┎', 1363 => '┏', 1364 => '┐', 1365 => '┑', 1366 => '┒', 1367 => '┓', 1368 => '└', 1369 => '┕', 1370 => '┖', 1371 => '┗', 1372 => '┘', 1373 => '┙', 1374 => '┚', 1375 => '┛', 1376 => '├', 1377 => '┝', 1378 => '┞', 1379 => '┟', 1380 => '┠', 1381 => '┡', 1382 => '┢', 1383 => '┣', 1384 => '┤', 1385 => '┥', 1386 => '┦', 1387 => '┧', 1388 => '┨', 1389 => '┩', 1390 => '┪', 1391 => '┫', 1392 => '┬', 1393 => '┭', 1394 => '┮', 1395 => '┯', 1396 => '┰', 1397 => '┱', 1398 => '┲', 1399 => '┳', 1400 => '┴', 1401 => '┵', 1402 => '┶', 1403 => '┷', 1404 => '┸', 1405 => '┹', 1406 => '┺', 1407 => '┻', 1408 => '┼', 1409 => '┽', 1410 => '┾', 1411 => '┿', 1412 => '╀', 1413 => '╁', 1414 => '╂', 1415 => '╃', 1416 => '╄', 1417 => '╅', 1418 => '╆', 1419 => '╇', 1420 => '╈', 1421 => '╉', 1422 => '╊', 1423 => '╋', 1424 => '╌', 1425 => '╍', 1426 => '╎', 1427 => '╏', 1428 => '═', 1429 => '║', 1430 => '╒', 1431 => '╓', 1432 => '╔', 1433 => '╕', 1434 => '╖', 1435 => '╗', 1436 => '╘', 1437 => '╙', 1438 => '╚', 1439 => '╛', 1440 => '╜', 1441 => '╝', 1442 => '╞', 1443 => '╟', 1444 => '╠', 1445 => '╡', 1446 => '╢', 1447 => '╣', 1448 => '╤', 1449 => '╥', 1450 => '╦', 1451 => '╧', 1452 => '╨', 1453 => '╩', 1454 => '╪', 1455 => '╫', 1456 => '╬', 1457 => '╭', 1458 => '╮', 1459 => '╯', 1460 => '╰', 1461 => '╱', 1462 => '╲', 1463 => '╳', 1464 => '╴', 1465 => '╵', 1466 => '╶', 1467 => '╷', 1468 => '╸', 1469 => '╹', 1470 => '╺', 1471 => '╻', 1472 => '╼', 1473 => '╽', 1474 => '╾', 1475 => '╿', 1476 => '▀', 1477 => '▁', 1478 => '▂', 1479 => '▃', 1480 => '▄', 1481 => '▅', 1482 => '▆', 1483 => '▇', 1484 => '█', 1485 => '▉', 1486 => '▊', 1487 => '▋', 1488 => '▌', 1489 => '▍', 1490 => '▎', 1491 => '▏', 1492 => '▐', 1493 => '░', 1494 => '▒', 1495 => '▓', 1496 => '▔', 1497 => '▕', 1498 => '▖', 1499 => '▗', 1500 => '▘', 1501 => '▙', 1502 => '▚', 1503 => '▛', 1504 => '▜', 1505 => '▝', 1506 => '▞', 1507 => '▟', 1508 => '■', 1509 => '□', 1510 => '▢', 1511 => '▣', 1512 => '▤', 1513 => '▥', 1514 => '▦', 1515 => '▧', 1516 => '▨', 1517 => '▩', 1518 => '▪', 1519 => '▫', 1520 => '▬', 1521 => '▭', 1522 => '▮', 1523 => '▯', 1524 => '▰', 1525 => '▱', 1526 => '▲', 1527 => '△', 1528 => '▴', 1529 => '▵', 1530 => '▶', 1531 => '▷', 1532 => '▸', 1533 => '▹', 1534 => '►', 1535 => '▻', 1536 => '▼', 1537 => '▽', 1538 => '▾', 1539 => '▿', 1540 => '◀', 1541 => '◁', 1542 => '◂', 1543 => '◃', 1544 => '◄', 1545 => '◅', 1546 => '◆', 1547 => '◇', 1548 => '◈', 1549 => '◉', 1550 => '◊', 1551 => '○', 1552 => '◌', 1553 => '◍', 1554 => '◎', 1555 => '●', 1556 => '◐', 1557 => '◑', 1558 => '◒', 1559 => '◓', 1560 => '◔', 1561 => '◕', 1562 => '◖', 1563 => '◗', 1564 => '◘', 1565 => '◙', 1566 => '◚', 1567 => '◛', 1568 => '◜', 1569 => '◝', 1570 => '◞', 1571 => '◟', 1572 => '◠', 1573 => '◡', 1574 => '◢', 1575 => '◣', 1576 => '◤', 1577 => '◥', 1578 => '◦', 1579 => '◧', 1580 => '◨', 1581 => '◩', 1582 => '◪', 1583 => '◫', 1584 => '◬', 1585 => '◭', 1586 => '◮', 1587 => '◯', 1588 => '◰', 1589 => '◱', 1590 => '◲', 1591 => '◳', 1592 => '◴', 1593 => '◵', 1594 => '◶', 1595 => '◷', 1596 => '◸', 1597 => '◹', 1598 => '◺', 1599 => '◻', 1600 => '◼', 1601 => '◽', 1602 => '◾', 1603 => '◿', 1604 => '☀', 1605 => '☁', 1606 => '☂', 1607 => '☃', 1608 => '☄', 1609 => '★', 1610 => '☆', 1611 => '☇', 1612 => '☈', 1613 => '☉', 1614 => '☊', 1615 => '☋', 1616 => '☌', 1617 => '☍', 1618 => '☎', 1619 => '☏', 1620 => '☐', 1621 => '☑', 1622 => '☒', 1623 => '☓', 1624 => '☔', 1625 => '☕', 1626 => '☖', 1627 => '☗', 1628 => '☘', 1629 => '☙', 1630 => '☚', 1631 => '☛', 1632 => '☜', 1633 => '☝', 1634 => '☞', 1635 => '☟', 1636 => '☠', 1637 => '☡', 1638 => '☢', 1639 => '☣', 1640 => '☤', 1641 => '☥', 1642 => '☦', 1643 => '☧', 1644 => '☨', 1645 => '☩', 1646 => '☪', 1647 => '☫', 1648 => '☬', 1649 => '☭', 1650 => '☮', 1651 => '☯', 1652 => '☸', 1653 => '☹', 1654 => '☺', 1655 => '☻', 1656 => '☼', 1657 => '☽', 1658 => '☾', 1659 => '☿', 1660 => '♀', 1661 => '♁', 1662 => '♂', 1663 => '♃', 1664 => '♄', 1665 => '♅', 1666 => '♆', 1667 => '♇', 1668 => '♈', 1669 => '♉', 1670 => '♊', 1671 => '♋', 1672 => '♌', 1673 => '♍', 1674 => '♎', 1675 => '♏', 1676 => '♐', 1677 => '♑', 1678 => '♒', 1679 => '♓', 1680 => '♔', 1681 => '♕', 1682 => '♖', 1683 => '♗', 1684 => '♘', 1685 => '♙', 1686 => '♚', 1687 => '♛', 1688 => '♜', 1689 => '♝', 1690 => '♞', 1691 => '♟', 1692 => '♠', 1693 => '♡', 1694 => '♢', 1695 => '♣', 1696 => '♤', 1697 => '♥', 1698 => '♦', 1699 => '♧', 1700 => '♨', 1701 => '♩', 1702 => '♪', 1703 => '♫', 1704 => '♬', 1705 => '♰', 1706 => '♱', 1707 => '♲', 1708 => '♳', 1709 => '♴', 1710 => '♵', 1711 => '♶', 1712 => '♷', 1713 => '♸', 1714 => '♹', 1715 => '♺', 1716 => '♻', 1717 => '♼', 1718 => '♽', 1719 => '♾', 1720 => '♿', 1721 => '⚀', 1722 => '⚁', 1723 => '⚂', 1724 => '⚃', 1725 => '⚄', 1726 => '⚅', 1727 => '⚆', 1728 => '⚇', 1729 => '⚈', 1730 => '⚉', 1731 => '⚐', 1732 => '⚑', 1733 => '⚒', 1734 => '⚓', 1735 => '⚔', 1736 => '⚕', 1737 => '⚖', 1738 => '⚗', 1739 => '⚘', 1740 => '⚙', 1741 => '⚚', 1742 => '⚛', 1743 => '⚜', 1744 => '⚝', 1745 => '⚞', 1746 => '⚟', 1747 => '⚠', 1748 => '⚡', 1749 => '⚢', 1750 => '⚣', 1751 => '⚤', 1752 => '⚥', 1753 => '⚦', 1754 => '⚧', 1755 => '⚨', 1756 => '⚩', 1757 => '⚪', 1758 => '⚫', 1759 => '⚬', 1760 => '⚭', 1761 => '⚮', 1762 => '⚯', 1763 => '⚰', 1764 => '⚱', 1765 => '⚲', 1766 => '⚳', 1767 => '⚴', 1768 => '⚵', 1769 => '⚶', 1770 => '⚷', 1771 => '⚸', 1772 => '⚹', 1773 => '⚺', 1774 => '⚻', 1775 => '⚼', 1776 => '⚽', 1777 => '⚾', 1778 => '⚿', 1779 => '⛀', 1780 => '⛁', 1781 => '⛂', 1782 => '⛃', 1783 => '⛄', 1784 => '⛅', 1785 => '⛆', 1786 => '⛇', 1787 => '⛈', 1788 => '⛉', 1789 => '⛊', 1790 => '⛋', 1791 => '⛌', 1792 => '⛍', 1793 => '⛎', 1794 => '⛏', 1795 => '⛐', 1796 => '⛑', 1797 => '⛒', 1798 => '⛓', 1799 => '⛔', 1800 => '⛕', 1801 => '⛖', 1802 => '⛗', 1803 => '⛘', 1804 => '⛙', 1805 => '⛚', 1806 => '⛛', 1807 => '⛜', 1808 => '⛝', 1809 => '⛞', 1810 => '⛟', 1811 => '⛠', 1812 => '⛡', 1813 => '⛢', 1814 => '⛣', 1815 => '⛤', 1816 => '⛥', 1817 => '⛦', 1818 => '⛧', 1819 => '⛨', 1820 => '⛩', 1821 => '⛪', 1822 => '⛫', 1823 => '⛬', 1824 => '⛭', 1825 => '⛮', 1826 => '⛯', 1827 => '⛰', 1828 => '⛱', 1829 => '⛲', 1830 => '⛳', 1831 => '⛴', 1832 => '⛵', 1833 => '⛶', 1834 => '⛷', 1835 => '⛸', 1836 => '⛹', 1837 => '⛺', 1838 => '⛻', 1839 => '⛼', 1840 => '⛽', 1841 => '⛾', 1842 => '⛿', 1843 => '✁', 1844 => '✂', 1845 => '✃', 1846 => '✄', 1847 => '✅', 1848 => '✆', 1849 => '✇', 1850 => '✈', 1851 => '✉', 1852 => '✊', 1853 => '✋', 1854 => '✌', 1855 => '✍', 1856 => '✎', 1857 => '✏', 1858 => '✐', 1859 => '✑', 1860 => '✒', 1861 => '✓', 1862 => '✔', 1863 => '✕', 1864 => '✖', 1865 => '✗', 1866 => '✘', 1867 => '✙', 1868 => '✚', 1869 => '✛', 1870 => '✜', 1871 => '✝', 1872 => '✞', 1873 => '✟', 1874 => '✠', 1875 => '✡', 1876 => '✢', 1877 => '✣', 1878 => '✤', 1879 => '✥', 1880 => '✦', 1881 => '✧', 1882 => '✨', 1883 => '✩', 1884 => '✪', 1885 => '✫', 1886 => '✬', 1887 => '✭', 1888 => '✮', 1889 => '✯', 1890 => '✰', 1891 => '✱', 1892 => '✲', 1893 => '✳', 1894 => '✴', 1895 => '✵', 1896 => '✶', 1897 => '✷', 1898 => '✸', 1899 => '✹', 1900 => '✺', 1901 => '✻', 1902 => '✼', 1903 => '✽', 1904 => '✾', 1905 => '✿', 1906 => '❀', 1907 => '❁', 1908 => '❂', 1909 => '❃', 1910 => '❄', 1911 => '❅', 1912 => '❆', 1913 => '❇', 1914 => '❈', 1915 => '❉', 1916 => '❊', 1917 => '❋', 1918 => '❌', 1919 => '❍', 1920 => '❎', 1921 => '❏', 1922 => '❐', 1923 => '❑', 1924 => '❒', 1925 => '❓', 1926 => '❔', 1927 => '❕', 1928 => '❖', 1929 => '❗', 1930 => '❘', 1931 => '❙', 1932 => '❚', 1933 => '❛', 1934 => '❜', 1935 => '❝', 1936 => '❞', 1937 => '❟', 1938 => '❠', 1939 => '❡', 1940 => '❢', 1941 => '❣', 1942 => '❤', 1943 => '❥', 1944 => '❦', 1945 => '❧', 1946 => '❨', 1947 => '❩', 1948 => '❪', 1949 => '❫', 1950 => '❬', 1951 => '❭', 1952 => '❮', 1953 => '❯', 1954 => '❰', 1955 => '❱', 1956 => '❲', 1957 => '❳', 1958 => '❴', 1959 => '❵', 1960 => '➔', 1961 => '➕', 1962 => '➖', 1963 => '➗', 1964 => '➘', 1965 => '➙', 1966 => '➚', 1967 => '➛', 1968 => '➜', 1969 => '➝', 1970 => '➞', 1971 => '➟', 1972 => '➠', 1973 => '➡', 1974 => '➢', 1975 => '➣', 1976 => '➤', 1977 => '➥', 1978 => '➦', 1979 => '➧', 1980 => '➨', 1981 => '➩', 1982 => '➪', 1983 => '➫', 1984 => '➬', 1985 => '➭', 1986 => '➮', 1987 => '➯', 1988 => '➰', 1989 => '➱', 1990 => '➲', 1991 => '➳', 1992 => '➴', 1993 => '➵', 1994 => '➶', 1995 => '➷', 1996 => '➸', 1997 => '➹', 1998 => '➺', 1999 => '➻', 2000 => '➼', 2001 => '➽', 2002 => '➾', 2003 => '➿', 2004 => '⟀', 2005 => '⟁', 2006 => '⟂', 2007 => '⟃', 2008 => '⟄', 2009 => '⟅', 2010 => '⟆', 2011 => '⟇', 2012 => '⟈', 2013 => '⟉', 2014 => '⟊', 2015 => '⟌', 2016 => '⟎', 2017 => '⟏', 2018 => '⟐', 2019 => '⟑', 2020 => '⟒', 2021 => '⟓', 2022 => '⟔', 2023 => '⟕', 2024 => '⟖', 2025 => '⟗', 2026 => '⟘', 2027 => '⟙', 2028 => '⟚', 2029 => '⟛', 2030 => '⟜', 2031 => '⟝', 2032 => '⟞', 2033 => '⟟', 2034 => '⟠', 2035 => '⟡', 2036 => '⟢', 2037 => '⟣', 2038 => '⟤', 2039 => '⟥', 2040 => '⟦', 2041 => '⟧', 2042 => '⟨', 2043 => '⟩', 2044 => '⟪', 2045 => '⟫', 2046 => '⟰', 2047 => '⟱', 2048 => '⟲', 2049 => '⟳', 2050 => '⟴', 2051 => '⟵', 2052 => '⟶', 2053 => '⟷', 2054 => '⟸', 2055 => '⟹', 2056 => '⟺', 2057 => '⟻', 2058 => '⟼', 2059 => '⟽', 2060 => '⟾', 2061 => '⟿', 2062 => '⤀', 2063 => '⤁', 2064 => '⤂', 2065 => '⤃', 2066 => '⤄', 2067 => '⤅', 2068 => '⤆', 2069 => '⤇', 2070 => '⤈', 2071 => '⤉', 2072 => '⤊', 2073 => '⤋', 2074 => '⤌', 2075 => '⤍', 2076 => '⤎', 2077 => '⤏', 2078 => '⤐', 2079 => '⤑', 2080 => '⤒', 2081 => '⤓', 2082 => '⤔', 2083 => '⤕', 2084 => '⤖', 2085 => '⤗', 2086 => '⤘', 2087 => '⤙', 2088 => '⤚', 2089 => '⤛', 2090 => '⤜', 2091 => '⤝', 2092 => '⤞', 2093 => '⤟', 2094 => '⤠', 2095 => '⤡', 2096 => '⤢', 2097 => '⤣', 2098 => '⤤', 2099 => '⤥', 2100 => '⤦', 2101 => '⤧', 2102 => '⤨', 2103 => '⤩', 2104 => '⤪', 2105 => '⤫', 2106 => '⤬', 2107 => '⤭', 2108 => '⤮', 2109 => '⤯', 2110 => '⤰', 2111 => '⤱', 2112 => '⤲', 2113 => '⤳', 2114 => '⤴', 2115 => '⤵', 2116 => '⤶', 2117 => '⤷', 2118 => '⤸', 2119 => '⤹', 2120 => '⤺', 2121 => '⤻', 2122 => '⤼', 2123 => '⤽', 2124 => '⤾', 2125 => '⤿', 2126 => '⥀', 2127 => '⥁', 2128 => '⥂', 2129 => '⥃', 2130 => '⥄', 2131 => '⥅', 2132 => '⥆', 2133 => '⥇', 2134 => '⥈', 2135 => '⥉', 2136 => '⥊', 2137 => '⥋', 2138 => '⥌', 2139 => '⥍', 2140 => '⥎', 2141 => '⥏', 2142 => '⥐', 2143 => '⥑', 2144 => '⥒', 2145 => '⥓', 2146 => '⥔', 2147 => '⥕', 2148 => '⥖', 2149 => '⥗', 2150 => '⥘', 2151 => '⥙', 2152 => '⥚', 2153 => '⥛', 2154 => '⥜', 2155 => '⥝', 2156 => '⥞', 2157 => '⥟', 2158 => '⥠', 2159 => '⥡', 2160 => '⥢', 2161 => '⥣', 2162 => '⥤', 2163 => '⥥', 2164 => '⥦', 2165 => '⥧', 2166 => '⥨', 2167 => '⥩', 2168 => '⥪', 2169 => '⥫', 2170 => '⥬', 2171 => '⥭', 2172 => '⥮', 2173 => '⥯', 2174 => '⥰', 2175 => '⥱', 2176 => '⥲', 2177 => '⥳', 2178 => '⥴', 2179 => '⥵', 2180 => '⥶', 2181 => '⥷', 2182 => '⥸', 2183 => '⥹', 2184 => '⥺', 2185 => '⥻', 2186 => '⥼', 2187 => '⥽', 2188 => '⥾', 2189 => '⥿', 2190 => '⦀', 2191 => '⦁', 2192 => '⦂', 2193 => '⦙', 2194 => '⦚', 2195 => '⦛', 2196 => '⦜', 2197 => '⦝', 2198 => '⦞', 2199 => '⦟', 2200 => '⦠', 2201 => '⦡', 2202 => '⦢', 2203 => '⦣', 2204 => '⦤', 2205 => '⦥', 2206 => '⦦', 2207 => '⦧', 2208 => '⦨', 2209 => '⦩', 2210 => '⦪', 2211 => '⦫', 2212 => '⦬', 2213 => '⦭', 2214 => '⦮', 2215 => '⦯', 2216 => '⦰', 2217 => '⦱', 2218 => '⦲', 2219 => '⦳', 2220 => '⦴', 2221 => '⦵', 2222 => '⦶', 2223 => '⦷', 2224 => '⦸', 2225 => '⦹', 2226 => '⦺', 2227 => '⦻', 2228 => '⦼', 2229 => '⦽', 2230 => '⦾', 2231 => '⦿', 2232 => '⧀', 2233 => '⧁', 2234 => '⧂', 2235 => '⧃', 2236 => '⧄', 2237 => '⧅', 2238 => '⧆', 2239 => '⧇', 2240 => '⧈', 2241 => '⧉', 2242 => '⧊', 2243 => '⧋', 2244 => '⧌', 2245 => '⧍', 2246 => '⧎', 2247 => '⧏', 2248 => '⧐', 2249 => '⧑', 2250 => '⧒', 2251 => '⧓', 2252 => '⧔', 2253 => '⧕', 2254 => '⧖', 2255 => '⧗', 2256 => '⧘', 2257 => '⧙', 2258 => '⧚', 2259 => '⧛', 2260 => '⧜', 2261 => '⧝', 2262 => '⧞', 2263 => '⧟', 2264 => '⧠', 2265 => '⧡', 2266 => '⧢', 2267 => '⧣', 2268 => '⧤', 2269 => '⧥', 2270 => '⧦', 2271 => '⧧', 2272 => '⧨', 2273 => '⧩', 2274 => '⧪', 2275 => '⧫', 2276 => '⧬', 2277 => '⧭', 2278 => '⧮', 2279 => '⧯', 2280 => '⧰', 2281 => '⧱', 2282 => '⧲', 2283 => '⧳', 2284 => '⧴', 2285 => '⧵', 2286 => '⧶', 2287 => '⧷', 2288 => '⧸', 2289 => '⧹', 2290 => '⧺', 2291 => '⧻', 2292 => '⧾', 2293 => '⧿', 2294 => '⨀', 2295 => '⨁', 2296 => '⨂', 2297 => '⨃', 2298 => '⨄', 2299 => '⨅', 2300 => '⨆', 2301 => '⨇', 2302 => '⨈', 2303 => '⨉', 2304 => '⨊', 2305 => '⨋', 2306 => '⨍', 2307 => '⨎', 2308 => '⨏', 2309 => '⨐', 2310 => '⨑', 2311 => '⨒', 2312 => '⨓', 2313 => '⨔', 2314 => '⨕', 2315 => '⨖', 2316 => '⨗', 2317 => '⨘', 2318 => '⨙', 2319 => '⨚', 2320 => '⨛', 2321 => '⨜', 2322 => '⨝', 2323 => '⨞', 2324 => '⨟', 2325 => '⨠', 2326 => '⨡', 2327 => '⨢', 2328 => '⨣', 2329 => '⨤', 2330 => '⨥', 2331 => '⨦', 2332 => '⨧', 2333 => '⨨', 2334 => '⨩', 2335 => '⨪', 2336 => '⨫', 2337 => '⨬', 2338 => '⨭', 2339 => '⨮', 2340 => '⨯', 2341 => '⨰', 2342 => '⨱', 2343 => '⨲', 2344 => '⨳', 2345 => '⨴', 2346 => '⨵', 2347 => '⨶', 2348 => '⨷', 2349 => '⨸', 2350 => '⨹', 2351 => '⨺', 2352 => '⨻', 2353 => '⨼', 2354 => '⨽', 2355 => '⨾', 2356 => '⨿', 2357 => '⩀', 2358 => '⩁', 2359 => '⩂', 2360 => '⩃', 2361 => '⩄', 2362 => '⩅', 2363 => '⩆', 2364 => '⩇', 2365 => '⩈', 2366 => '⩉', 2367 => '⩊', 2368 => '⩋', 2369 => '⩌', 2370 => '⩍', 2371 => '⩎', 2372 => '⩏', 2373 => '⩐', 2374 => '⩑', 2375 => '⩒', 2376 => '⩓', 2377 => '⩔', 2378 => '⩕', 2379 => '⩖', 2380 => '⩗', 2381 => '⩘', 2382 => '⩙', 2383 => '⩚', 2384 => '⩛', 2385 => '⩜', 2386 => '⩝', 2387 => '⩞', 2388 => '⩟', 2389 => '⩠', 2390 => '⩡', 2391 => '⩢', 2392 => '⩣', 2393 => '⩤', 2394 => '⩥', 2395 => '⩦', 2396 => '⩧', 2397 => '⩨', 2398 => '⩩', 2399 => '⩪', 2400 => '⩫', 2401 => '⩬', 2402 => '⩭', 2403 => '⩮', 2404 => '⩯', 2405 => '⩰', 2406 => '⩱', 2407 => '⩲', 2408 => '⩳', 2409 => '⩷', 2410 => '⩸', 2411 => '⩹', 2412 => '⩺', 2413 => '⩻', 2414 => '⩼', 2415 => '⩽', 2416 => '⩾', 2417 => '⩿', 2418 => '⪀', 2419 => '⪁', 2420 => '⪂', 2421 => '⪃', 2422 => '⪄', 2423 => '⪅', 2424 => '⪆', 2425 => '⪇', 2426 => '⪈', 2427 => '⪉', 2428 => '⪊', 2429 => '⪋', 2430 => '⪌', 2431 => '⪍', 2432 => '⪎', 2433 => '⪏', 2434 => '⪐', 2435 => '⪑', 2436 => '⪒', 2437 => '⪓', 2438 => '⪔', 2439 => '⪕', 2440 => '⪖', 2441 => '⪗', 2442 => '⪘', 2443 => '⪙', 2444 => '⪚', 2445 => '⪛', 2446 => '⪜', 2447 => '⪝', 2448 => '⪞', 2449 => '⪟', 2450 => '⪠', 2451 => '⪡', 2452 => '⪢', 2453 => '⪣', 2454 => '⪤', 2455 => '⪥', 2456 => '⪦', 2457 => '⪧', 2458 => '⪨', 2459 => '⪩', 2460 => '⪪', 2461 => '⪫', 2462 => '⪬', 2463 => '⪭', 2464 => '⪮', 2465 => '⪯', 2466 => '⪰', 2467 => '⪱', 2468 => '⪲', 2469 => '⪳', 2470 => '⪴', 2471 => '⪵', 2472 => '⪶', 2473 => '⪷', 2474 => '⪸', 2475 => '⪹', 2476 => '⪺', 2477 => '⪻', 2478 => '⪼', 2479 => '⪽', 2480 => '⪾', 2481 => '⪿', 2482 => '⫀', 2483 => '⫁', 2484 => '⫂', 2485 => '⫃', 2486 => '⫄', 2487 => '⫅', 2488 => '⫆', 2489 => '⫇', 2490 => '⫈', 2491 => '⫉', 2492 => '⫊', 2493 => '⫋', 2494 => '⫌', 2495 => '⫍', 2496 => '⫎', 2497 => '⫏', 2498 => '⫐', 2499 => '⫑', 2500 => '⫒', 2501 => '⫓', 2502 => '⫔', 2503 => '⫕', 2504 => '⫖', 2505 => '⫗', 2506 => '⫘', 2507 => '⫙', 2508 => '⫚', 2509 => '⫛', 2510 => '⫝', 2511 => '⫞', 2512 => '⫟', 2513 => '⫠', 2514 => '⫡', 2515 => '⫢', 2516 => '⫣', 2517 => '⫤', 2518 => '⫥', 2519 => '⫦', 2520 => '⫧', 2521 => '⫨', 2522 => '⫩', 2523 => '⫪', 2524 => '⫫', 2525 => '⫬', 2526 => '⫭', 2527 => '⫮', 2528 => '⫯', 2529 => '⫰', 2530 => '⫱', 2531 => '⫲', 2532 => '⫳', 2533 => '⫴', 2534 => '⫵', 2535 => '⫶', 2536 => '⫷', 2537 => '⫸', 2538 => '⫹', 2539 => '⫺', 2540 => '⫻', 2541 => '⫼', 2542 => '⫽', 2543 => '⫾', 2544 => '⫿', 2545 => '⬀', 2546 => '⬁', 2547 => '⬂', 2548 => '⬃', 2549 => '⬄', 2550 => '⬅', 2551 => '⬆', 2552 => '⬇', 2553 => '⬈', 2554 => '⬉', 2555 => '⬊', 2556 => '⬋', 2557 => '⬌', 2558 => '⬍', 2559 => '⬎', 2560 => '⬏', 2561 => '⬐', 2562 => '⬑', 2563 => '⬒', 2564 => '⬓', 2565 => '⬔', 2566 => '⬕', 2567 => '⬖', 2568 => '⬗', 2569 => '⬘', 2570 => '⬙', 2571 => '⬚', 2572 => '⬛', 2573 => '⬜', 2574 => '⬝', 2575 => '⬞', 2576 => '⬟', 2577 => '⬠', 2578 => '⬡', 2579 => '⬢', 2580 => '⬣', 2581 => '⬤', 2582 => '⬥', 2583 => '⬦', 2584 => '⬧', 2585 => '⬨', 2586 => '⬩', 2587 => '⬪', 2588 => '⬫', 2589 => '⬬', 2590 => '⬭', 2591 => '⬮', 2592 => '⬯', 2593 => '⬰', 2594 => '⬱', 2595 => '⬲', 2596 => '⬳', 2597 => '⬴', 2598 => '⬵', 2599 => '⬶', 2600 => '⬷', 2601 => '⬸', 2602 => '⬹', 2603 => '⬺', 2604 => '⬻', 2605 => '⬼', 2606 => '⬽', 2607 => '⬾', 2608 => '⬿', 2609 => '⭀', 2610 => '⭁', 2611 => '⭂', 2612 => '⭃', 2613 => '⭄', 2614 => '⭅', 2615 => '⭆', 2616 => '⭇', 2617 => '⭈', 2618 => '⭉', 2619 => '⭊', 2620 => '⭋', 2621 => '⭌', 2622 => '⭐', 2623 => '⭑', 2624 => '⭒', 2625 => '⭓', 2626 => '⭔', 2627 => '⭕', 2628 => '⭖', 2629 => '⭗', 2630 => '⭘', 2631 => '⭙', 2632 => '⳥', 2633 => '⳦', 2634 => '⳧', 2635 => '⳨', 2636 => '⳩', 2637 => '⳪', 2638 => '⠀', 2639 => '⠁', 2640 => '⠂', 2641 => '⠃', 2642 => '⠄', 2643 => '⠅', 2644 => '⠆', 2645 => '⠇', 2646 => '⠈', 2647 => '⠉', 2648 => '⠊', 2649 => '⠋', 2650 => '⠌', 2651 => '⠍', 2652 => '⠎', 2653 => '⠏', 2654 => '⠐', 2655 => '⠑', 2656 => '⠒', 2657 => '⠓', 2658 => '⠔', 2659 => '⠕', 2660 => '⠖', 2661 => '⠗', 2662 => '⠘', 2663 => '⠙', 2664 => '⠚', 2665 => '⠛', 2666 => '⠜', 2667 => '⠝', 2668 => '⠞', 2669 => '⠟', 2670 => '⠠', 2671 => '⠡', 2672 => '⠢', 2673 => '⠣', 2674 => '⠤', 2675 => '⠥', 2676 => '⠦', 2677 => '⠧', 2678 => '⠨', 2679 => '⠩', 2680 => '⠪', 2681 => '⠫', 2682 => '⠬', 2683 => '⠭', 2684 => '⠮', 2685 => '⠯', 2686 => '⠰', 2687 => '⠱', 2688 => '⠲', 2689 => '⠳', 2690 => '⠴', 2691 => '⠵', 2692 => '⠶', 2693 => '⠷', 2694 => '⠸', 2695 => '⠹', 2696 => '⠺', 2697 => '⠻', 2698 => '⠼', 2699 => '⠽', 2700 => '⠾', 2701 => '⠿', 2702 => '⡀', 2703 => '⡁', 2704 => '⡂', 2705 => '⡃', 2706 => '⡄', 2707 => '⡅', 2708 => '⡆', 2709 => '⡇', 2710 => '⡈', 2711 => '⡉', 2712 => '⡊', 2713 => '⡋', 2714 => '⡌', 2715 => '⡍', 2716 => '⡎', 2717 => '⡏', 2718 => '⡐', 2719 => '⡑', 2720 => '⡒', 2721 => '⡓', 2722 => '⡔', 2723 => '⡕', 2724 => '⡖', 2725 => '⡗', 2726 => '⡘', 2727 => '⡙', 2728 => '⡚', 2729 => '⡛', 2730 => '⡜', 2731 => '⡝', 2732 => '⡞', 2733 => '⡟', 2734 => '⡠', 2735 => '⡡', 2736 => '⡢', 2737 => '⡣', 2738 => '⡤', 2739 => '⡥', 2740 => '⡦', 2741 => '⡧', 2742 => '⡨', 2743 => '⡩', 2744 => '⡪', 2745 => '⡫', 2746 => '⡬', 2747 => '⡭', 2748 => '⡮', 2749 => '⡯', 2750 => '⡰', 2751 => '⡱', 2752 => '⡲', 2753 => '⡳', 2754 => '⡴', 2755 => '⡵', 2756 => '⡶', 2757 => '⡷', 2758 => '⡸', 2759 => '⡹', 2760 => '⡺', 2761 => '⡻', 2762 => '⡼', 2763 => '⡽', 2764 => '⡾', 2765 => '⡿', 2766 => '⢀', 2767 => '⢁', 2768 => '⢂', 2769 => '⢃', 2770 => '⢄', 2771 => '⢅', 2772 => '⢆', 2773 => '⢇', 2774 => '⢈', 2775 => '⢉', 2776 => '⢊', 2777 => '⢋', 2778 => '⢌', 2779 => '⢍', 2780 => '⢎', 2781 => '⢏', 2782 => '⢐', 2783 => '⢑', 2784 => '⢒', 2785 => '⢓', 2786 => '⢔', 2787 => '⢕', 2788 => '⢖', 2789 => '⢗', 2790 => '⢘', 2791 => '⢙', 2792 => '⢚', 2793 => '⢛', 2794 => '⢜', 2795 => '⢝', 2796 => '⢞', 2797 => '⢟', 2798 => '⢠', 2799 => '⢡', 2800 => '⢢', 2801 => '⢣', 2802 => '⢤', 2803 => '⢥', 2804 => '⢦', 2805 => '⢧', 2806 => '⢨', 2807 => '⢩', 2808 => '⢪', 2809 => '⢫', 2810 => '⢬', 2811 => '⢭', 2812 => '⢮', 2813 => '⢯', 2814 => '⢰', 2815 => '⢱', 2816 => '⢲', 2817 => '⢳', 2818 => '⢴', 2819 => '⢵', 2820 => '⢶', 2821 => '⢷', 2822 => '⢸', 2823 => '⢹', 2824 => '⢺', 2825 => '⢻', 2826 => '⢼', 2827 => '⢽', 2828 => '⢾', 2829 => '⢿', 2830 => '⣀', 2831 => '⣁', 2832 => '⣂', 2833 => '⣃', 2834 => '⣄', 2835 => '⣅', 2836 => '⣆', 2837 => '⣇', 2838 => '⣈', 2839 => '⣉', 2840 => '⣊', 2841 => '⣋', 2842 => '⣌', 2843 => '⣍', 2844 => '⣎', 2845 => '⣏', 2846 => '⣐', 2847 => '⣑', 2848 => '⣒', 2849 => '⣓', 2850 => '⣔', 2851 => '⣕', 2852 => '⣖', 2853 => '⣗', 2854 => '⣘', 2855 => '⣙', 2856 => '⣚', 2857 => '⣛', 2858 => '⣜', 2859 => '⣝', 2860 => '⣞', 2861 => '⣟', 2862 => '⣠', 2863 => '⣡', 2864 => '⣢', 2865 => '⣣', 2866 => '⣤', 2867 => '⣥', 2868 => '⣦', 2869 => '⣧', 2870 => '⣨', 2871 => '⣩', 2872 => '⣪', 2873 => '⣫', 2874 => '⣬', 2875 => '⣭', 2876 => '⣮', 2877 => '⣯', 2878 => '⣰', 2879 => '⣱', 2880 => '⣲', 2881 => '⣳', 2882 => '⣴', 2883 => '⣵', 2884 => '⣶', 2885 => '⣷', 2886 => '⣸', 2887 => '⣹', 2888 => '⣺', 2889 => '⣻', 2890 => '⣼', 2891 => '⣽', 2892 => '⣾', 2893 => '⣿', 2894 => '⚊', 2895 => '⚋', 2896 => '⚌', 2897 => '⚍', 2898 => '⚎', 2899 => '⚏', 2900 => '☰', 2901 => '☱', 2902 => '☲', 2903 => '☳', 2904 => '☴', 2905 => '☵', 2906 => '☶', 2907 => '☷', 2908 => '䷀', 2909 => '䷁', 2910 => '䷂', 2911 => '䷃', 2912 => '䷄', 2913 => '䷅', 2914 => '䷆', 2915 => '䷇', 2916 => '䷈', 2917 => '䷉', 2918 => '䷊', 2919 => '䷋', 2920 => '䷌', 2921 => '䷍', 2922 => '䷎', 2923 => '䷏', 2924 => '䷐', 2925 => '䷑', 2926 => '䷒', 2927 => '䷓', 2928 => '䷔', 2929 => '䷕', 2930 => '䷖', 2931 => '䷗', 2932 => '䷘', 2933 => '䷙', 2934 => '䷚', 2935 => '䷛', 2936 => '䷜', 2937 => '䷝', 2938 => '䷞', 2939 => '䷟', 2940 => '䷠', 2941 => '䷡', 2942 => '䷢', 2943 => '䷣', 2944 => '䷤', 2945 => '䷥', 2946 => '䷦', 2947 => '䷧', 2948 => '䷨', 2949 => '䷩', 2950 => '䷪', 2951 => '䷫', 2952 => '䷬', 2953 => '䷭', 2954 => '䷮', 2955 => '䷯', 2956 => '䷰', 2957 => '䷱', 2958 => '䷲', 2959 => '䷳', 2960 => '䷴', 2961 => '䷵', 2962 => '䷶', 2963 => '䷷', 2964 => '䷸', 2965 => '䷹', 2966 => '䷺', 2967 => '䷻', 2968 => '䷼', 2969 => '䷽', 2970 => '䷾', 2971 => '䷿', 2972 => '𝌀', 2973 => '𝌁', 2974 => '𝌂', 2975 => '𝌃', 2976 => '𝌄', 2977 => '𝌅', 2978 => '𝌆', 2979 => '𝌇', 2980 => '𝌈', 2981 => '𝌉', 2982 => '𝌊', 2983 => '𝌋', 2984 => '𝌌', 2985 => '𝌍', 2986 => '𝌎', 2987 => '𝌏', 2988 => '𝌐', 2989 => '𝌑', 2990 => '𝌒', 2991 => '𝌓', 2992 => '𝌔', 2993 => '𝌕', 2994 => '𝌖', 2995 => '𝌗', 2996 => '𝌘', 2997 => '𝌙', 2998 => '𝌚', 2999 => '𝌛', 3000 => '𝌜', 3001 => '𝌝', 3002 => '𝌞', 3003 => '𝌟', 3004 => '𝌠', 3005 => '𝌡', 3006 => '𝌢', 3007 => '𝌣', 3008 => '𝌤', 3009 => '𝌥', 3010 => '𝌦', 3011 => '𝌧', 3012 => '𝌨', 3013 => '𝌩', 3014 => '𝌪', 3015 => '𝌫', 3016 => '𝌬', 3017 => '𝌭', 3018 => '𝌮', 3019 => '𝌯', 3020 => '𝌰', 3021 => '𝌱', 3022 => '𝌲', 3023 => '𝌳', 3024 => '𝌴', 3025 => '𝌵', 3026 => '𝌶', 3027 => '𝌷', 3028 => '𝌸', 3029 => '𝌹', 3030 => '𝌺', 3031 => '𝌻', 3032 => '𝌼', 3033 => '𝌽', 3034 => '𝌾', 3035 => '𝌿', 3036 => '𝍀', 3037 => '𝍁', 3038 => '𝍂', 3039 => '𝍃', 3040 => '𝍄', 3041 => '𝍅', 3042 => '𝍆', 3043 => '𝍇', 3044 => '𝍈', 3045 => '𝍉', 3046 => '𝍊', 3047 => '𝍋', 3048 => '𝍌', 3049 => '𝍍', 3050 => '𝍎', 3051 => '𝍏', 3052 => '𝍐', 3053 => '𝍑', 3054 => '𝍒', 3055 => '𝍓', 3056 => '𝍔', 3057 => '𝍕', 3058 => '𝍖', 3059 => '꒐', 3060 => '꒑', 3061 => '꒒', 3062 => '꒓', 3063 => '꒔', 3064 => '꒕', 3065 => '꒖', 3066 => '꒗', 3067 => '꒘', 3068 => '꒙', 3069 => '꒚', 3070 => '꒛', 3071 => '꒜', 3072 => '꒝', 3073 => '꒞', 3074 => '꒟', 3075 => '꒠', 3076 => '꒡', 3077 => '꒢', 3078 => '꒣', 3079 => '꒤', 3080 => '꒥', 3081 => '꒦', 3082 => '꒧', 3083 => '꒨', 3084 => '꒩', 3085 => '꒪', 3086 => '꒫', 3087 => '꒬', 3088 => '꒭', 3089 => '꒮', 3090 => '꒯', 3091 => '꒰', 3092 => '꒱', 3093 => '꒲', 3094 => '꒳', 3095 => '꒴', 3096 => '꒵', 3097 => '꒶', 3098 => '꒷', 3099 => '꒸', 3100 => '꒹', 3101 => '꒺', 3102 => '꒻', 3103 => '꒼', 3104 => '꒽', 3105 => '꒾', 3106 => '꒿', 3107 => '꓀', 3108 => '꓁', 3109 => '꓂', 3110 => '꓃', 3111 => '꓄', 3112 => '꓅', 3113 => '꓆', 3114 => '𐄷', 3115 => '𐄸', 3116 => '𐄹', 3117 => '𐄺', 3118 => '𐄻', 3119 => '𐄼', 3120 => '𐄽', 3121 => '𐄾', 3122 => '𐄿', 3123 => '𐅹', 3124 => '𐅺', 3125 => '𐅻', 3126 => '𐅼', 3127 => '𐅽', 3128 => '𐅾', 3129 => '𐅿', 3130 => '𐆀', 3131 => '𐆁', 3132 => '𐆂', 3133 => '𐆃', 3134 => '𐆄', 3135 => '𐆅', 3136 => '𐆆', 3137 => '𐆇', 3138 => '𐆈', 3139 => '𐆉', 3140 => '𐆐', 3141 => '𐆑', 3142 => '𐆒', 3143 => '𐆓', 3144 => '𐆔', 3145 => '𐆕', 3146 => '𐆖', 3147 => '𐆗', 3148 => '𐆘', 3149 => '𐆙', 3150 => '𐆚', 3151 => '𐆛', 3152 => '𐇐', 3153 => '𐇑', 3154 => '𐇒', 3155 => '𐇓', 3156 => '𐇔', 3157 => '𐇕', 3158 => '𐇖', 3159 => '𐇗', 3160 => '𐇘', 3161 => '𐇙', 3162 => '𐇚', 3163 => '𐇛', 3164 => '𐇜', 3165 => '𐇝', 3166 => '𐇞', 3167 => '𐇟', 3168 => '𐇠', 3169 => '𐇡', 3170 => '𐇢', 3171 => '𐇣', 3172 => '𐇤', 3173 => '𐇥', 3174 => '𐇦', 3175 => '𐇧', 3176 => '𐇨', 3177 => '𐇩', 3178 => '𐇪', 3179 => '𐇫', 3180 => '𐇬', 3181 => '𐇭', 3182 => '𐇮', 3183 => '𐇯', 3184 => '𐇰', 3185 => '𐇱', 3186 => '𐇲', 3187 => '𐇳', 3188 => '𐇴', 3189 => '𐇵', 3190 => '𐇶', 3191 => '𐇷', 3192 => '𐇸', 3193 => '𐇹', 3194 => '𐇺', 3195 => '𐇻', 3196 => '𐇼', 3197 => '𝀀', 3198 => '𝀁', 3199 => '𝀂', 3200 => '𝀃', 3201 => '𝀄', 3202 => '𝀅', 3203 => '𝀆', 3204 => '𝀇', 3205 => '𝀈', 3206 => '𝀉', 3207 => '𝀊', 3208 => '𝀋', 3209 => '𝀌', 3210 => '𝀍', 3211 => '𝀎', 3212 => '𝀏', 3213 => '𝀐', 3214 => '𝀑', 3215 => '𝀒', 3216 => '𝀓', 3217 => '𝀔', 3218 => '𝀕', 3219 => '𝀖', 3220 => '𝀗', 3221 => '𝀘', 3222 => '𝀙', 3223 => '𝀚', 3224 => '𝀛', 3225 => '𝀜', 3226 => '𝀝', 3227 => '𝀞', 3228 => '𝀟', 3229 => '𝀠', 3230 => '𝀡', 3231 => '𝀢', 3232 => '𝀣', 3233 => '𝀤', 3234 => '𝀥', 3235 => '𝀦', 3236 => '𝀧', 3237 => '𝀨', 3238 => '𝀩', 3239 => '𝀪', 3240 => '𝀫', 3241 => '𝀬', 3242 => '𝀭', 3243 => '𝀮', 3244 => '𝀯', 3245 => '𝀰', 3246 => '𝀱', 3247 => '𝀲', 3248 => '𝀳', 3249 => '𝀴', 3250 => '𝀵', 3251 => '𝀶', 3252 => '𝀷', 3253 => '𝀸', 3254 => '𝀹', 3255 => '𝀺', 3256 => '𝀻', 3257 => '𝀼', 3258 => '𝀽', 3259 => '𝀾', 3260 => '𝀿', 3261 => '𝁀', 3262 => '𝁁', 3263 => '𝁂', 3264 => '𝁃', 3265 => '𝁄', 3266 => '𝁅', 3267 => '𝁆', 3268 => '𝁇', 3269 => '𝁈', 3270 => '𝁉', 3271 => '𝁊', 3272 => '𝁋', 3273 => '𝁌', 3274 => '𝁍', 3275 => '𝁎', 3276 => '𝁏', 3277 => '𝁐', 3278 => '𝁑', 3279 => '𝁒', 3280 => '𝁓', 3281 => '𝁔', 3282 => '𝁕', 3283 => '𝁖', 3284 => '𝁗', 3285 => '𝁘', 3286 => '𝁙', 3287 => '𝁚', 3288 => '𝁛', 3289 => '𝁜', 3290 => '𝁝', 3291 => '𝁞', 3292 => '𝁟', 3293 => '𝁠', 3294 => '𝁡', 3295 => '𝁢', 3296 => '𝁣', 3297 => '𝁤', 3298 => '𝁥', 3299 => '𝁦', 3300 => '𝁧', 3301 => '𝁨', 3302 => '𝁩', 3303 => '𝁪', 3304 => '𝁫', 3305 => '𝁬', 3306 => '𝁭', 3307 => '𝁮', 3308 => '𝁯', 3309 => '𝁰', 3310 => '𝁱', 3311 => '𝁲', 3312 => '𝁳', 3313 => '𝁴', 3314 => '𝁵', 3315 => '𝁶', 3316 => '𝁷', 3317 => '𝁸', 3318 => '𝁹', 3319 => '𝁺', 3320 => '𝁻', 3321 => '𝁼', 3322 => '𝁽', 3323 => '𝁾', 3324 => '𝁿', 3325 => '𝂀', 3326 => '𝂁', 3327 => '𝂂', 3328 => '𝂃', 3329 => '𝂄', 3330 => '𝂅', 3331 => '𝂆', 3332 => '𝂇', 3333 => '𝂈', 3334 => '𝂉', 3335 => '𝂊', 3336 => '𝂋', 3337 => '𝂌', 3338 => '𝂍', 3339 => '𝂎', 3340 => '𝂏', 3341 => '𝂐', 3342 => '𝂑', 3343 => '𝂒', 3344 => '𝂓', 3345 => '𝂔', 3346 => '𝂕', 3347 => '𝂖', 3348 => '𝂗', 3349 => '𝂘', 3350 => '𝂙', 3351 => '𝂚', 3352 => '𝂛', 3353 => '𝂜', 3354 => '𝂝', 3355 => '𝂞', 3356 => '𝂟', 3357 => '𝂠', 3358 => '𝂡', 3359 => '𝂢', 3360 => '𝂣', 3361 => '𝂤', 3362 => '𝂥', 3363 => '𝂦', 3364 => '𝂧', 3365 => '𝂨', 3366 => '𝂩', 3367 => '𝂪', 3368 => '𝂫', 3369 => '𝂬', 3370 => '𝂭', 3371 => '𝂮', 3372 => '𝂯', 3373 => '𝂰', 3374 => '𝂱', 3375 => '𝂲', 3376 => '𝂳', 3377 => '𝂴', 3378 => '𝂵', 3379 => '𝂶', 3380 => '𝂷', 3381 => '𝂸', 3382 => '𝂹', 3383 => '𝂺', 3384 => '𝂻', 3385 => '𝂼', 3386 => '𝂽', 3387 => '𝂾', 3388 => '𝂿', 3389 => '𝃀', 3390 => '𝃁', 3391 => '𝃂', 3392 => '𝃃', 3393 => '𝃄', 3394 => '𝃅', 3395 => '𝃆', 3396 => '𝃇', 3397 => '𝃈', 3398 => '𝃉', 3399 => '𝃊', 3400 => '𝃋', 3401 => '𝃌', 3402 => '𝃍', 3403 => '𝃎', 3404 => '𝃏', 3405 => '𝃐', 3406 => '𝃑', 3407 => '𝃒', 3408 => '𝃓', 3409 => '𝃔', 3410 => '𝃕', 3411 => '𝃖', 3412 => '𝃗', 3413 => '𝃘', 3414 => '𝃙', 3415 => '𝃚', 3416 => '𝃛', 3417 => '𝃜', 3418 => '𝃝', 3419 => '𝃞', 3420 => '𝃟', 3421 => '𝃠', 3422 => '𝃡', 3423 => '𝃢', 3424 => '𝃣', 3425 => '𝃤', 3426 => '𝃥', 3427 => '𝃦', 3428 => '𝃧', 3429 => '𝃨', 3430 => '𝃩', 3431 => '𝃪', 3432 => '𝃫', 3433 => '𝃬', 3434 => '𝃭', 3435 => '𝃮', 3436 => '𝃯', 3437 => '𝃰', 3438 => '𝃱', 3439 => '𝃲', 3440 => '𝃳', 3441 => '𝃴', 3442 => '𝃵', 3443 => '𝄀', 3444 => '𝄁', 3445 => '𝄂', 3446 => '𝄃', 3447 => '𝄄', 3448 => '𝄅', 3449 => '𝄆', 3450 => '𝄇', 3451 => '𝄈', 3452 => '𝄉', 3453 => '𝄊', 3454 => '𝄋', 3455 => '𝄌', 3456 => '𝄍', 3457 => '𝄎', 3458 => '𝄏', 3459 => '𝄐', 3460 => '𝄑', 3461 => '𝄒', 3462 => '𝄓', 3463 => '𝄔', 3464 => '𝄕', 3465 => '𝄖', 3466 => '𝄗', 3467 => '𝄘', 3468 => '𝄙', 3469 => '𝄚', 3470 => '𝄛', 3471 => '𝄜', 3472 => '𝄝', 3473 => '𝄞', 3474 => '𝄟', 3475 => '𝄠', 3476 => '𝄡', 3477 => '𝄢', 3478 => '𝄣', 3479 => '𝄤', 3480 => '𝄥', 3481 => '𝄦', 3482 => '♭', 3483 => '♮', 3484 => '♯', 3485 => '𝄪', 3486 => '𝄫', 3487 => '𝄬', 3488 => '𝄭', 3489 => '𝄮', 3490 => '𝄯', 3491 => '𝄰', 3492 => '𝄱', 3493 => '𝄲', 3494 => '𝄳', 3495 => '𝄴', 3496 => '𝄵', 3497 => '𝄶', 3498 => '𝄷', 3499 => '𝄸', 3500 => '𝄹', 3501 => '𝄩', 3502 => '𝄺', 3503 => '𝄻', 3504 => '𝄼', 3505 => '𝄽', 3506 => '𝄾', 3507 => '𝄿', 3508 => '𝅀', 3509 => '𝅁', 3510 => '𝅂', 3511 => '𝅃', 3512 => '𝅄', 3513 => '𝅅', 3514 => '𝅆', 3515 => '𝅇', 3516 => '𝅈', 3517 => '𝅉', 3518 => '𝅊', 3519 => '𝅋', 3520 => '𝅌', 3521 => '𝅍', 3522 => '𝅎', 3523 => '𝅏', 3524 => '𝅐', 3525 => '𝅑', 3526 => '𝅒', 3527 => '𝅓', 3528 => '𝅔', 3529 => '𝅕', 3530 => '𝅖', 3531 => '𝅗', 3532 => '𝅘', 3533 => '𝅙', 3534 => '𝅚', 3535 => '𝅛', 3536 => '𝅜', 3537 => '𝅝', 3538 => '𝅪', 3539 => '𝅫', 3540 => '𝅬', 3541 => '𝆃', 3542 => '𝆄', 3543 => '𝆌', 3544 => '𝆍', 3545 => '𝆎', 3546 => '𝆏', 3547 => '𝆐', 3548 => '𝆑', 3549 => '𝆒', 3550 => '𝆓', 3551 => '𝆔', 3552 => '𝆕', 3553 => '𝆖', 3554 => '𝆗', 3555 => '𝆘', 3556 => '𝆙', 3557 => '𝆚', 3558 => '𝆛', 3559 => '𝆜', 3560 => '𝆝', 3561 => '𝆞', 3562 => '𝆟', 3563 => '𝆠', 3564 => '𝆡', 3565 => '𝆢', 3566 => '𝆣', 3567 => '𝆤', 3568 => '𝆥', 3569 => '𝆦', 3570 => '𝆧', 3571 => '𝆨', 3572 => '𝆩', 3573 => '𝆮', 3574 => '𝆯', 3575 => '𝆰', 3576 => '𝆱', 3577 => '𝆲', 3578 => '𝆳', 3579 => '𝆴', 3580 => '𝆵', 3581 => '𝆶', 3582 => '𝆷', 3583 => '𝆸', 3584 => '𝆹', 3585 => '𝆺', 3586 => '𝇁', 3587 => '𝇂', 3588 => '𝇃', 3589 => '𝇄', 3590 => '𝇅', 3591 => '𝇆', 3592 => '𝇇', 3593 => '𝇈', 3594 => '𝇉', 3595 => '𝇊', 3596 => '𝇋', 3597 => '𝇌', 3598 => '𝇍', 3599 => '𝇎', 3600 => '𝇏', 3601 => '𝇐', 3602 => '𝇑', 3603 => '𝇒', 3604 => '𝇓', 3605 => '𝇔', 3606 => '𝇕', 3607 => '𝇖', 3608 => '𝇗', 3609 => '𝇘', 3610 => '𝇙', 3611 => '𝇚', 3612 => '𝇛', 3613 => '𝇜', 3614 => '𝇝', 3615 => '𝈀', 3616 => '𝈁', 3617 => '𝈂', 3618 => '𝈃', 3619 => '𝈄', 3620 => '𝈅', 3621 => '𝈆', 3622 => '𝈇', 3623 => '𝈈', 3624 => '𝈉', 3625 => '𝈊', 3626 => '𝈋', 3627 => '𝈌', 3628 => '𝈍', 3629 => '𝈎', 3630 => '𝈏', 3631 => '𝈐', 3632 => '𝈑', 3633 => '𝈒', 3634 => '𝈓', 3635 => '𝈔', 3636 => '𝈕', 3637 => '𝈖', 3638 => '𝈗', 3639 => '𝈘', 3640 => '𝈙', 3641 => '𝈚', 3642 => '𝈛', 3643 => '𝈜', 3644 => '𝈝', 3645 => '𝈞', 3646 => '𝈟', 3647 => '𝈠', 3648 => '𝈡', 3649 => '𝈢', 3650 => '𝈣', 3651 => '𝈤', 3652 => '𝈥', 3653 => '𝈦', 3654 => '𝈧', 3655 => '𝈨', 3656 => '𝈩', 3657 => '𝈪', 3658 => '𝈫', 3659 => '𝈬', 3660 => '𝈭', 3661 => '𝈮', 3662 => '𝈯', 3663 => '𝈰', 3664 => '𝈱', 3665 => '𝈲', 3666 => '𝈳', 3667 => '𝈴', 3668 => '𝈵', 3669 => '𝈶', 3670 => '𝈷', 3671 => '𝈸', 3672 => '𝈹', 3673 => '𝈺', 3674 => '𝈻', 3675 => '𝈼', 3676 => '𝈽', 3677 => '𝈾', 3678 => '𝈿', 3679 => '𝉀', 3680 => '𝉁', 3681 => '𝉅', 3682 => '🀀', 3683 => '🀁', 3684 => '🀂', 3685 => '🀃', 3686 => '🀄', 3687 => '🀅', 3688 => '🀆', 3689 => '🀇', 3690 => '🀈', 3691 => '🀉', 3692 => '🀊', 3693 => '🀋', 3694 => '🀌', 3695 => '🀍', 3696 => '🀎', 3697 => '🀏', 3698 => '🀐', 3699 => '🀑', 3700 => '🀒', 3701 => '🀓', 3702 => '🀔', 3703 => '🀕', 3704 => '🀖', 3705 => '🀗', 3706 => '🀘', 3707 => '🀙', 3708 => '🀚', 3709 => '🀛', 3710 => '🀜', 3711 => '🀝', 3712 => '🀞', 3713 => '🀟', 3714 => '🀠', 3715 => '🀡', 3716 => '🀢', 3717 => '🀣', 3718 => '🀤', 3719 => '🀥', 3720 => '🀦', 3721 => '🀧', 3722 => '🀨', 3723 => '🀩', 3724 => '🀪', 3725 => '🀫', 3726 => '🀰', 3727 => '🀱', 3728 => '🀲', 3729 => '🀳', 3730 => '🀴', 3731 => '🀵', 3732 => '🀶', 3733 => '🀷', 3734 => '🀸', 3735 => '🀹', 3736 => '🀺', 3737 => '🀻', 3738 => '🀼', 3739 => '🀽', 3740 => '🀾', 3741 => '🀿', 3742 => '🁀', 3743 => '🁁', 3744 => '🁂', 3745 => '🁃', 3746 => '🁄', 3747 => '🁅', 3748 => '🁆', 3749 => '🁇', 3750 => '🁈', 3751 => '🁉', 3752 => '🁊', 3753 => '🁋', 3754 => '🁌', 3755 => '🁍', 3756 => '🁎', 3757 => '🁏', 3758 => '🁐', 3759 => '🁑', 3760 => '🁒', 3761 => '🁓', 3762 => '🁔', 3763 => '🁕', 3764 => '🁖', 3765 => '🁗', 3766 => '🁘', 3767 => '🁙', 3768 => '🁚', 3769 => '🁛', 3770 => '🁜', 3771 => '🁝', 3772 => '🁞', 3773 => '🁟', 3774 => '🁠', 3775 => '🁡', 3776 => '🁢', 3777 => '🁣', 3778 => '🁤', 3779 => '🁥', 3780 => '🁦', 3781 => '🁧', 3782 => '🁨', 3783 => '🁩', 3784 => '🁪', 3785 => '🁫', 3786 => '🁬', 3787 => '🁭', 3788 => '🁮', 3789 => '🁯', 3790 => '🁰', 3791 => '🁱', 3792 => '🁲', 3793 => '🁳', 3794 => '🁴', 3795 => '🁵', 3796 => '🁶', 3797 => '🁷', 3798 => '🁸', 3799 => '🁹', 3800 => '🁺', 3801 => '🁻', 3802 => '🁼', 3803 => '🁽', 3804 => '🁾', 3805 => '🁿', 3806 => '🂀', 3807 => '🂁', 3808 => '🂂', 3809 => '🂃', 3810 => '🂄', 3811 => '🂅', 3812 => '🂆', 3813 => '🂇', 3814 => '🂈', 3815 => '🂉', 3816 => '🂊', 3817 => '🂋', 3818 => '🂌', 3819 => '🂍', 3820 => '🂎', 3821 => '🂏', 3822 => '🂐', 3823 => '🂑', 3824 => '🂒', 3825 => '🂓', 3826 => '🂠', 3827 => '🂡', 3828 => '🂢', 3829 => '🂣', 3830 => '🂤', 3831 => '🂥', 3832 => '🂦', 3833 => '🂧', 3834 => '🂨', 3835 => '🂩', 3836 => '🂪', 3837 => '🂫', 3838 => '🂬', 3839 => '🂭', 3840 => '🂮', 3841 => '🂱', 3842 => '🂲', 3843 => '🂳', 3844 => '🂴', 3845 => '🂵', 3846 => '🂶', 3847 => '🂷', 3848 => '🂸', 3849 => '🂹', 3850 => '🂺', 3851 => '🂻', 3852 => '🂼', 3853 => '🂽', 3854 => '🂾', 3855 => '🃁', 3856 => '🃂', 3857 => '🃃', 3858 => '🃄', 3859 => '🃅', 3860 => '🃆', 3861 => '🃇', 3862 => '🃈', 3863 => '🃉', 3864 => '🃊', 3865 => '🃋', 3866 => '🃌', 3867 => '🃍', 3868 => '🃎', 3869 => '🃏', 3870 => '🃑', 3871 => '🃒', 3872 => '🃓', 3873 => '🃔', 3874 => '🃕', 3875 => '🃖', 3876 => '🃗', 3877 => '🃘', 3878 => '🃙', 3879 => '🃚', 3880 => '🃛', 3881 => '🃜', 3882 => '🃝', 3883 => '🃞', 3884 => '🃟', 3885 => '🌀', 3886 => '🌁', 3887 => '🌂', 3888 => '🌃', 3889 => '🌄', 3890 => '🌅', 3891 => '🌆', 3892 => '🌇', 3893 => '🌈', 3894 => '🌉', 3895 => '🌊', 3896 => '🌋', 3897 => '🌌', 3898 => '🌍', 3899 => '🌎', 3900 => '🌏', 3901 => '🌐', 3902 => '🌑', 3903 => '🌒', 3904 => '🌓', 3905 => '🌔', 3906 => '🌕', 3907 => '🌖', 3908 => '🌗', 3909 => '🌘', 3910 => '🌙', 3911 => '🌚', 3912 => '🌛', 3913 => '🌜', 3914 => '🌝', 3915 => '🌞', 3916 => '🌟', 3917 => '🌠', 3918 => '🌰', 3919 => '🌱', 3920 => '🌲', 3921 => '🌳', 3922 => '🌴', 3923 => '🌵', 3924 => '🌷', 3925 => '🌸', 3926 => '🌹', 3927 => '🌺', 3928 => '🌻', 3929 => '🌼', 3930 => '🌽', 3931 => '🌾', 3932 => '🌿', 3933 => '🍀', 3934 => '🍁', 3935 => '🍂', 3936 => '🍃', 3937 => '🍄', 3938 => '🍅', 3939 => '🍆', 3940 => '🍇', 3941 => '🍈', 3942 => '🍉', 3943 => '🍊', 3944 => '🍋', 3945 => '🍌', 3946 => '🍍', 3947 => '🍎', 3948 => '🍏', 3949 => '🍐', 3950 => '🍑', 3951 => '🍒', 3952 => '🍓', 3953 => '🍔', 3954 => '🍕', 3955 => '🍖', 3956 => '🍗', 3957 => '🍘', 3958 => '🍙', 3959 => '🍚', 3960 => '🍛', 3961 => '🍜', 3962 => '🍝', 3963 => '🍞', 3964 => '🍟', 3965 => '🍠', 3966 => '🍡', 3967 => '🍢', 3968 => '🍣', 3969 => '🍤', 3970 => '🍥', 3971 => '🍦', 3972 => '🍧', 3973 => '🍨', 3974 => '🍩', 3975 => '🍪', 3976 => '🍫', 3977 => '🍬', 3978 => '🍭', 3979 => '🍮', 3980 => '🍯', 3981 => '🍰', 3982 => '🍱', 3983 => '🍲', 3984 => '🍳', 3985 => '🍴', 3986 => '🍵', 3987 => '🍶', 3988 => '🍷', 3989 => '🍸', 3990 => '🍹', 3991 => '🍺', 3992 => '🍻', 3993 => '🍼', 3994 => '🎀', 3995 => '🎁', 3996 => '🎂', 3997 => '🎃', 3998 => '🎄', 3999 => '🎅', 4000 => '🎆', 4001 => '🎇', 4002 => '🎈', 4003 => '🎉', 4004 => '🎊', 4005 => '🎋', 4006 => '🎌', 4007 => '🎍', 4008 => '🎎', 4009 => '🎏', 4010 => '🎐', 4011 => '🎑', 4012 => '🎒', 4013 => '🎓', 4014 => '🎠', 4015 => '🎡', 4016 => '🎢', 4017 => '🎣', 4018 => '🎤', 4019 => '🎥', 4020 => '🎦', 4021 => '🎧', 4022 => '🎨', 4023 => '🎩', 4024 => '🎪', 4025 => '🎫', 4026 => '🎬', 4027 => '🎭', 4028 => '🎮', 4029 => '🎯', 4030 => '🎰', 4031 => '🎱', 4032 => '🎲', 4033 => '🎳', 4034 => '🎴', 4035 => '🎵', 4036 => '🎶', 4037 => '🎷', 4038 => '🎸', 4039 => '🎹', 4040 => '🎺', 4041 => '🎻', 4042 => '🎼', 4043 => '🎽', 4044 => '🎾', 4045 => '🎿', 4046 => '🏀', 4047 => '🏁', 4048 => '🏂', 4049 => '🏃', 4050 => '🏄', 4051 => '🏆', 4052 => '🏇', 4053 => '🏈', 4054 => '🏉', 4055 => '🏊', 4056 => '🏠', 4057 => '🏡', 4058 => '🏢', 4059 => '🏣', 4060 => '🏤', 4061 => '🏥', 4062 => '🏦', 4063 => '🏧', 4064 => '🏨', 4065 => '🏩', 4066 => '🏪', 4067 => '🏫', 4068 => '🏬', 4069 => '🏭', 4070 => '🏮', 4071 => '🏯', 4072 => '🏰', 4073 => '🐀', 4074 => '🐁', 4075 => '🐂', 4076 => '🐃', 4077 => '🐄', 4078 => '🐅', 4079 => '🐆', 4080 => '🐇', 4081 => '🐈', 4082 => '🐉', 4083 => '🐊', 4084 => '🐋', 4085 => '🐌', 4086 => '🐍', 4087 => '🐎', 4088 => '🐏', 4089 => '🐐', 4090 => '🐑', 4091 => '🐒', 4092 => '🐓', 4093 => '🐔', 4094 => '🐕', 4095 => '🐖', 4096 => '🐗', 4097 => '🐘', 4098 => '🐙', 4099 => '🐚', 4100 => '🐛', 4101 => '🐜', 4102 => '🐝', 4103 => '🐞', 4104 => '🐟', 4105 => '🐠', 4106 => '🐡', 4107 => '🐢', 4108 => '🐣', 4109 => '🐤', 4110 => '🐥', 4111 => '🐦', 4112 => '🐧', 4113 => '🐨', 4114 => '🐩', 4115 => '🐪', 4116 => '🐫', 4117 => '🐬', 4118 => '🐭', 4119 => '🐮', 4120 => '🐯', 4121 => '🐰', 4122 => '🐱', 4123 => '🐲', 4124 => '🐳', 4125 => '🐴', 4126 => '🐵', 4127 => '🐶', 4128 => '🐷', 4129 => '🐸', 4130 => '🐹', 4131 => '🐺', 4132 => '🐻', 4133 => '🐼', 4134 => '🐽', 4135 => '🐾', 4136 => '👀', 4137 => '👂', 4138 => '👃', 4139 => '👄', 4140 => '👅', 4141 => '👆', 4142 => '👇', 4143 => '👈', 4144 => '👉', 4145 => '👊', 4146 => '👋', 4147 => '👌', 4148 => '👍', 4149 => '👎', 4150 => '👏', 4151 => '👐', 4152 => '👑', 4153 => '👒', 4154 => '👓', 4155 => '👔', 4156 => '👕', 4157 => '👖', 4158 => '👗', 4159 => '👘', 4160 => '👙', 4161 => '👚', 4162 => '👛', 4163 => '👜', 4164 => '👝', 4165 => '👞', 4166 => '👟', 4167 => '👠', 4168 => '👡', 4169 => '👢', 4170 => '👣', 4171 => '👤', 4172 => '👥', 4173 => '👦', 4174 => '👧', 4175 => '👨', 4176 => '👩', 4177 => '👪', 4178 => '👫', 4179 => '👬', 4180 => '👭', 4181 => '👮', 4182 => '👯', 4183 => '👰', 4184 => '👱', 4185 => '👲', 4186 => '👳', 4187 => '👴', 4188 => '👵', 4189 => '👶', 4190 => '👷', 4191 => '👸', 4192 => '👹', 4193 => '👺', 4194 => '👻', 4195 => '👼', 4196 => '👽', 4197 => '👾', 4198 => '👿', 4199 => '💀', 4200 => '💁', 4201 => '💂', 4202 => '💃', 4203 => '💄', 4204 => '💅', 4205 => '💆', 4206 => '💇', 4207 => '💈', 4208 => '💉', 4209 => '💊', 4210 => '💋', 4211 => '💌', 4212 => '💍', 4213 => '💎', 4214 => '💏', 4215 => '💐', 4216 => '💑', 4217 => '💒', 4218 => '💓', 4219 => '💔', 4220 => '💕', 4221 => '💖', 4222 => '💗', 4223 => '💘', 4224 => '💙', 4225 => '💚', 4226 => '💛', 4227 => '💜', 4228 => '💝', 4229 => '💞', 4230 => '💟', 4231 => '💠', 4232 => '💡', 4233 => '💢', 4234 => '💣', 4235 => '💤', 4236 => '💥', 4237 => '💦', 4238 => '💧', 4239 => '💨', 4240 => '💩', 4241 => '💪', 4242 => '💫', 4243 => '💬', 4244 => '💭', 4245 => '💮', 4246 => '💯', 4247 => '💰', 4248 => '💱', 4249 => '💲', 4250 => '💳', 4251 => '💴', 4252 => '💵', 4253 => '💶', 4254 => '💷', 4255 => '💸', 4256 => '💹', 4257 => '💺', 4258 => '💻', 4259 => '💼', 4260 => '💽', 4261 => '💾', 4262 => '💿', 4263 => '📀', 4264 => '📁', 4265 => '📂', 4266 => '📃', 4267 => '📄', 4268 => '📅', 4269 => '📆', 4270 => '📇', 4271 => '📈', 4272 => '📉', 4273 => '📊', 4274 => '📋', 4275 => '📌', 4276 => '📍', 4277 => '📎', 4278 => '📏', 4279 => '📐', 4280 => '📑', 4281 => '📒', 4282 => '📓', 4283 => '📔', 4284 => '📕', 4285 => '📖', 4286 => '📗', 4287 => '📘', 4288 => '📙', 4289 => '📚', 4290 => '📛', 4291 => '📜', 4292 => '📝', 4293 => '📞', 4294 => '📟', 4295 => '📠', 4296 => '📡', 4297 => '📢', 4298 => '📣', 4299 => '📤', 4300 => '📥', 4301 => '📦', 4302 => '📧', 4303 => '📨', 4304 => '📩', 4305 => '📪', 4306 => '📫', 4307 => '📬', 4308 => '📭', 4309 => '📮', 4310 => '📯', 4311 => '📰', 4312 => '📱', 4313 => '📲', 4314 => '📳', 4315 => '📴', 4316 => '📵', 4317 => '📶', 4318 => '📷', 4319 => '📹', 4320 => '📺', 4321 => '📻', 4322 => '📼', 4323 => '🔀', 4324 => '🔁', 4325 => '🔂', 4326 => '🔃', 4327 => '🔄', 4328 => '🔅', 4329 => '🔆', 4330 => '🔇', 4331 => '🔈', 4332 => '🔉', 4333 => '🔊', 4334 => '🔋', 4335 => '🔌', 4336 => '🔍', 4337 => '🔎', 4338 => '🔏', 4339 => '🔐', 4340 => '🔑', 4341 => '🔒', 4342 => '🔓', 4343 => '🔔', 4344 => '🔕', 4345 => '🔖', 4346 => '🔗', 4347 => '🔘', 4348 => '🔙', 4349 => '🔚', 4350 => '🔛', 4351 => '🔜', 4352 => '🔝', 4353 => '🔞', 4354 => '🔟', 4355 => '🔠', 4356 => '🔡', 4357 => '🔢', 4358 => '🔣', 4359 => '🔤', 4360 => '🔥', 4361 => '🔦', 4362 => '🔧', 4363 => '🔨', 4364 => '🔩', 4365 => '🔪', 4366 => '🔫', 4367 => '🔬', 4368 => '🔭', 4369 => '🔮', 4370 => '🔯', 4371 => '🔰', 4372 => '🔱', 4373 => '🔲', 4374 => '🔳', 4375 => '🔴', 4376 => '🔵', 4377 => '🔶', 4378 => '🔷', 4379 => '🔸', 4380 => '🔹', 4381 => '🔺', 4382 => '🔻', 4383 => '🔼', 4384 => '🔽', 4385 => '🕐', 4386 => '🕑', 4387 => '🕒', 4388 => '🕓', 4389 => '🕔', 4390 => '🕕', 4391 => '🕖', 4392 => '🕗', 4393 => '🕘', 4394 => '🕙', 4395 => '🕚', 4396 => '🕛', 4397 => '🕜', 4398 => '🕝', 4399 => '🕞', 4400 => '🕟', 4401 => '🕠', 4402 => '🕡', 4403 => '🕢', 4404 => '🕣', 4405 => '🕤', 4406 => '🕥', 4407 => '🕦', 4408 => '🕧', 4409 => '🗻', 4410 => '🗼', 4411 => '🗽', 4412 => '🗾', 4413 => '🗿', 4414 => '😁', 4415 => '😂', 4416 => '😃', 4417 => '😄', 4418 => '😅', 4419 => '😆', 4420 => '😇', 4421 => '😈', 4422 => '😉', 4423 => '😊', 4424 => '😋', 4425 => '😌', 4426 => '😍', 4427 => '😎', 4428 => '😏', 4429 => '😐', 4430 => '😒', 4431 => '😓', 4432 => '😔', 4433 => '😖', 4434 => '😘', 4435 => '😚', 4436 => '😜', 4437 => '😝', 4438 => '😞', 4439 => '😠', 4440 => '😡', 4441 => '😢', 4442 => '😣', 4443 => '😤', 4444 => '😥', 4445 => '😨', 4446 => '😩', 4447 => '😪', 4448 => '😫', 4449 => '😭', 4450 => '😰', 4451 => '😱', 4452 => '😲', 4453 => '😳', 4454 => '😵', 4455 => '😶', 4456 => '😷', 4457 => '😸', 4458 => '😹', 4459 => '😺', 4460 => '😻', 4461 => '😼', 4462 => '😽', 4463 => '😾', 4464 => '😿', 4465 => '🙀', 4466 => '🙅', 4467 => '🙆', 4468 => '🙇', 4469 => '🙈', 4470 => '🙉', 4471 => '🙊', 4472 => '🙋', 4473 => '🙌', 4474 => '🙍', 4475 => '🙎', 4476 => '🙏', 4477 => '🚀', 4478 => '🚁', 4479 => '🚂', 4480 => '🚃', 4481 => '🚄', 4482 => '🚅', 4483 => '🚆', 4484 => '🚇', 4485 => '🚈', 4486 => '🚉', 4487 => '🚊', 4488 => '🚋', 4489 => '🚌', 4490 => '🚍', 4491 => '🚎', 4492 => '🚏', 4493 => '🚐', 4494 => '🚑', 4495 => '🚒', 4496 => '🚓', 4497 => '🚔', 4498 => '🚕', 4499 => '🚖', 4500 => '🚗', 4501 => '🚘', 4502 => '🚙', 4503 => '🚚', 4504 => '🚛', 4505 => '🚜', 4506 => '🚝', 4507 => '🚞', 4508 => '🚟', 4509 => '🚠', 4510 => '🚡', 4511 => '🚢', 4512 => '🚣', 4513 => '🚤', 4514 => '🚥', 4515 => '🚦', 4516 => '🚧', 4517 => '🚨', 4518 => '🚩', 4519 => '🚪', 4520 => '🚫', 4521 => '🚬', 4522 => '🚭', 4523 => '🚮', 4524 => '🚯', 4525 => '🚰', 4526 => '🚱', 4527 => '🚲', 4528 => '🚳', 4529 => '🚴', 4530 => '🚵', 4531 => '🚶', 4532 => '🚷', 4533 => '🚸', 4534 => '🚹', 4535 => '🚺', 4536 => '🚻', 4537 => '🚼', 4538 => '🚽', 4539 => '🚾', 4540 => '🚿', 4541 => '🛀', 4542 => '🛁', 4543 => '🛂', 4544 => '🛃', 4545 => '🛄', 4546 => '🛅', 4547 => '🜀', 4548 => '🜁', 4549 => '🜂', 4550 => '🜃', 4551 => '🜄', 4552 => '🜅', 4553 => '🜆', 4554 => '🜇', 4555 => '🜈', 4556 => '🜉', 4557 => '🜊', 4558 => '🜋', 4559 => '🜌', 4560 => '🜍', 4561 => '🜎', 4562 => '🜏', 4563 => '🜐', 4564 => '🜑', 4565 => '🜒', 4566 => '🜓', 4567 => '🜔', 4568 => '🜕', 4569 => '🜖', 4570 => '🜗', 4571 => '🜘', 4572 => '🜙', 4573 => '🜚', 4574 => '🜛', 4575 => '🜜', 4576 => '🜝', 4577 => '🜞', 4578 => '🜟', 4579 => '🜠', 4580 => '🜡', 4581 => '🜢', 4582 => '🜣', 4583 => '🜤', 4584 => '🜥', 4585 => '🜦', 4586 => '🜧', 4587 => '🜨', 4588 => '🜩', 4589 => '🜪', 4590 => '🜫', 4591 => '🜬', 4592 => '🜭', 4593 => '🜮', 4594 => '🜯', 4595 => '🜰', 4596 => '🜱', 4597 => '🜲', 4598 => '🜳', 4599 => '🜴', 4600 => '🜵', 4601 => '🜶', 4602 => '🜷', 4603 => '🜸', 4604 => '🜹', 4605 => '🜺', 4606 => '🜻', 4607 => '🜼', 4608 => '🜽', 4609 => '🜾', 4610 => '🜿', 4611 => '🝀', 4612 => '🝁', 4613 => '🝂', 4614 => '🝃', 4615 => '🝄', 4616 => '🝅', 4617 => '🝆', 4618 => '🝇', 4619 => '🝈', 4620 => '🝉', 4621 => '🝊', 4622 => '🝋', 4623 => '🝌', 4624 => '🝍', 4625 => '🝎', 4626 => '🝏', 4627 => '🝐', 4628 => '🝑', 4629 => '🝒', 4630 => '🝓', 4631 => '🝔', 4632 => '🝕', 4633 => '🝖', 4634 => '🝗', 4635 => '🝘', 4636 => '🝙', 4637 => '🝚', 4638 => '🝛', 4639 => '🝜', 4640 => '🝝', 4641 => '🝞', 4642 => '🝟', 4643 => '🝠', 4644 => '🝡', 4645 => '🝢', 4646 => '🝣', 4647 => '🝤', 4648 => '🝥', 4649 => '🝦', 4650 => '🝧', 4651 => '🝨', 4652 => '🝩', 4653 => '🝪', 4654 => '🝫', 4655 => '🝬', 4656 => '🝭', 4657 => '🝮', 4658 => '🝯', 4659 => '🝰', 4660 => '🝱', 4661 => '🝲', 4662 => '🝳', 4663 => '㆐', 4664 => '㆑', 4665 => '', 4666 => '�', 4667 => '৴', 4668 => '৵', 4669 => '৶', 4670 => '৷', 4671 => '৸', 4672 => '৹', 4673 => '୲', 4674 => '୳', 4675 => '୴', 4676 => '୵', 4677 => '୶', 4678 => '୷', 4679 => '꠰', 4680 => '꠱', 4681 => '꠲', 4682 => '꠳', 4683 => '꠴', 4684 => '꠵', 4685 => '௰', 4686 => '௱', 4687 => '௲', 4688 => '൰', 4689 => '൱', 4690 => '൲', 4691 => '൳', 4692 => '൴', 4693 => '൵', 4694 => '፲', 4695 => '፳', 4696 => '፴', 4697 => '፵', 4698 => '፶', 4699 => '፷', 4700 => '፸', 4701 => '፹', 4702 => '፺', 4703 => '፻', 4704 => '፼', 4705 => 'ↀ', 4706 => 'ↁ', 4707 => 'ↂ', 4708 => 'ↆ', 4709 => 'ↇ', 4710 => 'ↈ', 4711 => '𐹩', 4712 => '𐹪', 4713 => '𐹫', 4714 => '𐹬', 4715 => '𐹭', 4716 => '𐹮', 4717 => '𐹯', 4718 => '𐹰', 4719 => '𐹱', 4720 => '𐹲', 4721 => '𐹳', 4722 => '𐹴', 4723 => '𐹵', 4724 => '𐹶', 4725 => '𐹷', 4726 => '𐹸', 4727 => '𐹹', 4728 => '𐹺', 4729 => '𐹻', 4730 => '𐹼', 4731 => '𐹽', 4732 => '𐹾', 4733 => '⳽', 4734 => '𐌢', 4735 => '𐌣', 4736 => '𐄐', 4737 => '𐄑', 4738 => '𐄒', 4739 => '𐄓', 4740 => '𐄔', 4741 => '𐄕', 4742 => '𐄖', 4743 => '𐄗', 4744 => '𐄘', 4745 => '𐄙', 4746 => '𐄚', 4747 => '𐄛', 4748 => '𐄜', 4749 =&g