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
17use CdnPurgeJob;
19use DateTime;
20use DateTimeZone;
25use EmaillingJob;
27use Generator;
31use InvalidArgumentException;
32use JobQueueDB;
34use LocalRepo;
35use LogFormatter;
64use MediaWiki\Settings\Source\JsonSchemaTrait;
76use NullJob;
82use ReflectionClass;
87use SqlBagOStuff;
102
135 use JsonSchemaTrait;
136
158 public static function listDefaultValues( string $prefix = '' ): Generator {
159 $class = new ReflectionClass( self::class );
160 foreach ( $class->getReflectionConstants() as $const ) {
161 if ( !$const->isPublic() ) {
162 continue;
163 }
164
165 $value = $const->getValue();
166
167 if ( !is_array( $value ) ) {
168 // Just in case we end up having some other kind of constant on this class.
169 continue;
170 }
171
172 if ( isset( $value['obsolete'] ) ) {
173 continue;
174 }
175
176 $name = $const->getName();
177 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
178 }
179 }
180
193 public static function getDefaultValue( string $name ) {
194 $class = new ReflectionClass( self::class );
195 if ( !$class->hasConstant( $name ) ) {
196 throw new InvalidArgumentException( "Unknown setting: $name" );
197 }
198 $value = $class->getConstant( $name );
199
200 if ( !is_array( $value ) ) {
201 // Might happen if we end up having other kinds of constants on this class.
202 throw new InvalidArgumentException( "Unknown setting: $name" );
203 }
204
205 return self::getDefaultFromJsonSchema( $value );
206 }
207
208 /***************************************************************************/
216 public const ConfigRegistry = [
217 'default' => [
218 'main' => 'GlobalVarConfig::newInstance',
219 ],
220 'type' => 'map',
221 ];
222
226 public const Sitename = [
227 'default' => 'MediaWiki',
228 ];
229
230 /***************************************************************************/
231 // region Server URLs and file paths
256 public const Server = [
257 'default' => false,
258 ];
259
269 public const CanonicalServer = [
270 'default' => false,
271 ];
272
279 public const ServerName = [
280 'default' => false,
281 ];
282
289 public const AssumeProxiesUseDefaultProtocolPorts = [
290 'default' => true,
291 'type' => 'boolean',
292 ];
293
304 public const HttpsPort = [
305 'default' => 443,
306 ];
307
325 public const ForceHTTPS = [
326 'default' => false,
327 'type' => 'boolean',
328 ];
329
340 public const ScriptPath = [
341 'default' => '/wiki',
342 ];
343
358 public const UsePathInfo = [
359 'dynamicDefault' => true,
360 ];
361
362 public static function getDefaultUsePathInfo(): bool {
363 // These often break when PHP is set up in CGI mode.
364 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
365 // lighttpd converts incoming path data to lowercase on systems
366 // with case-insensitive filesystems, and there have been reports of
367 // problems on Apache as well.
368 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
369 !str_contains( PHP_SAPI, 'isapi' );
370 }
371
377 public const Script = [
378 'default' => false,
379 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
380 ];
381
386 public static function getDefaultScript( $scriptPath ): string {
387 return "$scriptPath/index.php";
388 }
389
397 public const LoadScript = [
398 'default' => false,
399 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
400 ];
401
406 public static function getDefaultLoadScript( $scriptPath ): string {
407 return "$scriptPath/load.php";
408 }
409
416 public const RestPath = [
417 'default' => false,
418 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
419 ];
420
425 public static function getDefaultRestPath( $scriptPath ): string {
426 return "$scriptPath/rest.php";
427 }
428
436 public const StylePath = [
437 'default' => false,
438 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
439 ];
440
445 public static function getDefaultStylePath( $resourceBasePath ): string {
446 return "$resourceBasePath/skins";
447 }
448
456 public const LocalStylePath = [
457 'default' => false,
458 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
459 ];
460
465 public static function getDefaultLocalStylePath( $scriptPath ): string {
466 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
467 return "$scriptPath/skins";
468 }
469
477 public const ExtensionAssetsPath = [
478 'default' => false,
479 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
480 ];
481
486 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
487 return "$resourceBasePath/extensions";
488 }
489
498 public const ExtensionDirectory = [
499 'default' => null,
500 'type' => '?string',
501 ];
502
511 public const StyleDirectory = [
512 'default' => null,
513 'type' => '?string',
514 ];
515
523 public const ArticlePath = [
524 'default' => false,
525 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
526 ];
527
533 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
534 if ( $usePathInfo ) {
535 return "$script/$1";
536 }
537 return "$script?title=$1";
538 }
539
545 public const UploadPath = [
546 'default' => false,
547 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
548 ];
549
554 public static function getDefaultUploadPath( $scriptPath ): string {
555 return "$scriptPath/images";
556 }
557
570 public const ImgAuthPath = [
571 'default' => false,
572 ];
573
580 public const ThumbPath = [
581 'default' => false,
582 ];
583
589 public const UploadDirectory = [
590 'default' => false,
591 'type' => '?string|false',
592 ];
593
599 public const FileCacheDirectory = [
600 'default' => false,
601 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
602 ];
603
608 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
609 return "$uploadDirectory/cache";
610 }
611
620 public const Logo = [
621 'default' => false,
622 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
623 ];
624
629 public static function getDefaultLogo( $resourceBasePath ): string {
630 return "$resourceBasePath/resources/assets/change-your-logo.svg";
631 }
632
682 public const Logos = [
683 'default' => false,
684 'type' => 'map|false',
685 ];
686
692 public const Favicon = [
693 'default' => '/favicon.ico',
694 ];
695
703 public const AppleTouchIcon = [
704 'default' => false,
705 ];
706
725 public const ReferrerPolicy = [
726 'default' => false,
727 'type' => 'list|string|false',
728 ];
729
751 public const TmpDirectory = [
752 'default' => false,
753 ];
754
761 public const UploadBaseUrl = [
762 'default' => '',
763 ];
764
777 public const UploadStashScalerBaseUrl = [
778 'default' => false,
779 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
780 ];
781
796 public const ActionPaths = [
797 'default' => [],
798 'type' => 'map',
799 ];
800
807 public const MainPageIsDomainRoot = [
808 'default' => false,
809 'type' => 'boolean',
810 ];
811
812 // endregion -- end of server URLs and file paths
813
814 /***************************************************************************/
815 // region Files and file uploads
827 public const EnableUploads = [
828 'default' => false,
829 ];
830
834 public const UploadStashMaxAge = [
835 'default' => 6 * 3600, // 6 hours
836 ];
837
844 public const EnableAsyncUploads = [
845 'default' => false,
846 ];
847
853 public const EnableAsyncUploadsByURL = [
854 'default' => false,
855 ];
856
860 public const UploadMaintenance = [
861 'default' => false,
862 ];
863
873 public const IllegalFileChars = [
874 'default' => ':\\/\\\\',
875 'deprecated' => 'since 1.41; no longer customizable',
876 ];
877
883 public const DeletedDirectory = [
884 'default' => false,
885 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
886 ];
887
892 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
893 return "$uploadDirectory/deleted";
894 }
895
899 public const ImgAuthDetails = [
900 'default' => false,
901 ];
902
918 public const ImgAuthUrlPathMap = [
919 'default' => [],
920 'type' => 'map',
921 ];
922
1058 public const LocalFileRepo = [
1059 'default' => false,
1060 'type' => 'map|false',
1061 'dynamicDefault' => [ 'use' => [ 'UploadDirectory', 'ScriptPath', 'Favicon', 'UploadBaseUrl',
1062 'UploadPath', 'HashedUploadDirectory', 'ThumbnailScriptPath',
1063 'GenerateThumbnailOnParse', 'DeletedDirectory', 'UpdateCompatibleMetadata' ] ],
1064 ];
1065
1066 public static function getDefaultLocalFileRepo(
1067 $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath,
1068 $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory,
1069 $updateCompatibleMetadata
1070 ) {
1071 return [
1072 'class' => LocalRepo::class,
1073 'name' => 'local',
1074 'directory' => $uploadDirectory,
1075 'scriptDirUrl' => $scriptPath,
1076 'favicon' => $favicon,
1077 'url' => $uploadBaseUrl ? $uploadBaseUrl . $uploadPath : $uploadPath,
1078 'hashLevels' => $hashedUploadDirectory ? 2 : 0,
1079 'thumbScriptUrl' => $thumbnailScriptPath,
1080 'transformVia404' => !$generateThumbnailOnParse,
1081 'deletedDir' => $deletedDirectory,
1082 'deletedHashLevels' => $hashedUploadDirectory ? 3 : 0,
1083 'updateCompatibleMetadata' => $updateCompatibleMetadata,
1084 'reserializeMetadata' => $updateCompatibleMetadata,
1085 ];
1086 }
1087
1101 public const ForeignFileRepos = [
1102 'default' => [],
1103 'type' => 'list',
1104 ];
1105
1115 public const UseInstantCommons = [
1116 'default' => false,
1117 ];
1118
1146 public const UseSharedUploads = [
1147 'default' => false,
1148 'type' => 'boolean',
1149 ];
1150
1158 public const SharedUploadDirectory = [
1159 'default' => null,
1160 'type' => '?string',
1161 ];
1162
1170 public const SharedUploadPath = [
1171 'default' => null,
1172 'type' => '?string',
1173 ];
1174
1182 public const HashedSharedUploadDirectory = [
1183 'default' => true,
1184 'type' => 'boolean',
1185 ];
1186
1194 public const RepositoryBaseUrl = [
1195 'default' => 'https://commons.wikimedia.org/wiki/File:',
1196 ];
1197
1205 public const FetchCommonsDescriptions = [
1206 'default' => false,
1207 'type' => 'boolean',
1208 ];
1209
1218 public const SharedUploadDBname = [
1219 'default' => false,
1220 'type' => 'false|string',
1221 ];
1222
1230 public const SharedUploadDBprefix = [
1231 'default' => '',
1232 'type' => 'string',
1233 ];
1234
1242 public const CacheSharedUploads = [
1243 'default' => true,
1244 'type' => 'boolean',
1245 ];
1246
1257 public const ForeignUploadTargets = [
1258 'default' => [ 'local', ],
1259 'type' => 'list',
1260 ];
1261
1271 public const UploadDialog = [
1272 'default' =>
1273 [
1274 'fields' =>
1275 [
1276 'description' => true,
1277 'date' => false,
1278 'categories' => false,
1279 ],
1280 'licensemessages' =>
1281 [
1282 'local' => 'generic-local',
1283 'foreign' => 'generic-foreign',
1284 ],
1285 'comment' =>
1286 [
1287 'local' => '',
1288 'foreign' => '',
1289 ],
1290 'format' =>
1291 [
1292 'filepage' => '$DESCRIPTION',
1293 'description' => '$TEXT',
1294 'ownwork' => '',
1295 'license' => '',
1296 'uncategorized' => '',
1297 ],
1298 ],
1299 'type' => 'map',
1300 ];
1301
1338 public const FileBackends = [
1339 'default' => [],
1340 'type' => 'map',
1341 ];
1342
1354 public const LockManagers = [
1355 'default' => [],
1356 'type' => 'list',
1357 ];
1358
1374 public const ShowEXIF = [
1375 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1376 ];
1377
1378 public static function getDefaultShowEXIF(): bool {
1379 return function_exists( 'exif_read_data' );
1380 }
1381
1385 public const UpdateCompatibleMetadata = [
1386 'default' => false,
1387 ];
1388
1395 public const AllowCopyUploads = [
1396 'default' => false,
1397 ];
1398
1404 public const CopyUploadsDomains = [
1405 'default' => [],
1406 'type' => 'list',
1407 ];
1408
1414 public const CopyUploadsFromSpecialUpload = [
1415 'default' => false,
1416 ];
1417
1423 public const CopyUploadProxy = [
1424 'default' => false,
1425 ];
1426
1435 public const CopyUploadTimeout = [
1436 'default' => false,
1437 'type' => 'false|integer',
1438 ];
1439
1446 public const CopyUploadAllowOnWikiDomainConfig = [
1447 'default' => false,
1448 ];
1449
1470 public const MaxUploadSize = [
1471 'default' => 1024 * 1024 * 100,
1472 ];
1473
1488 public const MinUploadChunkSize = [
1489 'default' => 1024,
1490 ];
1491
1503 public const UploadNavigationUrl = [
1504 'default' => false,
1505 ];
1506
1512 public const UploadMissingFileUrl = [
1513 'default' => false,
1514 ];
1515
1529 public const ThumbnailScriptPath = [
1530 'default' => false,
1531 ];
1532
1540 public const SharedThumbnailScriptPath = [
1541 'default' => false,
1542 'type' => 'string|false',
1543 ];
1544
1550 public const HashedUploadDirectory = [
1551 'default' => true,
1552 'type' => 'boolean',
1553 ];
1554
1563 public const FileExtensions = [
1564 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1565 'type' => 'list',
1566 ];
1567
1576 public const ProhibitedFileExtensions = [
1577 'default' => [
1578 # HTML may contain cookie-stealing JavaScript and web bugs
1579 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1580 # PHP scripts may execute arbitrary code on the server
1581 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1582 # Other types that may be interpreted by some servers
1583 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1584 # May contain harmful executables for Windows victims
1585 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1586 # T341565
1587 'xml',
1588 ],
1589 'type' => 'list',
1590 ];
1591
1598 public const MimeTypeExclusions = [
1599 'default' => [
1600 # HTML may contain cookie-stealing JavaScript and web bugs
1601 'text/html',
1602 # Similarly with JavaScript itself
1603 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1604 # PHP scripts may execute arbitrary code on the server
1605 'application/x-php', 'text/x-php',
1606 # Other types that may be interpreted by some servers
1607 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1608 # Client-side hazards on Internet Explorer
1609 'text/scriptlet', 'application/x-msdownload',
1610 # Windows metafile, client-side vulnerability on some systems
1611 'application/x-msmetafile',
1612 # Files that look like java files
1613 'application/java',
1614 # XML files generally - T341565
1615 'application/xml', 'text/xml',
1616 ],
1617 'type' => 'list',
1618 ];
1619
1625 public const CheckFileExtensions = [
1626 'default' => true,
1627 ];
1628
1635 public const StrictFileExtensions = [
1636 'default' => true,
1637 ];
1638
1645 public const DisableUploadScriptChecks = [
1646 'default' => false,
1647 ];
1648
1652 public const UploadSizeWarning = [
1653 'default' => false,
1654 ];
1655
1667 public const TrustedMediaFormats = [
1668 'default' => [
1669 MEDIATYPE_BITMAP, // all bitmap formats
1670 MEDIATYPE_AUDIO, // all audio formats
1671 MEDIATYPE_VIDEO, // all plain video formats
1672 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1673 "application/pdf", // PDF files
1674 # "application/x-shockwave-flash", //flash/shockwave movie
1675 ],
1676 'type' => 'list',
1677 ];
1678
1687 public const MediaHandlers = [
1688 'default' => [],
1689 'type' => 'map',
1690 ];
1691
1698 public const NativeImageLazyLoading = [
1699 'default' => false,
1700 'type' => 'boolean',
1701 ];
1702
1707 public const ParserTestMediaHandlers = [
1708 'default' => [
1709 'image/jpeg' => 'MockBitmapHandler',
1710 'image/png' => 'MockBitmapHandler',
1711 'image/gif' => 'MockBitmapHandler',
1712 'image/tiff' => 'MockBitmapHandler',
1713 'image/webp' => 'MockBitmapHandler',
1714 'image/x-ms-bmp' => 'MockBitmapHandler',
1715 'image/x-bmp' => 'MockBitmapHandler',
1716 'image/x-xcf' => 'MockBitmapHandler',
1717 'image/svg+xml' => 'MockSvgHandler',
1718 'image/vnd.djvu' => 'MockDjVuHandler',
1719 ],
1720 'type' => 'map',
1721 ];
1722
1728 public const UseImageResize = [
1729 'default' => true,
1730 ];
1731
1741 public const UseImageMagick = [
1742 'default' => false,
1743 ];
1744
1748 public const ImageMagickConvertCommand = [
1749 'default' => '/usr/bin/convert',
1750 ];
1751
1757 public const MaxInterlacingAreas = [
1758 'default' => [],
1759 'type' => 'map',
1760 ];
1761
1765 public const SharpenParameter = [
1766 'default' => '0x0.4',
1767 ];
1768
1772 public const SharpenReductionThreshold = [
1773 'default' => 0.85,
1774 ];
1775
1780 public const ImageMagickTempDir = [
1781 'default' => false,
1782 ];
1783
1796 public const CustomConvertCommand = [
1797 'default' => false,
1798 ];
1799
1805 public const JpegTran = [
1806 'default' => '/usr/bin/jpegtran',
1807 ];
1808
1828 public const JpegPixelFormat = [
1829 'default' => 'yuv420',
1830 ];
1831
1839 public const JpegQuality = [
1840 'default' => 80,
1841 ];
1842
1847 public const Exiv2Command = [
1848 'default' => '/usr/bin/exiv2',
1849 ];
1850
1856 public const Exiftool = [
1857 'default' => '/usr/bin/exiftool',
1858 ];
1859
1870 public const SVGConverters = [
1871 'default' => [
1872 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1873 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
1874 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
1875 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1876 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1877 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
1878 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1879 ],
1880 'type' => 'map',
1881 ];
1882
1886 public const SVGConverter = [
1887 'default' => 'ImageMagick',
1888 ];
1889
1893 public const SVGConverterPath = [
1894 'default' => '',
1895 ];
1896
1900 public const SVGMaxSize = [
1901 'default' => 5120,
1902 ];
1903
1909 public const SVGMetadataCutoff = [
1910 'default' => 1024 * 1024 * 5,
1911 ];
1912
1923 public const SVGNativeRendering = [
1924 'default' => false,
1925 'type' => 'string|boolean',
1926 ];
1927
1935 public const SVGNativeRenderingSizeLimit = [
1936 'default' => 50 * 1024,
1937 ];
1938
1948 public const MediaInTargetLanguage = [
1949 'default' => true,
1950 ];
1951
1969 public const MaxImageArea = [
1970 'default' => 12_500_000,
1971 'type' => 'string|integer|false',
1972 ];
1973
1982 public const MaxAnimatedGifArea = [
1983 'default' => 12_500_000,
1984 ];
1985
2001 public const TiffThumbnailType = [
2002 'default' => [],
2003 'type' => 'list',
2004 'mergeStrategy' => 'replace',
2005 ];
2006
2014 public const ThumbnailEpoch = [
2015 'default' => '20030516000000',
2016 ];
2017
2025 public const AttemptFailureEpoch = [
2026 'default' => 1,
2027 ];
2028
2040 public const IgnoreImageErrors = [
2041 'default' => false,
2042 ];
2043
2064 public const GenerateThumbnailOnParse = [
2065 'default' => true,
2066 'type' => 'boolean',
2067 ];
2068
2072 public const ShowArchiveThumbnails = [
2073 'default' => true,
2074 ];
2075
2081 public const EnableAutoRotation = [
2082 'default' => null,
2083 'type' => '?boolean',
2084 ];
2085
2091 public const Antivirus = [
2092 'default' => null,
2093 'type' => '?string',
2094 ];
2095
2131 public const AntivirusSetup = [
2132 'default' => [
2133 # setup for clamav
2134 'clamav' => [
2135 'command' => 'clamscan --no-summary ',
2136 'codemap' => [
2137 "0" => AV_NO_VIRUS, # no virus
2138 "1" => AV_VIRUS_FOUND, # virus found
2139 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2140 "*" => AV_SCAN_FAILED, # else scan failed
2141 ],
2142 'messagepattern' => '/.*?:(.*)/sim',
2143 ],
2144 ],
2145 'type' => 'map',
2146 ];
2147
2151 public const AntivirusRequired = [
2152 'default' => true,
2153 ];
2154
2158 public const VerifyMimeType = [
2159 'default' => true,
2160 ];
2161
2172 public const MimeTypeFile = [
2173 'default' => 'internal',
2174 ];
2175
2181 public const MimeInfoFile = [
2182 'default' => 'internal',
2183 ];
2184
2198 public const MimeDetectorCommand = [
2199 'default' => null,
2200 'type' => '?string',
2201 ];
2202
2208 public const TrivialMimeDetection = [
2209 'default' => false,
2210 ];
2211
2217 public const XMLMimeTypes = [
2218 'default' => [
2219 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2220 'svg' => 'image/svg+xml',
2221 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2222 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2223 'html' => 'text/html',
2224 ],
2225 'type' => 'map',
2226 ];
2227
2238 public const ImageLimits = [
2239 'default' => [
2240 [ 320, 240 ],
2241 [ 640, 480 ],
2242 [ 800, 600 ],
2243 [ 1024, 768 ],
2244 [ 1280, 1024 ],
2245 [ 2560, 2048 ],
2246 ],
2247 'type' => 'list',
2248 ];
2249
2255 public const ThumbLimits = [
2256 'default' => [
2257 120,
2258 150,
2259 180,
2260 200,
2261 250,
2262 300
2263 ],
2264 'type' => 'list',
2265 ];
2266
2272 public const ThumbnailNamespaces = [
2273 'default' => [ NS_FILE ],
2274 'type' => 'list',
2275 'items' => [ 'type' => 'integer', ],
2276 ];
2277
2288 public const ThumbnailBuckets = [
2289 'default' => null,
2290 'type' => '?list',
2291 ];
2292
2308 public const ThumbnailMinimumBucketDistance = [
2309 'default' => 50,
2310 ];
2311
2321 public const UploadThumbnailRenderMap = [
2322 'default' => [],
2323 'type' => 'map',
2324 ];
2325
2337 public const UploadThumbnailRenderMethod = [
2338 'default' => 'jobqueue',
2339 ];
2340
2347 public const UploadThumbnailRenderHttpCustomHost = [
2348 'default' => false,
2349 ];
2350
2357 public const UploadThumbnailRenderHttpCustomDomain = [
2358 'default' => false,
2359 ];
2360
2368 public const UseTinyRGBForJPGThumbnails = [
2369 'default' => false,
2370 ];
2371
2387 public const GalleryOptions = [
2388 'default' => [],
2389 'type' => 'map',
2390 ];
2391
2397 public const ThumbUpright = [
2398 'default' => 0.75,
2399 ];
2400
2404 public const DirectoryMode = [
2405 'default' => 0777, // octal!
2406 ];
2407
2414 public const ResponsiveImages = [
2415 'default' => true,
2416 ];
2417
2434 public const ImagePreconnect = [
2435 'default' => false,
2436 ];
2437
2438 /***************************************************************************/
2439 // region DJVU settings
2448 public const DjvuUseBoxedCommand = [
2449 'default' => false,
2450 ];
2451
2460 public const DjvuDump = [
2461 'default' => null,
2462 'type' => '?string',
2463 ];
2464
2470 public const DjvuRenderer = [
2471 'default' => null,
2472 'type' => '?string',
2473 ];
2474
2483 public const DjvuTxt = [
2484 'default' => null,
2485 'type' => '?string',
2486 ];
2487
2493 public const DjvuPostProcessor = [
2494 'default' => 'pnmtojpeg',
2495 'type' => '?string',
2496 ];
2497
2501 public const DjvuOutputExtension = [
2502 'default' => 'jpg',
2503 ];
2504
2505 // endregion -- end of DJvu
2506
2507 // endregion -- end of file uploads
2508
2509 /***************************************************************************/
2510 // region Email settings
2518 public const EmergencyContact = [
2519 'default' => false,
2520 ];
2521
2530 public const PasswordSender = [
2531 'default' => false,
2532 ];
2533
2539 public const NoReplyAddress = [
2540 'default' => false,
2541 ];
2542
2548 public const EnableEmail = [
2549 'default' => true,
2550 ];
2551
2557 public const EnableUserEmail = [
2558 'default' => true,
2559 ];
2560
2568 public const EnableSpecialMute = [
2569 'default' => false,
2570 ];
2571
2577 public const EnableUserEmailMuteList = [
2578 'default' => false,
2579 ];
2580
2590 public const UserEmailUseReplyTo = [
2591 'default' => true,
2592 ];
2593
2598 public const PasswordReminderResendTime = [
2599 'default' => 24,
2600 ];
2601
2605 public const NewPasswordExpiry = [
2606 'default' => 3600 * 24 * 7,
2607 ];
2608
2612 public const UserEmailConfirmationTokenExpiry = [
2613 'default' => 7 * 24 * 60 * 60,
2614 ];
2615
2620 public const PasswordExpirationDays = [
2621 'default' => false,
2622 ];
2623
2628 public const PasswordExpireGrace = [
2629 'default' => 3600 * 24 * 7,
2630 ];
2631
2649 public const SMTP = [
2650 'default' => false,
2651 'type' => 'false|map',
2652 ];
2653
2657 public const AdditionalMailParams = [
2658 'default' => null,
2659 ];
2660
2665 public const AllowHTMLEmail = [
2666 'default' => false,
2667 ];
2668
2678 public const EnotifFromEditor = [
2679 'default' => false,
2680 'type' => 'boolean',
2681 ];
2682
2689 public const EmailAuthentication = [
2690 'default' => true,
2691 ];
2692
2696 public const EnotifWatchlist = [
2697 'default' => false,
2698 ];
2699
2707 public const EnotifUserTalk = [
2708 'default' => false,
2709 ];
2710
2723 public const EnotifRevealEditorAddress = [
2724 'default' => false,
2725 'type' => 'boolean',
2726 ];
2727
2741 public const EnotifMinorEdits = [
2742 'default' => true,
2743 ];
2744
2752 public const EnotifImpersonal = [
2753 'default' => false,
2754 ];
2755
2760 public const EnotifMaxRecips = [
2761 'default' => 500,
2762 ];
2763
2767 public const EnotifUseRealName = [
2768 'default' => false,
2769 ];
2770
2775 public const UsersNotifiedOnAllChanges = [
2776 'default' => [],
2777 'type' => 'map',
2778 ];
2779
2780 // endregion -- end of email settings
2781
2782 /***************************************************************************/
2783 // region Database settings
2796 public const DBname = [
2797 'default' => 'my_wiki',
2798 ];
2799
2810 public const DBmwschema = [
2811 'default' => null,
2812 'type' => '?string',
2813 ];
2814
2826 public const DBprefix = [
2827 'default' => '',
2828 ];
2829
2833 public const DBserver = [
2834 'default' => 'localhost',
2835 ];
2836
2840 public const DBport = [
2841 'default' => 5432,
2842 ];
2843
2847 public const DBuser = [
2848 'default' => 'wikiuser',
2849 ];
2850
2854 public const DBpassword = [
2855 'default' => '',
2856 ];
2857
2861 public const DBtype = [
2862 'default' => 'mysql',
2863 ];
2864
2872 public const DBssl = [
2873 'default' => false,
2874 ];
2875
2884 public const DBcompress = [
2885 'default' => false,
2886 ];
2887
2899 public const DBStrictWarnings = [
2900 'default' => false,
2901 ];
2902
2906 public const DBadminuser = [
2907 'default' => null,
2908 ];
2909
2913 public const DBadminpassword = [
2914 'default' => null,
2915 ];
2916
2928 public const SearchType = [
2929 'default' => null,
2930 ];
2931
2944 public const SearchTypeAlternatives = [
2945 'default' => null,
2946 ];
2947
2951 public const DBTableOptions = [
2952 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2953 ];
2954
2962 public const SQLMode = [
2963 'default' => '',
2964 ];
2965
2973 public const DBDefaultGroup = [
2974 'default' => null,
2975 ];
2976
2980 public const SQLiteDataDir = [
2981 'default' => '',
2982 ];
2983
3004 public const SharedDB = [
3005 'default' => null,
3006 ];
3007
3011 public const SharedPrefix = [
3012 'default' => false,
3013 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3014 ];
3015
3020 public static function getDefaultSharedPrefix( $dbPrefix ) {
3021 return $dbPrefix;
3022 }
3023
3028 public const SharedTables = [
3029 'default' => [
3030 'user',
3031 'user_properties',
3032 'user_autocreate_serial',
3033 ],
3034 'type' => 'list',
3035 ];
3036
3041 public const SharedSchema = [
3042 'default' => false,
3043 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3044 ];
3045
3050 public static function getDefaultSharedSchema( $dbMwschema ) {
3051 return $dbMwschema;
3052 }
3053
3108 public const DBservers = [
3109 'default' => false,
3110 'type' => 'false|list',
3111 ];
3112
3123 public const LBFactoryConf = [
3124 'default' => [
3125 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3126 ],
3127 'type' => 'map',
3128 'mergeStrategy' => 'replace',
3129 ];
3130
3142 public const DataCenterUpdateStickTTL = [
3143 'default' => 10,
3144 ];
3145
3149 public const DBerrorLog = [
3150 'default' => false,
3151 ];
3152
3173 public const DBerrorLogTZ = [
3174 'default' => false,
3175 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3176 ];
3177
3178 public static function getDefaultDBerrorLogTZ( $localtimezone ) {
3179 // NOTE: Extra fallback, in case $localtimezone is ''.
3180 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3181 // in them, erroneously generated by the installer.
3182 return $localtimezone ?: self::getDefaultLocaltimezone();
3183 }
3184
3198 public const LocalDatabases = [
3199 'default' => [],
3200 'type' => 'list',
3201 'items' => [ 'type' => 'string', ],
3202 ];
3203
3211 public const DatabaseReplicaLagWarning = [
3212 'default' => 10,
3213 ];
3214
3219 public const DatabaseReplicaLagCritical = [
3220 'default' => 30,
3221 ];
3222
3229 public const MaxExecutionTimeForExpensiveQueries = [
3230 'default' => 0,
3231 ];
3232
3248 public const VirtualDomainsMapping = [
3249 'default' => [],
3250 'type' => 'map',
3251 ];
3252
3264 public const PageLinksSchemaMigrationStage = [
3265 'default' => SCHEMA_COMPAT_NEW,
3266 'type' => 'integer',
3267 ];
3268
3280 public const FileSchemaMigrationStage = [
3281 'default' => SCHEMA_COMPAT_OLD,
3282 'type' => 'integer',
3283 ];
3284
3303 public const ExternalLinksDomainGaps = [
3304 'default' => [],
3305 'type' => 'map',
3306 ];
3307
3308 // endregion -- End of DB settings
3309
3310 /***************************************************************************/
3311 // region Content handlers and storage
3322 public const ContentHandlers = [
3323 'default' =>
3324 [
3325 // the usual case
3327 'class' => WikitextContentHandler::class,
3328 'services' => [
3329 'TitleFactory',
3330 'ParserFactory',
3331 'GlobalIdGenerator',
3332 'LanguageNameUtils',
3333 'LinkRenderer',
3334 'MagicWordFactory',
3335 'ParsoidParserFactory',
3336 ],
3337 ],
3338 // dumb version, no syntax highlighting
3339 CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
3340 // simple implementation, for use by extensions, etc.
3341 CONTENT_MODEL_JSON => JsonContentHandler::class,
3342 // dumb version, no syntax highlighting
3343 CONTENT_MODEL_CSS => CssContentHandler::class,
3344 // plain text, for use by extensions, etc.
3345 CONTENT_MODEL_TEXT => TextContentHandler::class,
3346 // fallback for unknown models, from imports or extensions that were removed
3347 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3348 ],
3349 'type' => 'map',
3350 ];
3351
3363 public const NamespaceContentModels = [
3364 'default' => [],
3365 'type' => 'map',
3366 ];
3367
3383 public const TextModelsToParse = [
3384 'default' => [
3385 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3386 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3387 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3388 ],
3389 'type' => 'list',
3390 ];
3391
3398 public const CompressRevisions = [
3399 'default' => false,
3400 ];
3401
3411 public const ExternalStores = [
3412 'default' => [],
3413 'type' => 'list',
3414 ];
3415
3435 public const ExternalServers = [
3436 'default' => [],
3437 'type' => 'map',
3438 ];
3439
3452 public const DefaultExternalStore = [
3453 'default' => false,
3454 'type' => 'list|false',
3455 ];
3456
3463 public const RevisionCacheExpiry = [
3464 'default' => SqlBlobStore::DEFAULT_TTL,
3465 'type' => 'integer',
3466 ];
3467
3474 public const RevisionSlotsCacheExpiry = [
3475 'default' => [
3476 'local' => BagOStuff::TTL_HOUR,
3477 'WAN' => BagOStuff::TTL_DAY,
3478 ],
3479 'type' => 'map',
3480 ];
3481
3488 public const PageLanguageUseDB = [
3489 'default' => false,
3490 'type' => 'boolean',
3491 ];
3492
3505 public const DiffEngine = [
3506 'default' => null,
3507 'type' => '?string',
3508 ];
3509
3513 public const ExternalDiffEngine = [
3514 'default' => false,
3515 'type' => 'string|false',
3516 ];
3517
3542 public const Wikidiff2Options = [
3543 'default' => [],
3544 'type' => 'map'
3545 ];
3546
3547 // endregion -- end of Content handlers and storage
3548
3549 /***************************************************************************/
3550 // region Performance hacks and limits
3562 public const RequestTimeLimit = [
3563 'default' => null,
3564 'type' => '?integer',
3565 ];
3566
3576 public const TransactionalTimeLimit = [
3577 'default' => 120,
3578 ];
3579
3594 public const CriticalSectionTimeLimit = [
3595 'default' => 180.0,
3596 'type' => 'float',
3597 ];
3598
3602 public const MiserMode = [
3603 'default' => false,
3604 ];
3605
3609 public const DisableQueryPages = [
3610 'default' => false,
3611 ];
3612
3616 public const QueryCacheLimit = [
3617 'default' => 1000,
3618 ];
3619
3623 public const WantedPagesThreshold = [
3624 'default' => 1,
3625 ];
3626
3630 public const AllowSlowParserFunctions = [
3631 'default' => false,
3632 ];
3633
3637 public const AllowSchemaUpdates = [
3638 'default' => true,
3639 ];
3640
3644 public const MaxArticleSize = [
3645 'default' => 2048,
3646 ];
3647
3652 public const MemoryLimit = [
3653 'default' => '50M',
3654 ];
3655
3699 public const PoolCounterConf = [
3700 'default' => null,
3701 'type' => '?map',
3702 ];
3703
3716 public const PoolCountClientConf = [
3717 'default' => [
3718 'servers' => [
3719 '127.0.0.1'
3720 ],
3721 'timeout' => 0.1,
3722 ],
3723 'type' => 'map',
3724 ];
3725
3733 public const MaxUserDBWriteDuration = [
3734 'default' => false,
3735 'type' => 'integer|false',
3736 ];
3737
3745 public const MaxJobDBWriteDuration = [
3746 'default' => false,
3747 'type' => 'integer|false',
3748 ];
3749
3754 public const LinkHolderBatchSize = [
3755 'default' => 1000,
3756 ];
3757
3761 public const MaximumMovedPages = [
3762 'default' => 100,
3763 ];
3764
3777 public const ForceDeferredUpdatesPreSend = [
3778 'default' => false,
3779 ];
3780
3790 public const MultiShardSiteStats = [
3791 'default' => false,
3792 'type' => 'boolean',
3793 ];
3794
3795 // endregion -- end performance hacks
3796
3797 /***************************************************************************/
3798 // region Cache settings
3809 public const CacheDirectory = [
3810 'default' => false,
3811 ];
3812
3837 public const MainCacheType = [
3838 'default' => CACHE_NONE,
3839 ];
3840
3847 public const MessageCacheType = [
3848 'default' => CACHE_ANYTHING,
3849 ];
3850
3876 public const ParserCacheType = [
3877 'default' => CACHE_ANYTHING,
3878 ];
3879
3887 public const SessionCacheType = [
3888 'default' => CACHE_ANYTHING,
3889 ];
3890
3899 public const LanguageConverterCacheType = [
3900 'default' => CACHE_ANYTHING,
3901 ];
3902
3964 public const ObjectCaches = [
3965 'default' => [
3966 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
3967 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
3968
3969 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
3970 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
3971 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
3972
3973 // Deprecated since 1.35.
3974 // - To configure a wg*CacheType variable to use the local server cache,
3975 // use CACHE_ACCEL instead, which will select these automatically.
3976 // - To access the object for the local server cache at run-time,
3977 // use MediaWikiServices::getLocalServerObjectCache()
3978 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
3979 // - To instantiate a new one of these explicitly, do so directly
3980 // by using `new APCUBagOStuff( [ … ] )`
3981 // - To instantiate a new one of these including auto-detection and fallback,
3982 // use ObjectCache::makeLocalServerCache().
3983 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3984 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
3985 ],
3986 'type' => 'map',
3987 ];
3988
3996 public const WANObjectCache = [
3997 'default' => [],
3998 'type' => 'map',
3999 ];
4000
4033 public const MicroStashType = [
4034 'default' => CACHE_ANYTHING,
4035 'type' => 'string|int',
4036 ];
4037
4065 public const MainStash = [
4066 'default' => CACHE_DB,
4067 ];
4068
4093 public const ParsoidCacheConfig = [
4094 'type' => 'object',
4095 'properties' => [
4096 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4097 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4098 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4099 ]
4100 ];
4101
4111 public const ParsoidSelectiveUpdateSampleRate = [
4112 'type' => 'integer',
4113 'default' => 0,
4114 ];
4115
4135 public const ParserCacheFilterConfig = [
4136 'type' => 'map',
4137 'default' => [ // default value
4138 'pcache' => [ // old parser cache
4139 'default' => [ // all namespaces
4140 // 0 means no threshold.
4141 // Use PHP_INT_MAX to disable cache.
4142 'minCpuTime' => 0
4143 ],
4144 ],
4145 'parsoid-pcache' => [ // parsoid output cache
4146 'default' => [ // all namespaces
4147 // 0 means no threshold.
4148 // Use PHP_INT_MAX to disable cache.
4149 'minCpuTime' => 0
4150 ],
4151 ],
4152 ],
4153 'additionalProperties' => [ // caches
4154 'type' => 'map',
4155 'description' => 'A map of namespace IDs to filter definitions.',
4156 'additionalProperties' => [ // namespaces
4157 'type' => 'map',
4158 'description' => 'A map of filter names to values.',
4159 'properties' => [ // filters
4160 'minCpuTime' => [ 'type' => 'float' ]
4161 ]
4162 ],
4163 ],
4164 ];
4165
4171 public const ChronologyProtectorSecret = [
4172 'default' => '',
4173 'type' => 'string',
4174 ];
4175
4181 public const ParserCacheExpireTime = [
4182 'default' => 60 * 60 * 24,
4183 ];
4184
4190 public const OldRevisionParserCacheExpireTime = [
4191 'default' => 60 * 60,
4192 ];
4193
4197 public const ObjectCacheSessionExpiry = [
4198 'default' => 60 * 60,
4199 ];
4200
4213 public const PHPSessionHandling = [
4214 'default' => 'enable',
4215 'type' => 'string',
4216 ];
4217
4225 public const SuspiciousIpExpiry = [
4226 'default' => false,
4227 'type' => 'integer|false',
4228 ];
4229
4235 public const SessionPbkdf2Iterations = [
4236 'default' => 10001,
4237 ];
4238
4242 public const MemCachedServers = [
4243 'default' => [ '127.0.0.1:11211', ],
4244 'type' => 'list',
4245 ];
4246
4251 public const MemCachedPersistent = [
4252 'default' => false,
4253 ];
4254
4258 public const MemCachedTimeout = [
4259 'default' => 500_000,
4260 ];
4261
4273 public const UseLocalMessageCache = [
4274 'default' => false,
4275 ];
4276
4284 public const AdaptiveMessageCache = [
4285 'default' => false,
4286 ];
4287
4319 public const LocalisationCacheConf = [
4320 'properties' => [
4321 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4322 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4323 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4324 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4325 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4326 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4327 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4328 ],
4329 'type' => 'object',
4330 ];
4331
4335 public const CachePages = [
4336 'default' => true,
4337 ];
4338
4348 public const CacheEpoch = [
4349 'default' => '20030516000000',
4350 ];
4351
4356 public const GitInfoCacheDirectory = [
4357 'default' => false,
4358 ];
4359
4365 public const UseFileCache = [
4366 'default' => false,
4367 ];
4368
4375 public const FileCacheDepth = [
4376 'default' => 2,
4377 ];
4378
4383 public const RenderHashAppend = [
4384 'default' => '',
4385 ];
4386
4396 public const EnableSidebarCache = [
4397 'default' => false,
4398 ];
4399
4403 public const SidebarCacheExpiry = [
4404 'default' => 86400,
4405 ];
4406
4413 public const UseGzip = [
4414 'default' => false,
4415 ];
4416
4426 public const InvalidateCacheOnLocalSettingsChange = [
4427 'default' => true,
4428 ];
4429
4444 public const ExtensionInfoMTime = [
4445 'default' => false,
4446 'type' => 'integer|false',
4447 ];
4448
4455 public const EnableRemoteBagOStuffTests = [
4456 'default' => false,
4457 ];
4458
4459 // endregion -- end of cache settings
4460
4461 /***************************************************************************/
4462 // region HTTP proxy (CDN) settings
4481 public const UseCdn = [
4482 'default' => false,
4483 ];
4484
4493 public const VaryOnXFP = [
4494 'default' => false,
4495 ];
4496
4506 public const InternalServer = [
4507 'default' => false,
4508 ];
4509
4519 public const CdnMaxAge = [
4520 'default' => 18000,
4521 ];
4522
4529 public const CdnMaxageLagged = [
4530 'default' => 30,
4531 ];
4532
4539 public const CdnMaxageStale = [
4540 'default' => 10,
4541 ];
4542
4558 public const CdnReboundPurgeDelay = [
4559 'default' => 0,
4560 ];
4561
4568 public const CdnMaxageSubstitute = [
4569 'default' => 60,
4570 ];
4571
4577 public const ForcedRawSMaxage = [
4578 'default' => 300,
4579 ];
4580
4591 public const CdnServers = [
4592 'default' => [],
4593 'type' => 'map',
4594 ];
4595
4604 public const CdnServersNoPurge = [
4605 'default' => [],
4606 'type' => 'map',
4607 ];
4608
4657 public const HTCPRouting = [
4658 'default' => [],
4659 'type' => 'map',
4660 ];
4661
4667 public const HTCPMulticastTTL = [
4668 'default' => 1,
4669 ];
4670
4674 public const UsePrivateIPs = [
4675 'default' => false,
4676 ];
4677
4689 public const CdnMatchParameterOrder = [
4690 'default' => true,
4691 ];
4692
4693 // endregion -- end of HTTP proxy settings
4694
4695 /***************************************************************************/
4696 // region Language, regional and character encoding settings
4716 public const LanguageCode = [
4717 'default' => 'en',
4718 ];
4719
4731 public const GrammarForms = [
4732 'default' => [],
4733 'type' => 'map',
4734 ];
4735
4739 public const InterwikiMagic = [
4740 'default' => true,
4741 ];
4742
4746 public const HideInterlanguageLinks = [
4747 'default' => false,
4748 ];
4749
4770 public const ExtraInterlanguageLinkPrefixes = [
4771 'default' => [],
4772 'type' => 'list',
4773 ];
4774
4782 public const InterlanguageLinkCodeMap = [
4783 'default' => [],
4784 'type' => 'map',
4785 ];
4786
4790 public const ExtraLanguageNames = [
4791 'default' => [],
4792 'type' => 'map',
4793 ];
4794
4809 public const ExtraLanguageCodes = [
4810 'default' => [
4811 'bh' => 'bho',
4812 'no' => 'nb',
4813 'simple' => 'en',
4814 ],
4815 'type' => 'map',
4816 ];
4817
4826 public const DummyLanguageCodes = [
4827 'default' => [],
4828 'type' => 'map',
4829 ];
4830
4838 public const AllUnicodeFixes = [
4839 'default' => false,
4840 ];
4841
4852 public const LegacyEncoding = [
4853 'default' => false,
4854 ];
4855
4860 public const AmericanDates = [
4861 'default' => false,
4862 ];
4863
4868 public const TranslateNumerals = [
4869 'default' => true,
4870 ];
4871
4877 public const UseDatabaseMessages = [
4878 'default' => true,
4879 ];
4880
4884 public const MaxMsgCacheEntrySize = [
4885 'default' => 10000,
4886 ];
4887
4891 public const DisableLangConversion = [
4892 'default' => false,
4893 ];
4894
4899 public const DisableTitleConversion = [
4900 'default' => false,
4901 ];
4902
4907 public const DefaultLanguageVariant = [
4908 'default' => false,
4909 ];
4910
4915 public const UsePigLatinVariant = [
4916 'default' => false,
4917 ];
4918
4929 public const DisabledVariants = [
4930 'default' => [],
4931 'type' => 'map',
4932 ];
4933
4952 public const VariantArticlePath = [
4953 'default' => false,
4954 ];
4955
4971 public const UseXssLanguage = [
4972 'default' => false,
4973 ];
4974
4980 public const LoginLanguageSelector = [
4981 'default' => false,
4982 ];
4983
5004 public const ForceUIMsgAsContentMsg = [
5005 'default' => [],
5006 'type' => 'map',
5007 ];
5008
5021 public const RawHtmlMessages = [
5022 'default' => [
5023 'copyright',
5024 'history_copyright',
5025 'googlesearch',
5026 ],
5027 'type' => 'list',
5028 'items' => [ 'type' => 'string', ],
5029 ];
5030
5037 public const AllowRawHtmlCopyrightMessages = [
5038 'default' => true,
5039 'type' => 'boolean',
5040 ];
5041
5066 public const Localtimezone = [
5067 'dynamicDefault' => true,
5068 ];
5069
5070 public static function getDefaultLocaltimezone(): string {
5071 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5072 // it falls back to UTC.
5073 $localtimezone = date_default_timezone_get();
5074 if ( !$localtimezone ) {
5075 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5076 // returned garbage.
5077 $localtimezone = 'UTC';
5078 }
5079
5080 return $localtimezone;
5081 }
5082
5092 public const LocalTZoffset = [
5093 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5094 ];
5095
5096 public static function getDefaultLocalTZoffset( $localtimezone ): int {
5097 // NOTE: Extra fallback, in case $localtimezone is ''.
5098 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5099 // in them, erroneously generated by the installer.
5100 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5101
5102 try {
5103 $timezone = new DateTimeZone( $localtimezone );
5104 } catch ( \Exception $e ) {
5105 throw new ConfigException(
5106 sprintf( "Invalid timezone '%s'. Please set a valid timezone in '$%s' in LocalSettings.php. Refer to the list of valid timezones at https://www.php.net/timezones. Error: %s",
5107 $localtimezone,
5108 "wgLocaltimezone",
5109 $e->getMessage() ),
5110 );
5111 }
5112
5113 $offset = $timezone->getOffset( new DateTime() );
5114
5115 return (int)( $offset / 60 );
5116 }
5117
5126 public const OverrideUcfirstCharacters = [
5127 'default' => [],
5128 'type' => 'map',
5129 ];
5130
5131 // endregion -- End of language/charset settings
5132
5133 /***************************************************************************/
5134 // region Output format and skin settings
5140 public const MimeType = [
5141 'default' => 'text/html',
5142 ];
5143
5153 public const Html5Version = [
5154 'default' => null,
5155 ];
5156
5164 public const EditSubmitButtonLabelPublish = [
5165 'default' => false,
5166 ];
5167
5184 public const XhtmlNamespaces = [
5185 'default' => [],
5186 'type' => 'map',
5187 ];
5188
5196 public const SiteNotice = [
5197 'default' => '',
5198 ];
5199
5211 public const BrowserFormatDetection = [
5212 'default' => 'telephone=no',
5213 'type' => 'string',
5214 ];
5215
5224 public const SkinMetaTags = [
5225 'default' => [],
5226 'type' => 'map',
5227 ];
5228
5233 public const DefaultSkin = [
5234 'default' => 'vector-2022',
5235 ];
5236
5242 public const FallbackSkin = [
5243 'default' => 'fallback',
5244 ];
5245
5256 public const SkipSkins = [
5257 'default' => [],
5258 'type' => 'map',
5259 ];
5260
5264 public const DisableOutputCompression = [
5265 'default' => false,
5266 ];
5267
5297 public const FragmentMode = [
5298 'default' => [ 'html5', 'legacy', ],
5299 'type' => 'list',
5300 ];
5301
5310 public const ExternalInterwikiFragmentMode = [
5311 'default' => 'legacy',
5312 ];
5313
5345 public const FooterIcons = [
5346 'default' => [
5347 "copyright" => [
5348 "copyright" => [], // placeholder for the built in copyright icon
5349 ],
5350 "poweredby" => [
5351 "mediawiki" => [
5352 // Defaults to point at
5353 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5354 // plus srcset for 1.5x, 2x resolution variants.
5355 "src" => null,
5356 "url" => "https://www.mediawiki.org/",
5357 "alt" => "Powered by MediaWiki",
5358 ]
5359 ],
5360 ],
5361 'type' => 'map',
5362 ];
5363
5371 public const UseCombinedLoginLink = [
5372 'default' => false,
5373 ];
5374
5378 public const Edititis = [
5379 'default' => false,
5380 ];
5381
5393 public const Send404Code = [
5394 'default' => true,
5395 ];
5396
5407 public const ShowRollbackEditCount = [
5408 'default' => 10,
5409 ];
5410
5417 public const EnableCanonicalServerLink = [
5418 'default' => false,
5419 ];
5420
5434 public const InterwikiLogoOverride = [
5435 'default' => [],
5436 'type' => 'list',
5437 'items' => [ 'type' => 'string', ],
5438 ];
5439
5440 // endregion -- End of output format settings
5441
5442 /***************************************************************************/
5443 // region ResourceLoader settings
5453 public const MangleFlashPolicy = [
5454 'default' => true,
5455 'obsolete' => 'Since 1.39; no longer has any effect.',
5456 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5457 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5458 ];
5459
5769 public const ResourceModules = [
5770 'default' => [],
5771 'type' => 'map',
5772 ];
5773
5868 public const ResourceModuleSkinStyles = [
5869 'default' => [],
5870 'type' => 'map',
5871 ];
5872
5884 public const ResourceLoaderSources = [
5885 'default' => [],
5886 'type' => 'map',
5887 ];
5888
5894 public const ResourceBasePath = [
5895 'default' => null,
5896 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
5897 ];
5898
5903 public static function getDefaultResourceBasePath( $scriptPath ): string {
5904 return $scriptPath;
5905 }
5906
5919 public const ResourceLoaderMaxage = [
5920 'default' => [],
5921 'type' => 'map',
5922 ];
5923
5929 public const ResourceLoaderDebug = [
5930 'default' => false,
5931 ];
5932
5945 public const ResourceLoaderMaxQueryLength = [
5946 'default' => false,
5947 'type' => 'integer|false',
5948 ];
5949
5960 public const ResourceLoaderValidateJS = [
5961 'default' => true,
5962 ];
5963
5972 public const ResourceLoaderEnableJSProfiler = [
5973 'default' => false,
5974 ];
5975
5980 public const ResourceLoaderStorageEnabled = [
5981 'default' => true,
5982 ];
5983
5990 public const ResourceLoaderStorageVersion = [
5991 'default' => 1,
5992 ];
5993
6000 public const ResourceLoaderEnableSourceMapLinks = [
6001 'default' => true,
6002 ];
6003
6015 public const AllowSiteCSSOnRestrictedPages = [
6016 'default' => false,
6017 ];
6018
6029 public const VueDevelopmentMode = [
6030 'default' => false,
6031 ];
6032
6046 public const CodexDevelopmentDir = [
6047 'default' => null,
6048 ];
6049
6050 // endregion -- End of ResourceLoader settings
6051
6052 /***************************************************************************/
6053 // region Page titles and redirects
6060 public const MetaNamespace = [
6061 'default' => false,
6062 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6063 ];
6064
6069 public static function getDefaultMetaNamespace( $sitename ): string {
6070 return str_replace( ' ', '_', $sitename );
6071 }
6072
6080 public const MetaNamespaceTalk = [
6081 'default' => false,
6082 ];
6083
6090 public const CanonicalNamespaceNames = [
6091 'default' => NamespaceInfo::CANONICAL_NAMES,
6092 'type' => 'map',
6093 ];
6094
6121 public const ExtraNamespaces = [
6122 'default' => [],
6123 'type' => 'map',
6124 ];
6125
6134 public const ExtraGenderNamespaces = [
6135 'default' => [],
6136 'type' => 'map',
6137 ];
6138
6161 public const NamespaceAliases = [
6162 'default' => [],
6163 'type' => 'map',
6164 ];
6165
6192 public const LegalTitleChars = [
6193 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6194 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6195 ];
6196
6204 public const CapitalLinks = [
6205 'default' => true,
6206 ];
6207
6222 public const CapitalLinkOverrides = [
6223 'default' => [],
6224 'type' => 'map',
6225 ];
6226
6231 public const NamespacesWithSubpages = [
6232 'default' => [
6233 NS_TALK => true,
6234 NS_USER => true,
6235 NS_USER_TALK => true,
6236 NS_PROJECT => true,
6237 NS_PROJECT_TALK => true,
6238 NS_FILE_TALK => true,
6239 NS_MEDIAWIKI => true,
6240 NS_MEDIAWIKI_TALK => true,
6241 NS_TEMPLATE => true,
6242 NS_TEMPLATE_TALK => true,
6243 NS_HELP => true,
6244 NS_HELP_TALK => true,
6245 NS_CATEGORY_TALK => true
6246 ],
6247 'type' => 'map',
6248 ];
6249
6256 public const ContentNamespaces = [
6257 'default' => [ NS_MAIN ],
6258 'type' => 'list',
6259 ];
6260
6269 public const ShortPagesNamespaceExclusions = [
6270 'default' => [],
6271 'type' => 'list',
6272 ];
6273
6282 public const ExtraSignatureNamespaces = [
6283 'default' => [],
6284 'type' => 'list',
6285 ];
6286
6298 public const InvalidRedirectTargets = [
6299 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6300 'type' => 'list',
6301 ];
6302
6311 public const DisableHardRedirects = [
6312 'default' => false,
6313 ];
6314
6320 public const FixDoubleRedirects = [
6321 'default' => false,
6322 ];
6323
6324 // endregion -- End of title and interwiki settings
6325
6326 /***************************************************************************/
6327 // region Interwiki links and sites
6336 public const LocalInterwikis = [
6337 'default' => [],
6338 'type' => 'list',
6339 ];
6340
6344 public const InterwikiExpiry = [
6345 'default' => 10800,
6346 ];
6347
6368 public const InterwikiCache = [
6369 'default' => false,
6370 'type' => 'false|map',
6371 'mergeStrategy' => 'replace',
6372 ];
6373
6381 public const InterwikiScopes = [
6382 'default' => 3,
6383 ];
6384
6388 public const InterwikiFallbackSite = [
6389 'default' => 'wiki',
6390 ];
6391
6408 public const RedirectSources = [
6409 'default' => false,
6410 ];
6411
6417 public const SiteTypes = [
6418 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6419 'type' => 'map',
6420 ];
6421
6422 // endregion -- Interwiki links and sites
6423
6424 /***************************************************************************/
6425 // region Parser settings
6433 public const MaxTocLevel = [
6434 'default' => 999,
6435 ];
6436
6441 public const MaxPPNodeCount = [
6442 'default' => 1_000_000,
6443 ];
6444
6452 public const MaxTemplateDepth = [
6453 'default' => 100,
6454 ];
6455
6459 public const MaxPPExpandDepth = [
6460 'default' => 100,
6461 ];
6462
6473 public const UrlProtocols = [
6474 'default' => [
6475 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6476 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6477 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6478 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:',
6479 '//',
6480 ],
6481 'type' => 'list',
6482 ];
6483
6487 public const CleanSignatures = [
6488 'default' => true,
6489 ];
6490
6494 public const AllowExternalImages = [
6495 'default' => false,
6496 ];
6497
6512 public const AllowExternalImagesFrom = [
6513 'default' => '',
6514 ];
6515
6527 public const EnableImageWhitelist = [
6528 'default' => false,
6529 ];
6530
6549 public const TidyConfig = [
6550 'default' => [],
6551 'type' => 'map',
6552 ];
6553
6562 public const ParsoidSettings = [
6563 'default' => [
6564 'useSelser' => true,
6565 ],
6566 'type' => 'map',
6567 ];
6568
6581 public const ParsoidFragmentSupport = [
6582 'default' => false,
6583 'type' => 'boolean|string',
6584 ];
6585
6594 public const ParserEnableLegacyMediaDOM = [
6595 'default' => false,
6596 'deprecated' => 'since 1.41',
6597 ];
6598
6610 public const ParserEnableLegacyHeadingDOM = [
6611 'default' => false,
6612 'deprecated' => 'since 1.44',
6613 ];
6614
6625 public const UseContentMediaStyles = [
6626 'default' => false,
6627 'deprecated' => 'since 1.41',
6628 ];
6629
6639 public const UseLegacyMediaStyles = [
6640 'default' => false,
6641 ];
6642
6649 public const RawHtml = [
6650 'default' => false,
6651 ];
6652
6662 public const ExternalLinkTarget = [
6663 'default' => false,
6664 ];
6665
6672 public const NoFollowLinks = [
6673 'default' => true,
6674 ];
6675
6681 public const NoFollowNsExceptions = [
6682 'default' => [],
6683 'type' => 'list',
6684 ];
6685
6699 public const NoFollowDomainExceptions = [
6700 'default' => [ 'mediawiki.org', ],
6701 'type' => 'list',
6702 ];
6703
6708 public const RegisterInternalExternals = [
6709 'default' => false,
6710 ];
6711
6715 public const AllowDisplayTitle = [
6716 'default' => true,
6717 ];
6718
6724 public const RestrictDisplayTitle = [
6725 'default' => true,
6726 ];
6727
6732 public const ExpensiveParserFunctionLimit = [
6733 'default' => 100,
6734 ];
6735
6740 public const PreprocessorCacheThreshold = [
6741 'default' => 1000,
6742 ];
6743
6747 public const EnableScaryTranscluding = [
6748 'default' => false,
6749 ];
6750
6756 public const TranscludeCacheExpiry = [
6757 'default' => 3600,
6758 ];
6759
6766 public const EnableMagicLinks = [
6767 'default' => [
6768 'ISBN' => false,
6769 'PMID' => false,
6770 'RFC' => false,
6771 ],
6772 'type' => 'map',
6773 ];
6774
6784 public const ParserEnableUserLanguage = [
6785 'default' => false,
6786 ];
6787
6788 // endregion -- end of parser settings
6789
6790 /***************************************************************************/
6791 // region Statistics and content analysis
6810 public const ArticleCountMethod = [
6811 'default' => 'link',
6812 ];
6813
6822 public const ActiveUserDays = [
6823 'default' => 30,
6824 ];
6825
6838 public const LearnerEdits = [
6839 'default' => 10,
6840 ];
6841
6847 public const LearnerMemberSince = [
6848 'default' => 4,
6849 ];
6850
6856 public const ExperiencedUserEdits = [
6857 'default' => 500,
6858 ];
6859
6865 public const ExperiencedUserMemberSince = [
6866 'default' => 30,
6867 ];
6868
6887 public const ManualRevertSearchRadius = [
6888 'default' => 15,
6889 'type' => 'integer',
6890 ];
6891
6904 public const RevertedTagMaxDepth = [
6905 'default' => 15,
6906 'type' => 'integer',
6907 ];
6908
6909 // endregion -- End of statistics and content analysis
6910
6911 /***************************************************************************/
6912 // region User accounts, authentication
6921 public const CentralIdLookupProviders = [
6922 'default' => [
6923 'local' => [
6924 'class' => LocalIdLookup::class,
6925 'services' => [
6926 'MainConfig',
6927 'DBLoadBalancerFactory',
6928 'HideUserUtils',
6929 ]
6930 ]
6931 ],
6932 'type' => 'map',
6933 ];
6934
6938 public const CentralIdLookupProvider = [
6939 'default' => 'local',
6940 'type' => 'string',
6941 ];
6942
6947 public const UserRegistrationProviders = [
6948 'default' => [
6949 LocalUserRegistrationProvider::TYPE => [
6950 'class' => LocalUserRegistrationProvider::class,
6951 'services' => [
6952 'UserFactory'
6953 ]
6954 ]
6955 ],
6956 'type' => 'map',
6957 ];
6958
7024 public const PasswordPolicy = [
7025 'default' => [
7026 'policies' => [
7027 'bureaucrat' => [
7028 'MinimalPasswordLength' => 10,
7029 'MinimumPasswordLengthToLogin' => 1,
7030 ],
7031 'sysop' => [
7032 'MinimalPasswordLength' => 10,
7033 'MinimumPasswordLengthToLogin' => 1,
7034 ],
7035 'interface-admin' => [
7036 'MinimalPasswordLength' => 10,
7037 'MinimumPasswordLengthToLogin' => 1,
7038 ],
7039 'bot' => [
7040 'MinimalPasswordLength' => 10,
7041 'MinimumPasswordLengthToLogin' => 1,
7042 ],
7043 'default' => [
7044 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
7045 'PasswordCannotBeSubstringInUsername' => [
7046 'value' => true,
7047 'suggestChangeOnLogin' => true
7048 ],
7049 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7050 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
7051 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
7052 ],
7053 ],
7054 'checks' => [
7055 'MinimalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMinimalPasswordLength' ],
7056 'MinimumPasswordLengthToLogin' => [ PasswordPolicyChecks::class, 'checkMinimumPasswordLengthToLogin' ],
7057 'PasswordCannotBeSubstringInUsername' => [ PasswordPolicyChecks::class, 'checkPasswordCannotBeSubstringInUsername' ],
7058 'PasswordCannotMatchDefaults' => [ PasswordPolicyChecks::class, 'checkPasswordCannotMatchDefaults' ],
7059 'MaximalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMaximalPasswordLength' ],
7060 'PasswordNotInCommonList' => [ PasswordPolicyChecks::class, 'checkPasswordNotInCommonList' ],
7061 ],
7062 ],
7063 'type' => 'map',
7064 'mergeStrategy' => 'array_replace_recursive',
7065 ];
7066
7086 public const AuthManagerConfig = [
7087 'default' => null,
7088 'type' => '?map',
7089 ];
7090
7095 public const AuthManagerAutoConfig = [
7096 'default' => [
7097 'preauth' => [
7098 ThrottlePreAuthenticationProvider::class => [
7099 'class' => ThrottlePreAuthenticationProvider::class,
7100 'sort' => 0,
7101 ],
7102 ],
7103 'primaryauth' => [
7104 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7105 // any other PasswordAuthenticationRequest-based
7106 // PrimaryAuthenticationProvider (or at least any that might return
7107 // FAIL rather than ABSTAIN for a wrong password), or password reset
7108 // won't work right. Do not remove this (or change the key) or
7109 // auto-configuration of other such providers in extensions will
7110 // probably auto-insert themselves in the wrong place.
7111 TemporaryPasswordPrimaryAuthenticationProvider::class => [
7112 'class' => TemporaryPasswordPrimaryAuthenticationProvider::class,
7113 'services' => [
7114 'DBLoadBalancerFactory',
7115 'UserOptionsLookup',
7116 ],
7117 'args' => [ [
7118 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7119 'authoritative' => false,
7120 ] ],
7121 'sort' => 0,
7122 ],
7123 LocalPasswordPrimaryAuthenticationProvider::class => [
7124 'class' => LocalPasswordPrimaryAuthenticationProvider::class,
7125 'services' => [
7126 'DBLoadBalancerFactory',
7127 ],
7128 'args' => [ [
7129 // Last one should be authoritative, or else the user will get
7130 // a less-than-helpful error message (something like "supplied
7131 // authentication info not supported" rather than "wrong
7132 // password") if it too fails.
7133 'authoritative' => true,
7134 ] ],
7135 'sort' => 100,
7136 ],
7137 ],
7138 'secondaryauth' => [
7139 CheckBlocksSecondaryAuthenticationProvider::class => [
7140 'class' => CheckBlocksSecondaryAuthenticationProvider::class,
7141 'sort' => 0,
7142 ],
7143 ResetPasswordSecondaryAuthenticationProvider::class => [
7144 'class' => ResetPasswordSecondaryAuthenticationProvider::class,
7145 'sort' => 100,
7146 ],
7147 // Linking during login is experimental, enable at your own risk - T134952
7148 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7149 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7150 // 'sort' => 100,
7151 // ],
7152 EmailNotificationSecondaryAuthenticationProvider::class => [
7153 'class' => EmailNotificationSecondaryAuthenticationProvider::class,
7154 'services' => [
7155 'DBLoadBalancerFactory',
7156 ],
7157 'sort' => 200,
7158 ],
7159 ],
7160 ],
7161 'type' => 'map',
7162 'mergeStrategy' => 'array_plus_2d',
7163 ];
7164
7175 public const RememberMe = [
7176 'default' => 'choose',
7177 'type' => 'string',
7178 ];
7179
7217 public const ReauthenticateTime = [
7218 'default' => [ 'default' => 300, ],
7219 'type' => 'map',
7220 'additionalProperties' => [ 'type' => 'integer', ],
7221 ];
7222
7237 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7238 'default' => [ 'default' => true, ],
7239 'type' => 'map',
7240 'additionalProperties' => [ 'type' => 'boolean', ],
7241 ];
7242
7253 public const ChangeCredentialsBlacklist = [
7254 'default' => [
7255 TemporaryPasswordAuthenticationRequest::class,
7256 ],
7257 'type' => 'list',
7258 'items' => [ 'type' => 'string', ],
7259 ];
7260
7271 public const RemoveCredentialsBlacklist = [
7272 'default' => [
7273 PasswordAuthenticationRequest::class,
7274 ],
7275 'type' => 'list',
7276 'items' => [ 'type' => 'string', ],
7277 ];
7278
7285 public const InvalidPasswordReset = [
7286 'default' => true,
7287 ];
7288
7297 public const PasswordDefault = [
7298 'default' => 'pbkdf2',
7299 ];
7300
7328 public const PasswordConfig = [
7329 'default' => [
7330 'A' => [
7331 'class' => MWOldPassword::class,
7332 ],
7333 'B' => [
7334 'class' => MWSaltedPassword::class,
7335 ],
7336 'pbkdf2-legacyA' => [
7337 'class' => LayeredParameterizedPassword::class,
7338 'types' => [
7339 'A',
7340 'pbkdf2',
7341 ],
7342 ],
7343 'pbkdf2-legacyB' => [
7344 'class' => LayeredParameterizedPassword::class,
7345 'types' => [
7346 'B',
7347 'pbkdf2',
7348 ],
7349 ],
7350 'bcrypt' => [
7351 'class' => BcryptPassword::class,
7352 'cost' => 9,
7353 ],
7354 'pbkdf2' => [
7355 'class' => Pbkdf2PasswordUsingOpenSSL::class,
7356 'algo' => 'sha512',
7357 'cost' => '30000',
7358 'length' => '64',
7359 ],
7360 'argon2' => [
7361 'class' => Argon2Password::class,
7362
7363 // Algorithm used:
7364 // * 'argon2i' is optimized against side-channel attacks
7365 // * 'argon2id' is optimized against both side-channel and GPU cracking
7366 // * 'auto' to use the best available algorithm. If you're using more than one server, be
7367 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7368 // older versions would not understand.
7369 'algo' => 'auto',
7370
7371 // The parameters below are the same as options accepted by password_hash().
7372 // Set them to override that function's defaults.
7373 //
7374 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7375 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7376 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7377 ],
7378 ],
7379 'type' => 'map',
7380 ];
7381
7388 public const PasswordResetRoutes = [
7389 'default' => [
7390 'username' => true,
7391 'email' => true,
7392 ],
7393 'type' => 'map',
7394 ];
7395
7399 public const MaxSigChars = [
7400 'default' => 255,
7401 ];
7402
7415 public const SignatureValidation = [
7416 'default' => 'warning',
7417 ];
7418
7425 public const SignatureAllowedLintErrors = [
7426 'default' => [ 'obsolete-tag', ],
7427 'type' => 'list',
7428 ];
7429
7434 public const MaxNameChars = [
7435 'default' => 255,
7436 ];
7437
7444 public const ReservedUsernames = [
7445 'default' => [
7446 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7447 'Conversion script', // Used for the old Wikipedia software upgrade
7448 'Maintenance script', // Maintenance scripts which perform editing, image import script
7449 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7450 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7451 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7452 'Move page script', // Default user name used by maintenance/deleteBatch.php
7453 'Command line script', // Default user name used by maintenance/undelete.php
7454 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7455 'msg:double-redirect-fixer', // Automatic double redirect fix
7456 'msg:usermessage-editor', // Default user for leaving user messages
7457 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7458 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7459 'msg:spambot_username', // Used by cleanupSpam.php
7460 'msg:autochange-username', // Used by anon category RC entries (removed in 1.44)
7461 ],
7462 'type' => 'list',
7463 ];
7464
7481 public const DefaultUserOptions = [
7482 'default' =>
7483 // This array should be sorted by key
7484 [
7485 'ccmeonemails' => 0,
7486 'date' => 'default',
7487 'diffonly' => 0,
7488 'diff-type' => 'table',
7489 'disablemail' => 0,
7490 'editfont' => 'monospace',
7491 'editondblclick' => 0,
7492 'editrecovery' => 0,
7493 'editsectiononrightclick' => 0,
7494 'email-allow-new-users' => 1,
7495 'enotifminoredits' => 0,
7496 'enotifrevealaddr' => 0,
7497 'enotifusertalkpages' => 1,
7498 'enotifwatchlistpages' => 1,
7499 'extendwatchlist' => 1,
7500 'fancysig' => 0,
7501 'forceeditsummary' => 0,
7502 'forcesafemode' => 0,
7503 'gender' => 'unknown',
7504 'hidecategorization' => 1,
7505 'hideminor' => 0,
7506 'hidepatrolled' => 0,
7507 'imagesize' => 2,
7508 'minordefault' => 0,
7509 'newpageshidepatrolled' => 0,
7510 'nickname' => '',
7511 'norollbackdiff' => 0,
7512 'prefershttps' => 1,
7513 'previewonfirst' => 0,
7514 'previewontop' => 1,
7515 'pst-cssjs' => 1,
7516 'rcdays' => 7,
7517 'rcenhancedfilters-disable' => 0,
7518 'rclimit' => 50,
7519 'requireemail' => 0,
7520 'search-match-redirect' => true,
7521 'search-special-page' => 'Search',
7522 'search-thumbnail-extra-namespaces' => true,
7523 'searchlimit' => 20,
7524 'showhiddencats' => 0,
7525 'shownumberswatching' => 1,
7526 'showrollbackconfirmation' => 0,
7527 'skin' => false,
7528 'skin-responsive' => 1,
7529 'thumbsize' => 5,
7530 'underline' => 2,
7531 'useeditwarning' => 1,
7532 'uselivepreview' => 0,
7533 'usenewrc' => 1,
7534 'watchcreations' => 1,
7535 'watchdefault' => 1,
7536 'watchdeletion' => 0,
7537 'watchlistdays' => 7,
7538 'watchlisthideanons' => 0,
7539 'watchlisthidebots' => 0,
7540 'watchlisthidecategorization' => 1,
7541 'watchlisthideliu' => 0,
7542 'watchlisthideminor' => 0,
7543 'watchlisthideown' => 0,
7544 'watchlisthidepatrolled' => 0,
7545 'watchlistreloadautomatically' => 0,
7546 'watchlistunwatchlinks' => 0,
7547 'watchmoves' => 0,
7548 'watchrollback' => 0,
7549 'watchuploads' => 1,
7550 'wlenhancedfilters-disable' => 0,
7551 'wllimit' => 250,
7552 ],
7553 'type' => 'map',
7554 ];
7555
7587 public const ConditionalUserOptions = [
7588 'default' => [],
7589 'type' => 'map',
7590 ];
7591
7595 public const HiddenPrefs = [
7596 'default' => [],
7597 'type' => 'list',
7598 ];
7599
7606 public const InvalidUsernameCharacters = [
7607 'default' => '@:>=',
7608 ];
7609
7619 public const UserrightsInterwikiDelimiter = [
7620 'default' => '@',
7621 ];
7622
7631 public const SecureLogin = [
7632 'default' => false,
7633 ];
7634
7644 public const AuthenticationTokenVersion = [
7645 'default' => null,
7646 'type' => '?string',
7647 ];
7648
7658 public const SessionProviders = [
7659 'type' => 'map',
7660 'default' => [
7661 \MediaWiki\Session\CookieSessionProvider::class => [
7662 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7663 'args' => [ [
7664 'priority' => 30,
7665 ] ],
7666 ],
7667 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7668 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7669 'args' => [ [
7670 'priority' => 75,
7671 ] ],
7672 'services' => [
7673 'GrantsInfo'
7674 ],
7675 ],
7676 ],
7677 ];
7678
7751 public const AutoCreateTempUser = [
7752 'properties' => [
7753 'known' => [ 'type' => 'bool', 'default' => false ],
7754 'enabled' => [ 'type' => 'bool', 'default' => false ],
7755 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7756 'genPattern' => [ 'type' => 'string', 'default' => '~$1' ],
7757 'matchPattern' => [ 'type' => 'string|array|null', 'default' => null ],
7758 'reservedPattern' => [ 'type' => 'string|null', 'default' => '~$1' ],
7759 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local', 'useYear' => true ] ],
7760 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'readable-numeric' ] ],
7761 'expireAfterDays' => [ 'type' => 'int|null', 'default' => 90 ],
7762 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => 10 ],
7763 ],
7764 'type' => 'object',
7765 ];
7766
7767 // endregion -- end user accounts
7768
7769 /***************************************************************************/
7770 // region User rights, access control and monitoring
7776 public const AutoblockExpiry = [
7777 'default' => 86400,
7778 ];
7779
7787 public const BlockAllowsUTEdit = [
7788 'default' => true,
7789 ];
7790
7805 public const BlockCIDRLimit = [
7806 'default' => [
7807 'IPv4' => 16,
7808 'IPv6' => 19,
7809 ],
7810 'type' => 'map',
7811 ];
7812
7818 public const BlockDisablesLogin = [
7819 'default' => false,
7820 ];
7821
7828 public const EnablePartialActionBlocks = [
7829 'default' => false,
7830 'type' => 'boolean',
7831 ];
7832
7838 public const EnableMultiBlocks = [
7839 'default' => false,
7840 'type' => 'boolean',
7841 ];
7842
7860 public const BlockTargetMigrationStage = [
7861 'default' => SCHEMA_COMPAT_NEW,
7862 'type' => 'integer',
7863 ];
7864
7884 public const WhitelistRead = [
7885 'default' => false,
7886 ];
7887
7915 public const WhitelistReadRegexp = [
7916 'default' => false,
7917 ];
7918
7923 public const EmailConfirmToEdit = [
7924 'default' => false,
7925 ];
7926
7931 public const HideIdentifiableRedirects = [
7932 'default' => true,
7933 ];
7934
7959 public const GroupPermissions = [
7960 'type' => 'map',
7961 'additionalProperties' => [
7962 'type' => 'map',
7963 'additionalProperties' => [ 'type' => 'boolean', ],
7964 ],
7965 'mergeStrategy' => 'array_plus_2d',
7966 'default' => [
7967 '*' => [
7968 'createaccount' => true,
7969 'read' => true,
7970 'edit' => true,
7971 'createpage' => true,
7972 'createtalk' => true,
7973 'viewmyprivateinfo' => true,
7974 'editmyprivateinfo' => true,
7975 'editmyoptions' => true,
7976 ],
7977 'user' => [
7978 'move' => true,
7979 'move-subpages' => true,
7980 'move-rootuserpages' => true,
7981 'move-categorypages' => true,
7982 'movefile' => true,
7983 'read' => true,
7984 'edit' => true,
7985 'createpage' => true,
7986 'createtalk' => true,
7987 'upload' => true,
7988 'reupload' => true,
7989 'reupload-shared' => true,
7990 'minoredit' => true,
7991 'editmyusercss' => true,
7992 'editmyuserjson' => true,
7993 'editmyuserjs' => true,
7994 'editmyuserjsredirect' => true,
7995 'sendemail' => true,
7996 'applychangetags' => true,
7997 'changetags' => true,
7998 'editcontentmodel' => true,
7999 'viewmywatchlist' => true,
8000 'editmywatchlist' => true,
8001 ],
8002 'autoconfirmed' => [
8003 'autoconfirmed' => true,
8004 'editsemiprotected' => true,
8005 ],
8006 'bot' => [
8007 'bot' => true,
8008 'autoconfirmed' => true,
8009 'editsemiprotected' => true,
8010 'nominornewtalk' => true,
8011 'autopatrol' => true,
8012 'suppressredirect' => true,
8013 'apihighlimits' => true,
8014 ],
8015 'sysop' => [
8016 'block' => true,
8017 'createaccount' => true,
8018 'delete' => true,
8019 'bigdelete' => true,
8020 'deletedhistory' => true,
8021 'deletedtext' => true,
8022 'undelete' => true,
8023 'editinterface' => true,
8024 'editsitejson' => true,
8025 'edituserjson' => true,
8026 'import' => true,
8027 'importupload' => true,
8028 'move' => true,
8029 'move-subpages' => true,
8030 'move-rootuserpages' => true,
8031 'move-categorypages' => true,
8032 'patrol' => true,
8033 'autopatrol' => true,
8034 'protect' => true,
8035 'editprotected' => true,
8036 'rollback' => true,
8037 'upload' => true,
8038 'reupload' => true,
8039 'reupload-shared' => true,
8040 'unwatchedpages' => true,
8041 'autoconfirmed' => true,
8042 'editsemiprotected' => true,
8043 'ipblock-exempt' => true,
8044 'blockemail' => true,
8045 'markbotedits' => true,
8046 'apihighlimits' => true,
8047 'browsearchive' => true,
8048 'noratelimit' => true,
8049 'movefile' => true,
8050 'unblockself' => true,
8051 'suppressredirect' => true,
8052 'mergehistory' => true,
8053 'managechangetags' => true,
8054 'deletechangetags' => true,
8055 ],
8056 'interface-admin' => [
8057 'editinterface' => true,
8058 'editsitecss' => true,
8059 'editsitejson' => true,
8060 'editsitejs' => true,
8061 'editusercss' => true,
8062 'edituserjson' => true,
8063 'edituserjs' => true,
8064 ],
8065 'bureaucrat' => [
8066 'userrights' => true,
8067 'noratelimit' => true,
8068 'renameuser' => true,
8069 ],
8070 'suppress' => [
8071 'hideuser' => true,
8072 'suppressrevision' => true,
8073 'viewsuppressed' => true,
8074 'suppressionlog' => true,
8075 'deleterevision' => true,
8076 'deletelogentry' => true,
8077 ],
8078 ],
8079 ];
8080
8088 public const PrivilegedGroups = [
8089 'default' => [
8090 'bureaucrat',
8091 'interface-admin',
8092 'suppress',
8093 'sysop',
8094 ],
8095 'type' => 'list',
8096 ];
8097
8107 public const RevokePermissions = [
8108 'default' => [],
8109 'type' => 'map',
8110 'mergeStrategy' => 'array_plus_2d',
8111 ];
8112
8132 public const GroupInheritsPermissions = [
8133 'default' => [],
8134 'type' => 'map',
8135 'additionalProperties' => [ 'type' => 'string', ],
8136 ];
8137
8141 public const ImplicitGroups = [
8142 'default' => [ '*', 'user', 'autoconfirmed' ],
8143 'type' => 'list',
8144 ];
8145
8170 public const GroupsAddToSelf = [
8171 'default' => [],
8172 'type' => 'map',
8173 ];
8174
8178 public const GroupsRemoveFromSelf = [
8179 'default' => [],
8180 'type' => 'map',
8181 ];
8182
8191 public const RestrictionTypes = [
8192 'default' => [ 'create', 'edit', 'move', 'upload' ],
8193 'type' => 'list',
8194 ];
8195
8207 public const RestrictionLevels = [
8208 'default' => [ '', 'autoconfirmed', 'sysop' ],
8209 'type' => 'list',
8210 ];
8211
8221 public const CascadingRestrictionLevels = [
8222 'default' => [ 'sysop', ],
8223 'type' => 'list',
8224 ];
8225
8238 public const SemiprotectedRestrictionLevels = [
8239 'default' => [ 'autoconfirmed', ],
8240 'type' => 'list',
8241 ];
8242
8250 public const NamespaceProtection = [
8251 'default' => [],
8252 'type' => 'map',
8253 ];
8254
8264 public const NonincludableNamespaces = [
8265 'default' => [],
8266 'type' => 'map',
8267 ];
8268
8292 public const AutoConfirmAge = [
8293 'default' => 0,
8294 ];
8295
8307 public const AutoConfirmCount = [
8308 'default' => 0,
8309 ];
8310
8368 public const Autopromote = [
8369 'default' => [
8370 'autoconfirmed' => [ '&',
8371 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8372 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8373 ],
8374 ],
8375 'type' => 'map',
8376 ];
8377
8397 public const AutopromoteOnce = [
8398 'default' => [ 'onEdit' => [], ],
8399 'type' => 'map',
8400 ];
8401
8407 public const AutopromoteOnceLogInRC = [
8408 'default' => true,
8409 ];
8410
8418 public const AutopromoteOnceRCExcludedGroups = [
8419 'default' => [],
8420 'type' => 'array',
8421 ];
8422
8452 public const AddGroups = [
8453 'default' => [],
8454 'type' => 'map',
8455 ];
8456
8460 public const RemoveGroups = [
8461 'default' => [],
8462 'type' => 'map',
8463 ];
8464
8475 public const AvailableRights = [
8476 'default' => [],
8477 'type' => 'list',
8478 'items' => [ 'type' => 'string', ],
8479 ];
8480
8494 public const ImplicitRights = [
8495 'default' => [],
8496 'type' => 'list',
8497 'items' => [ 'type' => 'string', ]
8498 ];
8499
8504 public const DeleteRevisionsLimit = [
8505 'default' => 0,
8506 ];
8507
8513 public const DeleteRevisionsBatchSize = [
8514 'default' => 1000,
8515 ];
8516
8526 public const HideUserContribLimit = [
8527 'default' => 1000,
8528 ];
8529
8556 public const AccountCreationThrottle = [
8557 'default' => [ [
8558 'count' => 0,
8559 'seconds' => 86400,
8560 ] ],
8561 'type' => 'int|list',
8562 ];
8563
8589 public const TempAccountCreationThrottle = [
8590 'default' => [ [
8591 'count' => 6,
8592 'seconds' => 86400,
8593 ] ],
8594 'type' => 'list',
8595 ];
8596
8632 public const TempAccountNameAcquisitionThrottle = [
8633 'default' => [ [
8634 'count' => 60,
8635 'seconds' => 86400,
8636 ] ],
8637 'type' => 'list',
8638 ];
8639
8650 public const SpamRegex = [
8651 'default' => [],
8652 'type' => 'list',
8653 ];
8654
8658 public const SummarySpamRegex = [
8659 'default' => [],
8660 'type' => 'list',
8661 ];
8662
8669 public const EnableDnsBlacklist = [
8670 'default' => false,
8671 ];
8672
8697 public const DnsBlacklistUrls = [
8698 'default' => [],
8699 'type' => 'list',
8700 ];
8701
8710 public const ProxyList = [
8711 'default' => [],
8712 'type' => 'string|list',
8713 ];
8714
8719 public const ProxyWhitelist = [
8720 'default' => [],
8721 'type' => 'list',
8722 ];
8723
8731 public const SoftBlockRanges = [
8732 'default' => [],
8733 'type' => 'list',
8734 'items' => [ 'type' => 'string', ],
8735 ];
8736
8742 public const ApplyIpBlocksToXff = [
8743 'default' => false,
8744 ];
8745
8788 public const RateLimits = [
8789 'default' => [
8790 // Page edits
8791 'edit' => [
8792 'ip' => [ 8, 60 ],
8793 'newbie' => [ 8, 60 ],
8794 'user' => [ 90, 60 ],
8795 ],
8796 // Page moves
8797 'move' => [
8798 'newbie' => [ 2, 120 ],
8799 'user' => [ 8, 60 ],
8800 ],
8801 // File uploads
8802 'upload' => [
8803 'ip' => [ 8, 60 ],
8804 'newbie' => [ 8, 60 ],
8805 ],
8806 // Page rollbacks
8807 'rollback' => [
8808 'user' => [ 10, 60 ],
8809 'newbie' => [ 5, 120 ]
8810 ],
8811 // Triggering password resets emails
8812 'mailpassword' => [
8813 'ip' => [ 5, 3600 ],
8814 ],
8815 // Emailing other users using MediaWiki
8816 'sendemail' => [
8817 'ip' => [ 5, 86400 ],
8818 'newbie' => [ 5, 86400 ],
8819 'user' => [ 20, 86400 ],
8820 ],
8821 'changeemail' => [
8822 'ip-all' => [ 10, 3600 ],
8823 'user' => [ 4, 86400 ]
8824 ],
8825 // since 1.33 - rate limit email confirmations
8826 'confirmemail' => [
8827 'ip-all' => [ 10, 3600 ],
8828 'user' => [ 4, 86400 ]
8829 ],
8830 // Purging pages
8831 'purge' => [
8832 'ip' => [ 30, 60 ],
8833 'user' => [ 30, 60 ],
8834 ],
8835 // Purges of link tables
8836 'linkpurge' => [
8837 'ip' => [ 30, 60 ],
8838 'user' => [ 30, 60 ],
8839 ],
8840 // Files rendered via thumb.php or thumb_handler.php
8841 'renderfile' => [
8842 'ip' => [ 700, 30 ],
8843 'user' => [ 700, 30 ],
8844 ],
8845 // Same as above but for non-standard thumbnails
8846 'renderfile-nonstandard' => [
8847 'ip' => [ 70, 30 ],
8848 'user' => [ 70, 30 ],
8849 ],
8850 // Stashing edits into cache before save
8851 'stashedit' => [
8852 'ip' => [ 30, 60 ],
8853 'newbie' => [ 30, 60 ],
8854 ],
8855 // Stash base HTML for VE edits
8856 'stashbasehtml' => [
8857 'ip' => [ 5, 60 ],
8858 'newbie' => [ 5, 60 ],
8859 ],
8860 // Adding or removing change tags
8861 'changetags' => [
8862 'ip' => [ 8, 60 ],
8863 'newbie' => [ 8, 60 ],
8864 ],
8865 // Changing the content model of a page
8866 'editcontentmodel' => [
8867 'newbie' => [ 2, 120 ],
8868 'user' => [ 8, 60 ],
8869 ],
8870 ],
8871 'type' => 'map',
8872 'mergeStrategy' => 'array_plus_2d',
8873 ];
8874
8880 public const RateLimitsExcludedIPs = [
8881 'default' => [],
8882 'type' => 'list',
8883 ];
8884
8890 public const PutIPinRC = [
8891 'default' => true,
8892 ];
8893
8898 public const QueryPageDefaultLimit = [
8899 'default' => 50,
8900 ];
8901
8914 public const PasswordAttemptThrottle = [
8915 'default' => [
8916 // Short term limit
8917 [ 'count' => 5, 'seconds' => 300 ],
8918 // Long term limit. We need to balance the risk
8919 // of somebody using this as a DoS attack to lock someone
8920 // out of their account, and someone doing a brute force attack.
8921 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
8922 ],
8923 'type' => 'list',
8924 ];
8925
8936 public const GrantPermissions = [
8937 'default' => [
8938 'basic' => [
8939 'autocreateaccount' => true,
8940 'autoconfirmed' => true,
8941 'autopatrol' => true,
8942 'editsemiprotected' => true,
8943 'ipblock-exempt' => true,
8944 'nominornewtalk' => true,
8945 'patrolmarks' => true,
8946 'read' => true,
8947 'unwatchedpages' => true,
8948 ],
8949 'highvolume' => [
8950 'bot' => true,
8951 'apihighlimits' => true,
8952 'noratelimit' => true,
8953 'markbotedits' => true,
8954 ],
8955 'import' => [
8956 'import' => true,
8957 'importupload' => true,
8958 ],
8959 'editpage' => [
8960 'edit' => true,
8961 'minoredit' => true,
8962 'applychangetags' => true,
8963 'changetags' => true,
8964 'editcontentmodel' => true,
8965 'pagelang' => true,
8966 ],
8967 'editprotected' => [
8968 'edit' => true,
8969 'minoredit' => true,
8970 'applychangetags' => true,
8971 'changetags' => true,
8972 'editcontentmodel' => true,
8973 'editprotected' => true,
8974 ],
8975 'editmycssjs' => [
8976 'edit' => true,
8977 'minoredit' => true,
8978 'applychangetags' => true,
8979 'changetags' => true,
8980 'editcontentmodel' => true,
8981 'editmyusercss' => true,
8982 'editmyuserjson' => true,
8983 'editmyuserjs' => true,
8984 ],
8985 'editmyoptions' => [
8986 'editmyoptions' => true,
8987 'editmyuserjson' => true,
8988 ],
8989 'editinterface' => [
8990 'edit' => true,
8991 'minoredit' => true,
8992 'applychangetags' => true,
8993 'changetags' => true,
8994 'editcontentmodel' => true,
8995 'editinterface' => true,
8996 'edituserjson' => true,
8997 'editsitejson' => true,
8998 ],
8999 'editsiteconfig' => [
9000 'edit' => true,
9001 'minoredit' => true,
9002 'applychangetags' => true,
9003 'changetags' => true,
9004 'editcontentmodel' => true,
9005 'editinterface' => true,
9006 'edituserjson' => true,
9007 'editsitejson' => true,
9008 'editusercss' => true,
9009 'edituserjs' => true,
9010 'editsitecss' => true,
9011 'editsitejs' => true,
9012 ],
9013 'createeditmovepage' => [
9014 'edit' => true,
9015 'minoredit' => true,
9016 'applychangetags' => true,
9017 'changetags' => true,
9018 'editcontentmodel' => true,
9019 'createpage' => true,
9020 'createtalk' => true,
9021 'delete-redirect' => true,
9022 'move' => true,
9023 'move-rootuserpages' => true,
9024 'move-subpages' => true,
9025 'move-categorypages' => true,
9026 'suppressredirect' => true,
9027 ],
9028 'uploadfile' => [
9029 'upload' => true,
9030 'reupload-own' => true,
9031 ],
9032 'uploadeditmovefile' => [
9033 'upload' => true,
9034 'reupload-own' => true,
9035 'reupload' => true,
9036 'reupload-shared' => true,
9037 'upload_by_url' => true,
9038 'movefile' => true,
9039 'suppressredirect' => true,
9040 ],
9041 'patrol' => [
9042 'patrol' => true,
9043 ],
9044 'rollback' => [
9045 'rollback' => true,
9046 ],
9047 'blockusers' => [
9048 'block' => true,
9049 'blockemail' => true,
9050 ],
9051 'viewdeleted' => [
9052 'browsearchive' => true,
9053 'deletedhistory' => true,
9054 'deletedtext' => true,
9055 ],
9056 'viewrestrictedlogs' => [
9057 'suppressionlog' => true,
9058 ],
9059 'delete' => [
9060 'edit' => true,
9061 'minoredit' => true,
9062 'applychangetags' => true,
9063 'changetags' => true,
9064 'editcontentmodel' => true,
9065 'browsearchive' => true,
9066 'deletedhistory' => true,
9067 'deletedtext' => true,
9068 'delete' => true,
9069 'bigdelete' => true,
9070 'deletelogentry' => true,
9071 'deleterevision' => true,
9072 'undelete' => true,
9073 ],
9074 'oversight' => [
9075 'suppressrevision' => true,
9076 'viewsuppressed' => true,
9077 ],
9078 'protect' => [
9079 'edit' => true,
9080 'minoredit' => true,
9081 'applychangetags' => true,
9082 'changetags' => true,
9083 'editcontentmodel' => true,
9084 'editprotected' => true,
9085 'protect' => true,
9086 ],
9087 'viewmywatchlist' => [
9088 'viewmywatchlist' => true,
9089 ],
9090 'editmywatchlist' => [
9091 'editmywatchlist' => true,
9092 ],
9093 'sendemail' => [
9094 'sendemail' => true,
9095 ],
9096 'createaccount' => [
9097 'createaccount' => true,
9098 ],
9099 'privateinfo' => [
9100 'viewmyprivateinfo' => true,
9101 ],
9102 'mergehistory' => [
9103 'mergehistory' => true,
9104 ],
9105 ],
9106 'type' => 'map',
9107 'mergeStrategy' => 'array_plus_2d',
9108 'additionalProperties' => [
9109 'type' => 'map',
9110 'additionalProperties' => [ 'type' => 'boolean', ],
9111 ],
9112 ];
9113
9124 public const GrantPermissionGroups = [
9125 'default' =>
9126 [
9127 // Hidden grants are implicitly present
9128 'basic' => 'hidden',
9129
9130 'editpage' => 'page-interaction',
9131 'createeditmovepage' => 'page-interaction',
9132 'editprotected' => 'page-interaction',
9133 'patrol' => 'page-interaction',
9134
9135 'uploadfile' => 'file-interaction',
9136 'uploadeditmovefile' => 'file-interaction',
9137
9138 'sendemail' => 'email',
9139
9140 'viewmywatchlist' => 'watchlist-interaction',
9141 'editviewmywatchlist' => 'watchlist-interaction',
9142
9143 'editmycssjs' => 'customization',
9144 'editmyoptions' => 'customization',
9145
9146 'editinterface' => 'administration',
9147 'editsiteconfig' => 'administration',
9148 'rollback' => 'administration',
9149 'blockusers' => 'administration',
9150 'delete' => 'administration',
9151 'viewdeleted' => 'administration',
9152 'viewrestrictedlogs' => 'administration',
9153 'protect' => 'administration',
9154 'oversight' => 'administration',
9155 'createaccount' => 'administration',
9156 'mergehistory' => 'administration',
9157 'import' => 'administration',
9158
9159 'highvolume' => 'high-volume',
9160
9161 'privateinfo' => 'private-information',
9162 ],
9163 'type' => 'map',
9164 'additionalProperties' => [ 'type' => 'string', ],
9165 ];
9166
9177 public const GrantRiskGroups = [
9178 'default' => [
9179 'basic' => GrantsInfo::RISK_LOW,
9180 'editpage' => GrantsInfo::RISK_LOW,
9181 'createeditmovepage' => GrantsInfo::RISK_LOW,
9182 'editprotected' => GrantsInfo::RISK_VANDALISM,
9183 'patrol' => GrantsInfo::RISK_LOW,
9184 'uploadfile' => GrantsInfo::RISK_LOW,
9185 'uploadeditmovefile' => GrantsInfo::RISK_LOW,
9186 'sendemail' => GrantsInfo::RISK_SECURITY,
9187 'viewmywatchlist' => GrantsInfo::RISK_LOW,
9188 'editviewmywatchlist' => GrantsInfo::RISK_LOW,
9189 'editmycssjs' => GrantsInfo::RISK_SECURITY,
9190 'editmyoptions' => GrantsInfo::RISK_SECURITY,
9191 'editinterface' => GrantsInfo::RISK_VANDALISM,
9192 'editsiteconfig' => GrantsInfo::RISK_SECURITY,
9193 'rollback' => GrantsInfo::RISK_LOW,
9194 'blockusers' => GrantsInfo::RISK_VANDALISM,
9195 'delete' => GrantsInfo::RISK_VANDALISM,
9196 'viewdeleted' => GrantsInfo::RISK_VANDALISM,
9197 'viewrestrictedlogs' => GrantsInfo::RISK_SECURITY,
9198 'protect' => GrantsInfo::RISK_VANDALISM,
9199 'oversight' => GrantsInfo::RISK_SECURITY,
9200 'createaccount' => GrantsInfo::RISK_LOW,
9201 'mergehistory' => GrantsInfo::RISK_VANDALISM,
9202 'import' => GrantsInfo::RISK_SECURITY,
9203 'highvolume' => GrantsInfo::RISK_LOW,
9204 'privateinfo' => GrantsInfo::RISK_LOW,
9205 ],
9206 'type' => 'map',
9207 ];
9208
9212 public const EnableBotPasswords = [
9213 'default' => true,
9214 'type' => 'boolean',
9215 ];
9216
9223 public const BotPasswordsCluster = [
9224 'default' => false,
9225 'type' => 'string|false',
9226 ];
9227
9237 public const BotPasswordsDatabase = [
9238 'default' => false,
9239 'type' => 'string|false',
9240 ];
9241
9242 // endregion -- end of user rights settings
9243
9244 /***************************************************************************/
9245 // region Security
9251 public const SecretKey = [
9252 'default' => false,
9253 ];
9254
9260 public const AllowUserJs = [
9261 'default' => false,
9262 ];
9263
9269 public const AllowUserCss = [
9270 'default' => false,
9271 ];
9272
9279 public const AllowUserCssPrefs = [
9280 'default' => true,
9281 ];
9282
9286 public const UseSiteJs = [
9287 'default' => true,
9288 ];
9289
9293 public const UseSiteCss = [
9294 'default' => true,
9295 ];
9296
9301 public const BreakFrames = [
9302 'default' => false,
9303 ];
9304
9324 public const EditPageFrameOptions = [
9325 'default' => 'DENY',
9326 ];
9327
9339 public const ApiFrameOptions = [
9340 'default' => 'DENY',
9341 ];
9342
9352 public const CSPHeader = [
9353 'default' => false,
9354 'type' => 'false|object',
9355 ];
9356
9362 public const CSPReportOnlyHeader = [
9363 'default' => false,
9364 'type' => 'false|object',
9365 ];
9366
9376 public const CSPFalsePositiveUrls = [
9377 'default' => [
9378 'https://3hub.co' => true,
9379 'https://morepro.info' => true,
9380 'https://p.ato.mx' => true,
9381 'https://s.ato.mx' => true,
9382 'https://adserver.adtech.de' => true,
9383 'https://ums.adtechus.com' => true,
9384 'https://cas.criteo.com' => true,
9385 'https://cat.nl.eu.criteo.com' => true,
9386 'https://atpixel.alephd.com' => true,
9387 'https://rtb.metrigo.com' => true,
9388 'https://d5p.de17a.com' => true,
9389 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9390 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9391 'https://t.lkqd.net/t' => true,
9392 'chrome-extension' => true,
9393 ],
9394 'type' => 'map',
9395 ];
9396
9404 public const AllowCrossOrigin = [
9405 'default' => false,
9406 'type' => 'boolean',
9407 ];
9408
9422 public const RestAllowCrossOriginCookieAuth = [
9423 'default' => false,
9424 'type' => 'boolean',
9425 ];
9426
9435 public const SessionSecret = [
9436 'default' => false,
9437 ];
9438
9439 // endregion -- end of security
9440
9441 /***************************************************************************/
9442 // region Cookie settings
9448 public const CookieExpiration = [
9449 'default' => 30 * 86400,
9450 ];
9451
9458 public const ExtendedLoginCookieExpiration = [
9459 'default' => 180 * 86400,
9460 ];
9461
9466 public const CookieDomain = [
9467 'default' => '',
9468 ];
9469
9474 public const CookiePath = [
9475 'default' => '/',
9476 ];
9477
9488 public const CookieSecure = [
9489 'default' => 'detect',
9490 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9491 ];
9492
9493 public static function getDefaultCookieSecure( $forceHTTPS ): bool {
9494 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9495 }
9496
9502 public const CookiePrefix = [
9503 'default' => false,
9504 'dynamicDefault' => [
9505 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9506 ],
9507 ];
9508
9509 public static function getDefaultCookiePrefix(
9510 $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix
9511 ): string {
9512 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9513 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9514 }
9515 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9516 }
9517
9523 public const CookieHttpOnly = [
9524 'default' => true,
9525 ];
9526
9536 public const CookieSameSite = [
9537 'default' => null,
9538 'type' => '?string',
9539 ];
9540
9544 public const CacheVaryCookies = [
9545 'default' => [],
9546 'type' => 'list',
9547 ];
9548
9552 public const SessionName = [
9553 'default' => false,
9554 ];
9555
9563 public const CookieSetOnAutoblock = [
9564 'default' => true,
9565 ];
9566
9574 public const CookieSetOnIpBlock = [
9575 'default' => true,
9576 ];
9577
9578 // endregion -- end of cookie settings
9579
9580 /***************************************************************************/
9581 // region Profiling, testing and debugging
9583 // See $wgProfiler for how to enable profiling.
9584
9596 public const DebugLogFile = [
9597 'default' => '',
9598 ];
9599
9603 public const DebugLogPrefix = [
9604 'default' => '',
9605 ];
9606
9612 public const DebugRedirects = [
9613 'default' => false,
9614 ];
9615
9630 public const DebugRawPage = [
9631 'default' => false,
9632 ];
9633
9642 public const DebugComments = [
9643 'default' => false,
9644 ];
9645
9653 public const DebugDumpSql = [
9654 'default' => false,
9655 ];
9656
9662 public const TrxProfilerLimits = [
9663 'default' => [
9664 // HTTP GET/HEAD requests.
9665 // Primary queries should not happen on GET requests
9666 'GET' => [
9667 'masterConns' => 0,
9668 'writes' => 0,
9669 'readQueryTime' => 5,
9670 'readQueryRows' => 10000
9671 ],
9672 // HTTP POST requests.
9673 // Primary reads and writes will happen for a subset of these.
9674 'POST' => [
9675 'readQueryTime' => 5,
9676 'writeQueryTime' => 1,
9677 'readQueryRows' => 100_000,
9678 'maxAffected' => 1000
9679 ],
9680 'POST-nonwrite' => [
9681 'writes' => 0,
9682 'readQueryTime' => 5,
9683 'readQueryRows' => 10000
9684 ],
9685 // Deferred updates that run after HTTP response is sent for GET requests
9686 'PostSend-GET' => [
9687 'readQueryTime' => 5,
9688 'writeQueryTime' => 1,
9689 'readQueryRows' => 10000,
9690 'maxAffected' => 1000,
9691 // Log primary queries under the post-send entry point as they are discouraged
9692 'masterConns' => 0,
9693 'writes' => 0,
9694 ],
9695 // Deferred updates that run after HTTP response is sent for POST requests
9696 'PostSend-POST' => [
9697 'readQueryTime' => 5,
9698 'writeQueryTime' => 1,
9699 'readQueryRows' => 100_000,
9700 'maxAffected' => 1000
9701 ],
9702 // Background job runner
9703 'JobRunner' => [
9704 'readQueryTime' => 30,
9705 'writeQueryTime' => 5,
9706 'readQueryRows' => 100_000,
9707 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9708 ],
9709 // Command-line scripts
9710 'Maintenance' => [
9711 'writeQueryTime' => 5,
9712 'maxAffected' => 1000
9713 ]
9714 ],
9715 'type' => 'map',
9716 ];
9717
9750 public const DebugLogGroups = [
9751 'default' => [],
9752 'type' => 'map',
9753 ];
9754
9776 public const MWLoggerDefaultSpi = [
9777 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9778 'mergeStrategy' => 'replace',
9779 'type' => 'map',
9780 ];
9781
9787 public const ShowDebug = [
9788 'default' => false,
9789 ];
9790
9794 public const SpecialVersionShowHooks = [
9795 'default' => false,
9796 ];
9797
9805 public const ShowExceptionDetails = [
9806 'default' => false,
9807 ];
9808
9812 public const LogExceptionBacktrace = [
9813 'default' => true,
9814 ];
9815
9820 public const PropagateErrors = [
9821 'default' => true,
9822 ];
9823
9827 public const ShowHostnames = [
9828 'default' => false,
9829 ];
9830
9838 public const OverrideHostname = [
9839 'default' => false,
9840 ];
9841
9846 public const DevelopmentWarnings = [
9847 'default' => false,
9848 ];
9849
9855 public const DeprecationReleaseLimit = [
9856 'default' => false,
9857 ];
9858
9925 public const Profiler = [
9926 'default' => [],
9927 'type' => 'map',
9928 'mergeStrategy' => 'replace',
9929 ];
9930
9941 public const StatsdServer = [
9942 'default' => false,
9943 ];
9944
9952 public const StatsdMetricPrefix = [
9953 'default' => 'MediaWiki',
9954 ];
9955
9964 public const StatsTarget = [
9965 'default' => null,
9966 'type' => '?string',
9967 ];
9968
9978 public const StatsFormat = [
9979 'default' => null,
9980 'type' => '?string',
9981 ];
9982
9992 public const StatsPrefix = [
9993 'default' => 'mediawiki',
9994 'type' => 'string',
9995 ];
9996
10016 public const OpenTelemetryConfig = [
10017 'default' => null,
10018 'type' => 'map|null'
10019 ];
10020
10027 public const PageInfoTransclusionLimit = [
10028 'default' => 50,
10029 ];
10030
10034 public const EnableJavaScriptTest = [
10035 'default' => false,
10036 ];
10037
10043 public const CachePrefix = [
10044 'default' => false,
10045 ];
10046
10055 public const DebugToolbar = [
10056 'default' => false,
10057 ];
10058
10059 // endregion -- end of profiling, testing and debugging
10060
10061 /***************************************************************************/
10062 // region Search
10068 public const DisableTextSearch = [
10069 'default' => false,
10070 ];
10071
10076 public const AdvancedSearchHighlighting = [
10077 'default' => false,
10078 ];
10079
10084 public const SearchHighlightBoundaries = [
10085 'default' => '[\\p{Z}\\p{P}\\p{C}]',
10086 ];
10087
10096 public const OpenSearchTemplates = [
10097 'default' => [
10098 'application/x-suggestions+json' => false,
10099 'application/x-suggestions+xml' => false,
10100 ],
10101 'type' => 'map',
10102 ];
10103
10110 public const EnableOpenSearchSuggest = [
10111 'default' => true,
10112 'obsolete' => 'Since 1.35, no longer used',
10113 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
10114 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
10115 ];
10116
10121 public const OpenSearchDefaultLimit = [
10122 'default' => 10,
10123 ];
10124
10129 public const OpenSearchDescriptionLength = [
10130 'default' => 100,
10131 ];
10132
10136 public const SearchSuggestCacheExpiry = [
10137 'default' => 1200,
10138 ];
10139
10144 public const DisableSearchUpdate = [
10145 'default' => false,
10146 ];
10147
10158 public const NamespacesToBeSearchedDefault = [
10159 'default' => [ NS_MAIN => true, ],
10160 'type' => 'map',
10161 ];
10162
10167 public const DisableInternalSearch = [
10168 'default' => false,
10169 ];
10170
10188 public const SearchForwardUrl = [
10189 'default' => null,
10190 ];
10191
10197 public const SitemapNamespaces = [
10198 'default' => false,
10199 'type' => 'false|list',
10200 ];
10201
10218 public const SitemapNamespacesPriorities = [
10219 'default' => false,
10220 'type' => 'false|map',
10221 ];
10222
10228 public const EnableSearchContributorsByIP = [
10229 'default' => true,
10230 ];
10231
10242 public const SpecialSearchFormOptions = [
10243 'default' => [],
10244 'type' => 'map',
10245 ];
10246
10255 public const SearchMatchRedirectPreference = [
10256 'default' => false,
10257 'type' => 'boolean',
10258 ];
10259
10266 public const SearchRunSuggestedQuery = [
10267 'default' => true,
10268 'type' => 'boolean',
10269 ];
10270
10271 // endregion -- end of search settings
10272
10273 /***************************************************************************/
10274 // region Edit user interface
10281 public const Diff3 = [
10282 'default' => '/usr/bin/diff3',
10283 ];
10284
10288 public const Diff = [
10289 'default' => '/usr/bin/diff',
10290 ];
10291
10297 public const PreviewOnOpenNamespaces = [
10298 'default' => [
10299 NS_CATEGORY => true
10300 ],
10301 'type' => 'map',
10302 ];
10303
10309 public const UniversalEditButton = [
10310 'default' => true,
10311 ];
10312
10318 public const UseAutomaticEditSummaries = [
10319 'default' => true,
10320 ];
10321
10322 // endregion -- end edit UI
10323
10324 /***************************************************************************/
10325 // region Maintenance
10327 // See also $wgSiteNotice
10328
10332 public const CommandLineDarkBg = [
10333 'default' => false,
10334 ];
10335
10344 public const ReadOnly = [
10345 'default' => null,
10346 ];
10347
10353 public const ReadOnlyWatchedItemStore = [
10354 'default' => false,
10355 'type' => 'boolean',
10356 ];
10357
10366 public const ReadOnlyFile = [
10367 'default' => false,
10368 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10369 ];
10370
10375 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10376 return "$uploadDirectory/lock_yBgMBwiR";
10377 }
10378
10388 public const UpgradeKey = [
10389 'default' => false,
10390 ];
10391
10395 public const GitBin = [
10396 'default' => '/usr/bin/git',
10397 ];
10398
10412 public const GitRepositoryViewers = [
10413 'default' => [
10414 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10415 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10416 ],
10417 'type' => 'map',
10418 ];
10419
10437 public const InstallerInitialPages = [
10438 'default' => [
10439 [
10440 'titlemsg' => 'mainpage',
10441 'text' => "{{subst:int:mainpagetext}}\n\n{{subst:int:mainpagedocfooter}}",
10442 ]
10443 ],
10444 'type' => 'list'
10445 ];
10446
10447 // endregion -- End of maintenance
10448
10449 /***************************************************************************/
10450 // region Recent changes, new pages, watchlist and history
10459 public const RCMaxAge = [
10460 'default' => 90 * 24 * 3600,
10461 ];
10462
10470 public const WatchersMaxAge = [
10471 'default' => 180 * 24 * 3600,
10472 ];
10473
10482 public const UnwatchedPageSecret = [
10483 'default' => 1,
10484 ];
10485
10493 public const RCFilterByAge = [
10494 'default' => false,
10495 ];
10496
10501 public const RCLinkLimits = [
10502 'default' => [ 50, 100, 250, 500 ],
10503 'type' => 'list',
10504 ];
10505
10512 public const RCLinkDays = [
10513 'default' => [ 1, 3, 7, 14, 30 ],
10514 'type' => 'list',
10515 ];
10516
10580 public const RCFeeds = [
10581 'default' => [],
10582 'type' => 'map',
10583 ];
10584
10592 public const RCEngines = [
10593 'default' => [
10594 'redis' => RedisPubSubFeedEngine::class,
10595 'udp' => UDPRCFeedEngine::class,
10596 ],
10597 'type' => 'map',
10598 ];
10599
10612 public const RCWatchCategoryMembership = [
10613 'default' => false,
10614 ];
10615
10624 public const UseRCPatrol = [
10625 'default' => true,
10626 ];
10627
10634 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10635 'default' => 3,
10636 ];
10637
10645 public const UseNPPatrol = [
10646 'default' => true,
10647 ];
10648
10657 public const UseFilePatrol = [
10658 'default' => true,
10659 ];
10660
10664 public const Feed = [
10665 'default' => true,
10666 ];
10667
10672 public const FeedLimit = [
10673 'default' => 50,
10674 ];
10675
10685 public const FeedCacheTimeout = [
10686 'default' => 60,
10687 ];
10688
10693 public const FeedDiffCutoff = [
10694 'default' => 32768,
10695 ];
10696
10712 public const OverrideSiteFeed = [
10713 'default' => [],
10714 'type' => 'map',
10715 ];
10716
10723 public const FeedClasses = [
10724 'default' => [
10725 'rss' => \MediaWiki\Feed\RSSFeed::class,
10726 'atom' => \MediaWiki\Feed\AtomFeed::class,
10727 ],
10728 'type' => 'map',
10729 ];
10730
10735 public const AdvertisedFeedTypes = [
10736 'default' => [ 'atom', ],
10737 'type' => 'list',
10738 ];
10739
10743 public const RCShowWatchingUsers = [
10744 'default' => false,
10745 ];
10746
10750 public const RCShowChangedSize = [
10751 'default' => true,
10752 ];
10753
10759 public const RCChangedSizeThreshold = [
10760 'default' => 500,
10761 ];
10762
10767 public const ShowUpdatedMarker = [
10768 'default' => true,
10769 ];
10770
10775 public const DisableAnonTalk = [
10776 'default' => false,
10777 ];
10778
10783 public const UseTagFilter = [
10784 'default' => true,
10785 ];
10786
10805 public const SoftwareTags = [
10806 'default' => [
10807 'mw-contentmodelchange' => true,
10808 'mw-new-redirect' => true,
10809 'mw-removed-redirect' => true,
10810 'mw-changed-redirect-target' => true,
10811 'mw-blank' => true,
10812 'mw-replace' => true,
10813 'mw-recreated' => true,
10814 'mw-rollback' => true,
10815 'mw-undo' => true,
10816 'mw-manual-revert' => true,
10817 'mw-reverted' => true,
10818 'mw-server-side-upload' => true,
10819 ],
10820 'type' => 'map',
10821 'additionalProperties' => [ 'type' => 'boolean', ],
10822 ];
10823
10831 public const UnwatchedPageThreshold = [
10832 'default' => false,
10833 ];
10834
10860 public const RecentChangesFlags = [
10861 'default' => [
10862 'newpage' => [
10863 'letter' => 'newpageletter',
10864 'title' => 'recentchanges-label-newpage',
10865 'legend' => 'recentchanges-legend-newpage',
10866 'grouping' => 'any',
10867 ],
10868 'minor' => [
10869 'letter' => 'minoreditletter',
10870 'title' => 'recentchanges-label-minor',
10871 'legend' => 'recentchanges-legend-minor',
10872 'class' => 'minoredit',
10873 'grouping' => 'all',
10874 ],
10875 'bot' => [
10876 'letter' => 'boteditletter',
10877 'title' => 'recentchanges-label-bot',
10878 'legend' => 'recentchanges-legend-bot',
10879 'class' => 'botedit',
10880 'grouping' => 'all',
10881 ],
10882 'unpatrolled' => [
10883 'letter' => 'unpatrolledletter',
10884 'title' => 'recentchanges-label-unpatrolled',
10885 'legend' => 'recentchanges-legend-unpatrolled',
10886 'grouping' => 'any',
10887 ],
10888 ],
10889 'type' => 'map',
10890 ];
10891
10897 public const WatchlistExpiry = [
10898 'default' => false,
10899 'type' => 'boolean',
10900 ];
10901
10912 public const WatchlistPurgeRate = [
10913 'default' => 0.1,
10914 'type' => 'float',
10915 ];
10916
10931 public const WatchlistExpiryMaxDuration = [
10932 'default' => '1 year',
10933 'type' => '?string',
10934 ];
10935
10936 // endregion -- end RC/watchlist
10937
10938 /***************************************************************************/
10939 // region Copyright and credits settings
10949 public const RightsPage = [
10950 'default' => null,
10951 ];
10952
10959 public const RightsUrl = [
10960 'default' => null,
10961 ];
10962
10971 public const RightsText = [
10972 'default' => null,
10973 ];
10974
10978 public const RightsIcon = [
10979 'default' => null,
10980 ];
10981
10985 public const UseCopyrightUpload = [
10986 'default' => false,
10987 ];
10988
10996 public const MaxCredits = [
10997 'default' => 0,
10998 ];
10999
11005 public const ShowCreditsIfMax = [
11006 'default' => true,
11007 ];
11008
11009 // endregion -- end of copyright and credits settings
11010
11011 /***************************************************************************/
11012 // region Import / Export
11038 public const ImportSources = [
11039 'default' => [],
11040 'type' => 'map',
11041 ];
11042
11051 public const ImportTargetNamespace = [
11052 'default' => null,
11053 ];
11054
11061 public const ExportAllowHistory = [
11062 'default' => true,
11063 ];
11064
11070 public const ExportMaxHistory = [
11071 'default' => 0,
11072 ];
11073
11077 public const ExportAllowListContributors = [
11078 'default' => false,
11079 ];
11080
11092 public const ExportMaxLinkDepth = [
11093 'default' => 0,
11094 ];
11095
11099 public const ExportFromNamespaces = [
11100 'default' => false,
11101 ];
11102
11106 public const ExportAllowAll = [
11107 'default' => false,
11108 ];
11109
11116 public const ExportPagelistLimit = [
11117 'default' => 5000,
11118 ];
11119
11124 public const XmlDumpSchemaVersion = [
11125 'default' => XML_DUMP_SCHEMA_VERSION_11,
11126 ];
11127
11128 // endregion -- end of import/export
11129
11130 /***************************************************************************/
11131 // region Wiki Farm
11143 public const WikiFarmSettingsDirectory = [
11144 'default' => null
11145 ];
11146
11154 public const WikiFarmSettingsExtension = [
11155 'default' => 'yaml'
11156 ];
11157
11158 // endregion -- End Wiki Farm
11159
11160 /***************************************************************************/
11161 // region Extensions
11168 public const ExtensionFunctions = [
11169 'default' => [],
11170 'type' => 'list',
11171 ];
11172
11200 public const ExtensionMessagesFiles = [
11201 'default' => [],
11202 'type' => 'map',
11203 ];
11204
11233 public const MessagesDirs = [
11234 'default' => [],
11235 'type' => 'map',
11236 ];
11237
11264 public const TranslationAliasesDirs = [
11265 'default' => [],
11266 'type' => 'map',
11267 ];
11268
11275 public const ExtensionEntryPointListFiles = [
11276 'default' => [],
11277 'type' => 'map',
11278 ];
11279
11283 public const EnableParserLimitReporting = [
11284 'default' => true,
11285 ];
11286
11312 public const ValidSkinNames = [
11313 'default' => [],
11314 'type' => 'map',
11315 ];
11316
11322 public const SpecialPages = [
11323 'default' => [],
11324 'type' => 'map',
11325 ];
11326
11337 public const AutoloadAttemptLowercase = [
11338 'default' => false,
11339 'obsolete' => 'Since 1.40; no longer has any effect.',
11340 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11341 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11342 ];
11343
11402 public const ExtensionCredits = [
11403 'default' => [],
11404 'type' => 'map',
11405 ];
11406
11436 public const Hooks = [
11437 'default' => [],
11438 'type' => 'map',
11439 'mergeStrategy' => 'array_merge_recursive',
11440 ];
11441
11456 public const ServiceWiringFiles = [
11457 'default' => [],
11458 'type' => 'list',
11459 ];
11460
11479 public const JobClasses = [
11480 'default' => [
11481 'deletePage' => DeletePageJob::class,
11482 'refreshLinks' => RefreshLinksJob::class,
11483 'deleteLinks' => DeleteLinksJob::class,
11484 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11485 'sendMail' => [
11486 'class' => EmaillingJob::class,
11487 'services' => [
11488 0 => 'Emailer'
11489 ]
11490 ],
11491 'enotifNotify' => EnotifNotifyJob::class,
11492 'fixDoubleRedirect' => [
11493 'class' => DoubleRedirectJob::class,
11494 'services' => [
11495 'RevisionLookup',
11496 'MagicWordFactory',
11497 'WikiPageFactory',
11498 ],
11499 // This job requires a title
11500 'needsPage' => true,
11501 ],
11502 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11503 'PublishStashedFile' => PublishStashedFileJob::class,
11504 'ThumbnailRender' => ThumbnailRenderJob::class,
11505 'UploadFromUrl' => UploadFromUrlJob::class,
11506 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11507 'refreshLinksPrioritized' => RefreshLinksJob::class,
11508 'refreshLinksDynamic' => RefreshLinksJob::class,
11509 'activityUpdateJob' => ActivityUpdateJob::class,
11510 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
11511 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11512 'watchlistExpiry' => WatchlistExpiryJob::class,
11513 'cdnPurge' => CdnPurgeJob::class,
11514 'userGroupExpiry' => UserGroupExpiryJob::class,
11515 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11516 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11517 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11518 'null' => NullJob::class,
11519 'userEditCountInit' => UserEditCountInitJob::class,
11520 'parsoidCachePrewarm' => [
11521 'class' => ParsoidCachePrewarmJob::class,
11522 'services' => [
11523 'ParserOutputAccess',
11524 'PageStore',
11525 'RevisionLookup',
11526 'ParsoidSiteConfig',
11527 ],
11528 // tell the JobFactory not to include the $page parameter in the constructor call
11529 'needsPage' => false
11530 ],
11531 'renameUser' => [
11532 'class' => RenameUserJob::class,
11533 'services' => [
11534 'MainConfig',
11535 'DBLoadBalancerFactory'
11536 ]
11537 ],
11538 ],
11539 'type' => 'map',
11540 ];
11541
11553 public const JobTypesExcludedFromDefaultQueue = [
11554 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl' ],
11555 'type' => 'list',
11556 ];
11557
11567 public const JobBackoffThrottling = [
11568 'default' => [],
11569 'type' => 'map',
11570 'additionalProperties' => [ 'type' => 'float', ],
11571 ];
11572
11580 public const JobTypeConf = [
11581 'default' => [
11582 'default' => [
11583 'class' => JobQueueDB::class,
11584 'order' => 'random',
11585 'claimTTL' => 3600
11586 ],
11587 ],
11588 'additionalProperties' => [
11589 'type' => 'object',
11590 'properties' => [
11591 'class' => [ 'type' => 'string' ],
11592 'order' => [ 'type' => 'string' ],
11593 'claimTTL' => [ 'type' => 'int' ]
11594 ],
11595 ],
11596 'type' => 'map',
11597 ];
11598
11611 public const JobQueueIncludeInMaxLagFactor = [
11612 'default' => false,
11613 ];
11614
11620 public const SpecialPageCacheUpdates = [
11621 'default' => [
11622 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11623 ],
11624 'type' => 'map',
11625 ];
11626
11635 public const PagePropLinkInvalidations = [
11636 'default' => [ 'hiddencat' => 'categorylinks', ],
11637 'type' => 'map',
11638 ];
11639
11640 // endregion -- End extensions
11641
11642 /***************************************************************************/
11643 // region Categories
11650 public const CategoryMagicGallery = [
11651 'default' => true,
11652 ];
11653
11657 public const CategoryPagingLimit = [
11658 'default' => 200,
11659 ];
11660
11687 public const CategoryCollation = [
11688 'default' => 'uppercase',
11689 ];
11690
11702 public const TempCategoryCollations = [
11703 'default' => [],
11704 'type' => 'list',
11705 ];
11706
11715 public const SortedCategories = [
11716 'default' => false,
11717 'type' => 'boolean',
11718 ];
11719
11734 public const TrackingCategories = [
11735 'default' => [],
11736 'type' => 'list',
11737 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
11738 'the new extension registration system.',
11739 ];
11740
11741 // endregion -- End categories
11742
11743 /***************************************************************************/
11744 // region Logging
11756 public const LogTypes = [
11757 'default' => [
11758 '',
11759 'block',
11760 'protect',
11761 'rights',
11762 'delete',
11763 'upload',
11764 'move',
11765 'import',
11766 'interwiki',
11767 'patrol',
11768 'merge',
11769 'suppress',
11770 'tag',
11771 'managetags',
11772 'contentmodel',
11773 'renameuser',
11774 ],
11775 'type' => 'list',
11776 ];
11777
11785 public const LogRestrictions = [
11786 'default' => [ 'suppress' => 'suppressionlog', ],
11787 'type' => 'map',
11788 ];
11789
11808 public const FilterLogTypes = [
11809 'default' => [
11810 'patrol' => true,
11811 'tag' => true,
11812 'newusers' => false,
11813 ],
11814 'type' => 'map',
11815 ];
11816
11826 public const LogNames = [
11827 'default' => [
11828 '' => 'all-logs-page',
11829 'block' => 'blocklogpage',
11830 'protect' => 'protectlogpage',
11831 'rights' => 'rightslog',
11832 'delete' => 'dellogpage',
11833 'upload' => 'uploadlogpage',
11834 'move' => 'movelogpage',
11835 'import' => 'importlogpage',
11836 'patrol' => 'patrol-log-page',
11837 'merge' => 'mergelog',
11838 'suppress' => 'suppressionlog',
11839 ],
11840 'type' => 'map',
11841 ];
11842
11852 public const LogHeaders = [
11853 'default' => [
11854 '' => 'alllogstext',
11855 'block' => 'blocklogtext',
11856 'delete' => 'dellogpagetext',
11857 'import' => 'importlogpagetext',
11858 'merge' => 'mergelogpagetext',
11859 'move' => 'movelogpagetext',
11860 'patrol' => 'patrol-log-header',
11861 'protect' => 'protectlogtext',
11862 'rights' => 'rightslogtext',
11863 'suppress' => 'suppressionlogtext',
11864 'upload' => 'uploadlogpagetext',
11865 ],
11866 'type' => 'map',
11867 ];
11868
11876 public const LogActions = [
11877 'default' => [],
11878 'type' => 'map',
11879 ];
11880
11890 public const LogActionsHandlers = [
11891 'default' => [
11892 'block/block' => BlockLogFormatter::class,
11893 'block/reblock' => BlockLogFormatter::class,
11894 'block/unblock' => BlockLogFormatter::class,
11895 'contentmodel/change' => ContentModelLogFormatter::class,
11896 'contentmodel/new' => ContentModelLogFormatter::class,
11897 'delete/delete' => DeleteLogFormatter::class,
11898 'delete/delete_redir' => DeleteLogFormatter::class,
11899 'delete/delete_redir2' => DeleteLogFormatter::class,
11900 'delete/event' => DeleteLogFormatter::class,
11901 'delete/restore' => DeleteLogFormatter::class,
11902 'delete/revision' => DeleteLogFormatter::class,
11903 'import/interwiki' => ImportLogFormatter::class,
11904 'import/upload' => ImportLogFormatter::class,
11905 'interwiki/iw_add' => InterwikiLogFormatter::class,
11906 'interwiki/iw_delete' => InterwikiLogFormatter::class,
11907 'interwiki/iw_edit' => InterwikiLogFormatter::class,
11908 'managetags/activate' => LogFormatter::class,
11909 'managetags/create' => LogFormatter::class,
11910 'managetags/deactivate' => LogFormatter::class,
11911 'managetags/delete' => LogFormatter::class,
11912 'merge/merge' => MergeLogFormatter::class,
11913 'move/move' => MoveLogFormatter::class,
11914 'move/move_redir' => MoveLogFormatter::class,
11915 'patrol/patrol' => PatrolLogFormatter::class,
11916 'patrol/autopatrol' => PatrolLogFormatter::class,
11917 'protect/modify' => ProtectLogFormatter::class,
11918 'protect/move_prot' => ProtectLogFormatter::class,
11919 'protect/protect' => ProtectLogFormatter::class,
11920 'protect/unprotect' => ProtectLogFormatter::class,
11921 'renameuser/renameuser' => RenameuserLogFormatter::class,
11922 'rights/autopromote' => RightsLogFormatter::class,
11923 'rights/rights' => RightsLogFormatter::class,
11924 'suppress/block' => BlockLogFormatter::class,
11925 'suppress/delete' => DeleteLogFormatter::class,
11926 'suppress/event' => DeleteLogFormatter::class,
11927 'suppress/reblock' => BlockLogFormatter::class,
11928 'suppress/revision' => DeleteLogFormatter::class,
11929 'tag/update' => TagLogFormatter::class,
11930 'upload/overwrite' => UploadLogFormatter::class,
11931 'upload/revert' => UploadLogFormatter::class,
11932 'upload/upload' => UploadLogFormatter::class,
11933 ],
11934 'type' => 'map',
11935 ];
11936
11946 public const ActionFilteredLogs = [
11947 'default' => [
11948 'block' => [
11949 'block' => [ 'block' ],
11950 'reblock' => [ 'reblock' ],
11951 'unblock' => [ 'unblock' ],
11952 ],
11953 'contentmodel' => [
11954 'change' => [ 'change' ],
11955 'new' => [ 'new' ],
11956 ],
11957 'delete' => [
11958 'delete' => [ 'delete' ],
11959 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
11960 'restore' => [ 'restore' ],
11961 'event' => [ 'event' ],
11962 'revision' => [ 'revision' ],
11963 ],
11964 'import' => [
11965 'interwiki' => [ 'interwiki' ],
11966 'upload' => [ 'upload' ],
11967 ],
11968 'managetags' => [
11969 'create' => [ 'create' ],
11970 'delete' => [ 'delete' ],
11971 'activate' => [ 'activate' ],
11972 'deactivate' => [ 'deactivate' ],
11973 ],
11974 'move' => [
11975 'move' => [ 'move' ],
11976 'move_redir' => [ 'move_redir' ],
11977 ],
11978 'newusers' => [
11979 'create' => [ 'create', 'newusers' ],
11980 'create2' => [ 'create2' ],
11981 'autocreate' => [ 'autocreate' ],
11982 'byemail' => [ 'byemail' ],
11983 ],
11984 'protect' => [
11985 'protect' => [ 'protect' ],
11986 'modify' => [ 'modify' ],
11987 'unprotect' => [ 'unprotect' ],
11988 'move_prot' => [ 'move_prot' ],
11989 ],
11990 'rights' => [
11991 'rights' => [ 'rights' ],
11992 'autopromote' => [ 'autopromote' ],
11993 ],
11994 'suppress' => [
11995 'event' => [ 'event' ],
11996 'revision' => [ 'revision' ],
11997 'delete' => [ 'delete' ],
11998 'block' => [ 'block' ],
11999 'reblock' => [ 'reblock' ],
12000 ],
12001 'upload' => [
12002 'upload' => [ 'upload' ],
12003 'overwrite' => [ 'overwrite' ],
12004 'revert' => [ 'revert' ],
12005 ],
12006 ],
12007 'type' => 'map',
12008 ];
12009
12013 public const NewUserLog = [
12014 'default' => true,
12015 ];
12016
12022 public const PageCreationLog = [
12023 'default' => true,
12024 ];
12025
12026 // endregion -- end logging
12027
12028 /***************************************************************************/
12029 // region Special pages (general and miscellaneous)
12035 public const AllowSpecialInclusion = [
12036 'default' => true,
12037 ];
12038
12045 public const DisableQueryPageUpdate = [
12046 'default' => false,
12047 ];
12048
12053 public const CountCategorizedImagesAsUsed = [
12054 'default' => false,
12055 ];
12056
12061 public const MaxRedirectLinksRetrieved = [
12062 'default' => 500,
12063 ];
12064
12071 public const RangeContributionsCIDRLimit = [
12072 'default' => [
12073 'IPv4' => 16,
12074 'IPv6' => 32,
12075 ],
12076 'type' => 'map',
12077 'additionalProperties' => [ 'type' => 'integer', ],
12078 ];
12079
12080 // endregion -- end special pages
12081
12082 /***************************************************************************/
12083 // region Actions
12092 public const Actions = [
12093 'default' => [],
12094 'type' => 'map',
12095 ];
12096
12097 // endregion -- end actions
12098
12099 /***************************************************************************/
12100 // region Robot (search engine crawler) policy
12102 // See also $wgNoFollowLinks.
12103
12109 public const DefaultRobotPolicy = [
12110 'default' => 'index,follow',
12111 ];
12112
12128 public const NamespaceRobotPolicies = [
12129 'default' => [],
12130 'type' => 'map',
12131 ];
12132
12162 public const ArticleRobotPolicies = [
12163 'default' => [],
12164 'type' => 'map',
12165 ];
12166
12178 public const ExemptFromUserRobotsControl = [
12179 'default' => null,
12180 'type' => '?list',
12181 ];
12182
12183 // endregion End robot policy
12184
12185 /***************************************************************************/
12186 // region Action API and REST API
12203 public const DebugAPI = [
12204 'default' => false,
12205 ];
12206
12242 public const APIModules = [
12243 'default' => [],
12244 'type' => 'map',
12245 ];
12246
12255 public const APIFormatModules = [
12256 'default' => [],
12257 'type' => 'map',
12258 ];
12259
12268 public const APIMetaModules = [
12269 'default' => [],
12270 'type' => 'map',
12271 ];
12272
12281 public const APIPropModules = [
12282 'default' => [],
12283 'type' => 'map',
12284 ];
12285
12294 public const APIListModules = [
12295 'default' => [],
12296 'type' => 'map',
12297 ];
12298
12303 public const APIMaxDBRows = [
12304 'default' => 5000,
12305 ];
12306
12312 public const APIMaxResultSize = [
12313 'default' => 8_388_608,
12314 ];
12315
12320 public const APIMaxUncachedDiffs = [
12321 'default' => 1,
12322 ];
12323
12330 public const APIMaxLagThreshold = [
12331 'default' => 7,
12332 ];
12333
12338 public const APIRequestLog = [
12339 'default' => false,
12340 'deprecated' => 'since 1.43; use api or api-request $wgDebugLogGroups channel',
12341 ];
12342
12346 public const APICacheHelpTimeout = [
12347 'default' => 60 * 60,
12348 ];
12349
12354 public const APIUselessQueryPages = [
12355 'default' => [
12356 'MIMEsearch',
12357 'LinkSearch',
12358 ],
12359 'type' => 'list',
12360 ];
12361
12365 public const AjaxLicensePreview = [
12366 'default' => true,
12367 ];
12368
12391 public const CrossSiteAJAXdomains = [
12392 'default' => [],
12393 'type' => 'map',
12394 ];
12395
12401 public const CrossSiteAJAXdomainExceptions = [
12402 'default' => [],
12403 'type' => 'map',
12404 ];
12405
12409 public const AllowedCorsHeaders = [
12410 'default' => [
12411 /* simple headers (see spec) */
12412 'Accept',
12413 'Accept-Language',
12414 'Content-Language',
12415 'Content-Type',
12416 /* non-authorable headers in XHR, which are however requested by some UAs */
12417 'Accept-Encoding',
12418 'DNT',
12419 'Origin',
12420 /* MediaWiki whitelist */
12421 'User-Agent',
12422 'Api-User-Agent',
12423 /* Allowing caching preflight requests, see T269636 */
12424 'Access-Control-Max-Age',
12425 /* OAuth 2.0, see T322944 */
12426 'Authorization',
12427 ],
12428 'type' => 'list',
12429 ];
12430
12436 public const RestAPIAdditionalRouteFiles = [
12437 'default' => [],
12438 'type' => 'list',
12439 ];
12440
12457 public const RestSandboxSpecs = [
12458 'default' => [],
12459 'type' => 'map',
12460 'additionalProperties' => [
12461 'type' => 'object',
12462 'properties' => [
12463 'url' => [ 'type' => 'string', 'format' => 'url' ],
12464 'name' => [ 'type' => 'string' ],
12465 'msg' => [ 'type' => 'string', 'description' => 'a message key' ]
12466 ],
12467 'required' => [ 'url' ]
12468 ]
12469 ];
12470
12471 // endregion -- End AJAX and API
12472
12473 /***************************************************************************/
12474 // region Shell and process control
12480 public const MaxShellMemory = [
12481 'default' => 307_200,
12482 ];
12483
12488 public const MaxShellFileSize = [
12489 'default' => 102_400,
12490 ];
12491
12495 public const MaxShellTime = [
12496 'default' => 180,
12497 ];
12498
12503 public const MaxShellWallClockTime = [
12504 'default' => 180,
12505 ];
12506
12530 public const ShellCgroup = [
12531 'default' => false,
12532 ];
12533
12537 public const PhpCli = [
12538 'default' => '/usr/bin/php',
12539 ];
12540
12553 public const ShellRestrictionMethod = [
12554 'default' => 'autodetect',
12555 'type' => 'string|false',
12556 ];
12557
12571 public const ShellboxUrls = [
12572 'default' => [ 'default' => null, ],
12573 'type' => 'map',
12574 'additionalProperties' => [
12575 'type' => 'string|false|null',
12576 ],
12577 ];
12578
12585 public const ShellboxSecretKey = [
12586 'default' => null,
12587 'type' => '?string',
12588 ];
12589
12599 public const ShellboxShell = [
12600 'default' => '/bin/sh',
12601 'type' => '?string',
12602 ];
12603
12604 // endregion -- end Shell and process control
12605
12606 /***************************************************************************/
12607 // region HTTP client
12615 public const HTTPTimeout = [
12616 'default' => 25,
12617 'type' => 'float',
12618 ];
12619
12627 public const HTTPConnectTimeout = [
12628 'default' => 5.0,
12629 'type' => 'float',
12630 ];
12631
12639 public const HTTPMaxTimeout = [
12640 'default' => 0,
12641 'type' => 'float',
12642 ];
12643
12651 public const HTTPMaxConnectTimeout = [
12652 'default' => 0,
12653 'type' => 'float',
12654 ];
12655
12661 public const HTTPImportTimeout = [
12662 'default' => 25,
12663 ];
12664
12668 public const AsyncHTTPTimeout = [
12669 'default' => 25,
12670 ];
12671
12675 public const HTTPProxy = [
12676 'default' => '',
12677 ];
12678
12685 public const LocalVirtualHosts = [
12686 'default' => [],
12687 'type' => 'map',
12688 ];
12689
12697 public const LocalHTTPProxy = [
12698 'default' => false,
12699 'type' => 'string|false',
12700 ];
12701
12711 public const AllowExternalReqID = [
12712 'default' => false,
12713 ];
12714
12715 // endregion -- End HTTP client
12716
12717 /***************************************************************************/
12718 // region Job queue
12738 public const JobRunRate = [
12739 'default' => 1,
12740 ];
12741
12749 public const RunJobsAsync = [
12750 'default' => false,
12751 ];
12752
12756 public const UpdateRowsPerJob = [
12757 'default' => 300,
12758 ];
12759
12763 public const UpdateRowsPerQuery = [
12764 'default' => 100,
12765 ];
12766
12767 // endregion -- End job queue
12768
12769 /***************************************************************************/
12770 // region Miscellaneous
12778 public const RedirectOnLogin = [
12779 'default' => null,
12780 ];
12781
12818 public const VirtualRestConfig = [
12819 'default' => [
12820 'paths' => [],
12821 'modules' => [],
12822 'global' => [
12823 # Timeout in seconds
12824 'timeout' => 360,
12825 # 'domain' is set to $wgCanonicalServer in Setup.php
12826 'forwardCookies' => false,
12827 'HTTPProxy' => null
12828 ]
12829 ],
12830 'mergeStrategy' => 'array_plus_2d',
12831 'type' => 'map',
12832 ];
12833
12856 public const EventRelayerConfig = [
12857 'default' => [
12858 'default' => [ 'class' => EventRelayerNull::class, ],
12859 ],
12860 'type' => 'map',
12861 ];
12862
12880 public const Pingback = [
12881 'default' => false,
12882 'type' => 'boolean',
12883 ];
12884
12890 public const OriginTrials = [
12891 'default' => [],
12892 'type' => 'list',
12893 ];
12894
12901 public const ReportToExpiry = [
12902 'default' => 86400,
12903 'type' => 'integer',
12904 ];
12905
12912 public const ReportToEndpoints = [
12913 'default' => [],
12914 'type' => 'list',
12915 ];
12916
12925 public const FeaturePolicyReportOnly = [
12926 'default' => [],
12927 'type' => 'list',
12928 ];
12929
12935 public const SkinsPreferred = [
12936 'default' => [ 'vector-2022', 'vector' ],
12937 'type' => 'list',
12938 ];
12939
12945 public const SpecialContributeSkinsEnabled = [
12946 'default' => [],
12947 'type' => 'list',
12948 ];
12949
12956 public const EnableEditRecovery = [
12957 'default' => false,
12958 'type' => 'boolean',
12959 ];
12960
12964 public const EditRecoveryExpiry = [
12965 'default' => 30 * 24 * 3600,
12966 'type' => 'integer',
12967 ];
12968
12975 public const UseCodexSpecialBlock = [
12976 'default' => false,
12977 'type' => 'boolean',
12978 ];
12979
12986 public const ShowLogoutConfirmation = [
12987 'default' => false,
12988 'type' => 'boolean',
12989 ];
12990
12996 public const EnableProtectionIndicators = [
12997 'default' => false,
12998 'type' => 'boolean',
12999 ];
13000
13007 public const OutputPipelineStages = [
13008 'default' => [],
13009 'type' => 'map',
13010 ];
13011 // endregion -- End Miscellaneous
13012
13013}
const SCHEMA_COMPAT_OLD
Definition Defines.php:294
const AV_SCAN_FAILED
Definition Defines.php:100
const AV_VIRUS_FOUND
Definition Defines.php:98
const APCOND_AGE
Definition Defines.php:184
const NS_HELP
Definition Defines.php:77
const NS_USER
Definition Defines.php:67
const CONTENT_MODEL_CSS
Definition Defines.php:230
const NS_FILE
Definition Defines.php:71
const CACHE_NONE
Definition Defines.php:87
const CACHE_ANYTHING
Definition Defines.php:86
const NS_MEDIAWIKI_TALK
Definition Defines.php:74
const NS_MAIN
Definition Defines.php:65
const NS_PROJECT_TALK
Definition Defines.php:70
const NS_MEDIAWIKI
Definition Defines.php:73
const NS_TEMPLATE
Definition Defines.php:75
const NS_FILE_TALK
Definition Defines.php:72
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:338
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:228
const CONTENT_MODEL_JSON
Definition Defines.php:232
const NS_HELP_TALK
Definition Defines.php:78
const NS_CATEGORY_TALK
Definition Defines.php:80
const CONTENT_MODEL_TEXT
Definition Defines.php:231
const CACHE_DB
Definition Defines.php:88
const AV_SCAN_ABORTED
Definition Defines.php:99
const APCOND_EDITCOUNT
Definition Defines.php:183
const NS_TALK
Definition Defines.php:66
const SCHEMA_COMPAT_NEW
Definition Defines.php:296
const AV_NO_VIRUS
Definition Defines.php:97
const NS_USER_TALK
Definition Defines.php:68
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:233
const NS_PROJECT
Definition Defines.php:69
const NS_CATEGORY
Definition Defines.php:79
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:229
const NS_TEMPLATE_TALK
Definition Defines.php:76
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:81
Assemble the segments of a chunked upload.
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 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.
Send an email notification.
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.
This class formats import log entries.
LogFormatter for interwiki/* logs.
Database-backed job queue storage.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:49
Caching for the contents of localisation files.
Implements the default log formatting.
Check if the user is blocked, and prevent authentication if so.
Handles email notification / email address confirmation for account creation.
A primary authentication provider that uses the password field in the 'user' table.
This is a value object for authentication requests with a username and password.
Reset the local password, if signalled via $this->manager->setAuthenticationSessionData()
This represents the intention to set a temporary password for the user.
A primary authentication provider that uses the temporary password field in the 'user' table.
A pre-authentication provider to throttle authentication actions.
This class performs some operations related to tracking categories, such as adding a tracking categor...
Exceptions for config failures.
Content handler for CSS pages.
Content handler implementation for unknown content.
Content handler for JSON text.
Base content handler implementation for flat text contents.
Content handler for wiki text pages.
Class for handling updates to the site_stats table.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:47
Methods for dealing with language codes.
This class contains schema declarations for all configuration variables known to MediaWiki core.
static getDefaultLocalTZoffset( $localtimezone)
Site language code.
static getDefaultLogo( $resourceBasePath)
static getDefaultUsePathInfo()
URL of the server.
static getDefaultLoadScript( $scriptPath)
static getDefaultCookieSecure( $forceHTTPS)
Default cookie lifetime, in seconds.
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 getDefaultShowEXIF()
Allow users to upload files.
static getDefaultRestPath( $scriptPath)
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
A Bcrypt-hashed password.
This password hash type layers one or more parameterized password types on top of each other.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Functions to check passwords against a policy requirement.
Users can authorize applications to use their account via OAuth.
Send recent change to a Redis Pub/Sub channel.
Send recent change notifications to a destination address over UDP.
Custom job to perform updates on tables in busier environments.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
Class representing a MediaWiki site.
Service for storing and loading Content objects representing revision data blobs.
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.
Job for updating user activity like "last viewed" timestamps.
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...
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.
Purge expired rows from the recentchanges table.
Job to update link tables for rerendered wiki pages.
LogFormatter for renameuser/renameuser logs.
Job for deferring the execution of RevertedTagUpdate.
This class formats rights log entries.
RDBMS-based caching module.
This class formats tag log entries.
Job for asynchronous rendering of thumbnails, e.g.
Upload a file by URL, via the jobqueue.
This class formats upload log entries.
Job that initializes an user's edit count.
Purge expired user group memberships.
Job that updates a user's preferences.
No-op class for publishing messages into a PubSub system.
Store data in the local server memory via APCu (php-apcu)
Abstract class for any ephemeral data store.
Definition BagOStuff.php:88
No-op implementation that stores nothing.
Store data in a memory for the current request/process only.
Store data on memcached server(s) via the php-memcached PECL extension.
Store data on memcached servers(s) via a pure-PHP memcached client.
Multi-datacenter aware caching interface.
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